]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update QueryCapsuleCapabilities interface.
authorli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 19 May 2010 02:31:41 +0000 (02:31 +0000)
committerli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 19 May 2010 02:31:41 +0000 (02:31 +0000)
1. Check all capsules to decide reset type instead of only checking the first capsule.
2. One purpose of MaxiumCapsuleSize is to ensure platform memory size is enough to handle capsule with reset type in PEI. Max capsule size should be returned for with/without reset flag cases.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10514 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/MdeModulePkg.dec
MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleService.c

index 9d0262e20cbc23b00370a6bea96af5b2b483e816..acc773e92880bd1b4946a048e13489c081e6bee5 100644 (file)
   #  This PCD is a sample to explain FixedAtBuild UINT32 PCD usage.\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdHelloWorldPrintTimes|1|UINT32|0x40000005\r
 \r
-  ## Indicate the max size of the populated capsule image that the platform can support.\r
+  ## Indicate the max size of the capsule image with reset flag that the platform can support.\r
   #  The default max size is 100MB (0x6400000) for more than one large capsule images.\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxSizePopulateCapsule|0x6400000|UINT32|0x0001001e\r
 \r
-  ## Indicate the max size of the non-populated capsule image that the platform can support.\r
-  #  The default max size is 10MB (0xa00000) for the casule image without populated flag setting.\r
+  ## Indicate the max size of the capsule image without reset flag that the platform can support.\r
+  #  The default max size is 10MB (0xa00000) for the casule image without reset flag setting.\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdMaxSizeNonPopulateCapsule|0xa00000|UINT32|0x0001001f\r
 \r
   ## Null-terminated Unicode string of the firmware vendor name that is default name filled into the EFI System Table\r
index a3b53262ef3a29f702f724ac75f698813d9082c3..76b2a2a8fcc525c8a9794573220152ed00e05bf8 100644 (file)
@@ -238,6 +238,7 @@ QueryCapsuleCapabilities (
 {\r
   UINTN                     ArrayNumber;\r
   EFI_CAPSULE_HEADER        *CapsuleHeader;\r
+  BOOLEAN                   NeedReset;\r
 \r
   //\r
   // Capsule Count can't be less than one.\r
@@ -254,6 +255,7 @@ QueryCapsuleCapabilities (
   }\r
 \r
   CapsuleHeader = NULL;\r
+  NeedReset     = FALSE;\r
 \r
   for (ArrayNumber = 0; ArrayNumber < CapsuleCount; ArrayNumber++) {\r
     CapsuleHeader = CapsuleHeaderArray[ArrayNumber];\r
@@ -281,31 +283,31 @@ QueryCapsuleCapabilities (
   }\r
 \r
   //\r
-  // Assume that capsules have the same flags on reseting or not.\r
+  // Find out whether there is any capsule defined to persist across system reset. \r
   //\r
-  CapsuleHeader = CapsuleHeaderArray[0];\r
-  if ((CapsuleHeader->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0) {\r
+  for (ArrayNumber = 0; ArrayNumber < CapsuleCount ; ArrayNumber++) {\r
+    CapsuleHeader = CapsuleHeaderArray[ArrayNumber];\r
+    if ((CapsuleHeader->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0) {\r
+      NeedReset = TRUE;\r
+      break;\r
+    }\r
+  }\r
+  \r
+  if (NeedReset) {\r
     //\r
     //Check if the platform supports update capsule across a system reset\r
     //\r
     if (!FeaturePcdGet(PcdSupportUpdateCapsuleReset)) {\r
       return EFI_UNSUPPORTED;\r
     }\r
-    *ResetType = EfiResetWarm;   \r
+    *ResetType = EfiResetWarm;\r
+    *MaxiumCapsuleSize = FixedPcdGet32(PcdMaxSizePopulateCapsule);\r
   } else {\r
     //\r
     // For non-reset capsule image.\r
     //\r
     *ResetType = EfiResetCold;\r
-  }\r
-  \r
-  //\r
-  // The support max capsule image size\r
-  //\r
-  if ((CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) != 0) {\r
-    *MaxiumCapsuleSize = PcdGet32(PcdMaxSizePopulateCapsule);\r
-  } else {\r
-    *MaxiumCapsuleSize = PcdGet32(PcdMaxSizeNonPopulateCapsule);\r
+    *MaxiumCapsuleSize = FixedPcdGet32(PcdMaxSizeNonPopulateCapsule);\r
   }\r
 \r
   return EFI_SUCCESS;\r