Merge https://gitlab.denx.de/u-boot/custodians/u-boot-marvell
[oweals/u-boot.git] / arch / x86 / include / asm / coreboot_tables.h
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