--- /dev/null
+/*++\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
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
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
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
(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
\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
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
\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