blob: 5b70d1aee5b3f8c9013aaaab4768b13065b6403c [file] [log] [blame]
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0-only */
#ifndef _CBFS_SERIALIZED_H_
#define _CBFS_SERIALIZED_H_
#include <stdint.h>
#include <vb2_sha.h>
enum cbfs_compression {
CBFS_COMPRESS_NONE = 0,
CBFS_COMPRESS_LZMA = 1,
CBFS_COMPRESS_LZ4 = 2,
};
enum cbfs_type {
/* QUERY is an alias for DELETED that can be passed to CBFS APIs to
inquire about the type of a file, rather than constrain it. */
CBFS_TYPE_QUERY = 0,
CBFS_TYPE_DELETED = 0x00000000,
CBFS_TYPE_NULL = 0xffffffff,
CBFS_TYPE_BOOTBLOCK = 0x01,
CBFS_TYPE_CBFSHEADER = 0x02,
CBFS_TYPE_LEGACY_STAGE = 0x10,
CBFS_TYPE_STAGE = 0x11,
CBFS_TYPE_SELF = 0x20,
CBFS_TYPE_FIT_PAYLOAD = 0x21,
CBFS_TYPE_OPTIONROM = 0x30,
CBFS_TYPE_BOOTSPLASH = 0x40,
CBFS_TYPE_RAW = 0x50,
CBFS_TYPE_VSA = 0x51,
CBFS_TYPE_MBI = 0x52,
CBFS_TYPE_MICROCODE = 0x53,
CBFS_TYPE_INTEL_FIT = 0x54,
CBFS_TYPE_FSP = 0x60,
CBFS_TYPE_MRC = 0x61,
CBFS_TYPE_MMA = 0x62,
CBFS_TYPE_EFI = 0x63,
CBFS_TYPE_STRUCT = 0x70,
CBFS_TYPE_CMOS_DEFAULT = 0xaa,
CBFS_TYPE_SPD = 0xab,
CBFS_TYPE_MRC_CACHE = 0xac,
CBFS_TYPE_CMOS_LAYOUT = 0x01aa,
};
#define CBFS_HEADER_MAGIC 0x4F524243 /* BE: 'ORBC' */
#define CBFS_HEADER_VERSION1 0x31313131 /* BE: '1111' */
#define CBFS_HEADER_VERSION2 0x31313132 /* BE: '1112' */
#define CBFS_HEADER_VERSION CBFS_HEADER_VERSION2
/* this is the master cbfs header - it must be located somewhere available
* to bootblock (to load romstage). The last 4 bytes in the image contain its
* relative offset from the end of the image (as a 32-bit signed integer). */
struct cbfs_header {
uint32_t magic;
uint32_t version;
uint32_t romsize;
uint32_t bootblocksize;
uint32_t align; /* fixed to 64 bytes */
uint32_t offset;
uint32_t architecture;
uint32_t pad[1];
} __packed;
/* this used to be flexible, but wasn't ever set to something different. */
#define CBFS_ALIGNMENT 64
/* "Unknown" refers to CBFS headers version 1,
* before the architecture was defined (i.e., x86 only).
*/
enum cbfs_architecture {
CBFS_ARCHITECTURE_UNKNOWN = 0xFFFFFFFF,
CBFS_ARCHITECTURE_X86 = 0x00000001,
CBFS_ARCHITECTURE_ARM = 0x00000010,
CBFS_ARCHITECTURE_AARCH64 = 0x0000aa64,
CBFS_ARCHITECTURE_MIPS = 0x00000100, /* deprecated */
CBFS_ARCHITECTURE_RISCV = 0xc001d0de,
CBFS_ARCHITECTURE_PPC64 = 0x407570ff,
};
/** This is a component header - every entry in the CBFS
will have this header.
This is how the component is arranged in the ROM:
-------------- <- 0
component header
-------------- <- sizeof(struct component)
component name
-------------- <- offset
data
...
-------------- <- offset + len
*/
#define CBFS_FILE_MAGIC "LARCHIVE"
#define CBFS_METADATA_MAX_SIZE 256
struct cbfs_file {
char magic[8];
uint32_t len;
uint32_t type;
uint32_t attributes_offset;
uint32_t offset;
char filename[0];
} __packed;
#if defined __GNUC__ && (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
_Static_assert(sizeof(struct cbfs_file) == 24, "cbfs_file size mismatch");
#endif
/* The common fields of extended cbfs file attributes.
Attributes are expected to start with tag/len, then append their
specific fields. */
struct cbfs_file_attribute {
uint32_t tag;
/* len covers the whole structure, incl. tag and len */
uint32_t len;
uint8_t data[0];
} __packed;
/* All attribute sizes must be divisible by this! */
#define CBFS_ATTRIBUTE_ALIGN 4
/* Depending on how the header was initialized, it may be backed with 0x00 or
* 0xff. Support both. */
enum cbfs_file_attr_tag {
CBFS_FILE_ATTR_TAG_UNUSED = 0,
CBFS_FILE_ATTR_TAG_UNUSED2 = 0xffffffff,
CBFS_FILE_ATTR_TAG_COMPRESSION = 0x42435a4c, /* BE: 'BCZL' */
CBFS_FILE_ATTR_TAG_HASH = 0x68736148, /* BE: 'hsaH' */
CBFS_FILE_ATTR_TAG_POSITION = 0x42435350, /* BE: 'BCSP' */
CBFS_FILE_ATTR_TAG_ALIGNMENT = 0x42434c41, /* BE: 'BCLA' */
CBFS_FILE_ATTR_TAG_IBB = 0x32494242, /* BE: '2IBB' */
CBFS_FILE_ATTR_TAG_PADDING = 0x47444150, /* BE: 'GNDP' */
CBFS_FILE_ATTR_TAG_STAGEHEADER = 0x53746748, /* BE: 'StgH' */
};
struct cbfs_file_attr_compression {
uint32_t tag;
uint32_t len;
/* whole file compression format. 0 if no compression. */
uint32_t compression;
uint32_t decompressed_size;
} __packed;
/* Actual size in CBFS may be larger/smaller than struct size! */
struct cbfs_file_attr_hash {
uint32_t tag;
uint32_t len;
struct vb2_hash hash;
} __packed;
struct cbfs_file_attr_position {
uint32_t tag;
uint32_t len;
uint32_t position;
} __packed;
struct cbfs_file_attr_align {
uint32_t tag;
uint32_t len;
uint32_t alignment;
} __packed;
struct cbfs_file_attr_stageheader {
uint32_t tag;
uint32_t len;
uint64_t loadaddr; /* Memory address to load the code to. */
uint32_t entry_offset; /* Offset of entry point from loadaddr. */
uint32_t memlen; /* Total length (including BSS) in memory. */
} __packed;
/*** Component sub-headers ***/
/* Following are component sub-headers for the "standard"
component types */
/** this is the sub-header for payload components. Payloads
are loaded by coreboot at the end of the boot process */
struct cbfs_payload_segment {
uint32_t type;
uint32_t compression;
uint32_t offset;
uint64_t load_addr;
uint32_t len;
uint32_t mem_len;
} __packed;
struct cbfs_payload {
struct cbfs_payload_segment segments;
};
enum cbfs_payload_segment_type {
PAYLOAD_SEGMENT_CODE = 0x434F4445, /* BE: 'CODE' */
PAYLOAD_SEGMENT_DATA = 0x44415441, /* BE: 'DATA' */
PAYLOAD_SEGMENT_BSS = 0x42535320, /* BE: 'BSS ' */
PAYLOAD_SEGMENT_PARAMS = 0x50415241, /* BE: 'PARA' */
PAYLOAD_SEGMENT_ENTRY = 0x454E5452, /* BE: 'ENTR' */
};
struct cbfs_optionrom {
uint32_t compression;
uint32_t len;
} __packed;
#endif /* _CBFS_SERIALIZED_H_ */