]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/PciBusDxe: make OPROM BAR degradation configurable
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Mon, 19 Sep 2016 08:36:13 +0000 (09:36 +0100)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Mon, 26 Sep 2016 12:49:15 +0000 (05:49 -0700)
The 'universal' PCI bus driver in MdeModulePkg contains a quirk to
degrade 64-bit PCI MMIO BARs to 32-bit in the presence of an option
ROM on the same PCI controller.

This quirk is highly specific to not just the X64 architecture in general,
but to the PC platform in particular, given that only X64 platforms that
require legacy PC BIOS compatibility require it. However, making the
quirk dependent on the presence of the legacy BIOS protocol met with
resistance, due to the fact that it introduces a dependency on the
IntelFrameworkModulePkg package.

So instead, make the quirk configurable, by introducing a feature flag PCD
'PcdPciDegradeResourceForOptionRom' which defaults to TRUE only for X64.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c
MdeModulePkg/MdeModulePkg.dec

index 330ccc8cbffcd928b5331b10c584c0d052e12042..a3ab11fd8d93421776e4c0d4cbff7bea721ed61f 100644 (file)
   gEfiLoadFile2ProtocolGuid                       ## SOMETIMES_PRODUCES\r
 \r
 [FeaturePcd]\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPciBusHotplugDeviceSupport  ## CONSUMES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdPciBridgeIoAlignmentProbe   ## CONSUMES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdUnalignedPciIoEnable        ## CONSUMES\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPciBusHotplugDeviceSupport      ## CONSUMES\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPciBridgeIoAlignmentProbe       ## CONSUMES\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdUnalignedPciIoEnable            ## CONSUMES\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPciDegradeResourceForOptionRom  ## CONSUMES\r
 \r
 [Pcd]\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdSrIovSystemPageSize         ## SOMETIMES_CONSUMES\r
