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