]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg: Enhance bus scan for all root bridge instances
authorFoster Nong <foster.nong@intel.com>
Fri, 22 Jul 2022 09:10:26 +0000 (17:10 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 12 Aug 2022 06:50:02 +0000 (06:50 +0000)
Ref:https://bugzilla.tianocore.org/show_bug.cgi?id=4000

Change flow to bus scan all root bridge instances even when any
one root bridge meet bus resource OUT_OF_RESOURCE case.
thus platform handler  of "EfiPciHostBridgeEndBusAllocation" has
an chance to do relative pci bus rebalance to handle this case.

Signed-off-by: Foster Nong <foster.nong@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
MdeModulePkg/Bus/Pci/PciBusDxe/PciLib.c

index 63d149b3b8c0559f275b5ffbd08c0407a0527e7e..d5e3ef4d3f5f80d079419141734beb36637a6995 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Internal library implementation for PCI Bus module.\r
 \r
-Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.<BR>\r
 (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -1528,6 +1528,7 @@ PciHostBridgeEnumerator (
   UINT8                              StartBusNumber;\r
   LIST_ENTRY                         RootBridgeList;\r
   LIST_ENTRY                         *Link;\r
+  EFI_STATUS                         RootBridgeEnumerationStatus;\r
 \r
   if (FeaturePcdGet (PcdPciBusHotplugDeviceSupport)) {\r
     InitializeHotPlugSupport ();\r
@@ -1545,7 +1546,8 @@ PciHostBridgeEnumerator (
   }\r
 \r
   DEBUG ((DEBUG_INFO, "PCI Bus First Scanning\n"));\r
-  RootBridgeHandle = NULL;\r
+  RootBridgeHandle            = NULL;\r
+  RootBridgeEnumerationStatus = EFI_SUCCESS;\r
   while (PciResAlloc->GetNextRootBridge (PciResAlloc, &RootBridgeHandle) == EFI_SUCCESS) {\r
     //\r
     // if a root bridge instance is found, create root bridge device for it\r
@@ -1572,7 +1574,7 @@ PciHostBridgeEnumerator (
     }\r
 \r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      RootBridgeEnumerationStatus = Status;\r
     }\r
   }\r
 \r
@@ -1581,6 +1583,10 @@ PciHostBridgeEnumerator (
   //\r
   NotifyPhase (PciResAlloc, EfiPciHostBridgeEndBusAllocation);\r
 \r
+  if (EFI_ERROR (RootBridgeEnumerationStatus)) {\r
+    return RootBridgeEnumerationStatus;\r
+  }\r
+\r
   if ((gPciHotPlugInit != NULL) && FeaturePcdGet (PcdPciBusHotplugDeviceSupport)) {\r
     //\r
     // Reset all assigned PCI bus number in all PPB\r
@@ -1659,7 +1665,7 @@ PciHostBridgeEnumerator (
 \r
       DestroyRootBridge (RootBridgeDev);\r
       if (EFI_ERROR (Status)) {\r
-        return Status;\r
+        RootBridgeEnumerationStatus = Status;\r
       }\r
     }\r
 \r
@@ -1667,6 +1673,10 @@ PciHostBridgeEnumerator (
     // Notify the bus allocation phase is to end for the 2nd time\r
     //\r
     NotifyPhase (PciResAlloc, EfiPciHostBridgeEndBusAllocation);\r
+\r
+    if (EFI_ERROR (RootBridgeEnumerationStatus)) {\r
+      return RootBridgeEnumerationStatus;\r
+    }\r
   }\r
 \r
   //\r