]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
OvmfPkg: PciHostBridgeLib: initialize RootBus->DevicePath
[mirror_edk2.git] / OvmfPkg / Library / PciHostBridgeLib / PciHostBridgeLib.c
index cc782c1cc3bed57a22a58d6ad73ce37e13f6506b..582e87dd9ac0d132d324faadd62669dc30e3a3b3 100644 (file)
 \r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/DebugLib.h>\r
+#include <Library/DevicePathLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/PciHostBridgeLib.h>\r
 #include <Library/PciLib.h>\r
 #include <Library/QemuFwCfgLib.h>\r
 \r
 \r
+#pragma pack(1)\r
+typedef struct {\r
+  ACPI_HID_DEVICE_PATH     AcpiDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL EndDevicePath;\r
+} OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH;\r
+#pragma pack ()\r
+\r
+\r
 GLOBAL_REMOVE_IF_UNREFERENCED\r
 CHAR16 *mPciHostBridgeLibAcpiAddressSpaceTypeStr[] = {\r
   L"Mem", L"I/O", L"Bus"\r
 };\r
 \r
 \r
+STATIC\r
+CONST\r
+OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH mRootBridgeDevicePathTemplate = {\r
+  {\r
+    {\r
+      ACPI_DEVICE_PATH,\r
+      ACPI_DP,\r
+      {\r
+        (UINT8) (sizeof(ACPI_HID_DEVICE_PATH)),\r
+        (UINT8) ((sizeof(ACPI_HID_DEVICE_PATH)) >> 8)\r
+      }\r
+    },\r
+    EISA_PNP_ID(0x0A03), // HID\r
+    0                    // UID\r
+  },\r
+\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    {\r
+      END_DEVICE_PATH_LENGTH,\r
+      0\r
+    }\r
+  }\r
+};\r
+\r
+\r
 /**\r
   Initialize a PCI_ROOT_BRIDGE structure.\r
 \r
@@ -67,6 +103,8 @@ InitRootBridge (
   OUT PCI_ROOT_BRIDGE *RootBus\r
   )\r
 {\r
+  OVMF_PCI_ROOT_BRIDGE_DEVICE_PATH *DevicePath;\r
+\r
   //\r
   // Be safe if other fields are added to PCI_ROOT_BRIDGE later.\r
   //\r
@@ -103,7 +141,19 @@ InitRootBridge (
 \r
   RootBus->NoExtendedConfigSpace = TRUE;\r
 \r
-  return EFI_OUT_OF_RESOURCES;\r
+  DevicePath = AllocateCopyPool (sizeof mRootBridgeDevicePathTemplate,\r
+                 &mRootBridgeDevicePathTemplate);\r
+  if (DevicePath == NULL) {\r
+    DEBUG ((EFI_D_ERROR, "%a: %r\n", __FUNCTION__, EFI_OUT_OF_RESOURCES));\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  DevicePath->AcpiDevicePath.UID = RootBusNumber;\r
+  RootBus->DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)DevicePath;\r
+\r
+  DEBUG ((EFI_D_INFO,\r
+    "%a: populated root bus %d, with room for %d subordinate bus(es)\n",\r
+    __FUNCTION__, RootBusNumber, MaxSubBusNumber - RootBusNumber));\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 \r
@@ -120,6 +170,7 @@ UninitRootBridge (
   IN PCI_ROOT_BRIDGE *RootBus\r
   )\r
 {\r
+  FreePool (RootBus->DevicePath);\r
 }\r
 \r
 \r