]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: PciHostBridgeDxe: shorten search for extra root buses
authorLaszlo Ersek <lersek@redhat.com>
Tue, 14 Jul 2015 12:02:34 +0000 (12:02 +0000)
committerlersek <lersek@Edk2>
Tue, 14 Jul 2015 12:02:34 +0000 (12:02 +0000)
QEMU provides an fw_cfg file called "etc/extra-pci-roots", containing a
little-endian UINT64 value that exposes the number of extra root buses. We
can use this value to terminate the scan as soon as we find the last extra
root bus.

Cc: Jordan Justen <jordan.l.justen@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Regression-tested-by: Gabriel Somlo <somlo@cmu.edu>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17963 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/PciHostBridgeDxe/PciHostBridge.c
OvmfPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf

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
index 40f4c3cc34ea2cede6c17d83275a08093f6b265d..ca760b5497e9c9b6d11ff74bacb9b973d837e557 100644 (file)
@@ -26,6 +26,7 @@
 \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
+  OvmfPkg/OvmfPkg.dec\r
 \r
 [LibraryClasses]\r
   UefiDriverEntryPoint\r
@@ -39,6 +40,7 @@
   DevicePathLib\r
   IoLib\r
   PciLib\r
+  QemuFwCfgLib\r
 \r
 [Sources]\r
   PciHostBridge.c\r