]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.c
MdeModulePkg/PciBusDxe: reference gFullEnumeration in one file
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / PciBusDxe / PciBus.c
index 950cacc1203c28e10e5867c28eefc0280f2f4082..3bb5099bd3fff4e390d5f4a1478c50dda8195c3e 100644 (file)
@@ -8,7 +8,7 @@
   PCI Root Bridges. So it means platform needs install PCI Root Bridge IO protocol for each\r
   PCI Root Bus and install PCI Host Bridge Resource Allocation Protocol.\r
 \r
-Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -240,8 +240,9 @@ PciBusDriverBindingStart (
   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;\r
+  EFI_STATUS                      Status;\r
+  EFI_DEVICE_PATH_PROTOCOL        *ParentDevicePath;\r
+  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
 \r
   //\r
   // Check RemainingDevicePath validation\r
@@ -321,12 +322,34 @@ PciBusDriverBindingStart (
     ParentDevicePath\r
     );\r
 \r
+  Status = EFI_SUCCESS;\r
   //\r
   // Enumerate the entire host bridge\r
   // After enumeration, a database that records all the device information will be created\r
   //\r
   //\r
-  Status = PciEnumerator (Controller);\r
+  if (gFullEnumeration) {\r
+    //\r
+    // Get the rootbridge Io protocol to find the host bridge handle\r
+    //\r
+    Status = gBS->OpenProtocol (\r
+                    Controller,\r
+                    &gEfiPciRootBridgeIoProtocolGuid,\r
+                    (VOID **) &PciRootBridgeIo,\r
+                    gPciBusDriverBinding.DriverBindingHandle,\r
+                    Controller,\r
+                    EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                    );\r
+\r
+    if (!EFI_ERROR (Status)) {\r
+      Status = PciEnumerator (Controller, PciRootBridgeIo->ParentHandle);\r
+    }\r
+  } else {\r
+    //\r
+    // If PCI bus has already done the full enumeration, never do it again\r
+    //\r
+    Status = PciEnumeratorLight (Controller);\r
+  }\r
 \r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
@@ -337,6 +360,7 @@ PciBusDriverBindingStart (
   //\r
   StartPciDevices (Controller);\r
 \r
+  gFullEnumeration = FALSE;\r
   return EFI_SUCCESS;\r
 }\r
 \r