Add CapsuleInfo guid to store the list of capsule image guid.
authorlgao4 <lgao4@de2fecce-e211-0410-80a6-f3fac2684e05>
Fri, 16 Nov 2007 10:14:34 +0000 (10:14 +0000)
committerlgao4 <lgao4@de2fecce-e211-0410-80a6-f3fac2684e05>
Fri, 16 Nov 2007 10:14:34 +0000 (10:14 +0000)
git-svn-id: https://edk2.tianocore.org/svn/edk2/trunk@4299 de2fecce-e211-0410-80a6-f3fac2684e05

edk2/MdeModulePkg/Include/Guid/CapsuleInfo.h [new file with mode: 0644]
edk2/MdeModulePkg/Include/Protocol/Capsule.h
edk2/MdeModulePkg/MdeModulePkg.dec
edk2/MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleService.c

diff --git a/edk2/MdeModulePkg/Include/Guid/CapsuleInfo.h b/edk2/MdeModulePkg/Include/Guid/CapsuleInfo.h
new file mode 100644 (file)
index 0000000..66c7838
--- /dev/null
@@ -0,0 +1,45 @@
+/*++\r
+\r
+Copyright (c) 2006 - 2007, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+  CapsuleVendor.h\r
+\r
+Abstract:\r
+\r
+  Capsule update Guid definitions\r
+\r
+--*/\r
+\r
+#ifndef __EFI_CAPSULE_INFO_GUID_H__\r
+#define __EFI_CAPSULE_INFO_GUID_H__\r
+\r
+typedef struct {\r
+  UINT32   CapsuleArrayNumber;\r
+  VOID*    CapsulePtr[1];\r
+} EFI_CAPSULE_TABLE;\r
+\r
+typedef struct {\r
+  UINT32      CapsuleGuidNumber;\r
+  EFI_GUID    CapsuleGuidPtr[1];\r
+} EFI_CAPSULE_INFO_TABLE;\r
+\r
+//\r
+// This GUID is used for collecting all capsules' Guids who install in ConfigTable.\r
+//\r
+#define EFI_CAPSULE_INFO_GUID \\r
+  { \\r
+    0x8B34EAC7, 0x2690, 0x460B, { 0x8B, 0xA5, 0xD5, 0xCF, 0x32, 0x83, 0x17, 0x35 } \\r
+  }\r
+\r
+extern EFI_GUID gEfiCapsuleInfoGuid;\r
+\r
+#endif // #ifndef _EFI_CAPSULE_INFO_GUID_H_\r
index 1af0b65..aeeb903 100644 (file)
@@ -30,10 +30,4 @@ Abstract:
 \r
 extern EFI_GUID gEfiCapsuleArchProtocolGuid;\r
 \r
-typedef struct {\r
-  UINT32   CapsuleArrayNumber;\r
-  VOID*    CapsulePtr[1];\r
-} EFI_CAPSULE_TABLE;\r
-\r
-\r
 #endif\r
