\r
**/\r
\r
+#include <Library/QemuFwCfgLib.h>\r
+\r
#include "PciHostBridge.h"\r
\r
STATIC\r
)\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
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
// alive.\r
//\r
for (RootBridgeNumber = 1;\r
- RootBridgeNumber < 256;\r
+ RootBridgeNumber < 256 && ExtraRootBridgesLeft > 0;\r
++RootBridgeNumber) {\r
UINTN Device;\r
\r
}\r
InsertTailList (&HostBridge->Head, &RootBus->Link);\r
LastRootBridgeNumber = RootBridgeNumber;\r
+ --ExtraRootBridgesLeft;\r
}\r
}\r
\r