index b0632d53b82b9ffba96cc3161b2430040b8d19cc..e93134613b488aad1b8c4fa5069500760769d562 100644 (file)
@@ -1058,48 +1058,50 @@ DegradeResource (
   LIST_ENTRY           *NextChildNodeLink;\r
   PCI_RESOURCE_NODE    *ResourceNode;\r
 \r
-  //\r
-  // If any child device has both option ROM and 64-bit BAR, degrade its PMEM64/MEM64\r
-  // requests in case that if a legacy option ROM image can not access 64-bit resources.\r
-  //\r
-  ChildDeviceLink = Bridge->ChildList.ForwardLink;\r
-  while (ChildDeviceLink != NULL && ChildDeviceLink != &Bridge->ChildList) {\r
-    PciIoDevice = PCI_IO_DEVICE_FROM_LINK (ChildDeviceLink);\r
-    if (PciIoDevice->RomSize != 0) {\r
-      if (!IsListEmpty (&Mem64Node->ChildList)) {      \r
-        ChildNodeLink = Mem64Node->ChildList.ForwardLink;\r
-        while (ChildNodeLink != &Mem64Node->ChildList) {\r
-          ResourceNode = RESOURCE_NODE_FROM_LINK (ChildNodeLink);\r
-          NextChildNodeLink = ChildNodeLink->ForwardLink;\r
-\r
-          if ((ResourceNode->PciDev == PciIoDevice) &&\r
-              (ResourceNode->Virtual || !PciIoDevice->PciBar[ResourceNode->Bar].BarTypeFixed)\r
-              ) {\r
-            RemoveEntryList (ChildNodeLink);\r
-            InsertResourceNode (Mem32Node, ResourceNode);\r
+  if (FeaturePcdGet (PcdPciDegradeResourceForOptionRom)) {\r
+    //\r
+    // If any child device has both option ROM and 64-bit BAR, degrade its PMEM64/MEM64\r
+    // requests in case that if a legacy option ROM image can not access 64-bit resources.\r
+    //\r
+    ChildDeviceLink = Bridge->ChildList.ForwardLink;\r
+    while (ChildDeviceLink != NULL && ChildDeviceLink != &Bridge->ChildList) {\r
+      PciIoDevice = PCI_IO_DEVICE_FROM_LINK (ChildDeviceLink);\r
+      if (PciIoDevice->RomSize != 0) {\r
+        if (!IsListEmpty (&Mem64Node->ChildList)) {\r
+          ChildNodeLink = Mem64Node->ChildList.ForwardLink;\r
+          while (ChildNodeLink != &Mem64Node->ChildList) {\r
+            ResourceNode = RESOURCE_NODE_FROM_LINK (ChildNodeLink);\r
+            NextChildNodeLink = ChildNodeLink->ForwardLink;\r
+\r
+            if ((ResourceNode->PciDev == PciIoDevice) &&\r
+                (ResourceNode->Virtual || !PciIoDevice->PciBar[ResourceNode->Bar].BarTypeFixed)\r
+                ) {\r
+              RemoveEntryList (ChildNodeLink);\r
+              InsertResourceNode (Mem32Node, ResourceNode);\r
+            }\r
+            ChildNodeLink = NextChildNodeLink;\r
           }\r
-          ChildNodeLink = NextChildNodeLink;\r
-        }        \r
-      }\r
+        }\r
 \r
-      if (!IsListEmpty (&PMem64Node->ChildList)) {      \r
-        ChildNodeLink = PMem64Node->ChildList.ForwardLink;\r
-        while (ChildNodeLink != &PMem64Node->ChildList) {\r
-          ResourceNode = RESOURCE_NODE_FROM_LINK (ChildNodeLink);\r
-          NextChildNodeLink = ChildNodeLink->ForwardLink;\r
-\r
-          if ((ResourceNode->PciDev == PciIoDevice) &&\r
-              (ResourceNode->Virtual || !PciIoDevice->PciBar[ResourceNode->Bar].BarTypeFixed)\r
-              ) {\r
-            RemoveEntryList (ChildNodeLink);\r
-            InsertResourceNode (PMem32Node, ResourceNode);\r
+        if (!IsListEmpty (&PMem64Node->ChildList)) {\r
+          ChildNodeLink = PMem64Node->ChildList.ForwardLink;\r
+          while (ChildNodeLink != &PMem64Node->ChildList) {\r
+            ResourceNode = RESOURCE_NODE_FROM_LINK (ChildNodeLink);\r
+            NextChildNodeLink = ChildNodeLink->ForwardLink;\r
+\r
+            if ((ResourceNode->PciDev == PciIoDevice) &&\r
+                (ResourceNode->Virtual || !PciIoDevice->PciBar[ResourceNode->Bar].BarTypeFixed)\r
+                ) {\r
+              RemoveEntryList (ChildNodeLink);\r
+              InsertResourceNode (PMem32Node, ResourceNode);\r
+            }\r
+            ChildNodeLink = NextChildNodeLink;\r
           }\r
-          ChildNodeLink = NextChildNodeLink;\r
-        }        \r
-      }\r
+        }\r
 \r
+      }\r
+      ChildDeviceLink = ChildDeviceLink->ForwardLink;\r
     }\r
-    ChildDeviceLink = ChildDeviceLink->ForwardLink;\r
   }\r
 \r
   //\r
index 8d90f169b26eeb186286a032b86150a4da1f89a6..270088c2e6a31deda75e218bb2bef632afc906a5 100644 (file)
   # @Prompt Turn on PS2 Mouse Extended Verification\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPs2MouseExtendedVerification|TRUE|BOOLEAN|0x00010075\r
 \r
+[PcdsFeatureFlag.X64]\r
+  ## Indicates whether 64-bit PCI MMIO BARs should degrade to 32-bit in the presence of an option ROM\r
+  #  On X64 platforms, Option ROMs may contain code that executes in the context of a legacy BIOS (CSM),\r
+  #  which requires that all PCI MMIO BARs are located below 4 GB\r
+  #   TRUE  - All PCI MMIO BARs of a device will be located below 4 GB if it has an option ROM\r
+  #   FALSE - PCI MMIO BARs of a device may be located above 4 GB even if it has an option ROM\r
+  # @Prompt Degrade 64-bit PCI MMIO BARs for legacy BIOS option ROMs\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPciDegradeResourceForOptionRom|TRUE|BOOLEAN|0x0001003a\r
+\r
+[PcdsFeatureFlag.IA32, PcdsFeatureFlag.ARM, PcdsFeatureFlag.AARCH64]\r
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPciDegradeResourceForOptionRom|FALSE|BOOLEAN|0x0001003a\r
+\r
 [PcdsFeatureFlag.IA32, PcdsFeatureFlag.X64]\r
   ## Indicates if DxeIpl should switch to long mode to enter DXE phase.\r
   #  It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore\r