index a4a74cb..6650bc0 100644 (file)
@@ -64,8 +64,8 @@
   gEfiStandardErrorDeviceGuid    = { 0xD3B36F2D, 0xD551, 0x11D4, { 0x9A, 0x46, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}\r
   gEfiPeiPeCoffLoaderGuid        = { 0xD8117CFF, 0x94A6, 0x11D4, { 0x9A, 0x3A, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}\r
   gEfiVariableInfoGuid           = { 0xddcf3616, 0x3275, 0x4164, { 0x98, 0xb6, 0xfe, 0x85, 0x70, 0x7f, 0xfe, 0x7d }}\r
-  gSimpleTextInExNotifyGuid      = { 0x856f2def, 0x4e93, 0x4d6b, { 0x94, 0xce, 0x1c, 0xfe, 0x47, 0x1, 0x3e, 0xa5 }}\r
-\r
+  gSimpleTextInExNotifyGuid      = { 0x856f2def, 0x4e93, 0x4d6b, { 0x94, 0xce, 0x1c, 0xfe, 0x47, 0x01, 0x3e, 0xa5 }}\r
+  gEfiCapsuleInfoGuid            = { 0x8B34EAC7, 0x2690, 0x460B, { 0x8B, 0xA5, 0xD5, 0xCF, 0x32, 0x83, 0x17, 0x35 }}\r
 \r
 [Protocols.common]\r
 \r
index 5a923cd..e74a591 100644 (file)
@@ -66,15 +66,26 @@ Returns:
   CapsuleHeader   = NULL;\r
 \r
   for (ArrayNumber = 0; ArrayNumber < CapsuleCount; ArrayNumber++) {\r
+    //\r
+    // A capsule which has the CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE flag must have\r
+    // CAPSULE_FLAGS_PERSIST_ACROSS_RESET set in its header as well.\r
+    //\r
     CapsuleHeader = CapsuleHeaderArray[ArrayNumber];\r
     if ((CapsuleHeader->Flags & (CAPSULE_FLAGS_PERSIST_ACROSS_RESET | CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE)) == CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-    if ((CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) == 0) {\r
-      return EFI_UNSUPPORTED;\r
-    }\r
+    //\r
+    // To remove this check. Capsule update supports non reset image.\r
+    // \r
+    //    if ((CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) == 0) {\r
+    //      return EFI_UNSUPPORTED;\r
+    //    }\r
   }\r
 \r
+  //\r
+  // Check capsule guid is suppored by this platform. To do\r
+  //\r
+\r
   //\r
   //Assume that capsules have the same flags on reseting or not.\r
   //\r
@@ -87,10 +98,18 @@ Returns:
     if (!FeaturePcdGet(PcdSupportUpdateCapsuleRest)) {\r
       return EFI_UNSUPPORTED;\r
     }\r
-\r
-    if (ScatterGatherList == 0) {\r
+    //\r
+    // ScatterGatherList is only referenced if the capsules are defined to persist across\r
+    // system reset. \r
+    //\r
+    if (ScatterGatherList == (EFI_PHYSICAL_ADDRESS) NULL) {\r
       return EFI_INVALID_PARAMETER;\r
     } else {\r
+      //\r
+      // ScatterGatherList is only referenced if the capsules are defined to persist across\r
+      // system reset. Set its value into NV storage to let pre-boot driver to pick it up \r
+      // after coming through a system reset.\r
+      //\r
       Status = EfiSetVariable (\r
                  EFI_CAPSULE_VARIABLE_NAME,\r
                  &gEfiCapsuleVendorGuid,\r
@@ -99,21 +118,23 @@ Returns:
                  (VOID *) &ScatterGatherList\r
                  );\r
       if (Status != EFI_SUCCESS) {\r
-        return EFI_DEVICE_ERROR;\r
+        return Status;\r
       }\r
     }\r
     return EFI_SUCCESS;\r
   }\r
 \r
   //\r
-  //The rest occurs in the condition of non-reset mode\r
+  // The rest occurs in the condition of non-reset mode\r
+  // Current Runtime mode doesn't support the non-reset capsule image.\r
   //\r
   if (EfiAtRuntime ()) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   //\r
-  //Here should be in the boot-time\r
+  // Here should be in the boot-time for non-reset capsule image\r
+  // Default process to Update Capsule image into Flash for any guid image.\r
   //\r
   for (ArrayNumber = 0; ArrayNumber < CapsuleCount ; ArrayNumber++) {\r
     CapsuleHeader = CapsuleHeaderArray[ArrayNumber];\r
@@ -121,7 +142,7 @@ Returns:
 \r
     BufferPtr = AllocatePool (CapsuleSize);\r
     if (BufferPtr == NULL) {\r
-      return EFI_DEVICE_ERROR;\r
+      return EFI_OUT_OF_RESOURCES;\r
     }\r
 \r
     CopyMem (BufferPtr, (UINT8*)CapsuleHeader+ CapsuleHeader->HeaderSize, CapsuleSize);\r
@@ -132,7 +153,7 @@ Returns:
     Status = gDS->ProcessFirmwareVolume (BufferPtr, CapsuleSize, &FvHandle);\r
     if (Status != EFI_SUCCESS) {\r
       FreePool (BufferPtr);\r
-      return EFI_DEVICE_ERROR;\r
+      return Status;\r
     }\r
     gDS->Dispatch ();\r
     FreePool (BufferPtr);\r
@@ -189,12 +210,19 @@ Returns:
 \r
   for (ArrayNumber = 0; ArrayNumber < CapsuleCount; ArrayNumber++) {\r
     CapsuleHeader = CapsuleHeaderArray[ArrayNumber];\r
+    //\r
+    // A capsule which has the CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE flag must have\r
+    // CAPSULE_FLAGS_PERSIST_ACROSS_RESET set in its header as well.\r
+    //\r
     if ((CapsuleHeader->Flags & (CAPSULE_FLAGS_PERSIST_ACROSS_RESET | CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE)) == CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-    if ((CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) == 0) {\r
-      return EFI_UNSUPPORTED;\r
-    }\r
+    //\r
+    // To remove this check. Capsule update supports non reset image.\r
+    // \r
+    //    if ((CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) == 0) {\r
+    //      return EFI_UNSUPPORTED;\r
+    //    }\r
   }\r
 \r
   //\r