1f1d6fda6SBin Meng /* 2f1d6fda6SBin Meng * This file is part of the libpayload project. 3f1d6fda6SBin Meng * 4f1d6fda6SBin Meng * Copyright (C) 2008 Advanced Micro Devices, Inc. 5f1d6fda6SBin Meng * 6f1d6fda6SBin Meng * SPDX-License-Identifier: BSD-3-Clause 7f1d6fda6SBin Meng */ 8f1d6fda6SBin Meng 9f1d6fda6SBin Meng #ifndef _COREBOOT_TABLES_H 10f1d6fda6SBin Meng #define _COREBOOT_TABLES_H 11f1d6fda6SBin Meng 12f1d6fda6SBin Meng struct cbuint64 { 13f1d6fda6SBin Meng u32 lo; 14f1d6fda6SBin Meng u32 hi; 15f1d6fda6SBin Meng }; 16f1d6fda6SBin Meng 17f1d6fda6SBin Meng struct cb_header { 18f1d6fda6SBin Meng u8 signature[4]; 19f1d6fda6SBin Meng u32 header_bytes; 20f1d6fda6SBin Meng u32 header_checksum; 21f1d6fda6SBin Meng u32 table_bytes; 22f1d6fda6SBin Meng u32 table_checksum; 23f1d6fda6SBin Meng u32 table_entries; 24f1d6fda6SBin Meng }; 25f1d6fda6SBin Meng 26f1d6fda6SBin Meng struct cb_record { 27f1d6fda6SBin Meng u32 tag; 28f1d6fda6SBin Meng u32 size; 29f1d6fda6SBin Meng }; 30f1d6fda6SBin Meng 31f1d6fda6SBin Meng #define CB_TAG_UNUSED 0x0000 32f1d6fda6SBin Meng #define CB_TAG_MEMORY 0x0001 33f1d6fda6SBin Meng 34f1d6fda6SBin Meng struct cb_memory_range { 35f1d6fda6SBin Meng struct cbuint64 start; 36f1d6fda6SBin Meng struct cbuint64 size; 37f1d6fda6SBin Meng u32 type; 38f1d6fda6SBin Meng }; 39f1d6fda6SBin Meng 40f1d6fda6SBin Meng #define CB_MEM_RAM 1 41f1d6fda6SBin Meng #define CB_MEM_RESERVED 2 42f1d6fda6SBin Meng #define CB_MEM_ACPI 3 43f1d6fda6SBin Meng #define CB_MEM_NVS 4 44f1d6fda6SBin Meng #define CB_MEM_UNUSABLE 5 45f1d6fda6SBin Meng #define CB_MEM_VENDOR_RSVD 6 46f1d6fda6SBin Meng #define CB_MEM_TABLE 16 47f1d6fda6SBin Meng 48f1d6fda6SBin Meng struct cb_memory { 49f1d6fda6SBin Meng u32 tag; 50f1d6fda6SBin Meng u32 size; 51f1d6fda6SBin Meng struct cb_memory_range map[0]; 52f1d6fda6SBin Meng }; 53f1d6fda6SBin Meng 54f1d6fda6SBin Meng #define CB_TAG_HWRPB 0x0002 55f1d6fda6SBin Meng 56f1d6fda6SBin Meng struct cb_hwrpb { 57f1d6fda6SBin Meng u32 tag; 58f1d6fda6SBin Meng u32 size; 59f1d6fda6SBin Meng u64 hwrpb; 60f1d6fda6SBin Meng }; 61f1d6fda6SBin Meng 62f1d6fda6SBin Meng #define CB_TAG_MAINBOARD 0x0003 63f1d6fda6SBin Meng 64f1d6fda6SBin Meng struct cb_mainboard { 65f1d6fda6SBin Meng u32 tag; 66f1d6fda6SBin Meng u32 size; 67f1d6fda6SBin Meng u8 vendor_idx; 68f1d6fda6SBin Meng u8 part_number_idx; 69f1d6fda6SBin Meng u8 strings[0]; 70f1d6fda6SBin Meng }; 71f1d6fda6SBin Meng 72f1d6fda6SBin Meng #define CB_TAG_VERSION 0x0004 73f1d6fda6SBin Meng #define CB_TAG_EXTRA_VERSION 0x0005 74f1d6fda6SBin Meng #define CB_TAG_BUILD 0x0006 75f1d6fda6SBin Meng #define CB_TAG_COMPILE_TIME 0x0007 76f1d6fda6SBin Meng #define CB_TAG_COMPILE_BY 0x0008 77f1d6fda6SBin Meng #define CB_TAG_COMPILE_HOST 0x0009 78f1d6fda6SBin Meng #define CB_TAG_COMPILE_DOMAIN 0x000a 79f1d6fda6SBin Meng #define CB_TAG_COMPILER 0x000b 80f1d6fda6SBin Meng #define CB_TAG_LINKER 0x000c 81f1d6fda6SBin Meng #define CB_TAG_ASSEMBLER 0x000d 82f1d6fda6SBin Meng 83f1d6fda6SBin Meng struct cb_string { 84f1d6fda6SBin Meng u32 tag; 85f1d6fda6SBin Meng u32 size; 86f1d6fda6SBin Meng u8 string[0]; 87f1d6fda6SBin Meng }; 88f1d6fda6SBin Meng 89f1d6fda6SBin Meng #define CB_TAG_SERIAL 0x000f 90f1d6fda6SBin Meng 91f1d6fda6SBin Meng struct cb_serial { 92f1d6fda6SBin Meng u32 tag; 93f1d6fda6SBin Meng u32 size; 94f1d6fda6SBin Meng #define CB_SERIAL_TYPE_IO_MAPPED 1 95f1d6fda6SBin Meng #define CB_SERIAL_TYPE_MEMORY_MAPPED 2 96f1d6fda6SBin Meng u32 type; 97f1d6fda6SBin Meng u32 baseaddr; 98f1d6fda6SBin Meng u32 baud; 99f1d6fda6SBin Meng }; 100f1d6fda6SBin Meng 101f2d0690eSBin Meng #define CB_TAG_CONSOLE 0x0010 102f1d6fda6SBin Meng 103f1d6fda6SBin Meng struct cb_console { 104f1d6fda6SBin Meng u32 tag; 105f1d6fda6SBin Meng u32 size; 106f1d6fda6SBin Meng u16 type; 107f1d6fda6SBin Meng }; 108f1d6fda6SBin Meng 109f1d6fda6SBin Meng #define CB_TAG_CONSOLE_SERIAL8250 0 110f1d6fda6SBin Meng #define CB_TAG_CONSOLE_VGA 1 /* OBSOLETE */ 111f1d6fda6SBin Meng #define CB_TAG_CONSOLE_BTEXT 2 /* OBSOLETE */ 112f1d6fda6SBin Meng #define CB_TAG_CONSOLE_LOGBUF 3 113f1d6fda6SBin Meng #define CB_TAG_CONSOLE_SROM 4 /* OBSOLETE */ 114f1d6fda6SBin Meng #define CB_TAG_CONSOLE_EHCI 5 115f1d6fda6SBin Meng 116f2d0690eSBin Meng #define CB_TAG_FORWARD 0x0011 117f1d6fda6SBin Meng 118f1d6fda6SBin Meng struct cb_forward { 119f1d6fda6SBin Meng u32 tag; 120f1d6fda6SBin Meng u32 size; 121f1d6fda6SBin Meng u64 forward; 122f1d6fda6SBin Meng }; 123f1d6fda6SBin Meng 124f1d6fda6SBin Meng #define CB_TAG_FRAMEBUFFER 0x0012 125f2d0690eSBin Meng 126f1d6fda6SBin Meng struct cb_framebuffer { 127f1d6fda6SBin Meng u32 tag; 128f1d6fda6SBin Meng u32 size; 129f1d6fda6SBin Meng u64 physical_address; 130f1d6fda6SBin Meng u32 x_resolution; 131f1d6fda6SBin Meng u32 y_resolution; 132f1d6fda6SBin Meng u32 bytes_per_line; 133f1d6fda6SBin Meng u8 bits_per_pixel; 134f1d6fda6SBin Meng u8 red_mask_pos; 135f1d6fda6SBin Meng u8 red_mask_size; 136f1d6fda6SBin Meng u8 green_mask_pos; 137f1d6fda6SBin Meng u8 green_mask_size; 138f1d6fda6SBin Meng u8 blue_mask_pos; 139f1d6fda6SBin Meng u8 blue_mask_size; 140f1d6fda6SBin Meng u8 reserved_mask_pos; 141f1d6fda6SBin Meng u8 reserved_mask_size; 142f1d6fda6SBin Meng }; 143f1d6fda6SBin Meng 144f1d6fda6SBin Meng #define CB_TAG_GPIO 0x0013 145f1d6fda6SBin Meng #define GPIO_MAX_NAME_LENGTH 16 146f2d0690eSBin Meng 147f1d6fda6SBin Meng struct cb_gpio { 148f1d6fda6SBin Meng u32 port; 149f1d6fda6SBin Meng u32 polarity; 150f1d6fda6SBin Meng u32 value; 151f1d6fda6SBin Meng u8 name[GPIO_MAX_NAME_LENGTH]; 152f1d6fda6SBin Meng }; 153f1d6fda6SBin Meng 154f1d6fda6SBin Meng struct cb_gpios { 155f1d6fda6SBin Meng u32 tag; 156f1d6fda6SBin Meng u32 size; 157f1d6fda6SBin Meng u32 count; 158f1d6fda6SBin Meng struct cb_gpio gpios[0]; 159f1d6fda6SBin Meng }; 160f1d6fda6SBin Meng 161f1d6fda6SBin Meng #define CB_TAG_FDT 0x0014 162f2d0690eSBin Meng 163f1d6fda6SBin Meng struct cb_fdt { 164f1d6fda6SBin Meng uint32_t tag; 165f1d6fda6SBin Meng uint32_t size; /* size of the entire entry */ 166f1d6fda6SBin Meng /* the actual FDT gets placed here */ 167f1d6fda6SBin Meng }; 168f1d6fda6SBin Meng 169f1d6fda6SBin Meng #define CB_TAG_VDAT 0x0015 170f2d0690eSBin Meng 171f1d6fda6SBin Meng struct cb_vdat { 172f1d6fda6SBin Meng uint32_t tag; 173f1d6fda6SBin Meng uint32_t size; /* size of the entire entry */ 174f1d6fda6SBin Meng void *vdat_addr; 175f1d6fda6SBin Meng uint32_t vdat_size; 176f1d6fda6SBin Meng }; 177f1d6fda6SBin Meng 178f1d6fda6SBin Meng #define CB_TAG_TIMESTAMPS 0x0016 179f1d6fda6SBin Meng #define CB_TAG_CBMEM_CONSOLE 0x0017 180f1d6fda6SBin Meng #define CB_TAG_MRC_CACHE 0x0018 181f2d0690eSBin Meng 182f1d6fda6SBin Meng struct cb_cbmem_tab { 183f1d6fda6SBin Meng uint32_t tag; 184f1d6fda6SBin Meng uint32_t size; 185f1d6fda6SBin Meng void *cbmem_tab; 186f1d6fda6SBin Meng }; 187f1d6fda6SBin Meng 188f1d6fda6SBin Meng #define CB_TAG_VBNV 0x0019 189f2d0690eSBin Meng 190f1d6fda6SBin Meng struct cb_vbnv { 191f1d6fda6SBin Meng uint32_t tag; 192f1d6fda6SBin Meng uint32_t size; 193f1d6fda6SBin Meng uint32_t vbnv_start; 194f1d6fda6SBin Meng uint32_t vbnv_size; 195f1d6fda6SBin Meng }; 196f1d6fda6SBin Meng 197f1d6fda6SBin Meng #define CB_TAG_CMOS_OPTION_TABLE 0x00c8 198f2d0690eSBin Meng 199f1d6fda6SBin Meng struct cb_cmos_option_table { 200f1d6fda6SBin Meng u32 tag; 201f1d6fda6SBin Meng u32 size; 202f1d6fda6SBin Meng u32 header_length; 203f1d6fda6SBin Meng }; 204f1d6fda6SBin Meng 205f1d6fda6SBin Meng #define CB_TAG_OPTION 0x00c9 206f2d0690eSBin Meng 207f1d6fda6SBin Meng #define CMOS_MAX_NAME_LENGTH 32 208f2d0690eSBin Meng 209f1d6fda6SBin Meng struct cb_cmos_entries { 210f1d6fda6SBin Meng u32 tag; 211f1d6fda6SBin Meng u32 size; 212f1d6fda6SBin Meng u32 bit; 213f1d6fda6SBin Meng u32 length; 214f1d6fda6SBin Meng u32 config; 215f1d6fda6SBin Meng u32 config_id; 216f1d6fda6SBin Meng u8 name[CMOS_MAX_NAME_LENGTH]; 217f1d6fda6SBin Meng }; 218f1d6fda6SBin Meng 219f1d6fda6SBin Meng #define CB_TAG_OPTION_ENUM 0x00ca 220f1d6fda6SBin Meng #define CMOS_MAX_TEXT_LENGTH 32 221f2d0690eSBin Meng 222f1d6fda6SBin Meng struct cb_cmos_enums { 223f1d6fda6SBin Meng u32 tag; 224f1d6fda6SBin Meng u32 size; 225f1d6fda6SBin Meng u32 config_id; 226f1d6fda6SBin Meng u32 value; 227f1d6fda6SBin Meng u8 text[CMOS_MAX_TEXT_LENGTH]; 228f1d6fda6SBin Meng }; 229f1d6fda6SBin Meng 230f1d6fda6SBin Meng #define CB_TAG_OPTION_DEFAULTS 0x00cb 231f1d6fda6SBin Meng #define CMOS_IMAGE_BUFFER_SIZE 128 232f2d0690eSBin Meng 233f1d6fda6SBin Meng struct cb_cmos_defaults { 234f1d6fda6SBin Meng u32 tag; 235f1d6fda6SBin Meng u32 size; 236f1d6fda6SBin Meng u32 name_length; 237f1d6fda6SBin Meng u8 name[CMOS_MAX_NAME_LENGTH]; 238f1d6fda6SBin Meng u8 default_set[CMOS_IMAGE_BUFFER_SIZE]; 239f1d6fda6SBin Meng }; 240f1d6fda6SBin Meng 241f1d6fda6SBin Meng #define CB_TAG_OPTION_CHECKSUM 0x00cc 242f1d6fda6SBin Meng #define CHECKSUM_NONE 0 243f1d6fda6SBin Meng #define CHECKSUM_PCBIOS 1 244f2d0690eSBin Meng 245f1d6fda6SBin Meng struct cb_cmos_checksum { 246f1d6fda6SBin Meng u32 tag; 247f1d6fda6SBin Meng u32 size; 248f1d6fda6SBin Meng u32 range_start; 249f1d6fda6SBin Meng u32 range_end; 250f1d6fda6SBin Meng u32 location; 251f1d6fda6SBin Meng u32 type; 252f1d6fda6SBin Meng }; 253f1d6fda6SBin Meng 254f1d6fda6SBin Meng /* Helpful macros */ 255f1d6fda6SBin Meng 256f1d6fda6SBin Meng #define MEM_RANGE_COUNT(_rec) \ 257f1d6fda6SBin Meng (((_rec)->size - sizeof(*(_rec))) / sizeof((_rec)->map[0])) 258f1d6fda6SBin Meng 259f1d6fda6SBin Meng #define MEM_RANGE_PTR(_rec, _idx) \ 260f1d6fda6SBin Meng (((u8 *) (_rec)) + sizeof(*(_rec)) \ 261f1d6fda6SBin Meng + (sizeof((_rec)->map[0]) * (_idx))) 262f1d6fda6SBin Meng 263f1d6fda6SBin Meng #define MB_VENDOR_STRING(_mb) \ 264f1d6fda6SBin Meng (((unsigned char *) ((_mb)->strings)) + (_mb)->vendor_idx) 265f1d6fda6SBin Meng 266f1d6fda6SBin Meng #define MB_PART_STRING(_mb) \ 267f1d6fda6SBin Meng (((unsigned char *) ((_mb)->strings)) + (_mb)->part_number_idx) 268f1d6fda6SBin Meng 269f1d6fda6SBin Meng #define UNPACK_CB64(_in) \ 270f1d6fda6SBin Meng ((((u64) _in.hi) << 32) | _in.lo) 271f1d6fda6SBin Meng 272f1d6fda6SBin Meng #define CBMEM_TOC_RESERVED 512 273f1d6fda6SBin Meng #define MAX_CBMEM_ENTRIES 16 274f1d6fda6SBin Meng #define CBMEM_MAGIC 0x434f5245 275f1d6fda6SBin Meng 276f1d6fda6SBin Meng struct cbmem_entry { 277f1d6fda6SBin Meng u32 magic; 278f1d6fda6SBin Meng u32 id; 279f1d6fda6SBin Meng u64 base; 280f1d6fda6SBin Meng u64 size; 281f1d6fda6SBin Meng } __packed; 282f1d6fda6SBin Meng 283f1d6fda6SBin Meng #define CBMEM_ID_FREESPACE 0x46524545 284f1d6fda6SBin Meng #define CBMEM_ID_GDT 0x4c474454 285f1d6fda6SBin Meng #define CBMEM_ID_ACPI 0x41435049 286f1d6fda6SBin Meng #define CBMEM_ID_CBTABLE 0x43425442 287f1d6fda6SBin Meng #define CBMEM_ID_PIRQ 0x49525154 288f1d6fda6SBin Meng #define CBMEM_ID_MPTABLE 0x534d5054 289f1d6fda6SBin Meng #define CBMEM_ID_RESUME 0x5245534d 290f1d6fda6SBin Meng #define CBMEM_ID_RESUME_SCRATCH 0x52455343 291f1d6fda6SBin Meng #define CBMEM_ID_SMBIOS 0x534d4254 292f1d6fda6SBin Meng #define CBMEM_ID_TIMESTAMP 0x54494d45 293f1d6fda6SBin Meng #define CBMEM_ID_MRCDATA 0x4d524344 294f1d6fda6SBin Meng #define CBMEM_ID_CONSOLE 0x434f4e53 295f1d6fda6SBin Meng #define CBMEM_ID_NONE 0x00000000 296f1d6fda6SBin Meng 29726f9a9b7SBin Meng /** 298*789b6dceSBin Meng * high_table_reserve() - reserve configuration table in high memory 299*789b6dceSBin Meng * 300*789b6dceSBin Meng * This reserves configuration table in high memory. 301*789b6dceSBin Meng * 302*789b6dceSBin Meng * @return: always 0 303*789b6dceSBin Meng */ 304*789b6dceSBin Meng int high_table_reserve(void); 305*789b6dceSBin Meng 306*789b6dceSBin Meng /** 307*789b6dceSBin Meng * high_table_malloc() - allocate configuration table in high memory 308*789b6dceSBin Meng * 309*789b6dceSBin Meng * This allocates configuration table in high memory. 310*789b6dceSBin Meng * 311*789b6dceSBin Meng * @bytes: size of configuration table to be allocated 312*789b6dceSBin Meng * @return: pointer to configuration table in high memory 313*789b6dceSBin Meng */ 314*789b6dceSBin Meng void *high_table_malloc(size_t bytes); 315*789b6dceSBin Meng 316*789b6dceSBin Meng /** 31726f9a9b7SBin Meng * write_coreboot_table() - write coreboot table 31826f9a9b7SBin Meng * 31926f9a9b7SBin Meng * This writes coreboot table at a given address. 32026f9a9b7SBin Meng * 32126f9a9b7SBin Meng * @addr: start address to write coreboot table 32226f9a9b7SBin Meng * @cfg_tables: pointer to configuration table memory area 32326f9a9b7SBin Meng */ 32426f9a9b7SBin Meng void write_coreboot_table(u32 addr, struct memory_area *cfg_tables); 32526f9a9b7SBin Meng 326f1d6fda6SBin Meng #endif 327