1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. 4 */ 5 6#ifndef __CBFS_H 7#define __CBFS_H 8 9#include <compiler.h> 10#include <linux/compiler.h> 11 12struct cbfs_priv; 13 14enum cbfs_result { 15 CBFS_SUCCESS = 0, 16 CBFS_NOT_INITIALIZED, 17 CBFS_BAD_HEADER, 18 CBFS_BAD_FILE, 19 CBFS_FILE_NOT_FOUND 20}; 21 22enum cbfs_filetype { 23 CBFS_TYPE_BOOTBLOCK = 0x01, 24 CBFS_TYPE_CBFSHEADER = 0x02, 25 CBFS_TYPE_STAGE = 0x10, 26 CBFS_TYPE_PAYLOAD = 0x20, 27 CBFS_TYPE_SELF = CBFS_TYPE_PAYLOAD, 28 29 CBFS_TYPE_FIT = 0x21, 30 CBFS_TYPE_OPTIONROM = 0x30, 31 CBFS_TYPE_BOOTSPLASH = 0x40, 32 CBFS_TYPE_RAW = 0x50, 33 CBFS_TYPE_VSA = 0x51, 34 CBFS_TYPE_MBI = 0x52, 35 CBFS_TYPE_MICROCODE = 0x53, 36 CBFS_TYPE_FSP = 0x60, 37 CBFS_TYPE_MRC = 0x61, 38 CBFS_TYPE_MMA = 0x62, 39 CBFS_TYPE_EFI = 0x63, 40 CBFS_TYPE_STRUCT = 0x70, 41 CBFS_TYPE_CMOS_DEFAULT = 0xaa, 42 CBFS_TYPE_SPD = 0xab, 43 CBFS_TYPE_MRC_CACHE = 0xac, 44 CBFS_TYPE_CMOS_LAYOUT = 0x01aa 45}; 46 47enum { 48 CBFS_HEADER_MAGIC = 0x4f524243, 49 CBFS_SIZE_UNKNOWN = 0xffffffff, 50 CBFS_ALIGN_SIZE = 0x40, 51}; 52 53/** 54 * struct cbfs_header - header at the start of a CBFS region 55 * 56 * All fields use big-endian format. 57 * 58 * @magic: Magic number (CBFS_HEADER_MAGIC) 59 */ 60struct cbfs_header { 61 u32 magic; 62 u32 version; 63 u32 rom_size; 64 u32 boot_block_size; 65 u32 align; 66 u32 offset; 67 u32 pad[2]; 68} __packed; 69 70struct cbfs_fileheader { 71 u8 magic[8]; 72 u32 len; 73 u32 type; 74 /* offset to struct cbfs_file_attribute or 0 */ 75 u32 attributes_offset; 76 u32 offset; 77 char filename[]; 78} __packed; 79 80/** 81 * These are standard values for the known compression alogrithms that coreboot 82 * knows about for stages and payloads. Of course, other CBFS users can use 83 * whatever values they want, as long as they understand them. 84 */ 85#define CBFS_COMPRESS_NONE 0 86#define CBFS_COMPRESS_LZMA 1 87#define CBFS_COMPRESS_LZ4 2 88 89/* 90 * Depending on how the header was initialized, it may be backed with 0x00 or 91 * 0xff, so support both 92 */ 93#define CBFS_FILE_ATTR_TAG_UNUSED 0 94#define CBFS_FILE_ATTR_TAG_UNUSED2 0xffffffff 95#define CBFS_FILE_ATTR_TAG_COMPRESSION 0x42435a4c 96#define CBFS_FILE_ATTR_TAG_HASH 0x68736148 97 98/* 99 * The common fields of extended cbfs file attributes. Attributes are expected 100 * to start with tag/len, then append their specific fields 101 */ 102struct cbfs_file_attribute { 103 u32 tag; 104 /* len covers the whole structure, incl. tag and len */ 105 u32 len; 106 u8 data[0]; 107} __packed; 108 109struct cbfs_file_attr_compression { 110 u32 tag; 111 u32 len; 112 /* whole file compression format. 0 if no compression. */ 113 u32 compression; 114 u32 decompressed_size; 115} __packed; 116 117struct cbfs_file_attr_hash { 118 u32 tag; 119 u32 len; 120 u32 hash_type; 121 /* hash_data is len - sizeof(struct) bytes */ 122 u8 hash_data[]; 123} __packed; 124 125/*** Component sub-headers ***/ 126 127/* Following are component sub-headers for the "standard" component types */ 128 129/** 130 * struct cbfs_stage - sub-header for stage components 131 * 132 * Stages are loaded by coreboot during the normal boot process 133 */ 134struct cbfs_stage { 135 u32 compression; /** Compression type */ 136 u64 entry; /** entry point */ 137 u64 load; /** Where to load in memory */ 138 u32 len; /** length of data to load */ 139 u32 memlen; /** total length of object in memory */ 140} __packed; 141 142/** 143 * struct cbfs_payload_segment - sub-header for payload components 144 * 145 * Payloads are loaded by coreboot at the end of the boot process 146 */ 147struct cbfs_payload_segment { 148 u32 type; 149 u32 compression; 150 u32 offset; 151 u64 load_addr; 152 u32 len; 153 u32 mem_len; 154} __packed; 155 156struct cbfs_payload { 157 struct cbfs_payload_segment segments; 158}; 159 160#define PAYLOAD_SEGMENT_CODE 0x45444F43 161#define PAYLOAD_SEGMENT_DATA 0x41544144 162#define PAYLOAD_SEGMENT_BSS 0x20535342 163#define PAYLOAD_SEGMENT_PARAMS 0x41524150 164#define PAYLOAD_SEGMENT_ENTRY 0x52544E45 165 166struct cbfs_cachenode { 167 struct cbfs_cachenode *next; 168 void *data; 169 char *name; 170 u32 type; 171 u32 data_length; 172 u32 name_length; 173 u32 attr_offset; 174 u32 comp_algo; 175 u32 decomp_size; 176}; 177 178/** 179 * file_cbfs_error() - Return a string describing the most recent error 180 * condition. 181 * 182 * Return: A pointer to the constant string. 183 */ 184const char *file_cbfs_error(void); 185 186/** 187 * cbfs_get_result() - Get the result of the last CBFS operation 188 * 189 *Return: last result 190 */ 191enum cbfs_result cbfs_get_result(void); 192 193/** 194 * file_cbfs_init() - Initialize the CBFS driver and load metadata into RAM. 195 * 196 * @end_of_rom: Points to the end of the ROM the CBFS should be read from 197 * Return: 0 if OK, -ve on error 198 */ 199int file_cbfs_init(ulong end_of_rom); 200 201/** 202 * file_cbfs_get_header() - Get the header structure for the current CBFS. 203 * 204 * Return: A pointer to the constant structure, or NULL if there is none. 205 */ 206const struct cbfs_header *file_cbfs_get_header(void); 207 208/** 209 * cbfs_get_first() - Get the first file in a CBFS 210 * 211 * Return: pointer to first file, or NULL if it is empty 212 */ 213const struct cbfs_cachenode *cbfs_get_first(const struct cbfs_priv *priv); 214 215/** 216 * cbfs_get_next() - Get the next file in a CBFS 217 * 218 * @filep: Pointer to current file; updated to point to the next file, if any, 219 * else NULL 220 */ 221void cbfs_get_next(const struct cbfs_cachenode **filep); 222 223/** 224 * file_cbfs_get_first() - Get a handle for the first file in CBFS. 225 * 226 * Return: A handle for the first file in CBFS, NULL on error. 227 */ 228const struct cbfs_cachenode *file_cbfs_get_first(void); 229 230/** 231 * file_cbfs_get_next() - Get a handle to the file after this one in CBFS. 232 * 233 * @file: A pointer to the handle to advance. 234 */ 235void file_cbfs_get_next(const struct cbfs_cachenode **file); 236 237/** 238 * file_cbfs_find() - Find a file with a particular name in CBFS. 239 * 240 * @name: The name to search for. 241 * 242 * Return: A handle to the file, or NULL on error. 243 */ 244const struct cbfs_cachenode *file_cbfs_find(const char *name); 245 246/** 247 * cbfs_find_file() - Find a file in a given CBFS 248 * 249 * @cbfs: CBFS to look in (use cbfs_init_mem() to set it up) 250 * @name: Filename to look for 251 * Return: pointer to CBFS node if found, else NULL 252 */ 253const struct cbfs_cachenode *cbfs_find_file(struct cbfs_priv *cbfs, 254 const char *name); 255 256/** 257 * cbfs_init_mem() - Set up a new CBFS 258 * 259 * @base: Base address of CBFS 260 * @size: Size of CBFS if known, else CBFS_SIZE_UNKNOWN 261 * @require_header: true to read a header at the start, false to not require one 262 * @cbfsp: Returns a pointer to CBFS on success 263 * Return: 0 if OK, -ve on error 264 */ 265int cbfs_init_mem(ulong base, ulong size, bool require_hdr, 266 struct cbfs_priv **privp); 267 268/***************************************************************************/ 269/* All of the functions below can be used without first initializing CBFS. */ 270/***************************************************************************/ 271 272/** 273 * file_cbfs_find_uncached() - Find a file in CBFS given the end of the ROM 274 * 275 * Note that @node should be declared by the caller. This design is to avoid 276 * the need for allocation here. 277 * 278 * @end_of_rom: Points to the end of the ROM the CBFS should be read from 279 * @name: The name to search for 280 * @node: Returns the contents of the node if found (i.e. copied into *node) 281 * Return: 0 on success, -ENOENT if not found, -EFAULT on bad header 282 */ 283int file_cbfs_find_uncached(ulong end_of_rom, const char *name, 284 struct cbfs_cachenode *node); 285 286/** 287 * file_cbfs_find_uncached_base() - Find a file in CBFS given the base address 288 * 289 * Note that @node should be declared by the caller. This design is to avoid 290 * the need for allocation here. 291 * 292 * @base: Points to the base of the CBFS 293 * @name: The name to search for 294 * @node: Returns the contents of the node if found (i.e. copied into *node) 295 * Return: 0 on success, -ENOENT if not found, -EFAULT on bad header 296 */ 297int file_cbfs_find_uncached_base(ulong base, const char *name, 298 struct cbfs_cachenode *node); 299 300/** 301 * file_cbfs_name() - Get the name of a file in CBFS. 302 * 303 * @file: The handle to the file. 304 * 305 * Return: The name of the file, NULL on error. 306 */ 307const char *file_cbfs_name(const struct cbfs_cachenode *file); 308 309/** 310 * file_cbfs_size() - Get the size of a file in CBFS. 311 * 312 * @file: The handle to the file. 313 * 314 * Return: The size of the file, zero on error. 315 */ 316u32 file_cbfs_size(const struct cbfs_cachenode *file); 317 318/** 319 * file_cbfs_type() - Get the type of a file in CBFS. 320 * 321 * @file: The handle to the file. 322 * 323 * Return: The type of the file, zero on error. 324 */ 325u32 file_cbfs_type(const struct cbfs_cachenode *file); 326 327/** 328 * file_cbfs_read() - Read a file from CBFS into RAM 329 * 330 * @file: A handle to the file to read. 331 * @buffer: Where to read it into memory. 332 * @maxsize: Maximum number of bytes to read 333 * 334 * Return: If positive or zero, the number of characters read. If negative, an 335 * error occurred. 336 */ 337long file_cbfs_read(const struct cbfs_cachenode *file, void *buffer, 338 unsigned long maxsize); 339 340#endif /* __CBFS_H */ 341