1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2013, Intel Corporation 3*4882a593Smuzhiyun * Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com> 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: Intel 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __FSP_FV___ 9*4882a593Smuzhiyun #define __FSP_FV___ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* Value of EFI_FV_FILE_ATTRIBUTES */ 12*4882a593Smuzhiyun #define EFI_FV_FILE_ATTR_ALIGNMENT 0x0000001F 13*4882a593Smuzhiyun #define EFI_FV_FILE_ATTR_FIXED 0x00000100 14*4882a593Smuzhiyun #define EFI_FV_FILE_ATTR_MEMORY_MAPPED 0x00000200 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* Attributes bit definitions */ 17*4882a593Smuzhiyun #define EFI_FVB2_READ_DISABLED_CAP 0x00000001 18*4882a593Smuzhiyun #define EFI_FVB2_READ_ENABLED_CAP 0x00000002 19*4882a593Smuzhiyun #define EFI_FVB2_READ_STATUS 0x00000004 20*4882a593Smuzhiyun #define EFI_FVB2_WRITE_DISABLED_CAP 0x00000008 21*4882a593Smuzhiyun #define EFI_FVB2_WRITE_ENABLED_CAP 0x00000010 22*4882a593Smuzhiyun #define EFI_FVB2_WRITE_STATUS 0x00000020 23*4882a593Smuzhiyun #define EFI_FVB2_LOCK_CAP 0x00000040 24*4882a593Smuzhiyun #define EFI_FVB2_LOCK_STATUS 0x00000080 25*4882a593Smuzhiyun #define EFI_FVB2_STICKY_WRITE 0x00000200 26*4882a593Smuzhiyun #define EFI_FVB2_MEMORY_MAPPED 0x00000400 27*4882a593Smuzhiyun #define EFI_FVB2_ERASE_POLARITY 0x00000800 28*4882a593Smuzhiyun #define EFI_FVB2_READ_LOCK_CAP 0x00001000 29*4882a593Smuzhiyun #define EFI_FVB2_READ_LOCK_STATUS 0x00002000 30*4882a593Smuzhiyun #define EFI_FVB2_WRITE_LOCK_CAP 0x00004000 31*4882a593Smuzhiyun #define EFI_FVB2_WRITE_LOCK_STATUS 0x00008000 32*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT 0x001F0000 33*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_1 0x00000000 34*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_2 0x00010000 35*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_4 0x00020000 36*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_8 0x00030000 37*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_16 0x00040000 38*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_32 0x00050000 39*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_64 0x00060000 40*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_128 0x00070000 41*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_256 0x00080000 42*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_512 0x00090000 43*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_1K 0x000A0000 44*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_2K 0x000B0000 45*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_4K 0x000C0000 46*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_8K 0x000D0000 47*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_16K 0x000E0000 48*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_32K 0x000F0000 49*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_64K 0x00100000 50*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_128K 0x00110000 51*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_256K 0x00120000 52*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_512K 0x00130000 53*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_1M 0x00140000 54*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_2M 0x00150000 55*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_4M 0x00160000 56*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_8M 0x00170000 57*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_16M 0x00180000 58*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_32M 0x00190000 59*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_64M 0x001A0000 60*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_128M 0x001B0000 61*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_256M 0x001C0000 62*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_512M 0x001D0000 63*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_1G 0x001E0000 64*4882a593Smuzhiyun #define EFI_FVB2_ALIGNMENT_2G 0x001F0000 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun struct fv_blkmap_entry { 67*4882a593Smuzhiyun /* The number of sequential blocks which are of the same size */ 68*4882a593Smuzhiyun u32 num_blocks; 69*4882a593Smuzhiyun /* The size of the blocks */ 70*4882a593Smuzhiyun u32 length; 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* Describes the features and layout of the firmware volume */ 74*4882a593Smuzhiyun struct fv_header { 75*4882a593Smuzhiyun /* 76*4882a593Smuzhiyun * The first 16 bytes are reserved to allow for the reset vector of 77*4882a593Smuzhiyun * processors whose reset vector is at address 0. 78*4882a593Smuzhiyun */ 79*4882a593Smuzhiyun u8 zero_vec[16]; 80*4882a593Smuzhiyun /* 81*4882a593Smuzhiyun * Declares the file system with which the firmware volume 82*4882a593Smuzhiyun * is formatted. 83*4882a593Smuzhiyun */ 84*4882a593Smuzhiyun struct efi_guid fs_guid; 85*4882a593Smuzhiyun /* 86*4882a593Smuzhiyun * Length in bytes of the complete firmware volume, including 87*4882a593Smuzhiyun * the header. 88*4882a593Smuzhiyun */ 89*4882a593Smuzhiyun u64 fv_len; 90*4882a593Smuzhiyun /* Set to EFI_FVH_SIGNATURE */ 91*4882a593Smuzhiyun u32 sign; 92*4882a593Smuzhiyun /* 93*4882a593Smuzhiyun * Declares capabilities and power-on defaults for the firmware 94*4882a593Smuzhiyun * volume. 95*4882a593Smuzhiyun */ 96*4882a593Smuzhiyun u32 attr; 97*4882a593Smuzhiyun /* Length in bytes of the complete firmware volume header */ 98*4882a593Smuzhiyun u16 hdr_len; 99*4882a593Smuzhiyun /* 100*4882a593Smuzhiyun * A 16-bit checksum of the firmware volume header. 101*4882a593Smuzhiyun * A valid header sums to zero. 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun u16 checksum; 104*4882a593Smuzhiyun /* 105*4882a593Smuzhiyun * Offset, relative to the start of the header, of the extended 106*4882a593Smuzhiyun * header (EFI_FIRMWARE_VOLUME_EXT_HEADER) or zero if there is 107*4882a593Smuzhiyun * no extended header. 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun u16 ext_hdr_off; 110*4882a593Smuzhiyun /* This field must always be set to zero */ 111*4882a593Smuzhiyun u8 reserved[1]; 112*4882a593Smuzhiyun /* 113*4882a593Smuzhiyun * Set to 2. Future versions of this specification may define new 114*4882a593Smuzhiyun * header fields and will increment the Revision field accordingly. 115*4882a593Smuzhiyun */ 116*4882a593Smuzhiyun u8 rev; 117*4882a593Smuzhiyun /* 118*4882a593Smuzhiyun * An array of run-length encoded FvBlockMapEntry structures. 119*4882a593Smuzhiyun * The array is terminated with an entry of {0,0}. 120*4882a593Smuzhiyun */ 121*4882a593Smuzhiyun struct fv_blkmap_entry block_map[1]; 122*4882a593Smuzhiyun }; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #define EFI_FVH_SIGNATURE SIGNATURE_32('_', 'F', 'V', 'H') 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* Firmware Volume Header Revision definition */ 127*4882a593Smuzhiyun #define EFI_FVH_REVISION 0x02 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* Extension header pointed by ExtHeaderOffset of volume header */ 130*4882a593Smuzhiyun struct fv_ext_header { 131*4882a593Smuzhiyun /* firmware volume name */ 132*4882a593Smuzhiyun struct efi_guid fv_name; 133*4882a593Smuzhiyun /* Size of the rest of the extension header including this structure */ 134*4882a593Smuzhiyun u32 ext_hdr_size; 135*4882a593Smuzhiyun }; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #endif 138