PCI Bus Driver Enhancement
authorxli24 <xli24@de2fecce-e211-0410-80a6-f3fac2684e05>
Fri, 28 Sep 2007 04:40:49 +0000 (04:40 +0000)
committerxli24 <xli24@de2fecce-e211-0410-80a6-f3fac2684e05>
Fri, 28 Sep 2007 04:40:49 +0000 (04:40 +0000)
git-svn-id: https://edk2.tianocore.org/svn/edk2/trunk@3960 de2fecce-e211-0410-80a6-f3fac2684e05

edk2/IntelFrameworkModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c
edk2/IntelFrameworkModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
edk2/IntelFrameworkModulePkg/Bus/Pci/PciBusDxe/PciLib.c
edk2/IntelFrameworkModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.h

index 988d301..e0b6694 100644 (file)
@@ -200,12 +200,21 @@ Returns:
   // Get the bus number to start with\r
   //\r
   StartBusNumber = (UINT8) (pConfiguration->AddrRangeMin);\r
+  PaddedBusRange  = (UINT8) (pConfiguration->AddrRangeMax);\r
 \r
   //\r
   // Initialize the subordinate bus number\r
   //\r
   SubBusNumber = StartBusNumber;\r
 \r
+  //\r
+  // Reset all assigned PCI bus number\r
+  //\r
+  ResetAllPpbBusNumber (\r
+    RootBridgeDev, \r
+    StartBusNumber\r
+  );\r
+\r
   //\r
   // Assign bus number\r
   //\r
index 432c6f7..4c9c800 100644 (file)
@@ -2161,7 +2161,7 @@ Returns:
 }\r
 \r
 EFI_STATUS\r
-ResetAllPpbBusReg (\r
+ResetAllPpbBusNumber (\r
   IN PCI_IO_DEVICE                      *Bridge,\r
   IN UINT8                              StartBusNumber\r
   )\r
@@ -2188,6 +2188,7 @@ Returns:
   UINT32                          Register;\r
   UINT8                           Func;\r
   UINT64                          Address;\r
+  UINT8                           SecondaryBus;\r
   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
 \r
   PciRootBridgeIo = Bridge->PciRootBridgeIo;\r
@@ -2207,6 +2208,7 @@ Returns:
                 );\r
 \r
       if (!EFI_ERROR (Status) && (IS_PCI_BRIDGE (&Pci))) {\r
+\r
         Register  = 0;\r
         Address   = EFI_PCI_ADDRESS (StartBusNumber, Device, Func, 0x18);\r
         Status   = PciRootBridgeIoRead (\r
@@ -2217,6 +2219,12 @@ Returns:
                                         1,\r
                                         &Register\r
                                         );\r
+        SecondaryBus = (UINT8)(Register >> 8);\r
+\r
+        if (SecondaryBus != 0) {\r
+          ResetAllPpbBusNumber (Bridge, SecondaryBus);\r
+        }\r
+\r
         //\r
         // Reset register 18h, 19h, 1Ah on PCI Bridge\r
         //\r
index 7a4684d..0812bf0 100644 (file)
@@ -1258,8 +1258,6 @@ Returns:
   SecondBus       = 0;\r
   Register        = 0;\r
 \r
-  ResetAllPpbBusReg (Bridge, StartBusNumber);\r
-\r
   for (Device = 0; Device <= PCI_MAX_DEVICE; Device++) {\r
     for (Func = 0; Func <= PCI_MAX_FUNC; Func++) {\r
 \r
@@ -1278,6 +1276,8 @@ Returns:
           (IS_PCI_BRIDGE (&Pci) ||\r
           IS_CARDBUS_BRIDGE (&Pci))) {\r
 \r
+        DEBUG((EFI_D_ERROR, "Found DEV(%02d,%02d,%02d)\n", StartBusNumber, Device, Func ));\r
+\r
         //\r
         // Get the bridge information\r
         //\r
@@ -1294,6 +1294,14 @@ Returns:
           return Status;\r
         }\r
 \r
+        //\r
+        // Add feature to support customized secondary bus number\r
+        //\r
+               if (*SubBusNumber == 0) {        \r
+          *SubBusNumber   = *PaddedBusRange;\r
+          *PaddedBusRange = 0;\r
+        }\r
+\r
         (*SubBusNumber)++;\r
 \r
         SecondBus = (*SubBusNumber);\r
@@ -1350,6 +1358,7 @@ Returns:
             EfiPciBeforeChildBusEnumeration\r
             );\r
 \r
+          DEBUG((EFI_D_ERROR, "Scan  PPB(%02d,%02d,%02d)\n", PciDevice->BusNumber, PciDevice->DeviceNumber,PciDevice->FunctionNumber ));\r
           Status = PciScanBus (\r
                     PciDevice,\r
                     (UINT8) (SecondBus),\r
@@ -1446,8 +1455,6 @@ Returns:
   Attributes      = (EFI_HPC_PADDING_ATTRIBUTES) 0;\r
   BusRange        = 0;\r
 \r
-  ResetAllPpbBusReg (Bridge, StartBusNumber);\r
-\r
   for (Device = 0; Device <= PCI_MAX_DEVICE; Device++) {\r
     for (Func = 0; Func <= PCI_MAX_FUNC; Func++) {\r
 \r
@@ -1473,6 +1480,8 @@ Returns:
         continue;\r
       }\r
 \r
+      DEBUG((EFI_D_ERROR, "Found DEV(%02d,%02d,%02d)\n", StartBusNumber, Device, Func ));\r
+      \r
       //\r
       // Get the PCI device information\r
       //\r
@@ -1534,7 +1543,6 @@ Returns:
               PciDevice->FunctionNumber,\r
               EfiPciBeforeChildBusEnumeration\r
             );\r
-            continue;\r
           }\r
         }\r
       }\r
