PciBus driver originally always degrade (64->32) the MMIO resource
for PCI BAR when the PCI device contains option ROM.
But the degrade causes the PCI device can only use resource below 4GB
which makes the resource allocation fails when the PCI device wants
very big MMIO.
The patch follows the PI spec to honor the granularity setting for
PCI BAR from IncompatiblePciDeviceSupport so that even for PCI device
which contains option ROM, the degrade doesn't happen if
IncompatiblePciDeviceSupport returns 64 as granularity.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <[email protected]>
Cc: Jeff Fan <[email protected]>
---
 MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h            |  3 +-
 .../Bus/Pci/PciBusDxe/PciEnumeratorSupport.c       | 33 ++++++++++++++++++++++
 .../Bus/Pci/PciBusDxe/PciResourceSupport.c         |  8 ++++--
 3 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h 
b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h
index 2226b1b..b12d7ec 100644
--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h
+++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h
@@ -1,7 +1,7 @@
 /** @file
   Header files and data structures needed by PCI Bus module.
 
-Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD 
License
 which accompanies this distribution.  The full text of the license may be 
found at
@@ -102,6 +102,7 @@ struct _PCI_BAR {
   UINT64        Length;
   UINT64        Alignment;
   PCI_BAR_TYPE  BarType;
+  BOOLEAN       BarTypeFixed;
   UINT16        Offset;
 };
 
diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c 
b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
index 57e2760..b3f217d 100644
--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
+++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
@@ -1408,6 +1408,38 @@ UpdatePciInfo (
         //
         if (CheckBarType (PciIoDevice, (UINT8) BarIndex, PciBarTypeMem)) {
           SetFlag = TRUE;
+
+          //
+          // Ignored if granularity is 0.
+          // Ignored if PCI BAR is I/O or 32-bit memory.
+          // If PCI BAR is 64-bit memory and granularity is 32, then
+          // the PCI BAR resource is allocated below 4GB.
+          // If PCI BAR is 64-bit memory and granularity is 64, then
+          // the PCI BAR resource is allocated above 4GB.
+          //
+          if (PciIoDevice->PciBar[BarIndex].BarType == PciBarTypeMem64) {
+            switch (Ptr->AddrSpaceGranularity) {
+            case 32:
+              PciIoDevice->PciBar[BarIndex].BarType = PciBarTypeMem32;
+            case 64:
+              PciIoDevice->PciBar[BarIndex].BarTypeFixed = TRUE;
+              break;
+            default:
+              break;
+            }
+          }
+
+          if (PciIoDevice->PciBar[BarIndex].BarType == PciBarTypePMem64) {
+            switch (Ptr->AddrSpaceGranularity) {
+            case 32:
+              PciIoDevice->PciBar[BarIndex].BarType = PciBarTypePMem32;
+            case 64:
+              PciIoDevice->PciBar[BarIndex].BarTypeFixed = TRUE;
+              break;
+            default:
+              break;
+            }
+          }
         }
         break;
 
@@ -1752,6 +1784,7 @@ PciParseBar (
     return Offset + 4;
   }
 
+  PciIoDevice->PciBar[BarIndex].BarTypeFixed = FALSE;
   PciIoDevice->PciBar[BarIndex].Offset = (UINT8) Offset;
   if ((Value & 0x01) != 0) {
     //
diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c 
b/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
index 560f8d8..b0632d5 100644
--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
+++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
@@ -1072,7 +1072,9 @@ DegradeResource (
           ResourceNode = RESOURCE_NODE_FROM_LINK (ChildNodeLink);
           NextChildNodeLink = ChildNodeLink->ForwardLink;
 
-          if (ResourceNode->PciDev == PciIoDevice) {
+          if ((ResourceNode->PciDev == PciIoDevice) &&
+              (ResourceNode->Virtual || 
!PciIoDevice->PciBar[ResourceNode->Bar].BarTypeFixed)
+              ) {
             RemoveEntryList (ChildNodeLink);
             InsertResourceNode (Mem32Node, ResourceNode);
           }
@@ -1086,7 +1088,9 @@ DegradeResource (
           ResourceNode = RESOURCE_NODE_FROM_LINK (ChildNodeLink);
           NextChildNodeLink = ChildNodeLink->ForwardLink;
 
-          if (ResourceNode->PciDev == PciIoDevice) {
+          if ((ResourceNode->PciDev == PciIoDevice) &&
+              (ResourceNode->Virtual || 
!PciIoDevice->PciBar[ResourceNode->Bar].BarTypeFixed)
+              ) {
             RemoveEntryList (ChildNodeLink);
             InsertResourceNode (PMem32Node, ResourceNode);
           }
-- 
2.7.0.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to