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