]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.c
OvmfPkg: PciHostBridgeLib: permit access to the full extended config space
[mirror_edk2.git] / OvmfPkg / Library / PciHostBridgeLib / PciHostBridgeLib.c
index b238a8544d81640e2b10d29ec3df18855f56401f..3e02778492a8bd0e2ebb9bdb06ed0940f0b1e8ab 100644 (file)
 #include <PiDxe.h>\r
 \r
 #include <IndustryStandard/Pci.h>\r
+#include <IndustryStandard/Q35MchIch9.h>\r
 \r
 #include <Protocol/PciHostBridgeResourceAllocation.h>\r
 #include <Protocol/PciRootBridgeIo.h>\r
 \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 +104,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
@@ -93,7 +132,30 @@ InitRootBridge (
   RootBus->MemAbove4G.Base      = 0;\r
   RootBus->MemAbove4G.Limit     = 0;\r
 \r
-  return EFI_OUT_OF_RESOURCES;\r
+  RootBus->Bus.Base  = RootBusNumber;\r
+  RootBus->Bus.Limit = MaxSubBusNumber;\r
+  RootBus->Io.Base   = PcdGet64 (PcdPciIoBase);\r
+  RootBus->Io.Limit  = PcdGet64 (PcdPciIoBase) + (PcdGet64 (PcdPciIoSize) - 1);\r
+  RootBus->Mem.Base  = PcdGet64 (PcdPciMmio32Base);\r
+  RootBus->Mem.Limit = PcdGet64 (PcdPciMmio32Base) +\r
+                       (PcdGet64 (PcdPciMmio32Size) - 1);\r
+\r
+  RootBus->NoExtendedConfigSpace = (PcdGet16 (PcdOvmfHostBridgePciDevId) !=\r
+                                    INTEL_Q35_MCH_DEVICE_ID);\r
+\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
@@ -110,6 +172,7 @@ UninitRootBridge (
   IN PCI_ROOT_BRIDGE *RootBus\r
   )\r
 {\r
+  FreePool (RootBus->DevicePath);\r
 }\r
 \r
 \r