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