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