1. Capsule Layout is below:
+------------------------------------------+
| Capsule Header (OPTIONAL, WFU) | <== ESRT.FwClass (Optional)
+------------------------------------------+
| FMP Capsule Header | <== EFI_FIRMWARE_MANAGEMENT_CAPSULE_ID_GUID
+------------------------------------------+
| FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER | <== PcdSystemFmpCapsuleImageTypeIdGuid
+------------------------------------------+
| EFI_FIRMWARE_IMAGE_AUTHENTICATION |
+------------------------------------------+
| FMP Payload |
+------------------------------------------+
2. System FMP Payload is below:
+------------------------------------------+
| EFI_FIRMWARE_VOLUME |
| +------------------------------------+ |
| | FFS (Configure File) | | <== gEdkiiSystemFmpCapsuleConfigFileGuid
| +------------------------------------+ |
| | FFS (Driver FV) | | <== gEdkiiSystemFmpCapsuleDriverFvFileGuid
| +------------------------------------+ |
| | FFS (System Firmware Image) | | <== PcdEdkiiSystemFirmwareFileGuid
| | +------------------------------+ | |
| | | FV Recovery | | |
| | |------------------------------| | |
| | | FV Main | | |
| | +------------------------------+ | |
| +------------------------------------+ |
+------------------------------------------+
NOTE: There might be multiple FFS (System Firmware Image) exist in the System FMP Capsule.
Only the one, whose FFS GUID matches PcdEdkiiSystemFirmwareFileGuid, takes effect.
The other FFS is ignored.
3. The format of the recovery configuration is below:
[Head]
NumOfRecovery = <Num> # Decimal
Recovery0 = <Name1> # String
Recovery1 = <Name2> # String
Recovery<Num-1> = <NameX> # String
[Name?]
Length = <Length> # Fv Length (HEX)
ImageOffset = <ImageOffset> # Fv offset of this SystemFirmware image (HEX)
FileGuid = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX # PcdEdkiiSystemFirmwareFileGuid
NOTE: The [Name?] entry may have different FileGuid.
Only the one, whose FileGuid matches PcdEdkiiSystemFirmwareFileGuid, takes effect.
The other entry is ignored.
4. The format of the capsule update configuration is below:
[Head]
NumOfUpdate = <Num> # Decimal
Update0 = <Name1> # String
Update1 = <Name2> # String
Update<Num-1> = <NameX> # String
[Name?]
FirmwareType = 0 # 0 - SystemFirmware, 1 - NvRam
AddressType = 0 # 0 - relative address, 1 - absolute address.
BaseAddress = <BaseAddress> # Base address offset on flash (HEX)
Length = <Length> # Image Length (HEX)
ImageOffset = <ImageOffset> # Image offset of this SystemFirmware image (HEX)
FileGuid = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX # PcdEdkiiSystemFirmwareFileGuid
NOTE: The [Name?] entry may have different FileGuid.
Only the one, whose FileGuid matches PcdEdkiiSystemFirmwareFileGuid, takes effect.
The other entry is ignored.