@@ -1583,6 +1591,14 @@ Returns:
           }\r
         }\r
 \r
+        //\r
+        // Add feature to support customized secondary bus number\r
+        //\r
+               if (*SubBusNumber == 0) {        \r
+          *SubBusNumber   = *PaddedBusRange;\r
+          *PaddedBusRange = 0;\r
+        }\r
+\r
         (*SubBusNumber)++;\r
         SecondBus = *SubBusNumber;\r
 \r
@@ -1629,6 +1645,7 @@ Returns:
             EfiPciBeforeChildBusEnumeration\r
             );\r
 \r
+          DEBUG((EFI_D_ERROR, "Scan  PPB(%02d,%02d,%02d)\n", PciDevice->BusNumber, PciDevice->DeviceNumber,PciDevice->FunctionNumber ));\r
           Status = PciScanBus (\r
                     PciDevice,\r
                     (UINT8) (SecondBus),\r
@@ -1851,6 +1868,7 @@ Returns:
   //\r
   NotifyPhase (PciResAlloc, EfiPciHostBridgeBeginBusAllocation);\r
 \r
+  DEBUG((EFI_D_ERROR, "PCI Bus First Scanning\n"));\r
   RootBridgeHandle = NULL;\r
   while (PciResAlloc->GetNextRootBridge (PciResAlloc, &RootBridgeHandle) == EFI_SUCCESS) {\r
 \r
@@ -1901,6 +1919,7 @@ Returns:
       //\r
       NotifyPhase (PciResAlloc, EfiPciHostBridgeBeginBusAllocation);\r
 \r
+      DEBUG((EFI_D_ERROR, "PCI Bus Second Scanning\n"));  \r
       RootBridgeHandle = NULL;\r
       while (PciResAlloc->GetNextRootBridge (PciResAlloc, &RootBridgeHandle) == EFI_SUCCESS) {\r
 \r
index 3210a01..34a7787 100644 (file)
@@ -705,7 +705,7 @@ Returns:
 ;\r
 \r
 EFI_STATUS\r
-ResetAllPpbBusReg (\r
+ResetAllPpbBusNumber (\r
   IN PCI_IO_DEVICE                      *Bridge,\r
   IN UINT8                              StartBusNumber\r
   )\r