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 
297*26f9a9b7SBin Meng /**
298*26f9a9b7SBin Meng  * write_coreboot_table() - write coreboot table
299*26f9a9b7SBin Meng  *
300*26f9a9b7SBin Meng  * This writes coreboot table at a given address.
301*26f9a9b7SBin Meng  *
302*26f9a9b7SBin Meng  * @addr:	start address to write coreboot table
303*26f9a9b7SBin Meng  * @cfg_tables:	pointer to configuration table memory area
304*26f9a9b7SBin Meng  */
305*26f9a9b7SBin Meng void write_coreboot_table(u32 addr, struct memory_area *cfg_tables);
306*26f9a9b7SBin Meng 
307f1d6fda6SBin Meng #endif
308