Add parlib/common.h
[akaros.git] / user / vmm / include / coreboot_tables.h
1 #ifndef COREBOOT_TABLES_H
2 #define COREBOOT_TABLES_H
3
4 #include <stdint.h>
5 #include <parlib/common.h>
6
7 // NOTE: the first part of this file is for producers of tables.
8 // It is used when we are starting a guest. 
9 // The second part is for CONSUMERS of tables, e.g. running
10 // on a coreboot-based system. 
11
12 /* The coreboot table information is for conveying information
13  * from the firmware to the loaded OS image.  Primarily this
14  * is expected to be information that cannot be discovered by
15  * other means, such as querying the hardware directly.
16  *
17  * All of the information should be Position Independent Data.
18  * That is it should be safe to relocated any of the information
19  * without it's meaning/correctness changing.   For table that
20  * can reasonably be used on multiple architectures the data
21  * size should be fixed.  This should ease the transition between
22  * 32 bit and 64 bit architectures etc.
23  *
24  * The completeness test for the information in this table is:
25  * - Can all of the hardware be detected?
26  * - Are the per motherboard constants available?
27  * - Is there enough to allow a kernel to run that was written before
28  *   a particular motherboard is constructed? (Assuming the kernel
29  *   has drivers for all of the hardware but it does not have
30  *   assumptions on how the hardware is connected together).
31  *
32  * With this test it should be straight forward to determine if a
33  * table entry is required or not.  This should remove much of the
34  * long term compatibility burden as table entries which are
35  * irrelevant or have been replaced by better alternatives may be
36  * dropped.  Of course it is polite and expedite to include extra
37  * table entries and be backwards compatible, but it is not required.
38  */
39
40 /* Since coreboot is usually compiled 32bit, gcc will align 64bit
41  * types to 32bit boundaries. If the coreboot table is dumped on a
42  * 64bit system, a uint64_t would be aligned to 64bit boundaries,
43  * breaking the table format.
44  *
45  * lb_uint64 will keep 64bit coreboot table values aligned to 32bit
46  * to ensure compatibility. They can be accessed with the two functions
47  * below: unpack_lb64() and pack_lb64()
48  *
49  * See also: util/lbtdump/lbtdump.c
50  */
51
52 struct lb_uint64 {
53         uint32_t lo;
54         uint32_t hi;
55 };
56
57 static inline uint64_t unpack_lb64(struct lb_uint64 value)
58 {
59         uint64_t result;
60         result = value.hi;
61         result = (result << 32) + value.lo;
62         return result;
63 }
64
65 static inline struct lb_uint64 pack_lb64(uint64_t value)
66 {
67         struct lb_uint64 result;
68         result.lo = (value >> 0) & 0xffffffff;
69         result.hi = (value >> 32) & 0xffffffff;
70         return result;
71 }
72
73 struct lb_header
74 {
75         uint8_t  signature[4]; /* LBIO */
76         uint32_t header_bytes;
77         uint32_t header_checksum;
78         uint32_t table_bytes;
79         uint32_t table_checksum;
80         uint32_t table_entries;
81 };
82
83 /* Every entry in the boot environment list will correspond to a boot
84  * info record.  Encoding both type and size.  The type is obviously
85  * so you can tell what it is.  The size allows you to skip that
86  * boot environment record if you don't know what it is.  This allows
87  * forward compatibility with records not yet defined.
88  */
89 struct lb_record {
90         uint32_t tag;           /* tag ID */
91         uint32_t size;          /* size of record (in bytes) */
92 };
93
94 #define LB_TAG_UNUSED           0x0000
95
96 #define LB_TAG_MEMORY           0x0001
97
98 struct lb_memory_range {
99         struct lb_uint64 start;
100         struct lb_uint64 size;
101         uint32_t type;
102 #define LB_MEM_RAM               1      /* Memory anyone can use */
103 #define LB_MEM_RESERVED          2      /* Don't use this memory region */
104 #define LB_MEM_ACPI              3      /* ACPI Tables */
105 #define LB_MEM_NVS               4      /* ACPI NVS Memory */
106 #define LB_MEM_UNUSABLE          5      /* Unusable address space */
107 #define LB_MEM_VENDOR_RSVD       6      /* Vendor Reserved */
108 #define LB_MEM_TABLE            16      /* Ram configuration tables are kept in */
109 };
110
111 struct lb_memory {
112         uint32_t tag;
113         uint32_t size;
114         struct lb_memory_range map[0];
115 };
116
117 #define LB_TAG_HWRPB            0x0002
118 struct lb_hwrpb {
119         uint32_t tag;
120         uint32_t size;
121         uint64_t hwrpb;
122 };
123
124 #define LB_TAG_MAINBOARD        0x0003
125 struct lb_mainboard {
126         uint32_t tag;
127         uint32_t size;
128         uint8_t  vendor_idx;
129         uint8_t  part_number_idx;
130         uint8_t  strings[0];
131 };
132
133 #define LB_TAG_VERSION          0x0004
134 #define LB_TAG_EXTRA_VERSION    0x0005
135 #define LB_TAG_BUILD            0x0006
136 #define LB_TAG_COMPILE_TIME     0x0007
137 #define LB_TAG_COMPILE_BY       0x0008
138 #define LB_TAG_COMPILE_HOST     0x0009
139 #define LB_TAG_COMPILE_DOMAIN   0x000a
140 #define LB_TAG_COMPILER         0x000b
141 #define LB_TAG_LINKER           0x000c
142 #define LB_TAG_ASSEMBLER        0x000d
143 struct lb_string {
144         uint32_t tag;
145         uint32_t size;
146         uint8_t  string[0];
147 };
148
149 #define LB_TAG_VERSION_TIMESTAMP        0x0026
150 struct lb_timestamp {
151         uint32_t tag;
152         uint32_t size;
153         uint32_t timestamp;
154 };
155
156
157 /* 0xe is taken by v3 */
158
159 #define LB_TAG_SERIAL           0x000f
160 struct lb_serial {
161         uint32_t tag;
162         uint32_t size;
163 #define LB_SERIAL_TYPE_IO_MAPPED     1
164 #define LB_SERIAL_TYPE_MEMORY_MAPPED 2
165         uint32_t type;
166         uint32_t baseaddr;
167         uint32_t baud;
168         uint32_t regwidth;
169 };
170
171 #define LB_TAG_CONSOLE          0x0010
172 struct lb_console {
173         uint32_t tag;
174         uint32_t size;
175         uint16_t type;
176 };
177
178 #define LB_TAG_CONSOLE_SERIAL8250       0
179 #define LB_TAG_CONSOLE_VGA              1 // OBSOLETE
180 #define LB_TAG_CONSOLE_BTEXT            2 // OBSOLETE
181 #define LB_TAG_CONSOLE_LOGBUF           3 // OBSOLETE
182 #define LB_TAG_CONSOLE_SROM             4 // OBSOLETE
183 #define LB_TAG_CONSOLE_EHCI             5
184 #define LB_TAG_CONSOLE_SERIAL8250MEM    6
185
186 #define LB_TAG_FORWARD          0x0011
187 struct lb_forward {
188         uint32_t tag;
189         uint32_t size;
190         uint64_t forward;
191 };
192
193 #define LB_TAG_FRAMEBUFFER      0x0012
194 struct lb_framebuffer {
195         uint32_t tag;
196         uint32_t size;
197
198         uint64_t physical_address;
199         uint32_t x_resolution;
200         uint32_t y_resolution;
201         uint32_t bytes_per_line;
202         uint8_t bits_per_pixel;
203         uint8_t red_mask_pos;
204         uint8_t red_mask_size;
205         uint8_t green_mask_pos;
206         uint8_t green_mask_size;
207         uint8_t blue_mask_pos;
208         uint8_t blue_mask_size;
209         uint8_t reserved_mask_pos;
210         uint8_t reserved_mask_size;
211 };
212
213 #define LB_TAG_GPIO     0x0013
214
215 struct lb_gpio {
216         uint32_t port;
217         uint32_t polarity;
218 #define ACTIVE_LOW      0
219 #define ACTIVE_HIGH     1
220         uint32_t value;
221 #define GPIO_MAX_NAME_LENGTH 16
222         uint8_t name[GPIO_MAX_NAME_LENGTH];
223 };
224
225 struct lb_gpios {
226         uint32_t tag;
227         uint32_t size;
228
229         uint32_t count;
230         struct lb_gpio gpios[0];
231 };
232
233 #define LB_TAG_VDAT             0x0015
234 #define LB_TAG_VBNV             0x0019
235 #define LB_TAB_VBOOT_HANDOFF    0x0020
236 #define LB_TAB_DMA              0x0022
237 #define LB_TAG_RAM_OOPS         0x0023
238 struct lb_range {
239         uint32_t tag;
240         uint32_t size;
241
242         uint64_t range_start;
243         uint32_t range_size;
244 };
245
246 void lb_ramoops(struct lb_header *header);
247
248 #define LB_TAG_TIMESTAMPS       0x0016
249 #define LB_TAG_CBMEM_CONSOLE    0x0017
250 #define LB_TAG_MRC_CACHE        0x0018
251 #define LB_TAG_ACPI_GNVS        0x0024
252 #define LB_TAG_WIFI_CALIBRATION 0x0027
253 struct lb_cbmem_ref {
254         uint32_t tag;
255         uint32_t size;
256
257         uint64_t cbmem_addr;
258 };
259
260 #define LB_TAG_X86_ROM_MTRR     0x0021
261 struct lb_x86_rom_mtrr {
262         uint32_t tag;
263         uint32_t size;
264         /* The variable range MTRR index covering the ROM. */
265         uint32_t index;
266 };
267
268 #define LB_TAG_BOARD_ID         0x0025
269 struct lb_board_id {
270         uint32_t tag;
271         uint32_t size;
272         /* Board ID as retrieved from the board revision GPIOs. */
273         uint32_t board_id;
274 };
275
276 #define LB_TAG_MAC_ADDRS        0x0026
277 struct mac_address {
278         uint8_t mac_addr[6];
279         uint8_t pad[2];         /* Pad it to 8 bytes to keep it simple. */
280 };
281
282 struct lb_macs {
283         uint32_t tag;
284         uint32_t size;
285         uint32_t count;
286         struct mac_address mac_addrs[0];
287 };
288
289 #define LB_TAG_RAM_CODE         0x0028
290 struct lb_ram_code {
291         uint32_t tag;
292         uint32_t size;
293         uint32_t ram_code;
294 };
295
296 #define LB_TAG_SPI_FLASH        0x0029
297 struct lb_spi_flash {
298         uint32_t tag;
299         uint32_t size;
300         uint32_t flash_size;
301         uint32_t sector_size;
302         uint32_t erase_cmd;
303 };
304
305 #define LB_TAG_SERIALNO         0x002a
306 #define MAX_SERIALNO_LENGTH     32
307
308 /* The following structures are for the cmos definitions table */
309 #define LB_TAG_CMOS_OPTION_TABLE 200
310 /* cmos header record */
311 struct cmos_option_table {
312         uint32_t tag;               /* CMOS definitions table type */
313         uint32_t size;               /* size of the entire table */
314         uint32_t header_length;      /* length of header */
315 };
316
317 /* cmos entry record
318         This record is variable length.  The name field may be
319         shorter than CMOS_MAX_NAME_LENGTH. The entry may start
320         anywhere in the byte, but can not span bytes unless it
321         starts at the beginning of the byte and the length is
322         fills complete bytes.
323 */
324 #define LB_TAG_OPTION 201
325 struct cmos_entries {
326         uint32_t tag;                /* entry type */
327         uint32_t size;               /* length of this record */
328         uint32_t bit;                /* starting bit from start of image */
329         uint32_t length;             /* length of field in bits */
330         uint32_t config;             /* e=enumeration, h=hex, r=reserved */
331         uint32_t config_id;          /* a number linking to an enumeration record */
332 #define CMOS_MAX_NAME_LENGTH 32
333         uint8_t name[CMOS_MAX_NAME_LENGTH]; /* name of entry in ascii,
334                                                variable length int aligned */
335 };
336
337
338 /* cmos enumerations record
339         This record is variable length.  The text field may be
340         shorter than CMOS_MAX_TEXT_LENGTH.
341 */
342 #define LB_TAG_OPTION_ENUM 202
343 struct cmos_enums {
344         uint32_t tag;                /* enumeration type */
345         uint32_t size;               /* length of this record */
346         uint32_t config_id;          /* a number identifying the config id */
347         uint32_t value;              /* the value associated with the text */
348 #define CMOS_MAX_TEXT_LENGTH 32
349         uint8_t text[CMOS_MAX_TEXT_LENGTH]; /* enum description in ascii,
350                                                 variable length int aligned */
351 };
352
353 /* cmos defaults record
354         This record contains default settings for the cmos ram.
355 */
356 #define LB_TAG_OPTION_DEFAULTS 203
357 struct cmos_defaults {
358         uint32_t tag;                /* default type */
359         uint32_t size;               /* length of this record */
360         uint32_t name_length;        /* length of the following name field */
361         uint8_t name[CMOS_MAX_NAME_LENGTH]; /* name identifying the default */
362 #define CMOS_IMAGE_BUFFER_SIZE 256
363         uint8_t default_set[CMOS_IMAGE_BUFFER_SIZE]; /* default settings */
364 };
365
366 #define LB_TAG_OPTION_CHECKSUM 204
367 struct  cmos_checksum {
368         uint32_t tag;
369         uint32_t size;
370         /* In practice everything is byte aligned, but things are measured
371          * in bits to be consistent.
372          */
373         uint32_t range_start;   /* First bit that is checksummed (byte aligned) */
374         uint32_t range_end;     /* Last bit that is checksummed (byte aligned) */
375         uint32_t location;      /* First bit of the checksum (byte aligned) */
376         uint32_t type;          /* Checksum algorithm that is used */
377 #define CHECKSUM_NONE   0
378 #define CHECKSUM_PCBIOS 1
379 };
380
381 /* function prototypes for building the coreboot table */
382
383 void *write_coreboot_table(void *where, void *base, uint64_t len);
384
385 void fill_lb_gpios(struct lb_gpios *gpios);
386 void fill_lb_gpio(struct lb_gpio *gpio, int num,
387                          int polarity, const char *name, int value);
388
389 void uart_fill_lb(void *data);
390 void lb_add_serial(struct lb_serial *serial, void *data);
391 void lb_add_console(uint16_t consoletype, void *data);
392
393 /* Define this in mainboard.c to add board-specific table entries. */
394 void lb_board(struct lb_header *header);
395
396 /*
397  * Function to retrieve MAC address(es) from the VPD and store them in the
398  * coreboot table.
399  */
400 void lb_table_add_macs_from_vpd(struct lb_header *header);
401
402 void lb_table_add_serialno_from_vpd(struct lb_header *header);
403
404 struct lb_record *lb_new_record(struct lb_header *header);
405 #endif