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