1*f439973dSWarner Losh /** @file 2*f439973dSWarner Losh The firmware volume related definitions in PI. 3*f439973dSWarner Losh 4*f439973dSWarner Losh Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR> 5*f439973dSWarner Losh SPDX-License-Identifier: BSD-2-Clause-Patent 6*f439973dSWarner Losh 7*f439973dSWarner Losh @par Revision Reference: 8*f439973dSWarner Losh PI Version 1.6 9*f439973dSWarner Losh 10*f439973dSWarner Losh **/ 11*f439973dSWarner Losh 12*f439973dSWarner Losh #ifndef __PI_FIRMWAREVOLUME_H__ 13*f439973dSWarner Losh #define __PI_FIRMWAREVOLUME_H__ 14*f439973dSWarner Losh 15*f439973dSWarner Losh /// 16*f439973dSWarner Losh /// EFI_FV_FILE_ATTRIBUTES 17*f439973dSWarner Losh /// 18*f439973dSWarner Losh typedef UINT32 EFI_FV_FILE_ATTRIBUTES; 19*f439973dSWarner Losh 20*f439973dSWarner Losh // 21*f439973dSWarner Losh // Value of EFI_FV_FILE_ATTRIBUTES. 22*f439973dSWarner Losh // 23*f439973dSWarner Losh #define EFI_FV_FILE_ATTRIB_ALIGNMENT 0x0000001F 24*f439973dSWarner Losh #define EFI_FV_FILE_ATTRIB_FIXED 0x00000100 25*f439973dSWarner Losh #define EFI_FV_FILE_ATTRIB_MEMORY_MAPPED 0x00000200 26*f439973dSWarner Losh 27*f439973dSWarner Losh /// 28*f439973dSWarner Losh /// type of EFI FVB attribute 29*f439973dSWarner Losh /// 30*f439973dSWarner Losh typedef UINT32 EFI_FVB_ATTRIBUTES_2; 31*f439973dSWarner Losh 32*f439973dSWarner Losh // 33*f439973dSWarner Losh // Attributes bit definitions 34*f439973dSWarner Losh // 35*f439973dSWarner Losh #define EFI_FVB2_READ_DISABLED_CAP 0x00000001 36*f439973dSWarner Losh #define EFI_FVB2_READ_ENABLED_CAP 0x00000002 37*f439973dSWarner Losh #define EFI_FVB2_READ_STATUS 0x00000004 38*f439973dSWarner Losh #define EFI_FVB2_WRITE_DISABLED_CAP 0x00000008 39*f439973dSWarner Losh #define EFI_FVB2_WRITE_ENABLED_CAP 0x00000010 40*f439973dSWarner Losh #define EFI_FVB2_WRITE_STATUS 0x00000020 41*f439973dSWarner Losh #define EFI_FVB2_LOCK_CAP 0x00000040 42*f439973dSWarner Losh #define EFI_FVB2_LOCK_STATUS 0x00000080 43*f439973dSWarner Losh #define EFI_FVB2_STICKY_WRITE 0x00000200 44*f439973dSWarner Losh #define EFI_FVB2_MEMORY_MAPPED 0x00000400 45*f439973dSWarner Losh #define EFI_FVB2_ERASE_POLARITY 0x00000800 46*f439973dSWarner Losh #define EFI_FVB2_READ_LOCK_CAP 0x00001000 47*f439973dSWarner Losh #define EFI_FVB2_READ_LOCK_STATUS 0x00002000 48*f439973dSWarner Losh #define EFI_FVB2_WRITE_LOCK_CAP 0x00004000 49*f439973dSWarner Losh #define EFI_FVB2_WRITE_LOCK_STATUS 0x00008000 50*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT 0x001F0000 51*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_1 0x00000000 52*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_2 0x00010000 53*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_4 0x00020000 54*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_8 0x00030000 55*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_16 0x00040000 56*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_32 0x00050000 57*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_64 0x00060000 58*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_128 0x00070000 59*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_256 0x00080000 60*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_512 0x00090000 61*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_1K 0x000A0000 62*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_2K 0x000B0000 63*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_4K 0x000C0000 64*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_8K 0x000D0000 65*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_16K 0x000E0000 66*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_32K 0x000F0000 67*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_64K 0x00100000 68*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_128K 0x00110000 69*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_256K 0x00120000 70*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_512K 0x00130000 71*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_1M 0x00140000 72*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_2M 0x00150000 73*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_4M 0x00160000 74*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_8M 0x00170000 75*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_16M 0x00180000 76*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_32M 0x00190000 77*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_64M 0x001A0000 78*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_128M 0x001B0000 79*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_256M 0x001C0000 80*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_512M 0x001D0000 81*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_1G 0x001E0000 82*f439973dSWarner Losh #define EFI_FVB2_ALIGNMENT_2G 0x001F0000 83*f439973dSWarner Losh #define EFI_FVB2_WEAK_ALIGNMENT 0x80000000 84*f439973dSWarner Losh 85*f439973dSWarner Losh typedef struct { 86*f439973dSWarner Losh /// 87*f439973dSWarner Losh /// The number of sequential blocks which are of the same size. 88*f439973dSWarner Losh /// 89*f439973dSWarner Losh UINT32 NumBlocks; 90*f439973dSWarner Losh /// 91*f439973dSWarner Losh /// The size of the blocks. 92*f439973dSWarner Losh /// 93*f439973dSWarner Losh UINT32 Length; 94*f439973dSWarner Losh } EFI_FV_BLOCK_MAP_ENTRY; 95*f439973dSWarner Losh 96*f439973dSWarner Losh /// 97*f439973dSWarner Losh /// Describes the features and layout of the firmware volume. 98*f439973dSWarner Losh /// 99*f439973dSWarner Losh typedef struct { 100*f439973dSWarner Losh /// 101*f439973dSWarner Losh /// The first 16 bytes are reserved to allow for the reset vector of 102*f439973dSWarner Losh /// processors whose reset vector is at address 0. 103*f439973dSWarner Losh /// 104*f439973dSWarner Losh UINT8 ZeroVector[16]; 105*f439973dSWarner Losh /// 106*f439973dSWarner Losh /// Declares the file system with which the firmware volume is formatted. 107*f439973dSWarner Losh /// 108*f439973dSWarner Losh EFI_GUID FileSystemGuid; 109*f439973dSWarner Losh /// 110*f439973dSWarner Losh /// Length in bytes of the complete firmware volume, including the header. 111*f439973dSWarner Losh /// 112*f439973dSWarner Losh UINT64 FvLength; 113*f439973dSWarner Losh /// 114*f439973dSWarner Losh /// Set to EFI_FVH_SIGNATURE 115*f439973dSWarner Losh /// 116*f439973dSWarner Losh UINT32 Signature; 117*f439973dSWarner Losh /// 118*f439973dSWarner Losh /// Declares capabilities and power-on defaults for the firmware volume. 119*f439973dSWarner Losh /// 120*f439973dSWarner Losh EFI_FVB_ATTRIBUTES_2 Attributes; 121*f439973dSWarner Losh /// 122*f439973dSWarner Losh /// Length in bytes of the complete firmware volume header. 123*f439973dSWarner Losh /// 124*f439973dSWarner Losh UINT16 HeaderLength; 125*f439973dSWarner Losh /// 126*f439973dSWarner Losh /// A 16-bit checksum of the firmware volume header. A valid header sums to zero. 127*f439973dSWarner Losh /// 128*f439973dSWarner Losh UINT16 Checksum; 129*f439973dSWarner Losh /// 130*f439973dSWarner Losh /// Offset, relative to the start of the header, of the extended header 131*f439973dSWarner Losh /// (EFI_FIRMWARE_VOLUME_EXT_HEADER) or zero if there is no extended header. 132*f439973dSWarner Losh /// 133*f439973dSWarner Losh UINT16 ExtHeaderOffset; 134*f439973dSWarner Losh /// 135*f439973dSWarner Losh /// This field must always be set to zero. 136*f439973dSWarner Losh /// 137*f439973dSWarner Losh UINT8 Reserved[1]; 138*f439973dSWarner Losh /// 139*f439973dSWarner Losh /// Set to 2. Future versions of this specification may define new header fields and will 140*f439973dSWarner Losh /// increment the Revision field accordingly. 141*f439973dSWarner Losh /// 142*f439973dSWarner Losh UINT8 Revision; 143*f439973dSWarner Losh /// 144*f439973dSWarner Losh /// An array of run-length encoded FvBlockMapEntry structures. The array is 145*f439973dSWarner Losh /// terminated with an entry of {0,0}. 146*f439973dSWarner Losh /// 147*f439973dSWarner Losh EFI_FV_BLOCK_MAP_ENTRY BlockMap[1]; 148*f439973dSWarner Losh } EFI_FIRMWARE_VOLUME_HEADER; 149*f439973dSWarner Losh 150*f439973dSWarner Losh #define EFI_FVH_SIGNATURE SIGNATURE_32 ('_', 'F', 'V', 'H') 151*f439973dSWarner Losh 152*f439973dSWarner Losh /// 153*f439973dSWarner Losh /// Firmware Volume Header Revision definition 154*f439973dSWarner Losh /// 155*f439973dSWarner Losh #define EFI_FVH_REVISION 0x02 156*f439973dSWarner Losh 157*f439973dSWarner Losh /// 158*f439973dSWarner Losh /// Extension header pointed by ExtHeaderOffset of volume header. 159*f439973dSWarner Losh /// 160*f439973dSWarner Losh typedef struct { 161*f439973dSWarner Losh /// 162*f439973dSWarner Losh /// Firmware volume name. 163*f439973dSWarner Losh /// 164*f439973dSWarner Losh EFI_GUID FvName; 165*f439973dSWarner Losh /// 166*f439973dSWarner Losh /// Size of the rest of the extension header, including this structure. 167*f439973dSWarner Losh /// 168*f439973dSWarner Losh UINT32 ExtHeaderSize; 169*f439973dSWarner Losh } EFI_FIRMWARE_VOLUME_EXT_HEADER; 170*f439973dSWarner Losh 171*f439973dSWarner Losh /// 172*f439973dSWarner Losh /// Entry struture for describing FV extension header 173*f439973dSWarner Losh /// 174*f439973dSWarner Losh typedef struct { 175*f439973dSWarner Losh /// 176*f439973dSWarner Losh /// Size of this header extension. 177*f439973dSWarner Losh /// 178*f439973dSWarner Losh UINT16 ExtEntrySize; 179*f439973dSWarner Losh /// 180*f439973dSWarner Losh /// Type of the header. 181*f439973dSWarner Losh /// 182*f439973dSWarner Losh UINT16 ExtEntryType; 183*f439973dSWarner Losh } EFI_FIRMWARE_VOLUME_EXT_ENTRY; 184*f439973dSWarner Losh 185*f439973dSWarner Losh #define EFI_FV_EXT_TYPE_OEM_TYPE 0x01 186*f439973dSWarner Losh /// 187*f439973dSWarner Losh /// This extension header provides a mapping between a GUID and an OEM file type. 188*f439973dSWarner Losh /// 189*f439973dSWarner Losh typedef struct { 190*f439973dSWarner Losh /// 191*f439973dSWarner Losh /// Standard extension entry, with the type EFI_FV_EXT_TYPE_OEM_TYPE. 192*f439973dSWarner Losh /// 193*f439973dSWarner Losh EFI_FIRMWARE_VOLUME_EXT_ENTRY Hdr; 194*f439973dSWarner Losh /// 195*f439973dSWarner Losh /// A bit mask, one bit for each file type between 0xC0 (bit 0) and 0xDF (bit 31). If a bit 196*f439973dSWarner Losh /// is '1', then the GUID entry exists in Types. If a bit is '0' then no GUID entry exists in Types. 197*f439973dSWarner Losh /// 198*f439973dSWarner Losh UINT32 TypeMask; 199*f439973dSWarner Losh /// 200*f439973dSWarner Losh /// An array of GUIDs, each GUID representing an OEM file type. 201*f439973dSWarner Losh /// 202*f439973dSWarner Losh /// EFI_GUID Types[1]; 203*f439973dSWarner Losh /// 204*f439973dSWarner Losh } EFI_FIRMWARE_VOLUME_EXT_ENTRY_OEM_TYPE; 205*f439973dSWarner Losh 206*f439973dSWarner Losh #define EFI_FV_EXT_TYPE_GUID_TYPE 0x0002 207*f439973dSWarner Losh 208*f439973dSWarner Losh /// 209*f439973dSWarner Losh /// This extension header EFI_FIRMWARE_VOLUME_EXT_ENTRY_GUID_TYPE provides a vendor specific 210*f439973dSWarner Losh /// GUID FormatType type which includes a length and a successive series of data bytes. 211*f439973dSWarner Losh /// 212*f439973dSWarner Losh typedef struct { 213*f439973dSWarner Losh /// 214*f439973dSWarner Losh /// Standard extension entry, with the type EFI_FV_EXT_TYPE_OEM_TYPE. 215*f439973dSWarner Losh /// 216*f439973dSWarner Losh EFI_FIRMWARE_VOLUME_EXT_ENTRY Hdr; 217*f439973dSWarner Losh /// 218*f439973dSWarner Losh /// Vendor-specific GUID. 219*f439973dSWarner Losh /// 220*f439973dSWarner Losh EFI_GUID FormatType; 221*f439973dSWarner Losh /// 222*f439973dSWarner Losh /// An arry of bytes of length Length. 223*f439973dSWarner Losh /// 224*f439973dSWarner Losh /// UINT8 Data[1]; 225*f439973dSWarner Losh /// 226*f439973dSWarner Losh } EFI_FIRMWARE_VOLUME_EXT_ENTRY_GUID_TYPE; 227*f439973dSWarner Losh 228*f439973dSWarner Losh #define EFI_FV_EXT_TYPE_USED_SIZE_TYPE 0x03 229*f439973dSWarner Losh 230*f439973dSWarner Losh /// 231*f439973dSWarner Losh /// The EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE can be used to find 232*f439973dSWarner Losh /// out how many EFI_FVB2_ERASE_POLARITY bytes are at the end of the FV. 233*f439973dSWarner Losh /// 234*f439973dSWarner Losh typedef struct { 235*f439973dSWarner Losh /// 236*f439973dSWarner Losh /// Standard extension entry, with the type EFI_FV_EXT_TYPE_USED_SIZE_TYPE. 237*f439973dSWarner Losh /// 238*f439973dSWarner Losh EFI_FIRMWARE_VOLUME_EXT_ENTRY Hdr; 239*f439973dSWarner Losh /// 240*f439973dSWarner Losh /// The number of bytes of the FV that are in uses. The remaining 241*f439973dSWarner Losh /// EFI_FIRMWARE_VOLUME_HEADER FvLength minus UsedSize bytes in 242*f439973dSWarner Losh /// the FV must contain the value implied by EFI_FVB2_ERASE_POLARITY. 243*f439973dSWarner Losh /// 244*f439973dSWarner Losh UINT32 UsedSize; 245*f439973dSWarner Losh } EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE; 246*f439973dSWarner Losh 247*f439973dSWarner Losh #endif 248