]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update resource degrade algorithm in PCI bus driver. (1)If any child device has both...
authorrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 24 Dec 2009 14:05:36 +0000 (14:05 +0000)
committerrsun3 <rsun3@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 24 Dec 2009 14:05:36 +0000 (14:05 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9599 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c
MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c

index ece3ee830ff02f6049b8d860d5a5795b0445bb71..aa209cd8cff8c9e6e51845f15d1b9098c6a924b4 100644 (file)
@@ -475,6 +475,7 @@ DetermineRootBridgeAttributes (
   }\r
 \r
   if ((Attributes & EFI_PCI_HOST_BRIDGE_MEM64_DECODE) != 0) {\r
+    RootBridgeDev->Decodes |= EFI_BRIDGE_MEM64_DECODE_SUPPORTED;\r
     RootBridgeDev->Decodes |= EFI_BRIDGE_PMEM64_DECODE_SUPPORTED;\r
   }\r
 \r
index 7fd856e5cae3bec202646f1ea78b24f79a5252f7..d6291b9375c7d0830fe70b51ce58a5b7c5b5913d 100644 (file)
@@ -1047,31 +1047,59 @@ DegradeResource (
   IN PCI_RESOURCE_NODE *PMem64Node\r
   )\r
 {\r
-  BOOLEAN              HasOprom;\r
   PCI_IO_DEVICE        *Temp;\r
   LIST_ENTRY           *CurrentLink;\r
+  PCI_RESOURCE_NODE    *TempNode;\r
 \r
   //\r
-  // For RootBridge, PPB , P2C, go recursively to traverse all its children\r
-  // to find if this bridge and downstream has OptionRom.\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
-  HasOprom = FALSE;\r
   CurrentLink = Bridge->ChildList.ForwardLink;\r
   while (CurrentLink != NULL && CurrentLink != &Bridge->ChildList) {\r
-\r
     Temp = PCI_IO_DEVICE_FROM_LINK (CurrentLink);\r
     if (Temp->RomSize != 0) {\r
-      HasOprom = TRUE;\r
-      break;\r
+      if (!IsListEmpty (&Mem64Node->ChildList)) {      \r
+        CurrentLink = Mem64Node->ChildList.ForwardLink;\r
+        while (CurrentLink != &Mem64Node->ChildList) {\r
+          TempNode = RESOURCE_NODE_FROM_LINK (CurrentLink);\r
+\r
+          if (TempNode->PciDev == Temp) {\r
+            RemoveEntryList (CurrentLink);\r
+            InsertResourceNode (Mem32Node, TempNode);\r
+          }\r
+          CurrentLink = TempNode->Link.ForwardLink;\r
+        }        \r
+      }\r
+\r
+      if (!IsListEmpty (&PMem64Node->ChildList)) {      \r
+        CurrentLink = PMem64Node->ChildList.ForwardLink;\r
+        while (CurrentLink != &PMem64Node->ChildList) {\r
+          TempNode = RESOURCE_NODE_FROM_LINK (CurrentLink);\r
+\r
+          if (TempNode->PciDev == Temp) {\r
+            RemoveEntryList (CurrentLink);\r
+            InsertResourceNode (PMem32Node, TempNode);\r
+          }\r
+          CurrentLink = TempNode->Link.ForwardLink;\r
+        }        \r
+      }\r
+\r
     }\r
     CurrentLink = CurrentLink->ForwardLink;\r
   }\r
 \r
   //\r
-  // If bridge doesn't support Prefetchable\r
-  // memory64, degrade it to Prefetchable memory32\r
+  // If firmware is in 32-bit mode,\r
+  // then degrade PMEM64/MEM64 requests\r
   //\r
-  if (!BridgeSupportResourceDecode (Bridge, EFI_BRIDGE_PMEM64_DECODE_SUPPORTED)) {\r
+  if (sizeof (UINTN) <= 4) {\r
+    MergeResourceTree (\r
+      Mem32Node,\r
+      Mem64Node,\r
+      TRUE\r
+      );\r
+\r
     MergeResourceTree (\r
       PMem32Node,\r
       PMem64Node,\r
@@ -1079,31 +1107,38 @@ DegradeResource (
       );\r
   } else {\r
     //\r
-    // if no PMem32 request and no OptionRom request, still keep PMem64. Otherwise degrade to PMem32\r
+    // if the bridge does not support MEM64, degrade MEM64 to MEM32\r
     //\r
-    if ((PMem32Node != NULL && (PMem32Node->Length != 0 && Bridge->Parent != NULL)) || HasOprom) {\r
-      //\r
-      // Fixed the issue that there is no resource for 64-bit (above 4G)\r
-      //\r
+    if (!BridgeSupportResourceDecode (Bridge, EFI_BRIDGE_MEM64_DECODE_SUPPORTED)) {\r
+        MergeResourceTree (\r
+          Mem32Node,\r
+          Mem64Node,\r
+          TRUE\r
+          );\r
+    }\r
+\r
+    //\r
+    // if the bridge does not support PMEM64, degrade PMEM64 to PMEM32\r
+    //\r
+    if (!BridgeSupportResourceDecode (Bridge, EFI_BRIDGE_PMEM64_DECODE_SUPPORTED)) {\r
       MergeResourceTree (\r
         PMem32Node,\r
         PMem64Node,\r
         TRUE\r
         );\r
-    }\r
-  }\r
+    } \r
 \r
-\r
-  //\r
-  // If bridge doesn't support Mem64\r
-  // degrade it to mem32\r
-  //\r
-  if (!BridgeSupportResourceDecode (Bridge, EFI_BRIDGE_MEM64_DECODE_SUPPORTED)) {\r
-    MergeResourceTree (\r
-      Mem32Node,\r
-      Mem64Node,\r
-      TRUE\r
-      );\r
+    //\r
+    // if both PMEM64 and PMEM32 requests from child devices, which can not be satisfied\r
+    // by a P2P bridge simultaneously, keep PMEM64 and degrade PMEM32 to MEM32.\r
+    //\r
+    if (!IsListEmpty (&PMem64Node->ChildList) && Bridge->Parent != NULL) {\r
+      MergeResourceTree (\r
+        Mem32Node,\r
+        PMem32Node,\r
+        TRUE\r
+        );\r
+    }\r
   }\r
 \r
   //\r
@@ -1119,7 +1154,7 @@ DegradeResource (
   }\r
 \r
   //\r
-  // if bridge supports combined Pmem Mem decoding\r
+  // if root bridge supports combined Pmem Mem decoding\r
   // merge these two type of resource\r
   //\r
   if (BridgeSupportResourceDecode (Bridge, EFI_BRIDGE_PMEM_MEM_COMBINE_SUPPORTED)) {\r
@@ -1129,6 +1164,11 @@ DegradeResource (
       FALSE\r
       );\r
 \r
+    //\r
+    // No need to check if to degrade MEM64 after merge, because\r
+    // if there are PMEM64 still here, 64-bit decode should be supported\r
+    // by the root bride.\r
+    //\r
     MergeResourceTree (\r
       Mem64Node,\r
       PMem64Node,\r