]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/PciHostBridgeDxe/PciHostBridge.c
BaseTools/Ecc: Fix a bug to report fake issue
[mirror_edk2.git] / OvmfPkg / PciHostBridgeDxe / PciHostBridge.c
index 348664438d4a2ace26211e5a9c4b7a9ae2faa204..efef2ed79efc2963d3be8b0e09e71dec9f2e009e 100644 (file)
@@ -15,6 +15,8 @@
 \r
 **/\r
 \r
+#include <Library/QemuFwCfgLib.h>\r
+\r
 #include "PciHostBridge.h"\r
 \r
 STATIC\r
@@ -207,6 +209,9 @@ InitializePciHostBridge (
   )\r
 {\r
   EFI_STATUS                  Status;\r
+  FIRMWARE_CONFIG_ITEM        FwCfgItem;\r
+  UINTN                       FwCfgSize;\r
+  UINT64                      ExtraRootBridgesLeft;\r
   UINTN                       LastRootBridgeNumber;\r
   UINTN                       RootBridgeNumber;\r
   PCI_HOST_BRIDGE_INSTANCE    *HostBridge;\r
@@ -236,6 +241,20 @@ InitializePciHostBridge (
     goto FreeHostBridge;\r
   }\r
 \r
+  //\r
+  // QEMU provides the number of extra root buses, shortening the exhaustive\r
+  // search below. If there is no hint, the feature is missing.\r
+  //\r
+  Status = QemuFwCfgFindFile ("etc/extra-pci-roots", &FwCfgItem, &FwCfgSize);\r
+  if (EFI_ERROR (Status) || FwCfgSize != sizeof ExtraRootBridgesLeft) {\r
+    ExtraRootBridgesLeft = 0;\r
+  } else {\r
+    QemuFwCfgSelectItem (FwCfgItem);\r
+    QemuFwCfgReadBytes (FwCfgSize, &ExtraRootBridgesLeft);\r
+    DEBUG ((EFI_D_INFO, "%a: %Lu extra root buses reported by QEMU\n",\r
+      __FUNCTION__, ExtraRootBridgesLeft));\r
+  }\r
+\r
   //\r
   // The "main" root bus is always there.\r
   //\r
@@ -247,7 +266,7 @@ InitializePciHostBridge (
   // alive.\r
   //\r
   for (RootBridgeNumber = 1;\r
-       RootBridgeNumber < 256;\r
+       RootBridgeNumber < 256 && ExtraRootBridgesLeft > 0;\r
        ++RootBridgeNumber) {\r
     UINTN Device;\r
 \r
@@ -271,6 +290,7 @@ InitializePciHostBridge (
       }\r
       InsertTailList (&HostBridge->Head, &RootBus->Link);\r
       LastRootBridgeNumber = RootBridgeNumber;\r
+      --ExtraRootBridgesLeft;\r
     }\r
   }\r
 \r