From 2fbe6247a9c328628d521b14eee90bd5be378685 Mon Sep 17 00:00:00 2001 From: Stefan Reinauer Date: Fri, 18 Jan 2008 16:17:44 +0000 Subject: Rename linuxbios_* files in utils repository Corresponding to flashrom svn r179 and coreboot v2 svn r3058. Signed-off-by: Stefan Reinauer Acked-by: Stefan Reinauer --- Makefile | 2 +- cbtable.c | 218 +++++++++++++++++++++++++++++++++++++++++++++++++++++ coreboot_tables.h | 210 +++++++++++++++++++++++++++++++++++++++++++++++++++ lbtable.c | 218 ----------------------------------------------------- linuxbios_tables.h | 210 --------------------------------------------------- 5 files changed, 429 insertions(+), 429 deletions(-) create mode 100644 cbtable.c create mode 100644 coreboot_tables.h delete mode 100644 lbtable.c delete mode 100644 linuxbios_tables.h diff --git a/Makefile b/Makefile index 067590a..4b2fbbd 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ endif OBJS = chipset_enable.o board_enable.o udelay.o jedec.o sst28sf040.o \ am29f040b.o mx29f002.o sst39sf020.o m29f400bt.o w49f002u.o \ 82802ab.o msys_doc.o pm49fl004.o sst49lf040.o sst49lfxxxc.o \ - sst_fwhub.o layout.o lbtable.o flashchips.o flashrom.o \ + sst_fwhub.o layout.o cbtable.o flashchips.o flashrom.o \ sharplhf00l04.o w29ee011.o spi.o all: pciutils dep $(PROGRAM) diff --git a/cbtable.c b/cbtable.c new file mode 100644 index 0000000..cc3a73c --- /dev/null +++ b/cbtable.c @@ -0,0 +1,218 @@ +/* + * This file is part of the flashrom project. + * + * Copyright (C) 2002 Steven James + * Copyright (C) 2002 Linux Networx + * (Written by Eric Biederman for Linux Networx) + * Copyright (C) 2006-2007 coresystems GmbH + * (Written by Stefan Reinauer for coresystems GmbH) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "flash.h" +#include "coreboot_tables.h" + +char *lb_part = NULL, *lb_vendor = NULL; + +static unsigned long compute_checksum(void *addr, unsigned long length) +{ + uint8_t *ptr; + volatile union { + uint8_t byte[2]; + uint16_t word; + } value; + unsigned long sum; + unsigned long i; + + /* In the most straight forward way possible, + * compute an ip style checksum. + */ + sum = 0; + ptr = addr; + for (i = 0; i < length; i++) { + unsigned long value; + value = ptr[i]; + if (i & 1) { + value <<= 8; + } + /* Add the new value */ + sum += value; + /* Wrap around the carry */ + if (sum > 0xFFFF) { + sum = (sum + (sum >> 16)) & 0xFFFF; + } + } + value.byte[0] = sum & 0xff; + value.byte[1] = (sum >> 8) & 0xff; + + return (~value.word) & 0xFFFF; +} + +#define for_each_lbrec(head, rec) \ + for(rec = (struct lb_record *)(((char *)head) + sizeof(*head)); \ + (((char *)rec) < (((char *)head) + sizeof(*head) + head->table_bytes)) && \ + (rec->size >= 1) && \ + ((((char *)rec) + rec->size) <= (((char *)head) + sizeof(*head) + head->table_bytes)); \ + rec = (struct lb_record *)(((char *)rec) + rec->size)) + +static int count_lb_records(struct lb_header *head) +{ + struct lb_record *rec; + int count; + + count = 0; + for_each_lbrec(head, rec) { + count++; + } + + return count; +} + +static struct lb_header *find_lb_table(void *base, unsigned long start, + unsigned long end) +{ + unsigned long addr; + + /* For now be stupid.... */ + for (addr = start; addr < end; addr += 16) { + struct lb_header *head = + (struct lb_header *)(((char *)base) + addr); + struct lb_record *recs = + (struct lb_record *)(((char *)base) + addr + sizeof(*head)); + if (memcmp(head->signature, "LBIO", 4) != 0) + continue; + printf_debug("Found canidate at: %08lx-%08lx\n", + addr, addr + head->table_bytes); + if (head->header_bytes != sizeof(*head)) { + fprintf(stderr, "Header bytes of %d are incorrect.\n", + head->header_bytes); + continue; + } + if (count_lb_records(head) != head->table_entries) { + fprintf(stderr, "Bad record count: %d.\n", + head->table_entries); + continue; + } + if (compute_checksum((uint8_t *) head, sizeof(*head)) != 0) { + fprintf(stderr, "Bad header checksum.\n"); + continue; + } + if (compute_checksum(recs, head->table_bytes) + != head->table_checksum) { + fprintf(stderr, "Bad table checksum: %04x.\n", + head->table_checksum); + continue; + } + fprintf(stdout, "Found coreboot table at 0x%08lx.\n", addr); + return head; + + }; + + return 0; +} + +static void find_mainboard(struct lb_record *ptr, unsigned long addr) +{ + struct lb_mainboard *rec; + int max_size; + char vendor[256], part[256]; + + rec = (struct lb_mainboard *)ptr; + max_size = rec->size - sizeof(*rec); + printf("Vendor ID: %.*s, part ID: %.*s\n", + max_size - rec->vendor_idx, + rec->strings + rec->vendor_idx, + max_size - rec->part_number_idx, + rec->strings + rec->part_number_idx); + snprintf(vendor, 255, "%.*s", max_size - rec->vendor_idx, + rec->strings + rec->vendor_idx); + snprintf(part, 255, "%.*s", max_size - rec->part_number_idx, + rec->strings + rec->part_number_idx); + + if (lb_part) { + printf("Overwritten by command line, vendor ID: %s, part ID: %s.\n", lb_vendor, lb_part); + } else { + lb_part = strdup(part); + lb_vendor = strdup(vendor); + } +} + +static struct lb_record *next_record(struct lb_record *rec) +{ + return (struct lb_record *)(((char *)rec) + rec->size); +} + +static void search_lb_records(struct lb_record *rec, struct lb_record *last, + unsigned long addr) +{ + struct lb_record *next; + int count; + count = 0; + + for (next = next_record(rec); (rec < last) && (next <= last); + rec = next, addr += rec->size) { + next = next_record(rec); + count++; + if (rec->tag == LB_TAG_MAINBOARD) { + find_mainboard(rec, addr); + break; + } + } +} + +int coreboot_init(void) +{ + uint8_t *low_1MB; + struct lb_header *lb_table; + struct lb_record *rec, *last; + + low_1MB = mmap(0, 1024 * 1024, PROT_READ, MAP_SHARED, fd_mem, + 0x00000000); + if (low_1MB == MAP_FAILED) { + perror("Can't mmap memory using " MEM_DEV); + exit(-2); + } + lb_table = 0; + if (!lb_table) + lb_table = find_lb_table(low_1MB, 0x00000, 0x1000); + if (!lb_table) + lb_table = find_lb_table(low_1MB, 0xf0000, 1024 * 1024); + if (lb_table) { + unsigned long addr; + addr = ((char *)lb_table) - ((char *)low_1MB); + printf_debug("Coreboot table found at %p.\n", lb_table); + rec = (struct lb_record *)(((char *)lb_table) + lb_table->header_bytes); + last = (struct lb_record *)(((char *)rec) + lb_table->table_bytes); + printf_debug("Coreboot header(%d) checksum: %04x table(%d) checksum: %04x entries: %d\n", + lb_table->header_bytes, lb_table->header_checksum, + lb_table->table_bytes, lb_table->table_checksum, + lb_table->table_entries); + search_lb_records(rec, last, addr + lb_table->header_bytes); + } else { + printf("No coreboot table found.\n"); + return -1; + } + + return 0; +} diff --git a/coreboot_tables.h b/coreboot_tables.h new file mode 100644 index 0000000..c4c2d4d --- /dev/null +++ b/coreboot_tables.h @@ -0,0 +1,210 @@ +#ifndef COREBOOT_TABLES_H +#define COREBOOT_TABLES_H + +#include + +/* The coreboot table information is for conveying information + * from the firmware to the loaded OS image. Primarily this + * is expected to be information that cannot be discovered by + * other means, such as quering the hardware directly. + * + * All of the information should be Position Independent Data. + * That is it should be safe to relocated any of the information + * without it's meaning/correctnes changing. For table that + * can reasonably be used on multiple architectures the data + * size should be fixed. This should ease the transition between + * 32 bit and 64 bit architectures etc. + * + * The completeness test for the information in this table is: + * - Can all of the hardware be detected? + * - Are the per motherboard constants available? + * - Is there enough to allow a kernel to run that was written before + * a particular motherboard is constructed? (Assuming the kernel + * has drivers for all of the hardware but it does not have + * assumptions on how the hardware is connected together). + * + * With this test it should be straight forward to determine if a + * table entry is required or not. This should remove much of the + * long term compatibility burden as table entries which are + * irrelevant or have been replaced by better alternatives may be + * dropped. Of course it is polite and expidite to include extra + * table entries and be backwards compatible, but it is not required. + */ + +/* Since coreboot is usually compiled 32bit, gcc will align 64bit + * types to 32bit boundaries. If the coreboot table is dumped on a + * 64bit system, a uint64_t would be aligned to 64bit boundaries, + * breaking the table format. + * + * lb_uint64 will keep 64bit coreboot table values aligned to 32bit + * to ensure compatibility. They can be accessed with the two functions + * below: unpack_lb64() and pack_lb64() + * + * See also: util/lbtdump/lbtdump.c + */ + +struct lb_uint64 { + uint32_t lo; + uint32_t hi; +}; + +static inline uint64_t unpack_lb64(struct lb_uint64 value) +{ + uint64_t result; + result = value.hi; + result = (result << 32) + value.lo; + return result; +} + +static inline struct lb_uint64 pack_lb64(uint64_t value) +{ + struct lb_uint64 result; + result.lo = (value >> 0) & 0xffffffff; + result.hi = (value >> 32) & 0xffffffff; + return result; +} + +struct lb_header { + uint8_t signature[4]; /* LBIO */ + uint32_t header_bytes; + uint32_t header_checksum; + uint32_t table_bytes; + uint32_t table_checksum; + uint32_t table_entries; +}; + +/* Every entry in the boot enviroment list will correspond to a boot + * info record. Encoding both type and size. The type is obviously + * so you can tell what it is. The size allows you to skip that + * boot enviroment record if you don't know what it easy. This allows + * forward compatibility with records not yet defined. + */ +struct lb_record { + uint32_t tag; /* tag ID */ + uint32_t size; /* size of record (in bytes) */ +}; + +#define LB_TAG_UNUSED 0x0000 + +#define LB_TAG_MEMORY 0x0001 + +struct lb_memory_range { + struct lb_uint64 start; + struct lb_uint64 size; + uint32_t type; +#define LB_MEM_RAM 1 /* Memory anyone can use */ +#define LB_MEM_RESERVED 2 /* Don't use this memory region */ +#define LB_MEM_TABLE 16 /* Ram configuration tables are kept in */ +}; + +struct lb_memory { + uint32_t tag; + uint32_t size; + struct lb_memory_range map[0]; +}; + +#define LB_TAG_HWRPB 0x0002 +struct lb_hwrpb { + uint32_t tag; + uint32_t size; + uint64_t hwrpb; +}; + +#define LB_TAG_MAINBOARD 0x0003 +struct lb_mainboard { + uint32_t tag; + uint32_t size; + uint8_t vendor_idx; + uint8_t part_number_idx; + uint8_t strings[0]; +}; + +#define LB_TAG_VERSION 0x0004 +#define LB_TAG_EXTRA_VERSION 0x0005 +#define LB_TAG_BUILD 0x0006 +#define LB_TAG_COMPILE_TIME 0x0007 +#define LB_TAG_COMPILE_BY 0x0008 +#define LB_TAG_COMPILE_HOST 0x0009 +#define LB_TAG_COMPILE_DOMAIN 0x000a +#define LB_TAG_COMPILER 0x000b +#define LB_TAG_LINKER 0x000c +#define LB_TAG_ASSEMBLER 0x000d +struct lb_string { + uint32_t tag; + uint32_t size; + uint8_t string[0]; +}; + +/* The following structures are for the cmos definitions table */ +#define LB_TAG_CMOS_OPTION_TABLE 200 +/* cmos header record */ +struct cmos_option_table { + uint32_t tag; /* CMOS definitions table type */ + uint32_t size; /* size of the entire table */ + uint32_t header_length; /* length of header */ +}; + +/* cmos entry record + This record is variable length. The name field may be + shorter than CMOS_MAX_NAME_LENGTH. The entry may start + anywhere in the byte, but can not span bytes unless it + starts at the beginning of the byte and the length is + fills complete bytes. +*/ +#define LB_TAG_OPTION 201 +struct cmos_entries { + uint32_t tag; /* entry type */ + uint32_t size; /* length of this record */ + uint32_t bit; /* starting bit from start of image */ + uint32_t length; /* length of field in bits */ + uint32_t config; /* e=enumeration, h=hex, r=reserved */ + uint32_t config_id; /* a number linking to an enumeration record */ +#define CMOS_MAX_NAME_LENGTH 32 + uint8_t name[CMOS_MAX_NAME_LENGTH]; /* name of entry in ascii, + variable length int aligned */ +}; + +/* cmos enumerations record + This record is variable length. The text field may be + shorter than CMOS_MAX_TEXT_LENGTH. +*/ +#define LB_TAG_OPTION_ENUM 202 +struct cmos_enums { + uint32_t tag; /* enumeration type */ + uint32_t size; /* length of this record */ + uint32_t config_id; /* a number identifying the config id */ + uint32_t value; /* the value associated with the text */ +#define CMOS_MAX_TEXT_LENGTH 32 + uint8_t text[CMOS_MAX_TEXT_LENGTH]; /* enum description in ascii, + variable length int aligned */ +}; + +/* cmos defaults record + This record contains default settings for the cmos ram. +*/ +#define LB_TAG_OPTION_DEFAULTS 203 +struct cmos_defaults { + uint32_t tag; /* default type */ + uint32_t size; /* length of this record */ + uint32_t name_length; /* length of the following name field */ + uint8_t name[CMOS_MAX_NAME_LENGTH]; /* name identifying the default */ +#define CMOS_IMAGE_BUFFER_SIZE 128 + uint8_t default_set[CMOS_IMAGE_BUFFER_SIZE]; /* default settings */ +}; + +#define LB_TAG_OPTION_CHECKSUM 204 +struct cmos_checksum { + uint32_t tag; + uint32_t size; + /* In practice everything is byte aligned, but things are measured + * in bits to be consistent. + */ + uint32_t range_start; /* First bit that is checksummed (byte aligned) */ + uint32_t range_end; /* Last bit that is checksummed (byte aligned) */ + uint32_t location; /* First bit of the checksum (byte aligned) */ + uint32_t type; /* Checksum algorithm that is used */ +#define CHECKSUM_NONE 0 +#define CHECKSUM_PCBIOS 1 +}; + +#endif /* COREBOOT_TABLES_H */ diff --git a/lbtable.c b/lbtable.c deleted file mode 100644 index 1cca964..0000000 --- a/lbtable.c +++ /dev/null @@ -1,218 +0,0 @@ -/* - * This file is part of the flashrom project. - * - * Copyright (C) 2002 Steven James - * Copyright (C) 2002 Linux Networx - * (Written by Eric Biederman for Linux Networx) - * Copyright (C) 2006-2007 coresystems GmbH - * (Written by Stefan Reinauer for coresystems GmbH) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "flash.h" -#include "linuxbios_tables.h" - -char *lb_part = NULL, *lb_vendor = NULL; - -static unsigned long compute_checksum(void *addr, unsigned long length) -{ - uint8_t *ptr; - volatile union { - uint8_t byte[2]; - uint16_t word; - } value; - unsigned long sum; - unsigned long i; - - /* In the most straight forward way possible, - * compute an ip style checksum. - */ - sum = 0; - ptr = addr; - for (i = 0; i < length; i++) { - unsigned long value; - value = ptr[i]; - if (i & 1) { - value <<= 8; - } - /* Add the new value */ - sum += value; - /* Wrap around the carry */ - if (sum > 0xFFFF) { - sum = (sum + (sum >> 16)) & 0xFFFF; - } - } - value.byte[0] = sum & 0xff; - value.byte[1] = (sum >> 8) & 0xff; - - return (~value.word) & 0xFFFF; -} - -#define for_each_lbrec(head, rec) \ - for(rec = (struct lb_record *)(((char *)head) + sizeof(*head)); \ - (((char *)rec) < (((char *)head) + sizeof(*head) + head->table_bytes)) && \ - (rec->size >= 1) && \ - ((((char *)rec) + rec->size) <= (((char *)head) + sizeof(*head) + head->table_bytes)); \ - rec = (struct lb_record *)(((char *)rec) + rec->size)) - -static int count_lb_records(struct lb_header *head) -{ - struct lb_record *rec; - int count; - - count = 0; - for_each_lbrec(head, rec) { - count++; - } - - return count; -} - -static struct lb_header *find_lb_table(void *base, unsigned long start, - unsigned long end) -{ - unsigned long addr; - - /* For now be stupid.... */ - for (addr = start; addr < end; addr += 16) { - struct lb_header *head = - (struct lb_header *)(((char *)base) + addr); - struct lb_record *recs = - (struct lb_record *)(((char *)base) + addr + sizeof(*head)); - if (memcmp(head->signature, "LBIO", 4) != 0) - continue; - printf_debug("Found canidate at: %08lx-%08lx\n", - addr, addr + head->table_bytes); - if (head->header_bytes != sizeof(*head)) { - fprintf(stderr, "Header bytes of %d are incorrect.\n", - head->header_bytes); - continue; - } - if (count_lb_records(head) != head->table_entries) { - fprintf(stderr, "Bad record count: %d.\n", - head->table_entries); - continue; - } - if (compute_checksum((uint8_t *) head, sizeof(*head)) != 0) { - fprintf(stderr, "Bad header checksum.\n"); - continue; - } - if (compute_checksum(recs, head->table_bytes) - != head->table_checksum) { - fprintf(stderr, "Bad table checksum: %04x.\n", - head->table_checksum); - continue; - } - fprintf(stdout, "Found coreboot table at 0x%08lx.\n", addr); - return head; - - }; - - return 0; -} - -static void find_mainboard(struct lb_record *ptr, unsigned long addr) -{ - struct lb_mainboard *rec; - int max_size; - char vendor[256], part[256]; - - rec = (struct lb_mainboard *)ptr; - max_size = rec->size - sizeof(*rec); - printf("Vendor ID: %.*s, part ID: %.*s\n", - max_size - rec->vendor_idx, - rec->strings + rec->vendor_idx, - max_size - rec->part_number_idx, - rec->strings + rec->part_number_idx); - snprintf(vendor, 255, "%.*s", max_size - rec->vendor_idx, - rec->strings + rec->vendor_idx); - snprintf(part, 255, "%.*s", max_size - rec->part_number_idx, - rec->strings + rec->part_number_idx); - - if (lb_part) { - printf("Overwritten by command line, vendor ID: %s, part ID: %s.\n", lb_vendor, lb_part); - } else { - lb_part = strdup(part); - lb_vendor = strdup(vendor); - } -} - -static struct lb_record *next_record(struct lb_record *rec) -{ - return (struct lb_record *)(((char *)rec) + rec->size); -} - -static void search_lb_records(struct lb_record *rec, struct lb_record *last, - unsigned long addr) -{ - struct lb_record *next; - int count; - count = 0; - - for (next = next_record(rec); (rec < last) && (next <= last); - rec = next, addr += rec->size) { - next = next_record(rec); - count++; - if (rec->tag == LB_TAG_MAINBOARD) { - find_mainboard(rec, addr); - break; - } - } -} - -int coreboot_init(void) -{ - uint8_t *low_1MB; - struct lb_header *lb_table; - struct lb_record *rec, *last; - - low_1MB = mmap(0, 1024 * 1024, PROT_READ, MAP_SHARED, fd_mem, - 0x00000000); - if (low_1MB == MAP_FAILED) { - perror("Can't mmap memory using " MEM_DEV); - exit(-2); - } - lb_table = 0; - if (!lb_table) - lb_table = find_lb_table(low_1MB, 0x00000, 0x1000); - if (!lb_table) - lb_table = find_lb_table(low_1MB, 0xf0000, 1024 * 1024); - if (lb_table) { - unsigned long addr; - addr = ((char *)lb_table) - ((char *)low_1MB); - printf_debug("Coreboot table found at %p.\n", lb_table); - rec = (struct lb_record *)(((char *)lb_table) + lb_table->header_bytes); - last = (struct lb_record *)(((char *)rec) + lb_table->table_bytes); - printf_debug("Coreboot header(%d) checksum: %04x table(%d) checksum: %04x entries: %d\n", - lb_table->header_bytes, lb_table->header_checksum, - lb_table->table_bytes, lb_table->table_checksum, - lb_table->table_entries); - search_lb_records(rec, last, addr + lb_table->header_bytes); - } else { - printf("No coreboot table found.\n"); - return -1; - } - - return 0; -} diff --git a/linuxbios_tables.h b/linuxbios_tables.h deleted file mode 100644 index c4c2d4d..0000000 --- a/linuxbios_tables.h +++ /dev/null @@ -1,210 +0,0 @@ -#ifndef COREBOOT_TABLES_H -#define COREBOOT_TABLES_H - -#include - -/* The coreboot table information is for conveying information - * from the firmware to the loaded OS image. Primarily this - * is expected to be information that cannot be discovered by - * other means, such as quering the hardware directly. - * - * All of the information should be Position Independent Data. - * That is it should be safe to relocated any of the information - * without it's meaning/correctnes changing. For table that - * can reasonably be used on multiple architectures the data - * size should be fixed. This should ease the transition between - * 32 bit and 64 bit architectures etc. - * - * The completeness test for the information in this table is: - * - Can all of the hardware be detected? - * - Are the per motherboard constants available? - * - Is there enough to allow a kernel to run that was written before - * a particular motherboard is constructed? (Assuming the kernel - * has drivers for all of the hardware but it does not have - * assumptions on how the hardware is connected together). - * - * With this test it should be straight forward to determine if a - * table entry is required or not. This should remove much of the - * long term compatibility burden as table entries which are - * irrelevant or have been replaced by better alternatives may be - * dropped. Of course it is polite and expidite to include extra - * table entries and be backwards compatible, but it is not required. - */ - -/* Since coreboot is usually compiled 32bit, gcc will align 64bit - * types to 32bit boundaries. If the coreboot table is dumped on a - * 64bit system, a uint64_t would be aligned to 64bit boundaries, - * breaking the table format. - * - * lb_uint64 will keep 64bit coreboot table values aligned to 32bit - * to ensure compatibility. They can be accessed with the two functions - * below: unpack_lb64() and pack_lb64() - * - * See also: util/lbtdump/lbtdump.c - */ - -struct lb_uint64 { - uint32_t lo; - uint32_t hi; -}; - -static inline uint64_t unpack_lb64(struct lb_uint64 value) -{ - uint64_t result; - result = value.hi; - result = (result << 32) + value.lo; - return result; -} - -static inline struct lb_uint64 pack_lb64(uint64_t value) -{ - struct lb_uint64 result; - result.lo = (value >> 0) & 0xffffffff; - result.hi = (value >> 32) & 0xffffffff; - return result; -} - -struct lb_header { - uint8_t signature[4]; /* LBIO */ - uint32_t header_bytes; - uint32_t header_checksum; - uint32_t table_bytes; - uint32_t table_checksum; - uint32_t table_entries; -}; - -/* Every entry in the boot enviroment list will correspond to a boot - * info record. Encoding both type and size. The type is obviously - * so you can tell what it is. The size allows you to skip that - * boot enviroment record if you don't know what it easy. This allows - * forward compatibility with records not yet defined. - */ -struct lb_record { - uint32_t tag; /* tag ID */ - uint32_t size; /* size of record (in bytes) */ -}; - -#define LB_TAG_UNUSED 0x0000 - -#define LB_TAG_MEMORY 0x0001 - -struct lb_memory_range { - struct lb_uint64 start; - struct lb_uint64 size; - uint32_t type; -#define LB_MEM_RAM 1 /* Memory anyone can use */ -#define LB_MEM_RESERVED 2 /* Don't use this memory region */ -#define LB_MEM_TABLE 16 /* Ram configuration tables are kept in */ -}; - -struct lb_memory { - uint32_t tag; - uint32_t size; - struct lb_memory_range map[0]; -}; - -#define LB_TAG_HWRPB 0x0002 -struct lb_hwrpb { - uint32_t tag; - uint32_t size; - uint64_t hwrpb; -}; - -#define LB_TAG_MAINBOARD 0x0003 -struct lb_mainboard { - uint32_t tag; - uint32_t size; - uint8_t vendor_idx; - uint8_t part_number_idx; - uint8_t strings[0]; -}; - -#define LB_TAG_VERSION 0x0004 -#define LB_TAG_EXTRA_VERSION 0x0005 -#define LB_TAG_BUILD 0x0006 -#define LB_TAG_COMPILE_TIME 0x0007 -#define LB_TAG_COMPILE_BY 0x0008 -#define LB_TAG_COMPILE_HOST 0x0009 -#define LB_TAG_COMPILE_DOMAIN 0x000a -#define LB_TAG_COMPILER 0x000b -#define LB_TAG_LINKER 0x000c -#define LB_TAG_ASSEMBLER 0x000d -struct lb_string { - uint32_t tag; - uint32_t size; - uint8_t string[0]; -}; - -/* The following structures are for the cmos definitions table */ -#define LB_TAG_CMOS_OPTION_TABLE 200 -/* cmos header record */ -struct cmos_option_table { - uint32_t tag; /* CMOS definitions table type */ - uint32_t size; /* size of the entire table */ - uint32_t header_length; /* length of header */ -}; - -/* cmos entry record - This record is variable length. The name field may be - shorter than CMOS_MAX_NAME_LENGTH. The entry may start - anywhere in the byte, but can not span bytes unless it - starts at the beginning of the byte and the length is - fills complete bytes. -*/ -#define LB_TAG_OPTION 201 -struct cmos_entries { - uint32_t tag; /* entry type */ - uint32_t size; /* length of this record */ - uint32_t bit; /* starting bit from start of image */ - uint32_t length; /* length of field in bits */ - uint32_t config; /* e=enumeration, h=hex, r=reserved */ - uint32_t config_id; /* a number linking to an enumeration record */ -#define CMOS_MAX_NAME_LENGTH 32 - uint8_t name[CMOS_MAX_NAME_LENGTH]; /* name of entry in ascii, - variable length int aligned */ -}; - -/* cmos enumerations record - This record is variable length. The text field may be - shorter than CMOS_MAX_TEXT_LENGTH. -*/ -#define LB_TAG_OPTION_ENUM 202 -struct cmos_enums { - uint32_t tag; /* enumeration type */ - uint32_t size; /* length of this record */ - uint32_t config_id; /* a number identifying the config id */ - uint32_t value; /* the value associated with the text */ -#define CMOS_MAX_TEXT_LENGTH 32 - uint8_t text[CMOS_MAX_TEXT_LENGTH]; /* enum description in ascii, - variable length int aligned */ -}; - -/* cmos defaults record - This record contains default settings for the cmos ram. -*/ -#define LB_TAG_OPTION_DEFAULTS 203 -struct cmos_defaults { - uint32_t tag; /* default type */ - uint32_t size; /* length of this record */ - uint32_t name_length; /* length of the following name field */ - uint8_t name[CMOS_MAX_NAME_LENGTH]; /* name identifying the default */ -#define CMOS_IMAGE_BUFFER_SIZE 128 - uint8_t default_set[CMOS_IMAGE_BUFFER_SIZE]; /* default settings */ -}; - -#define LB_TAG_OPTION_CHECKSUM 204 -struct cmos_checksum { - uint32_t tag; - uint32_t size; - /* In practice everything is byte aligned, but things are measured - * in bits to be consistent. - */ - uint32_t range_start; /* First bit that is checksummed (byte aligned) */ - uint32_t range_end; /* Last bit that is checksummed (byte aligned) */ - uint32_t location; /* First bit of the checksum (byte aligned) */ - uint32_t type; /* Checksum algorithm that is used */ -#define CHECKSUM_NONE 0 -#define CHECKSUM_PCBIOS 1 -}; - -#endif /* COREBOOT_TABLES_H */ -- cgit v1.1