| /* SPDX-License-Identifier: Intel */ |
| /* |
| * Copyright (C) 2013, Intel Corporation |
| * Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com> |
| */ |
| |
| #ifndef __FSP_FFS_H__ |
| #define __FSP_FFS_H__ |
| |
| /* Used to verify the integrity of the file */ |
| union __packed ffs_integrity { |
| struct { |
| /* |
| * The IntegrityCheck.checksum.header field is an 8-bit |
| * checksum of the file header. The State and |
| * IntegrityCheck.checksum.file fields are assumed to be zero |
| * and the checksum is calculated such that the entire header |
| * sums to zero. |
| */ |
| u8 header; |
| /* |
| * If the FFS_ATTRIB_CHECKSUM (see definition below) bit of |
| * the Attributes field is set to one, the |
| * IntegrityCheck.checksum.file field is an 8-bit checksum of |
| * the file data. If the FFS_ATTRIB_CHECKSUM bit of the |
| * Attributes field is cleared to zero, the |
| * IntegrityCheck.checksum.file field must be initialized with |
| * a value of 0xAA. The IntegrityCheck.checksum.file field is |
| * valid any time the EFI_FILE_DATA_VALID bit is set in the |
| * State field. |
| */ |
| u8 file; |
| } checksum; |
| |
| /* This is the full 16 bits of the IntegrityCheck field */ |
| u16 checksum16; |
| }; |
| |
| /* |
| * Each file begins with the header that describe the |
| * contents and state of the files. |
| */ |
| struct __packed ffs_file_header { |
| /* |
| * This GUID is the file name. |
| * It is used to uniquely identify the file. |
| */ |
| struct efi_guid name; |
| /* Used to verify the integrity of the file */ |
| union ffs_integrity integrity; |
| /* Identifies the type of file */ |
| u8 type; |
| /* Declares various file attribute bits */ |
| u8 attr; |
| /* The length of the file in bytes, including the FFS header */ |
| u8 size[3]; |
| /* |
| * Used to track the state of the file throughout the life of |
| * the file from creation to deletion. |
| */ |
| u8 state; |
| }; |
| |
| struct __packed ffs_file_header2 { |
| /* |
| * This GUID is the file name. It is used to uniquely identify the file. |
| * There may be only one instance of a file with the file name GUID of |
| * Name in any given firmware volume, except if the file type is |
| * EFI_FV_FILE_TYPE_FFS_PAD. |
| */ |
| struct efi_guid name; |
| /* Used to verify the integrity of the file */ |
| union ffs_integrity integrity; |
| /* Identifies the type of file */ |
| u8 type; |
| /* Declares various file attribute bits */ |
| u8 attr; |
| /* |
| * The length of the file in bytes, including the FFS header. |
| * The length of the file data is either |
| * (size - sizeof(struct ffs_file_header)). This calculation means a |
| * zero-length file has a size of 24 bytes, which is |
| * sizeof(struct ffs_file_header). Size is not required to be a |
| * multiple of 8 bytes. Given a file F, the next file header is located |
| * at the next 8-byte aligned firmware volume offset following the last |
| * byte of the file F. |
| */ |
| u8 size[3]; |
| /* |
| * Used to track the state of the file throughout the life of |
| * the file from creation to deletion. |
| */ |
| u8 state; |
| /* |
| * If FFS_ATTRIB_LARGE_FILE is set in attr, then ext_size exists |
| * and size must be set to zero. |
| * If FFS_ATTRIB_LARGE_FILE is not set then |
| * struct ffs_file_header is used. |
| */ |
| u32 ext_size; |
| }; |
| |
| /* |
| * Pseudo type. It is used as a wild card when retrieving sections. |
| * The section type EFI_SECTION_ALL matches all section types. |
| */ |
| #define EFI_SECTION_ALL 0x00 |
| |
| /* Encapsulation section Type values */ |
| #define EFI_SECTION_COMPRESSION 0x01 |
| #define EFI_SECTION_GUID_DEFINED 0x02 |
| #define EFI_SECTION_DISPOSABLE 0x03 |
| |
| /* Leaf section Type values */ |
| #define EFI_SECTION_PE32 0x10 |
| #define EFI_SECTION_PIC 0x11 |
| #define EFI_SECTION_TE 0x12 |
| #define EFI_SECTION_DXE_DEPEX 0x13 |
| #define EFI_SECTION_VERSION 0x14 |
| #define EFI_SECTION_USER_INTERFACE 0x15 |
| #define EFI_SECTION_COMPATIBILITY16 0x16 |
| #define EFI_SECTION_FIRMWARE_VOLUME_IMAGE 0x17 |
| #define EFI_SECTION_FREEFORM_SUBTYPE_GUID 0x18 |
| #define EFI_SECTION_RAW 0x19 |
| #define EFI_SECTION_PEI_DEPEX 0x1B |
| #define EFI_SECTION_SMM_DEPEX 0x1C |
| |
| /* Common section header */ |
| struct __packed raw_section { |
| /* |
| * A 24-bit unsigned integer that contains the total size of |
| * the section in bytes, including the EFI_COMMON_SECTION_HEADER. |
| */ |
| u8 size[3]; |
| u8 type; |
| }; |
| |
| struct __packed raw_section2 { |
| /* |
| * A 24-bit unsigned integer that contains the total size of |
| * the section in bytes, including the EFI_COMMON_SECTION_HEADER. |
| */ |
| u8 size[3]; |
| u8 type; |
| /* |
| * If size is 0xFFFFFF, then ext_size contains the size of |
| * the section. If size is not equal to 0xFFFFFF, then this |
| * field does not exist. |
| */ |
| u32 ext_size; |
| }; |
| |
| #endif |