+/**\r
+ Function to dump information about PciRootBridgeIo.\r
+\r
+ This will allocate the return buffer from boot services pool.\r
+\r
+ @param[in] TheHandle The handle that has PciRootBridgeIo installed.\r
+ @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
+\r
+ @retval A poitner to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+PciRootBridgeIoDumpInformation(\r
+ IN CONST EFI_HANDLE TheHandle,\r
+ IN CONST BOOLEAN Verbose\r
+ )\r
+{\r
+ EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
+ EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Configuration;\r
+ UINT64 Supports;\r
+ UINT64 Attributes;\r
+ CHAR16 *Temp;\r
+ CHAR16 *Temp2;\r
+ CHAR16 *RetVal;\r
+ EFI_STATUS Status;\r
+\r
+ RetVal = NULL;\r
+\r
+ if (!Verbose) {\r
+ return (CatSPrint(NULL, L"PciRootBridgeIo"));\r
+ }\r
+\r
+ Status = gBS->HandleProtocol(\r
+ TheHandle,\r
+ &gEfiPciRootBridgeIoProtocolGuid,\r
+ (VOID**)&PciRootBridgeIo);\r
+\r
+ if (EFI_ERROR(Status)) {\r
+ return NULL;\r
+ }\r
+\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_PH), NULL);\r
+ Temp2 = CatSPrint(L"\r\n", Temp, PciRootBridgeIo->ParentHandle);\r
+ FreePool(Temp);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ \r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SEG), NULL);\r
+ Temp2 = CatSPrint(RetVal, Temp, PciRootBridgeIo->SegmentNumber);\r
+ FreePool(Temp);\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+\r
+ Supports = 0;\r
+ Attributes = 0;\r
+ Status = PciRootBridgeIo->GetAttributes (PciRootBridgeIo, &Supports, &Attributes);\r
+ if (!EFI_ERROR(Status)) {\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_ATT), NULL);\r
+ Temp2 = CatSPrint(RetVal, Temp, Attributes);\r
+ FreePool(Temp);\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ \r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SUPPORTS), NULL);\r
+ Temp2 = CatSPrint(RetVal, Temp, Supports);\r
+ FreePool(Temp);\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ }\r
+\r
+ Configuration = NULL;\r
+ Status = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **) &Configuration);\r
+ if (!EFI_ERROR(Status) && Configuration != NULL) {\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_TITLE), NULL);\r
+ Temp2 = CatSPrint(RetVal, Temp, Supports);\r
+ FreePool(Temp);\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ while (Configuration->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {\r
+ Temp = NULL;\r
+ switch (Configuration->ResType) {\r
+ case ACPI_ADDRESS_SPACE_TYPE_MEM:\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_MEM), NULL);\r
+ break;\r
+ case ACPI_ADDRESS_SPACE_TYPE_IO:\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_IO), NULL);\r
+ break;\r
+ case ACPI_ADDRESS_SPACE_TYPE_BUS:\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_BUS), NULL);\r
+ break;\r
+ }\r
+ if (Temp != NULL) {\r
+ Temp2 = CatSPrint(RetVal, L"%s", Temp);\r
+ FreePool(Temp);\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ }\r
+\r
+ Temp2 = CatSPrint(RetVal, \r
+ L"%H%02x %016lx %016lx %02x%N\r\n",\r
+ Configuration->SpecificFlag,\r
+ Configuration->AddrRangeMin,\r
+ Configuration->AddrRangeMax,\r
+ Configuration->AddrSpaceGranularity\r
+ );\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ Configuration++;\r
+ }\r
+ }\r
+ return (RetVal);\r
+}\r
+\r