uboot/include/cbfs.h
<<
>>
Prefs
   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