rename linuxbios_* files, too.
authorStefan Reinauer <stepan@coresystems.de>
Fri, 18 Jan 2008 16:16:45 +0000 (16:16 +0000)
committerStefan Reinauer <stepan@openbios.org>
Fri, 18 Jan 2008 16:16:45 +0000 (16:16 +0000)
Signed-off-by: Stefan Reinauer <stepan@coresystems.de>
Acked-by: Stefan Reinauer <stepan@coresystems.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3057 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

26 files changed:
src/arch/i386/boot/Config.lb
src/arch/i386/boot/coreboot_table.c [new file with mode: 0644]
src/arch/i386/boot/coreboot_table.h [new file with mode: 0644]
src/arch/i386/boot/linuxbios_table.c [deleted file]
src/arch/i386/boot/linuxbios_table.h [deleted file]
src/arch/i386/boot/tables.c
src/arch/i386/llshell/readme.coreboot [new file with mode: 0644]
src/arch/i386/llshell/readme.linuxbios [deleted file]
src/arch/ppc/boot/Config.lb
src/arch/ppc/boot/coreboot_table.c [new file with mode: 0644]
src/arch/ppc/boot/coreboot_table.h [new file with mode: 0644]
src/arch/ppc/boot/linuxbios_table.c [deleted file]
src/arch/ppc/boot/linuxbios_table.h [deleted file]
src/arch/ppc/boot/tables.c
src/boot/elfboot.c
src/config/Config.lb
src/config/coreboot_apc.ld [new file with mode: 0644]
src/config/coreboot_ram.ld [new file with mode: 0644]
src/config/linuxbios_apc.ld [deleted file]
src/config/linuxbios_ram.ld [deleted file]
src/include/boot/coreboot_tables.h [new file with mode: 0644]
src/include/boot/linuxbios_tables.h [deleted file]
src/include/boot/tables.h
src/pc80/mc146818rtc.c
util/lbtdump/lbtdump.c
util/options/build_opt_tbl.c

index c5a14d0f78d2986c54ed9cb902055bb4714e59f3..4f8a8680eca0813aa26909dd4bfa09136534e00e 100644 (file)
@@ -2,7 +2,7 @@ uses HAVE_PIRQ_TABLE
 uses HAVE_ACPI_TABLES
 
 object boot.o
-object linuxbios_table.o
+object coreboot_table.o
 object tables.o
 if HAVE_PIRQ_TABLE
 object pirq_routing.o 
diff --git a/src/arch/i386/boot/coreboot_table.c b/src/arch/i386/boot/coreboot_table.c
new file mode 100644 (file)
index 0000000..b13b63e
--- /dev/null
@@ -0,0 +1,417 @@
+#include <console/console.h>
+#include <ip_checksum.h>
+#include <boot/coreboot_tables.h>
+#include "coreboot_table.h"
+#include <string.h>
+#include <version.h>
+#include <device/device.h>
+#include <stdlib.h>
+
+struct lb_header *lb_table_init(unsigned long addr)
+{
+       struct lb_header *header;
+
+       /* 16 byte align the address */
+       addr += 15;
+       addr &= ~15;
+
+       header = (void *)addr;
+       header->signature[0] = 'L';
+       header->signature[1] = 'B';
+       header->signature[2] = 'I';
+       header->signature[3] = 'O';
+       header->header_bytes = sizeof(*header);
+       header->header_checksum = 0;
+       header->table_bytes = 0;
+       header->table_checksum = 0;
+       header->table_entries = 0;
+       return header;
+}
+
+struct lb_record *lb_first_record(struct lb_header *header)
+{
+       struct lb_record *rec;
+       rec = (void *)(((char *)header) + sizeof(*header));
+       return rec;
+}
+
+struct lb_record *lb_last_record(struct lb_header *header)
+{
+       struct lb_record *rec;
+       rec = (void *)(((char *)header) + sizeof(*header) + header->table_bytes);
+       return rec;
+}
+
+struct lb_record *lb_next_record(struct lb_record *rec)
+{
+       rec = (void *)(((char *)rec) + rec->size);      
+       return rec;
+}
+
+struct lb_record *lb_new_record(struct lb_header *header)
+{
+       struct lb_record *rec;
+       rec = lb_last_record(header);
+       if (header->table_entries) {
+               header->table_bytes += rec->size;
+       }
+       rec = lb_last_record(header);
+       header->table_entries++;
+       rec->tag = LB_TAG_UNUSED;
+       rec->size = sizeof(*rec);
+       return rec;
+}
+
+
+struct lb_memory *lb_memory(struct lb_header *header)
+{
+       struct lb_record *rec;
+       struct lb_memory *mem;
+       rec = lb_new_record(header);
+       mem = (struct lb_memory *)rec;
+       mem->tag = LB_TAG_MEMORY;
+       mem->size = sizeof(*mem);
+       return mem;
+}
+
+struct lb_mainboard *lb_mainboard(struct lb_header *header)
+{
+       struct lb_record *rec;
+       struct lb_mainboard *mainboard;
+       rec = lb_new_record(header);
+       mainboard = (struct lb_mainboard *)rec;
+       mainboard->tag = LB_TAG_MAINBOARD;
+
+       mainboard->size = (sizeof(*mainboard) +
+               strlen(mainboard_vendor) + 1 + 
+               strlen(mainboard_part_number) + 1 +
+               3) & ~3;
+
+       mainboard->vendor_idx = 0;
+       mainboard->part_number_idx = strlen(mainboard_vendor) + 1;
+
+       memcpy(mainboard->strings + mainboard->vendor_idx,
+               mainboard_vendor,      strlen(mainboard_vendor) + 1);
+       memcpy(mainboard->strings + mainboard->part_number_idx,
+               mainboard_part_number, strlen(mainboard_part_number) + 1);
+
+       return mainboard;
+}
+
+struct cmos_checksum *lb_cmos_checksum(struct lb_header *header)
+{
+       struct lb_record *rec;
+       struct cmos_checksum *cmos_checksum;
+       rec = lb_new_record(header);
+       cmos_checksum = (struct cmos_checksum *)rec;
+       cmos_checksum->tag = LB_TAG_OPTION_CHECKSUM;
+
+       cmos_checksum->size = (sizeof(*cmos_checksum));
+
+       cmos_checksum->range_start = LB_CKS_RANGE_START * 8;
+       cmos_checksum->range_end = ( LB_CKS_RANGE_END * 8 ) + 7;
+       cmos_checksum->location = LB_CKS_LOC * 8;
+       cmos_checksum->type = CHECKSUM_PCBIOS;
+       
+       return cmos_checksum;
+}
+
+void lb_strings(struct lb_header *header)
+{
+       static const struct {
+               uint32_t tag;
+               const char *string;
+       } strings[] = {
+               { LB_TAG_VERSION,        coreboot_version,        },
+               { LB_TAG_EXTRA_VERSION,  coreboot_extra_version,  },
+               { LB_TAG_BUILD,          coreboot_build,          },
+               { LB_TAG_COMPILE_TIME,   coreboot_compile_time,   },
+               { LB_TAG_COMPILE_BY,     coreboot_compile_by,     },
+               { LB_TAG_COMPILE_HOST,   coreboot_compile_host,   },
+               { LB_TAG_COMPILE_DOMAIN, coreboot_compile_domain, },
+               { LB_TAG_COMPILER,       coreboot_compiler,       },
+               { LB_TAG_LINKER,         coreboot_linker,         },
+               { LB_TAG_ASSEMBLER,      coreboot_assembler,      },
+       };
+       unsigned int i;
+       for(i = 0; i < sizeof(strings)/sizeof(strings[0]); i++) {
+               struct lb_string *rec;
+               size_t len;
+               rec = (struct lb_string *)lb_new_record(header);
+               len = strlen(strings[i].string);
+               rec->tag = strings[i].tag;
+               rec->size = (sizeof(*rec) + len + 1 + 3) & ~3;
+               memcpy(rec->string, strings[i].string, len+1);
+       }
+
+}
+
+void lb_memory_range(struct lb_memory *mem,
+       uint32_t type, uint64_t start, uint64_t size)
+{
+       int entries;
+       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
+       mem->map[entries].start = pack_lb64(start);
+       mem->map[entries].size = pack_lb64(size);
+       mem->map[entries].type = type;
+       mem->size += sizeof(mem->map[0]);
+}
+
+static void lb_reserve_table_memory(struct lb_header *head)
+{
+       struct lb_record *last_rec;
+       struct lb_memory *mem;
+       uint64_t start;
+       uint64_t end;
+       int i, entries;
+
+       last_rec = lb_last_record(head);
+       mem = get_lb_mem();
+       start = (unsigned long)head;
+       end = (unsigned long)last_rec;
+       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
+       /* Resize the right two memory areas so this table is in
+        * a reserved area of memory.  Everything has been carefully
+        * setup so that is all we need to do.
+        */
+       for(i = 0; i < entries; i++ ) {
+               uint64_t map_start = unpack_lb64(mem->map[i].start);
+               uint64_t map_end = map_start + unpack_lb64(mem->map[i].size);
+               /* Does this area need to be expanded? */
+               if (map_end == start) {
+                       mem->map[i].size = pack_lb64(end - map_start);
+               }
+               /* Does this area need to be contracted? */
+               else if (map_start == start) {
+                       mem->map[i].start = pack_lb64(end);
+                       mem->map[i].size = pack_lb64(map_end - end);
+               }
+       }
+}
+
+unsigned long lb_table_fini(struct lb_header *head)
+{
+       struct lb_record *rec, *first_rec;
+       rec = lb_last_record(head);
+       if (head->table_entries) {
+               head->table_bytes += rec->size;
+       }
+       lb_reserve_table_memory(head);
+       first_rec = lb_first_record(head);
+       head->table_checksum = compute_ip_checksum(first_rec, head->table_bytes);
+       head->header_checksum = 0;
+       head->header_checksum = compute_ip_checksum(head, sizeof(*head));
+       printk_debug("Wrote coreboot table at: %p - %p  checksum %lx\n",
+               head, rec, head->table_checksum);
+       return (unsigned long)rec;
+}
+
+static void lb_cleanup_memory_ranges(struct lb_memory *mem)
+{
+       int entries;
+       int i, j;
+       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
+       
+       /* Sort the lb memory ranges */
+       for(i = 0; i < entries; i++) {
+               uint64_t entry_start = unpack_lb64(mem->map[i].start);
+               for(j = i; j < entries; j++) {
+                       uint64_t temp_start = unpack_lb64(mem->map[j].start);
+                       if (temp_start < entry_start) {
+                               struct lb_memory_range tmp;
+                               tmp = mem->map[i];
+                               mem->map[i] = mem->map[j];
+                               mem->map[j] = tmp;
+                       }
+               }
+       }
+
+       /* Merge adjacent entries */
+       for(i = 0; (i + 1) < entries; i++) {
+               uint64_t start, end, nstart, nend;
+               if (mem->map[i].type != mem->map[i + 1].type) {
+                       continue;
+               }
+               start  = unpack_lb64(mem->map[i].start);
+               end    = start + unpack_lb64(mem->map[i].size);
+               nstart = unpack_lb64(mem->map[i + 1].start);
+               nend   = nstart + unpack_lb64(mem->map[i + 1].size);
+               if ((start <= nstart) && (end > nstart)) {
+                       if (start > nstart) {
+                               start = nstart;
+                       }
+                       if (end < nend) {
+                               end = nend;
+                       }
+                       /* Record the new region size */
+                       mem->map[i].start = pack_lb64(start);
+                       mem->map[i].size  = pack_lb64(end - start);
+
+                       /* Delete the entry I have merged with */
+                       memmove(&mem->map[i + 1], &mem->map[i + 2], 
+                               ((entries - i - 2) * sizeof(mem->map[0])));
+                       mem->size -= sizeof(mem->map[0]);
+                       entries -= 1;
+                       /* See if I can merge with the next entry as well */
+                       i -= 1; 
+               }
+       }
+}
+
+static void lb_remove_memory_range(struct lb_memory *mem, 
+       uint64_t start, uint64_t size)
+{
+       uint64_t end;
+       int entries;
+       int i;
+
+       end = start + size;
+       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
+
+       /* Remove a reserved area from the memory map */
+       for(i = 0; i < entries; i++) {
+               uint64_t map_start = unpack_lb64(mem->map[i].start);
+               uint64_t map_end   = map_start + unpack_lb64(mem->map[i].size);
+               if ((start <= map_start) && (end >= map_end)) {
+                       /* Remove the completely covered range */
+                       memmove(&mem->map[i], &mem->map[i + 1], 
+                               ((entries - i - 1) * sizeof(mem->map[0])));
+                       mem->size -= sizeof(mem->map[0]);
+                       entries -= 1;
+                       /* Since the index will disappear revisit what will appear here */
+                       i -= 1; 
+               }
+               else if ((start > map_start) && (end < map_end)) {
+                       /* Split the memory range */
+                       memmove(&mem->map[i + 1], &mem->map[i], 
+                               ((entries - i) * sizeof(mem->map[0])));
+                       mem->size += sizeof(mem->map[0]);
+                       entries += 1;
+                       /* Update the first map entry */
+                       mem->map[i].size = pack_lb64(start - map_start);
+                       /* Update the second map entry */
+                       mem->map[i + 1].start = pack_lb64(end);
+                       mem->map[i + 1].size  = pack_lb64(map_end - end);
+                       /* Don't bother with this map entry again */
+                       i += 1;
+               }
+               else if ((start <= map_start) && (end > map_start)) {
+                       /* Shrink the start of the memory range */
+                       mem->map[i].start = pack_lb64(end);
+                       mem->map[i].size  = pack_lb64(map_end - end);
+               }
+               else if ((start < map_end) && (start > map_start)) {
+                       /* Shrink the end of the memory range */
+                       mem->map[i].size = pack_lb64(start - map_start);
+               }
+       }
+}
+
+static void lb_add_memory_range(struct lb_memory *mem,
+       uint32_t type, uint64_t start, uint64_t size)
+{
+       lb_remove_memory_range(mem, start, size);
+       lb_memory_range(mem, type, start, size);
+       lb_cleanup_memory_ranges(mem);
+}
+
+/* Routines to extract part so the coreboot table or 
+ * information from the coreboot table after we have written it.
+ * Currently get_lb_mem relies on a global we can change the
+ * implementaiton.
+ */
+static struct lb_memory *mem_ranges = 0;
+struct lb_memory *get_lb_mem(void)
+{
+       return mem_ranges;
+}
+
+static void build_lb_mem_range(void *gp, struct device *dev, struct resource *res)
+{
+       struct lb_memory *mem = gp;
+       lb_memory_range(mem, LB_MEM_RAM, res->base, res->size);
+}
+
+static struct lb_memory *build_lb_mem(struct lb_header *head)
+{
+       struct lb_memory *mem;
+
+       /* Record where the lb memory ranges will live */
+       mem = lb_memory(head);
+       mem_ranges = mem;
+
+       /* Build the raw table of memory */
+       search_global_resources(
+               IORESOURCE_MEM | IORESOURCE_CACHEABLE, IORESOURCE_MEM | IORESOURCE_CACHEABLE,
+               build_lb_mem_range, mem);
+       lb_cleanup_memory_ranges(mem);
+       return mem;
+}
+
+unsigned long write_coreboot_table( 
+       unsigned long low_table_start, unsigned long low_table_end, 
+       unsigned long rom_table_start, unsigned long rom_table_end)
+{
+       unsigned long table_size;
+       struct lb_header *head;
+       struct lb_memory *mem;
+
+       if(low_table_end > (0x1000 - sizeof(struct lb_header))) { /* after 4K */
+               /* We need to put lbtable on  to [0xf0000,0x100000) */
+               head = lb_table_init(rom_table_end);
+               rom_table_end = (unsigned long)head;
+       } else {
+               head = lb_table_init(low_table_end);
+               low_table_end = (unsigned long)head;
+       }
+       printk_debug("Adjust low_table_end from 0x%08x to ", low_table_end);
+       low_table_end += 0xfff; // 4K aligned
+       low_table_end &= ~0xfff;
+       printk_debug("0x%08x \n", low_table_end);
+
+       /* The Linux kernel assumes this region is reserved */
+       printk_debug("Adjust rom_table_end from 0x%08x to ", rom_table_end);
+       rom_table_end += 0xffff; // 64K align
+       rom_table_end &= ~0xffff;
+       printk_debug("0x%08x \n", rom_table_end);
+
+#if (HAVE_OPTION_TABLE == 1) 
+       {
+               struct lb_record *rec_dest, *rec_src;
+               /* Write the option config table... */
+               rec_dest = lb_new_record(head);
+               rec_src = (struct lb_record *)(void *)&option_table;
+               memcpy(rec_dest,  rec_src, rec_src->size);
+               /* Create cmos checksum entry in coreboot table */
+               lb_cmos_checksum(head);
+       }
+#endif
+       /* Record where RAM is located */
+       mem = build_lb_mem(head);
+       
+       /* Record the mptable and the the lb_table (This will be adjusted later) */
+       lb_add_memory_range(mem, LB_MEM_TABLE, 
+               low_table_start, low_table_end - low_table_start);
+
+       /* Record the pirq table, acpi tables, and maybe the mptable */
+       table_size=rom_table_end-rom_table_start;
+       lb_add_memory_range(mem, LB_MEM_TABLE, 
+               rom_table_start, table_size<0x10000?0x10000:table_size);
+
+       /* Note:
+        * I assume that there is always memory at immediately after
+        * the low_table_end.  This means that after I setup the coreboot table.
+        * I can trivially fixup the reserved memory ranges to hold the correct
+        * size of the coreboot table.
+        */
+
+       /* Record our motheboard */
+       lb_mainboard(head);
+       /* Record our various random string information */
+       lb_strings(head);
+
+       /* Remember where my valid memory ranges are */
+       return lb_table_fini(head);
+       
+}
diff --git a/src/arch/i386/boot/coreboot_table.h b/src/arch/i386/boot/coreboot_table.h
new file mode 100644 (file)
index 0000000..a5ba0f5
--- /dev/null
@@ -0,0 +1,29 @@
+#ifndef COREBOOT_TABLE_H
+#define COREBOOT_TABLE_H
+
+#include <boot/coreboot_tables.h>
+
+/* This file holds function prototypes for building the coreboot table. */
+unsigned long write_coreboot_table(
+       unsigned long low_table_start, unsigned long low_table_end,
+       unsigned long rom_table_start, unsigned long rom_table_end);
+
+struct lb_header *lb_table_init(unsigned long addr);
+struct lb_record *lb_first_record(struct lb_header *header);
+struct lb_record *lb_last_record(struct lb_header *header);
+struct lb_record *lb_next_record(struct lb_record *rec);
+struct lb_record *lb_new_record(struct lb_header *header);
+struct lb_memory *lb_memory(struct lb_header *header);
+void lb_memory_range(struct lb_memory *mem, 
+       uint32_t type, uint64_t start, uint64_t size);
+struct lb_mainboard *lb_mainboard(struct lb_header *header);
+unsigned long lb_table_fini(struct lb_header *header);
+
+/* Routines to extract part so the coreboot table or information
+ * from the coreboot table.
+ */
+struct lb_memory *get_lb_mem(void);
+
+extern struct cmos_option_table option_table;
+
+#endif /* COREBOOT_TABLE_H */
diff --git a/src/arch/i386/boot/linuxbios_table.c b/src/arch/i386/boot/linuxbios_table.c
deleted file mode 100644 (file)
index 0dbdce3..0000000
+++ /dev/null
@@ -1,417 +0,0 @@
-#include <console/console.h>
-#include <ip_checksum.h>
-#include <boot/linuxbios_tables.h>
-#include "linuxbios_table.h"
-#include <string.h>
-#include <version.h>
-#include <device/device.h>
-#include <stdlib.h>
-
-struct lb_header *lb_table_init(unsigned long addr)
-{
-       struct lb_header *header;
-
-       /* 16 byte align the address */
-       addr += 15;
-       addr &= ~15;
-
-       header = (void *)addr;
-       header->signature[0] = 'L';
-       header->signature[1] = 'B';
-       header->signature[2] = 'I';
-       header->signature[3] = 'O';
-       header->header_bytes = sizeof(*header);
-       header->header_checksum = 0;
-       header->table_bytes = 0;
-       header->table_checksum = 0;
-       header->table_entries = 0;
-       return header;
-}
-
-struct lb_record *lb_first_record(struct lb_header *header)
-{
-       struct lb_record *rec;
-       rec = (void *)(((char *)header) + sizeof(*header));
-       return rec;
-}
-
-struct lb_record *lb_last_record(struct lb_header *header)
-{
-       struct lb_record *rec;
-       rec = (void *)(((char *)header) + sizeof(*header) + header->table_bytes);
-       return rec;
-}
-
-struct lb_record *lb_next_record(struct lb_record *rec)
-{
-       rec = (void *)(((char *)rec) + rec->size);      
-       return rec;
-}
-
-struct lb_record *lb_new_record(struct lb_header *header)
-{
-       struct lb_record *rec;
-       rec = lb_last_record(header);
-       if (header->table_entries) {
-               header->table_bytes += rec->size;
-       }
-       rec = lb_last_record(header);
-       header->table_entries++;
-       rec->tag = LB_TAG_UNUSED;
-       rec->size = sizeof(*rec);
-       return rec;
-}
-
-
-struct lb_memory *lb_memory(struct lb_header *header)
-{
-       struct lb_record *rec;
-       struct lb_memory *mem;
-       rec = lb_new_record(header);
-       mem = (struct lb_memory *)rec;
-       mem->tag = LB_TAG_MEMORY;
-       mem->size = sizeof(*mem);
-       return mem;
-}
-
-struct lb_mainboard *lb_mainboard(struct lb_header *header)
-{
-       struct lb_record *rec;
-       struct lb_mainboard *mainboard;
-       rec = lb_new_record(header);
-       mainboard = (struct lb_mainboard *)rec;
-       mainboard->tag = LB_TAG_MAINBOARD;
-
-       mainboard->size = (sizeof(*mainboard) +
-               strlen(mainboard_vendor) + 1 + 
-               strlen(mainboard_part_number) + 1 +
-               3) & ~3;
-
-       mainboard->vendor_idx = 0;
-       mainboard->part_number_idx = strlen(mainboard_vendor) + 1;
-
-       memcpy(mainboard->strings + mainboard->vendor_idx,
-               mainboard_vendor,      strlen(mainboard_vendor) + 1);
-       memcpy(mainboard->strings + mainboard->part_number_idx,
-               mainboard_part_number, strlen(mainboard_part_number) + 1);
-
-       return mainboard;
-}
-
-struct cmos_checksum *lb_cmos_checksum(struct lb_header *header)
-{
-       struct lb_record *rec;
-       struct cmos_checksum *cmos_checksum;
-       rec = lb_new_record(header);
-       cmos_checksum = (struct cmos_checksum *)rec;
-       cmos_checksum->tag = LB_TAG_OPTION_CHECKSUM;
-
-       cmos_checksum->size = (sizeof(*cmos_checksum));
-
-       cmos_checksum->range_start = LB_CKS_RANGE_START * 8;
-       cmos_checksum->range_end = ( LB_CKS_RANGE_END * 8 ) + 7;
-       cmos_checksum->location = LB_CKS_LOC * 8;
-       cmos_checksum->type = CHECKSUM_PCBIOS;
-       
-       return cmos_checksum;
-}
-
-void lb_strings(struct lb_header *header)
-{
-       static const struct {
-               uint32_t tag;
-               const char *string;
-       } strings[] = {
-               { LB_TAG_VERSION,        coreboot_version,        },
-               { LB_TAG_EXTRA_VERSION,  coreboot_extra_version,  },
-               { LB_TAG_BUILD,          coreboot_build,          },
-               { LB_TAG_COMPILE_TIME,   coreboot_compile_time,   },
-               { LB_TAG_COMPILE_BY,     coreboot_compile_by,     },
-               { LB_TAG_COMPILE_HOST,   coreboot_compile_host,   },
-               { LB_TAG_COMPILE_DOMAIN, coreboot_compile_domain, },
-               { LB_TAG_COMPILER,       coreboot_compiler,       },
-               { LB_TAG_LINKER,         coreboot_linker,         },
-               { LB_TAG_ASSEMBLER,      coreboot_assembler,      },
-       };
-       unsigned int i;
-       for(i = 0; i < sizeof(strings)/sizeof(strings[0]); i++) {
-               struct lb_string *rec;
-               size_t len;
-               rec = (struct lb_string *)lb_new_record(header);
-               len = strlen(strings[i].string);
-               rec->tag = strings[i].tag;
-               rec->size = (sizeof(*rec) + len + 1 + 3) & ~3;
-               memcpy(rec->string, strings[i].string, len+1);
-       }
-
-}
-
-void lb_memory_range(struct lb_memory *mem,
-       uint32_t type, uint64_t start, uint64_t size)
-{
-       int entries;
-       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
-       mem->map[entries].start = pack_lb64(start);
-       mem->map[entries].size = pack_lb64(size);
-       mem->map[entries].type = type;
-       mem->size += sizeof(mem->map[0]);
-}
-
-static void lb_reserve_table_memory(struct lb_header *head)
-{
-       struct lb_record *last_rec;
-       struct lb_memory *mem;
-       uint64_t start;
-       uint64_t end;
-       int i, entries;
-
-       last_rec = lb_last_record(head);
-       mem = get_lb_mem();
-       start = (unsigned long)head;
-       end = (unsigned long)last_rec;
-       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
-       /* Resize the right two memory areas so this table is in
-        * a reserved area of memory.  Everything has been carefully
-        * setup so that is all we need to do.
-        */
-       for(i = 0; i < entries; i++ ) {
-               uint64_t map_start = unpack_lb64(mem->map[i].start);
-               uint64_t map_end = map_start + unpack_lb64(mem->map[i].size);
-               /* Does this area need to be expanded? */
-               if (map_end == start) {
-                       mem->map[i].size = pack_lb64(end - map_start);
-               }
-               /* Does this area need to be contracted? */
-               else if (map_start == start) {
-                       mem->map[i].start = pack_lb64(end);
-                       mem->map[i].size = pack_lb64(map_end - end);
-               }
-       }
-}
-
-unsigned long lb_table_fini(struct lb_header *head)
-{
-       struct lb_record *rec, *first_rec;
-       rec = lb_last_record(head);
-       if (head->table_entries) {
-               head->table_bytes += rec->size;
-       }
-       lb_reserve_table_memory(head);
-       first_rec = lb_first_record(head);
-       head->table_checksum = compute_ip_checksum(first_rec, head->table_bytes);
-       head->header_checksum = 0;
-       head->header_checksum = compute_ip_checksum(head, sizeof(*head));
-       printk_debug("Wrote coreboot table at: %p - %p  checksum %lx\n",
-               head, rec, head->table_checksum);
-       return (unsigned long)rec;
-}
-
-static void lb_cleanup_memory_ranges(struct lb_memory *mem)
-{
-       int entries;
-       int i, j;
-       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
-       
-       /* Sort the lb memory ranges */
-       for(i = 0; i < entries; i++) {
-               uint64_t entry_start = unpack_lb64(mem->map[i].start);
-               for(j = i; j < entries; j++) {
-                       uint64_t temp_start = unpack_lb64(mem->map[j].start);
-                       if (temp_start < entry_start) {
-                               struct lb_memory_range tmp;
-                               tmp = mem->map[i];
-                               mem->map[i] = mem->map[j];
-                               mem->map[j] = tmp;
-                       }
-               }
-       }
-
-       /* Merge adjacent entries */
-       for(i = 0; (i + 1) < entries; i++) {
-               uint64_t start, end, nstart, nend;
-               if (mem->map[i].type != mem->map[i + 1].type) {
-                       continue;
-               }
-               start  = unpack_lb64(mem->map[i].start);
-               end    = start + unpack_lb64(mem->map[i].size);
-               nstart = unpack_lb64(mem->map[i + 1].start);
-               nend   = nstart + unpack_lb64(mem->map[i + 1].size);
-               if ((start <= nstart) && (end > nstart)) {
-                       if (start > nstart) {
-                               start = nstart;
-                       }
-                       if (end < nend) {
-                               end = nend;
-                       }
-                       /* Record the new region size */
-                       mem->map[i].start = pack_lb64(start);
-                       mem->map[i].size  = pack_lb64(end - start);
-
-                       /* Delete the entry I have merged with */
-                       memmove(&mem->map[i + 1], &mem->map[i + 2], 
-                               ((entries - i - 2) * sizeof(mem->map[0])));
-                       mem->size -= sizeof(mem->map[0]);
-                       entries -= 1;
-                       /* See if I can merge with the next entry as well */
-                       i -= 1; 
-               }
-       }
-}
-
-static void lb_remove_memory_range(struct lb_memory *mem, 
-       uint64_t start, uint64_t size)
-{
-       uint64_t end;
-       int entries;
-       int i;
-
-       end = start + size;
-       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
-
-       /* Remove a reserved area from the memory map */
-       for(i = 0; i < entries; i++) {
-               uint64_t map_start = unpack_lb64(mem->map[i].start);
-               uint64_t map_end   = map_start + unpack_lb64(mem->map[i].size);
-               if ((start <= map_start) && (end >= map_end)) {
-                       /* Remove the completely covered range */
-                       memmove(&mem->map[i], &mem->map[i + 1], 
-                               ((entries - i - 1) * sizeof(mem->map[0])));
-                       mem->size -= sizeof(mem->map[0]);
-                       entries -= 1;
-                       /* Since the index will disappear revisit what will appear here */
-                       i -= 1; 
-               }
-               else if ((start > map_start) && (end < map_end)) {
-                       /* Split the memory range */
-                       memmove(&mem->map[i + 1], &mem->map[i], 
-                               ((entries - i) * sizeof(mem->map[0])));
-                       mem->size += sizeof(mem->map[0]);
-                       entries += 1;
-                       /* Update the first map entry */
-                       mem->map[i].size = pack_lb64(start - map_start);
-                       /* Update the second map entry */
-                       mem->map[i + 1].start = pack_lb64(end);
-                       mem->map[i + 1].size  = pack_lb64(map_end - end);
-                       /* Don't bother with this map entry again */
-                       i += 1;
-               }
-               else if ((start <= map_start) && (end > map_start)) {
-                       /* Shrink the start of the memory range */
-                       mem->map[i].start = pack_lb64(end);
-                       mem->map[i].size  = pack_lb64(map_end - end);
-               }
-               else if ((start < map_end) && (start > map_start)) {
-                       /* Shrink the end of the memory range */
-                       mem->map[i].size = pack_lb64(start - map_start);
-               }
-       }
-}
-
-static void lb_add_memory_range(struct lb_memory *mem,
-       uint32_t type, uint64_t start, uint64_t size)
-{
-       lb_remove_memory_range(mem, start, size);
-       lb_memory_range(mem, type, start, size);
-       lb_cleanup_memory_ranges(mem);
-}
-
-/* Routines to extract part so the coreboot table or 
- * information from the coreboot table after we have written it.
- * Currently get_lb_mem relies on a global we can change the
- * implementaiton.
- */
-static struct lb_memory *mem_ranges = 0;
-struct lb_memory *get_lb_mem(void)
-{
-       return mem_ranges;
-}
-
-static void build_lb_mem_range(void *gp, struct device *dev, struct resource *res)
-{
-       struct lb_memory *mem = gp;
-       lb_memory_range(mem, LB_MEM_RAM, res->base, res->size);
-}
-
-static struct lb_memory *build_lb_mem(struct lb_header *head)
-{
-       struct lb_memory *mem;
-
-       /* Record where the lb memory ranges will live */
-       mem = lb_memory(head);
-       mem_ranges = mem;
-
-       /* Build the raw table of memory */
-       search_global_resources(
-               IORESOURCE_MEM | IORESOURCE_CACHEABLE, IORESOURCE_MEM | IORESOURCE_CACHEABLE,
-               build_lb_mem_range, mem);
-       lb_cleanup_memory_ranges(mem);
-       return mem;
-}
-
-unsigned long write_coreboot_table( 
-       unsigned long low_table_start, unsigned long low_table_end, 
-       unsigned long rom_table_start, unsigned long rom_table_end)
-{
-       unsigned long table_size;
-       struct lb_header *head;
-       struct lb_memory *mem;
-
-       if(low_table_end > (0x1000 - sizeof(struct lb_header))) { /* after 4K */
-               /* We need to put lbtable on  to [0xf0000,0x100000) */
-               head = lb_table_init(rom_table_end);
-               rom_table_end = (unsigned long)head;
-       } else {
-               head = lb_table_init(low_table_end);
-               low_table_end = (unsigned long)head;
-       }
-       printk_debug("Adjust low_table_end from 0x%08x to ", low_table_end);
-       low_table_end += 0xfff; // 4K aligned
-       low_table_end &= ~0xfff;
-       printk_debug("0x%08x \n", low_table_end);
-
-       /* The Linux kernel assumes this region is reserved */
-       printk_debug("Adjust rom_table_end from 0x%08x to ", rom_table_end);
-       rom_table_end += 0xffff; // 64K align
-       rom_table_end &= ~0xffff;
-       printk_debug("0x%08x \n", rom_table_end);
-
-#if (HAVE_OPTION_TABLE == 1) 
-       {
-               struct lb_record *rec_dest, *rec_src;
-               /* Write the option config table... */
-               rec_dest = lb_new_record(head);
-               rec_src = (struct lb_record *)(void *)&option_table;
-               memcpy(rec_dest,  rec_src, rec_src->size);
-               /* Create cmos checksum entry in coreboot table */
-               lb_cmos_checksum(head);
-       }
-#endif
-       /* Record where RAM is located */
-       mem = build_lb_mem(head);
-       
-       /* Record the mptable and the the lb_table (This will be adjusted later) */
-       lb_add_memory_range(mem, LB_MEM_TABLE, 
-               low_table_start, low_table_end - low_table_start);
-
-       /* Record the pirq table, acpi tables, and maybe the mptable */
-       table_size=rom_table_end-rom_table_start;
-       lb_add_memory_range(mem, LB_MEM_TABLE, 
-               rom_table_start, table_size<0x10000?0x10000:table_size);
-
-       /* Note:
-        * I assume that there is always memory at immediately after
-        * the low_table_end.  This means that after I setup the coreboot table.
-        * I can trivially fixup the reserved memory ranges to hold the correct
-        * size of the coreboot table.
-        */
-
-       /* Record our motheboard */
-       lb_mainboard(head);
-       /* Record our various random string information */
-       lb_strings(head);
-
-       /* Remember where my valid memory ranges are */
-       return lb_table_fini(head);
-       
-}
diff --git a/src/arch/i386/boot/linuxbios_table.h b/src/arch/i386/boot/linuxbios_table.h
deleted file mode 100644 (file)
index 7944791..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef COREBOOT_TABLE_H
-#define COREBOOT_TABLE_H
-
-#include <boot/linuxbios_tables.h>
-
-/* This file holds function prototypes for building the coreboot table. */
-unsigned long write_coreboot_table(
-       unsigned long low_table_start, unsigned long low_table_end,
-       unsigned long rom_table_start, unsigned long rom_table_end);
-
-struct lb_header *lb_table_init(unsigned long addr);
-struct lb_record *lb_first_record(struct lb_header *header);
-struct lb_record *lb_last_record(struct lb_header *header);
-struct lb_record *lb_next_record(struct lb_record *rec);
-struct lb_record *lb_new_record(struct lb_header *header);
-struct lb_memory *lb_memory(struct lb_header *header);
-void lb_memory_range(struct lb_memory *mem, 
-       uint32_t type, uint64_t start, uint64_t size);
-struct lb_mainboard *lb_mainboard(struct lb_header *header);
-unsigned long lb_table_fini(struct lb_header *header);
-
-/* Routines to extract part so the coreboot table or information
- * from the coreboot table.
- */
-struct lb_memory *get_lb_mem(void);
-
-extern struct cmos_option_table option_table;
-
-#endif /* COREBOOT_TABLE_H */
index 417d9a98bbd664a8697c702ee85e06a27885a600..0ff5c0ad2d625d1f477c73a42cbacdd178bfa947 100644 (file)
@@ -4,12 +4,12 @@
 #include <console/console.h>
 #include <cpu/cpu.h>
 #include <boot/tables.h>
-#include <boot/linuxbios_tables.h>
+#include <boot/coreboot_tables.h>
 #include <arch/pirq_routing.h>
 #include <arch/smp/mpspec.h>
 #include <arch/acpi.h>
 #include <string.h>
-#include "linuxbios_table.h"
+#include "coreboot_table.h"
 
 // Global Descriptor Table, defined in c_start.S
 extern uint8_t gdt;
diff --git a/src/arch/i386/llshell/readme.coreboot b/src/arch/i386/llshell/readme.coreboot
new file mode 100644 (file)
index 0000000..fb23d1a
--- /dev/null
@@ -0,0 +1,25 @@
+
+1) Include llshell.inc in your northbridge Config file
+2) In raminit.inc (or whatever), make a jmp out to low_level_shell, setting
+   a return label in %esp.
+For example:
+ram_set_registers:
+
+       mov $llshell_ret1,%esp
+       jmp low_level_shell
+llshell_ret1:
+
+        /* Disable and invalidate the cache */
+        invd
+        mov %cr0, %eax
+        ....
+3) Optionally, comment out two lines in ramtest.inc:
+5:
+        CONSOLE_INFO_TX_STRING($rt_toomany)
+        // intel_chip_post_macro(0xf1)
+        // jmp  .Lhlt
+otherwise, a ramtest failure will hang
+
+4) build and flash as normal
+If it worked, the speaker will beep, and you'll get a shell.
+Type help or ? at the prompt for a list of commands.
diff --git a/src/arch/i386/llshell/readme.linuxbios b/src/arch/i386/llshell/readme.linuxbios
deleted file mode 100644 (file)
index fb23d1a..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-
-1) Include llshell.inc in your northbridge Config file
-2) In raminit.inc (or whatever), make a jmp out to low_level_shell, setting
-   a return label in %esp.
-For example:
-ram_set_registers:
-
-       mov $llshell_ret1,%esp
-       jmp low_level_shell
-llshell_ret1:
-
-        /* Disable and invalidate the cache */
-        invd
-        mov %cr0, %eax
-        ....
-3) Optionally, comment out two lines in ramtest.inc:
-5:
-        CONSOLE_INFO_TX_STRING($rt_toomany)
-        // intel_chip_post_macro(0xf1)
-        // jmp  .Lhlt
-otherwise, a ramtest failure will hang
-
-4) build and flash as normal
-If it worked, the speaker will beep, and you'll get a shell.
-Type help or ? at the prompt for a list of commands.
index 284406c17593e868053549b908a88588d1044626..cac76ed3afb0a73bbb4e7b60ce0d94e7e5e60b11 100644 (file)
@@ -1,3 +1,3 @@
 object boot.o
 object tables.o
-object linuxbios_table.o
+object coreboot_table.o
diff --git a/src/arch/ppc/boot/coreboot_table.c b/src/arch/ppc/boot/coreboot_table.c
new file mode 100644 (file)
index 0000000..ea6b683
--- /dev/null
@@ -0,0 +1,380 @@
+#include <console/console.h>
+#include <ip_checksum.h>
+#include <boot/coreboot_tables.h>
+#include "coreboot_table.h"
+#include <string.h>
+#include <version.h>
+#include <device/device.h>
+#include <stdlib.h>
+
+struct lb_header *lb_table_init(unsigned long addr)
+{
+       struct lb_header *header;
+
+       /* 16 byte align the address */
+       addr += 15;
+       addr &= ~15;
+
+       header = (void *)addr;
+       header->signature[0] = 'L';
+       header->signature[1] = 'B';
+       header->signature[2] = 'I';
+       header->signature[3] = 'O';
+       header->header_bytes = sizeof(*header);
+       header->header_checksum = 0;
+       header->table_bytes = 0;
+       header->table_checksum = 0;
+       header->table_entries = 0;
+       return header;
+}
+
+struct lb_record *lb_first_record(struct lb_header *header)
+{
+       struct lb_record *rec;
+       rec = (void *)(((char *)header) + sizeof(*header));
+       return rec;
+}
+
+struct lb_record *lb_last_record(struct lb_header *header)
+{
+       struct lb_record *rec;
+       rec = (void *)(((char *)header) + sizeof(*header) + header->table_bytes);
+       return rec;
+}
+
+struct lb_record *lb_next_record(struct lb_record *rec)
+{
+       rec = (void *)(((char *)rec) + rec->size);      
+       return rec;
+}
+
+struct lb_record *lb_new_record(struct lb_header *header)
+{
+       struct lb_record *rec;
+       rec = lb_last_record(header);
+       if (header->table_entries) {
+               header->table_bytes += rec->size;
+       }
+       rec = lb_last_record(header);
+       header->table_entries++;
+       rec->tag = LB_TAG_UNUSED;
+       rec->size = sizeof(*rec);
+       return rec;
+}
+
+
+struct lb_memory *lb_memory(struct lb_header *header)
+{
+       struct lb_record *rec;
+       struct lb_memory *mem;
+       rec = lb_new_record(header);
+       mem = (struct lb_memory *)rec;
+       mem->tag = LB_TAG_MEMORY;
+       mem->size = sizeof(*mem);
+       return mem;
+}
+
+struct lb_mainboard *lb_mainboard(struct lb_header *header)
+{
+       struct lb_record *rec;
+       struct lb_mainboard *mainboard;
+       rec = lb_new_record(header);
+       mainboard = (struct lb_mainboard *)rec;
+       mainboard->tag = LB_TAG_MAINBOARD;
+
+       mainboard->size = (sizeof(*mainboard) +
+               strlen(mainboard_vendor) + 1 + 
+               strlen(mainboard_part_number) + 1 +
+               3) & ~3;
+
+       mainboard->vendor_idx = 0;
+       mainboard->part_number_idx = strlen(mainboard_vendor) + 1;
+
+       memcpy(mainboard->strings + mainboard->vendor_idx,
+               mainboard_vendor,      strlen(mainboard_vendor) + 1);
+       memcpy(mainboard->strings + mainboard->part_number_idx,
+               mainboard_part_number, strlen(mainboard_part_number) + 1);
+
+       return mainboard;
+}
+
+void lb_strings(struct lb_header *header)
+{
+       static const struct {
+               uint32_t tag;
+               const uint8_t *string;
+       } strings[] = {
+               { LB_TAG_VERSION,        coreboot_version,        },
+               { LB_TAG_EXTRA_VERSION,  coreboot_extra_version,  },
+               { LB_TAG_BUILD,          coreboot_build,          },
+               { LB_TAG_COMPILE_TIME,   coreboot_compile_time,   },
+               { LB_TAG_COMPILE_BY,     coreboot_compile_by,     },
+               { LB_TAG_COMPILE_HOST,   coreboot_compile_host,   },
+               { LB_TAG_COMPILE_DOMAIN, coreboot_compile_domain, },
+               { LB_TAG_COMPILER,       coreboot_compiler,       },
+               { LB_TAG_LINKER,         coreboot_linker,         },
+               { LB_TAG_ASSEMBLER,      coreboot_assembler,      },
+       };
+       unsigned int i;
+       for(i = 0; i < sizeof(strings)/sizeof(strings[0]); i++) {
+               struct lb_string *rec;
+               size_t len;
+               rec = (struct lb_string *)lb_new_record(header);
+               len = strlen(strings[i].string);
+               rec->tag = strings[i].tag;
+               rec->size = (sizeof(*rec) + len + 1 + 3) & ~3;
+               memcpy(rec->string, strings[i].string, len+1);
+       }
+
+}
+
+void lb_memory_range(struct lb_memory *mem,
+       uint32_t type, uint64_t start, uint64_t size)
+{
+       int entries;
+       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
+       mem->map[entries].start = pack_lb64(start);
+       mem->map[entries].size = pack_lb64(size);
+       mem->map[entries].type = type;
+       mem->size += sizeof(mem->map[0]);
+}
+
+static void lb_reserve_table_memory(struct lb_header *head)
+{
+       struct lb_record *last_rec;
+       struct lb_memory *mem;
+       uint64_t start;
+       uint64_t end;
+       int i, entries;
+
+       last_rec = lb_last_record(head);
+       mem = get_lb_mem();
+       start = (unsigned long)head;
+       end = (unsigned long)last_rec;
+       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
+       /* Resize the right two memory areas so this table is in
+        * a reserved area of memory.  Everything has been carefully
+        * setup so that is all we need to do.
+        */
+       for(i = 0; i < entries; i++ ) {
+               uint64_t map_start = unpack_lb64(mem->map[i].start);
+               uint64_t map_end = map_start + unpack_lb64(mem->map[i].size);
+               /* Does this area need to be expanded? */
+               if (map_end == start) {
+                       mem->map[i].size = pack_lb64(end - map_start);
+               }
+               /* Does this area need to be contracted? */
+               else if (map_start == start) {
+                       mem->map[i].start = pack_lb64(end);
+                       mem->map[i].size = pack_lb64(map_end - end);
+               }
+       }
+}
+
+unsigned long lb_table_fini(struct lb_header *head)
+{
+       struct lb_record *rec, *first_rec;
+       rec = lb_last_record(head);
+       if (head->table_entries) {
+               head->table_bytes += rec->size;
+       }
+       lb_reserve_table_memory(head);
+       first_rec = lb_first_record(head);
+       head->table_checksum = compute_ip_checksum(first_rec, head->table_bytes);
+       head->header_checksum = 0;
+       head->header_checksum = compute_ip_checksum(head, sizeof(*head));
+       printk_debug("Wrote coreboot table at: %p - %p  checksum %lx\n",
+               head, rec, head->table_checksum);
+       return (unsigned long)rec;
+}
+
+static void lb_cleanup_memory_ranges(struct lb_memory *mem)
+{
+       int entries;
+       int i, j;
+       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
+       
+       /* Sort the lb memory ranges */
+       for(i = 0; i < entries; i++) {
+               uint64_t entry_start = unpack_lb64(mem->map[i].start);
+               for(j = i; j < entries; j++) {
+                       uint64_t temp_start = unpack_lb64(mem->map[j].start);
+                       if (temp_start < entry_start) {
+                               struct lb_memory_range tmp;
+                               tmp = mem->map[i];
+                               mem->map[i] = mem->map[j];
+                               mem->map[j] = tmp;
+                       }
+               }
+       }
+
+       /* Merge adjacent entries */
+       for(i = 0; (i + 1) < entries; i++) {
+               uint64_t start, end, nstart, nend;
+               if (mem->map[i].type != mem->map[i + 1].type) {
+                       continue;
+               }
+               start  = unpack_lb64(mem->map[i].start);
+               end    = start + unpack_lb64(mem->map[i].size);
+               nstart = unpack_lb64(mem->map[i + 1].start);
+               nend   = nstart + unpack_lb64(mem->map[i + 1].size);
+               if ((start <= nstart) && (end > nstart)) {
+                       if (start > nstart) {
+                               start = nstart;
+                       }
+                       if (end < nend) {
+                               end = nend;
+                       }
+                       /* Record the new region size */
+                       mem->map[i].start = pack_lb64(start);
+                       mem->map[i].size  = pack_lb64(end - start);
+
+                       /* Delete the entry I have merged with */
+                       memmove(&mem->map[i + 1], &mem->map[i + 2], 
+                               ((entries - i - 2) * sizeof(mem->map[0])));
+                       mem->size -= sizeof(mem->map[0]);
+                       entries -= 1;
+                       /* See if I can merge with the next entry as well */
+                       i -= 1; 
+               }
+       }
+}
+
+static void lb_remove_memory_range(struct lb_memory *mem, 
+       uint64_t start, uint64_t size)
+{
+       uint64_t end;
+       int entries;
+       int i;
+
+       end = start + size;
+       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
+
+       /* Remove a reserved area from the memory map */
+       for(i = 0; i < entries; i++) {
+               uint64_t map_start = unpack_lb64(mem->map[i].start);
+               uint64_t map_end   = map_start + unpack_lb64(mem->map[i].size);
+               if ((start <= map_start) && (end >= map_end)) {
+                       /* Remove the completely covered range */
+                       memmove(&mem->map[i], &mem->map[i + 1], 
+                               ((entries - i - 1) * sizeof(mem->map[0])));
+                       mem->size -= sizeof(mem->map[0]);
+                       entries -= 1;
+                       /* Since the index will disappear revisit what will appear here */
+                       i -= 1; 
+               }
+               else if ((start > map_start) && (end < map_end)) {
+                       /* Split the memory range */
+                       memmove(&mem->map[i + 1], &mem->map[i], 
+                               ((entries - i) * sizeof(mem->map[0])));
+                       mem->size += sizeof(mem->map[0]);
+                       entries += 1;
+                       /* Update the first map entry */
+                       mem->map[i].size = pack_lb64(start - map_start);
+                       /* Update the second map entry */
+                       mem->map[i + 1].start = pack_lb64(end);
+                       mem->map[i + 1].size  = pack_lb64(map_end - end);
+                       /* Don't bother with this map entry again */
+                       i += 1;
+               }
+               else if ((start <= map_start) && (end > map_start)) {
+                       /* Shrink the start of the memory range */
+                       mem->map[i].start = pack_lb64(end);
+                       mem->map[i].size  = pack_lb64(map_end - end);
+               }
+               else if ((start < map_end) && (start > map_start)) {
+                       /* Shrink the end of the memory range */
+                       mem->map[i].size = pack_lb64(start - map_start);
+               }
+       }
+}
+
+static void lb_add_memory_range(struct lb_memory *mem,
+       uint32_t type, uint64_t start, uint64_t size)
+{
+       lb_remove_memory_range(mem, start, size);
+       lb_memory_range(mem, type, start, size);
+       lb_cleanup_memory_ranges(mem);
+}
+
+/* Routines to extract part so the coreboot table or 
+ * information from the coreboot table after we have written it.
+ * Currently get_lb_mem relies on a global we can change the
+ * implementaiton.
+ */
+static struct lb_memory *mem_ranges = 0;
+struct lb_memory *get_lb_mem(void)
+{
+       return mem_ranges;
+}
+
+static void build_lb_mem_range(void *gp, struct device *dev, struct resource *res)
+{
+       struct lb_memory *mem = gp;
+       lb_memory_range(mem, LB_MEM_RAM, res->base, res->size);
+}
+
+static struct lb_memory *build_lb_mem(struct lb_header *head)
+{
+       struct lb_memory *mem;
+
+       /* Record where the lb memory ranges will live */
+       mem = lb_memory(head);
+       mem_ranges = mem;
+
+       /* Build the raw table of memory */
+       search_global_resources(
+               IORESOURCE_MEM | IORESOURCE_CACHEABLE, IORESOURCE_MEM | IORESOURCE_CACHEABLE,
+               build_lb_mem_range, mem);
+       lb_cleanup_memory_ranges(mem);
+       return mem;
+}
+
+unsigned long write_coreboot_table( 
+       unsigned long low_table_start, unsigned long low_table_end,
+       unsigned long rom_table_start, unsigned long rom_table_end)
+{
+       unsigned long table_size;
+       struct lb_header *head;
+       struct lb_memory *mem;
+
+       head = lb_table_init(low_table_end);
+       low_table_end = (unsigned long)head;
+       if (HAVE_OPTION_TABLE == 1) {
+               struct lb_record *rec_dest, *rec_src;
+               /* Write the option config table... */
+               rec_dest = lb_new_record(head);
+               rec_src = (struct lb_record *)(void *)&option_table;
+               memcpy(rec_dest,  rec_src, rec_src->size);
+       }
+       /* Record where RAM is located */
+       mem = build_lb_mem(head);
+       
+       /* Find the current mptable size */
+       table_size = (low_table_end - low_table_start);
+
+       /* Record the mptable and the the lb_table (This will be adjusted later) */
+       lb_add_memory_range(mem, LB_MEM_TABLE, 
+               low_table_start, table_size);
+
+       /* Record the pirq table */
+       lb_add_memory_range(mem, LB_MEM_TABLE, 
+               rom_table_start, (rom_table_end - rom_table_start));
+
+       /* Note:
+        * I assume that there is always memory at immediately after
+        * the low_table_end.  This means that after I setup the coreboot table.
+        * I can trivially fixup the reserved memory ranges to hold the correct
+        * size of the coreboot table.
+        */
+
+       /* Record our motheboard */
+       lb_mainboard(head);
+       /* Record our various random string information */
+       lb_strings(head);
+
+       low_table_end = lb_table_fini(head);
+
+       /* Remember where my valid memory ranges are */
+       return low_table_end;
+}
diff --git a/src/arch/ppc/boot/coreboot_table.h b/src/arch/ppc/boot/coreboot_table.h
new file mode 100644 (file)
index 0000000..2645dd5
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef COREBOOT_TABLE_H
+#define COREBOOT_TABLE_H
+
+#include <boot/coreboot_tables.h>
+
+struct mem_range;
+
+/* This file holds function prototypes for building the coreboot table. */
+unsigned long write_coreboot_table(
+       unsigned long low_table_start, unsigned long low_table_end,
+       unsigned long rom_table_start, unsigned long rom_table_end);
+
+struct lb_header *lb_table_init(unsigned long addr);
+struct lb_record *lb_first_record(struct lb_header *header);
+struct lb_record *lb_last_record(struct lb_header *header);
+struct lb_record *lb_next_record(struct lb_record *rec);
+struct lb_record *lb_new_record(struct lb_header *header);
+struct lb_memory *lb_memory(struct lb_header *header);
+void lb_memory_range(struct lb_memory *mem, 
+       uint32_t type, uint64_t startk, uint64_t sizek);
+struct lb_mainboard *lb_mainboard(struct lb_header *header);
+unsigned long lb_table_fini(struct lb_header *header);
+
+/* Routines to extract part so the coreboot table or information
+ * from the coreboot table.
+ */
+struct lb_memory *get_lb_mem(void);
+
+extern struct cmos_option_table option_table;
+
+#endif /* COREBOOT_TABLE_H */
diff --git a/src/arch/ppc/boot/linuxbios_table.c b/src/arch/ppc/boot/linuxbios_table.c
deleted file mode 100644 (file)
index 2758934..0000000
+++ /dev/null
@@ -1,380 +0,0 @@
-#include <console/console.h>
-#include <ip_checksum.h>
-#include <boot/linuxbios_tables.h>
-#include "linuxbios_table.h"
-#include <string.h>
-#include <version.h>
-#include <device/device.h>
-#include <stdlib.h>
-
-struct lb_header *lb_table_init(unsigned long addr)
-{
-       struct lb_header *header;
-
-       /* 16 byte align the address */
-       addr += 15;
-       addr &= ~15;
-
-       header = (void *)addr;
-       header->signature[0] = 'L';
-       header->signature[1] = 'B';
-       header->signature[2] = 'I';
-       header->signature[3] = 'O';
-       header->header_bytes = sizeof(*header);
-       header->header_checksum = 0;
-       header->table_bytes = 0;
-       header->table_checksum = 0;
-       header->table_entries = 0;
-       return header;
-}
-
-struct lb_record *lb_first_record(struct lb_header *header)
-{
-       struct lb_record *rec;
-       rec = (void *)(((char *)header) + sizeof(*header));
-       return rec;
-}
-
-struct lb_record *lb_last_record(struct lb_header *header)
-{
-       struct lb_record *rec;
-       rec = (void *)(((char *)header) + sizeof(*header) + header->table_bytes);
-       return rec;
-}
-
-struct lb_record *lb_next_record(struct lb_record *rec)
-{
-       rec = (void *)(((char *)rec) + rec->size);      
-       return rec;
-}
-
-struct lb_record *lb_new_record(struct lb_header *header)
-{
-       struct lb_record *rec;
-       rec = lb_last_record(header);
-       if (header->table_entries) {
-               header->table_bytes += rec->size;
-       }
-       rec = lb_last_record(header);
-       header->table_entries++;
-       rec->tag = LB_TAG_UNUSED;
-       rec->size = sizeof(*rec);
-       return rec;
-}
-
-
-struct lb_memory *lb_memory(struct lb_header *header)
-{
-       struct lb_record *rec;
-       struct lb_memory *mem;
-       rec = lb_new_record(header);
-       mem = (struct lb_memory *)rec;
-       mem->tag = LB_TAG_MEMORY;
-       mem->size = sizeof(*mem);
-       return mem;
-}
-
-struct lb_mainboard *lb_mainboard(struct lb_header *header)
-{
-       struct lb_record *rec;
-       struct lb_mainboard *mainboard;
-       rec = lb_new_record(header);
-       mainboard = (struct lb_mainboard *)rec;
-       mainboard->tag = LB_TAG_MAINBOARD;
-
-       mainboard->size = (sizeof(*mainboard) +
-               strlen(mainboard_vendor) + 1 + 
-               strlen(mainboard_part_number) + 1 +
-               3) & ~3;
-
-       mainboard->vendor_idx = 0;
-       mainboard->part_number_idx = strlen(mainboard_vendor) + 1;
-
-       memcpy(mainboard->strings + mainboard->vendor_idx,
-               mainboard_vendor,      strlen(mainboard_vendor) + 1);
-       memcpy(mainboard->strings + mainboard->part_number_idx,
-               mainboard_part_number, strlen(mainboard_part_number) + 1);
-
-       return mainboard;
-}
-
-void lb_strings(struct lb_header *header)
-{
-       static const struct {
-               uint32_t tag;
-               const uint8_t *string;
-       } strings[] = {
-               { LB_TAG_VERSION,        coreboot_version,        },
-               { LB_TAG_EXTRA_VERSION,  coreboot_extra_version,  },
-               { LB_TAG_BUILD,          coreboot_build,          },
-               { LB_TAG_COMPILE_TIME,   coreboot_compile_time,   },
-               { LB_TAG_COMPILE_BY,     coreboot_compile_by,     },
-               { LB_TAG_COMPILE_HOST,   coreboot_compile_host,   },
-               { LB_TAG_COMPILE_DOMAIN, coreboot_compile_domain, },
-               { LB_TAG_COMPILER,       coreboot_compiler,       },
-               { LB_TAG_LINKER,         coreboot_linker,         },
-               { LB_TAG_ASSEMBLER,      coreboot_assembler,      },
-       };
-       unsigned int i;
-       for(i = 0; i < sizeof(strings)/sizeof(strings[0]); i++) {
-               struct lb_string *rec;
-               size_t len;
-               rec = (struct lb_string *)lb_new_record(header);
-               len = strlen(strings[i].string);
-               rec->tag = strings[i].tag;
-               rec->size = (sizeof(*rec) + len + 1 + 3) & ~3;
-               memcpy(rec->string, strings[i].string, len+1);
-       }
-
-}
-
-void lb_memory_range(struct lb_memory *mem,
-       uint32_t type, uint64_t start, uint64_t size)
-{
-       int entries;
-       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
-       mem->map[entries].start = pack_lb64(start);
-       mem->map[entries].size = pack_lb64(size);
-       mem->map[entries].type = type;
-       mem->size += sizeof(mem->map[0]);
-}
-
-static void lb_reserve_table_memory(struct lb_header *head)
-{
-       struct lb_record *last_rec;
-       struct lb_memory *mem;
-       uint64_t start;
-       uint64_t end;
-       int i, entries;
-
-       last_rec = lb_last_record(head);
-       mem = get_lb_mem();
-       start = (unsigned long)head;
-       end = (unsigned long)last_rec;
-       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
-       /* Resize the right two memory areas so this table is in
-        * a reserved area of memory.  Everything has been carefully
-        * setup so that is all we need to do.
-        */
-       for(i = 0; i < entries; i++ ) {
-               uint64_t map_start = unpack_lb64(mem->map[i].start);
-               uint64_t map_end = map_start + unpack_lb64(mem->map[i].size);
-               /* Does this area need to be expanded? */
-               if (map_end == start) {
-                       mem->map[i].size = pack_lb64(end - map_start);
-               }
-               /* Does this area need to be contracted? */
-               else if (map_start == start) {
-                       mem->map[i].start = pack_lb64(end);
-                       mem->map[i].size = pack_lb64(map_end - end);
-               }
-       }
-}
-
-unsigned long lb_table_fini(struct lb_header *head)
-{
-       struct lb_record *rec, *first_rec;
-       rec = lb_last_record(head);
-       if (head->table_entries) {
-               head->table_bytes += rec->size;
-       }
-       lb_reserve_table_memory(head);
-       first_rec = lb_first_record(head);
-       head->table_checksum = compute_ip_checksum(first_rec, head->table_bytes);
-       head->header_checksum = 0;
-       head->header_checksum = compute_ip_checksum(head, sizeof(*head));
-       printk_debug("Wrote coreboot table at: %p - %p  checksum %lx\n",
-               head, rec, head->table_checksum);
-       return (unsigned long)rec;
-}
-
-static void lb_cleanup_memory_ranges(struct lb_memory *mem)
-{
-       int entries;
-       int i, j;
-       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
-       
-       /* Sort the lb memory ranges */
-       for(i = 0; i < entries; i++) {
-               uint64_t entry_start = unpack_lb64(mem->map[i].start);
-               for(j = i; j < entries; j++) {
-                       uint64_t temp_start = unpack_lb64(mem->map[j].start);
-                       if (temp_start < entry_start) {
-                               struct lb_memory_range tmp;
-                               tmp = mem->map[i];
-                               mem->map[i] = mem->map[j];
-                               mem->map[j] = tmp;
-                       }
-               }
-       }
-
-       /* Merge adjacent entries */
-       for(i = 0; (i + 1) < entries; i++) {
-               uint64_t start, end, nstart, nend;
-               if (mem->map[i].type != mem->map[i + 1].type) {
-                       continue;
-               }
-               start  = unpack_lb64(mem->map[i].start);
-               end    = start + unpack_lb64(mem->map[i].size);
-               nstart = unpack_lb64(mem->map[i + 1].start);
-               nend   = nstart + unpack_lb64(mem->map[i + 1].size);
-               if ((start <= nstart) && (end > nstart)) {
-                       if (start > nstart) {
-                               start = nstart;
-                       }
-                       if (end < nend) {
-                               end = nend;
-                       }
-                       /* Record the new region size */
-                       mem->map[i].start = pack_lb64(start);
-                       mem->map[i].size  = pack_lb64(end - start);
-
-                       /* Delete the entry I have merged with */
-                       memmove(&mem->map[i + 1], &mem->map[i + 2], 
-                               ((entries - i - 2) * sizeof(mem->map[0])));
-                       mem->size -= sizeof(mem->map[0]);
-                       entries -= 1;
-                       /* See if I can merge with the next entry as well */
-                       i -= 1; 
-               }
-       }
-}
-
-static void lb_remove_memory_range(struct lb_memory *mem, 
-       uint64_t start, uint64_t size)
-{
-       uint64_t end;
-       int entries;
-       int i;
-
-       end = start + size;
-       entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
-
-       /* Remove a reserved area from the memory map */
-       for(i = 0; i < entries; i++) {
-               uint64_t map_start = unpack_lb64(mem->map[i].start);
-               uint64_t map_end   = map_start + unpack_lb64(mem->map[i].size);
-               if ((start <= map_start) && (end >= map_end)) {
-                       /* Remove the completely covered range */
-                       memmove(&mem->map[i], &mem->map[i + 1], 
-                               ((entries - i - 1) * sizeof(mem->map[0])));
-                       mem->size -= sizeof(mem->map[0]);
-                       entries -= 1;
-                       /* Since the index will disappear revisit what will appear here */
-                       i -= 1; 
-               }
-               else if ((start > map_start) && (end < map_end)) {
-                       /* Split the memory range */
-                       memmove(&mem->map[i + 1], &mem->map[i], 
-                               ((entries - i) * sizeof(mem->map[0])));
-                       mem->size += sizeof(mem->map[0]);
-                       entries += 1;
-                       /* Update the first map entry */
-                       mem->map[i].size = pack_lb64(start - map_start);
-                       /* Update the second map entry */
-                       mem->map[i + 1].start = pack_lb64(end);
-                       mem->map[i + 1].size  = pack_lb64(map_end - end);
-                       /* Don't bother with this map entry again */
-                       i += 1;
-               }
-               else if ((start <= map_start) && (end > map_start)) {
-                       /* Shrink the start of the memory range */
-                       mem->map[i].start = pack_lb64(end);
-                       mem->map[i].size  = pack_lb64(map_end - end);
-               }
-               else if ((start < map_end) && (start > map_start)) {
-                       /* Shrink the end of the memory range */
-                       mem->map[i].size = pack_lb64(start - map_start);
-               }
-       }
-}
-
-static void lb_add_memory_range(struct lb_memory *mem,
-       uint32_t type, uint64_t start, uint64_t size)
-{
-       lb_remove_memory_range(mem, start, size);
-       lb_memory_range(mem, type, start, size);
-       lb_cleanup_memory_ranges(mem);
-}
-
-/* Routines to extract part so the coreboot table or 
- * information from the coreboot table after we have written it.
- * Currently get_lb_mem relies on a global we can change the
- * implementaiton.
- */
-static struct lb_memory *mem_ranges = 0;
-struct lb_memory *get_lb_mem(void)
-{
-       return mem_ranges;
-}
-
-static void build_lb_mem_range(void *gp, struct device *dev, struct resource *res)
-{
-       struct lb_memory *mem = gp;
-       lb_memory_range(mem, LB_MEM_RAM, res->base, res->size);
-}
-
-static struct lb_memory *build_lb_mem(struct lb_header *head)
-{
-       struct lb_memory *mem;
-
-       /* Record where the lb memory ranges will live */
-       mem = lb_memory(head);
-       mem_ranges = mem;
-
-       /* Build the raw table of memory */
-       search_global_resources(
-               IORESOURCE_MEM | IORESOURCE_CACHEABLE, IORESOURCE_MEM | IORESOURCE_CACHEABLE,
-               build_lb_mem_range, mem);
-       lb_cleanup_memory_ranges(mem);
-       return mem;
-}
-
-unsigned long write_coreboot_table( 
-       unsigned long low_table_start, unsigned long low_table_end,
-       unsigned long rom_table_start, unsigned long rom_table_end)
-{
-       unsigned long table_size;
-       struct lb_header *head;
-       struct lb_memory *mem;
-
-       head = lb_table_init(low_table_end);
-       low_table_end = (unsigned long)head;
-       if (HAVE_OPTION_TABLE == 1) {
-               struct lb_record *rec_dest, *rec_src;
-               /* Write the option config table... */
-               rec_dest = lb_new_record(head);
-               rec_src = (struct lb_record *)(void *)&option_table;
-               memcpy(rec_dest,  rec_src, rec_src->size);
-       }
-       /* Record where RAM is located */
-       mem = build_lb_mem(head);
-       
-       /* Find the current mptable size */
-       table_size = (low_table_end - low_table_start);
-
-       /* Record the mptable and the the lb_table (This will be adjusted later) */
-       lb_add_memory_range(mem, LB_MEM_TABLE, 
-               low_table_start, table_size);
-
-       /* Record the pirq table */
-       lb_add_memory_range(mem, LB_MEM_TABLE, 
-               rom_table_start, (rom_table_end - rom_table_start));
-
-       /* Note:
-        * I assume that there is always memory at immediately after
-        * the low_table_end.  This means that after I setup the coreboot table.
-        * I can trivially fixup the reserved memory ranges to hold the correct
-        * size of the coreboot table.
-        */
-
-       /* Record our motheboard */
-       lb_mainboard(head);
-       /* Record our various random string information */
-       lb_strings(head);
-
-       low_table_end = lb_table_fini(head);
-
-       /* Remember where my valid memory ranges are */
-       return low_table_end;
-}
diff --git a/src/arch/ppc/boot/linuxbios_table.h b/src/arch/ppc/boot/linuxbios_table.h
deleted file mode 100644 (file)
index 2f20091..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef COREBOOT_TABLE_H
-#define COREBOOT_TABLE_H
-
-#include <boot/linuxbios_tables.h>
-
-struct mem_range;
-
-/* This file holds function prototypes for building the coreboot table. */
-unsigned long write_coreboot_table(
-       unsigned long low_table_start, unsigned long low_table_end,
-       unsigned long rom_table_start, unsigned long rom_table_end);
-
-struct lb_header *lb_table_init(unsigned long addr);
-struct lb_record *lb_first_record(struct lb_header *header);
-struct lb_record *lb_last_record(struct lb_header *header);
-struct lb_record *lb_next_record(struct lb_record *rec);
-struct lb_record *lb_new_record(struct lb_header *header);
-struct lb_memory *lb_memory(struct lb_header *header);
-void lb_memory_range(struct lb_memory *mem, 
-       uint32_t type, uint64_t startk, uint64_t sizek);
-struct lb_mainboard *lb_mainboard(struct lb_header *header);
-unsigned long lb_table_fini(struct lb_header *header);
-
-/* Routines to extract part so the coreboot table or information
- * from the coreboot table.
- */
-struct lb_memory *get_lb_mem(void);
-
-extern struct cmos_option_table option_table;
-
-#endif /* COREBOOT_TABLE_H */
index a9e1e8eb0fca2c67f35aad550d737e7c2aaca014..00cc057277ea5582f0998d8b14babcaa1474c157 100644 (file)
@@ -1,8 +1,8 @@
 #include <console/console.h>
 #include <cpu/cpu.h>
 #include <boot/tables.h>
-#include <boot/linuxbios_tables.h>
-#include "linuxbios_table.h"
+#include <boot/coreboot_tables.h>
+#include "coreboot_table.h"
 
 struct lb_memory *
 write_tables(void)
index cb8e1cf28d0c79822ec8fc80fbadb83742ff5164..f2c5975b11f79b03f5605b999a5cef79bc5e8f32 100644 (file)
@@ -2,7 +2,7 @@
 #include <part/fallback_boot.h>
 #include <boot/elf.h>
 #include <boot/elf_boot.h>
-#include <boot/linuxbios_tables.h>
+#include <boot/coreboot_tables.h>
 #include <ip_checksum.h>
 #include <stream/read_bytes.h>
 #include <stdint.h>
index 76b44b7c650055bf02bbe5952ed96f451aa0ea05..e2daee3b45298205dd922d8583e704ebc6a00945 100644 (file)
@@ -44,8 +44,8 @@ makerule coreboot_ram.o
 end
 
 makerule coreboot_ram
-       depends "coreboot_ram.o $(TOP)/src/config/linuxbios_ram.ld ldoptions" 
-       action  "$(CC) -nostdlib -nostartfiles -static -o $@ -T $(TOP)/src/config/linuxbios_ram.ld coreboot_ram.o"
+       depends "coreboot_ram.o $(TOP)/src/config/coreboot_ram.ld ldoptions" 
+       action  "$(CC) -nostdlib -nostartfiles -static -o $@ -T $(TOP)/src/config/coreboot_ram.ld coreboot_ram.o"
        action  "$(CROSS_COMPILE)nm -n coreboot_ram | sort > coreboot_ram.map"
 end
 
@@ -87,8 +87,8 @@ if CONFIG_AP_CODE_IN_CAR
        end
 
        makerule coreboot_apc
-               depends "coreboot_apc.o $(TOP)/src/config/linuxbios_apc.ld ldoptions"
-               action  "$(CC) -nostdlib -nostartfiles -static -o $@ -T $(TOP)/src/config/linuxbios_apc.ld coreboot_apc.o"
+               depends "coreboot_apc.o $(TOP)/src/config/coreboot_apc.ld ldoptions"
+               action  "$(CC) -nostdlib -nostartfiles -static -o $@ -T $(TOP)/src/config/coreboot_apc.ld coreboot_apc.o"
                action  "$(CROSS_COMPILE)nm -n coreboot_apc | sort > coreboot_apc.map"
        end
 
@@ -174,7 +174,7 @@ makerule ./romcc
 end
 
 makerule build_opt_tbl   
-       depends "$(TOP)/util/options/build_opt_tbl.c $(TOP)/src/include/pc80/mc146818rtc.h $(TOP)/src/include/boot/linuxbios_tables.h Makefile.settings Makefile"
+       depends "$(TOP)/util/options/build_opt_tbl.c $(TOP)/src/include/pc80/mc146818rtc.h $(TOP)/src/include/boot/coreboot_tables.h Makefile.settings Makefile"
        action  "$(HOSTCC) $(HOSTCFLAGS) $(CPUFLAGS) $< -o $@" 
 end
 
diff --git a/src/config/coreboot_apc.ld b/src/config/coreboot_apc.ld
new file mode 100644 (file)
index 0000000..9bca028
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ *     Memory map:
+ *
+ *     DCACHE_RAM_BASE         
+ *                             : data segment
+ *                             : bss segment
+ *                             : heap
+ *                             : stack
+ */
+/*
+ * Bootstrap code for the STPC Consumer
+ * Copyright (c) 1999 by Net Insight AB. All Rights Reserved.
+ */
+
+/*
+ *     Written by Johan Rydberg, based on work by Daniel Kahlin.
+ *      Rewritten by Eric Biederman
+ *  2005.12 yhlu add coreboot_ram cross the vga font buffer handling
+ *  2006.05 yhlu tailed it to use it for AP code in cache
+ */
+/*
+ *     We use ELF as output format. So that we can
+ *     debug the code in some form. 
+ */
+INCLUDE ldoptions
+
+ENTRY(_start)
+
+SECTIONS
+{
+       . = DCACHE_RAM_BASE;
+       /*
+        * First we place the code and read only data (typically const declared).
+        * This get placed in rom.
+        */
+       .text : {
+               _text = .;
+               *(.text);
+               *(.text.*);
+               . = ALIGN(16);
+               _etext = .;
+       }
+       .rodata : {
+               _rodata = .;
+               . = ALIGN(4);
+               *(.rodata)
+               *(.rodata.*)
+                . = ALIGN(4);
+               _erodata = .;
+       }       
+       /*
+        * After the code we place initialized data (typically initialized
+        * global variables). This gets copied into ram by startup code.
+        * __data_start and __data_end shows where in ram this should be placed,
+        * whereas __data_loadstart and __data_loadend shows where in rom to
+        * copy from.
+        */
+       .data : {
+               _data = .;
+               *(.data)
+               _edata = .;
+       }
+       /*
+        * bss does not contain data, it is just a space that should be zero
+        * initialized on startup. (typically uninitialized global variables)
+        * crt0.S fills between _bss and _ebss with zeroes.
+        */
+       _bss = .;
+       .bss . : {
+               *(.bss)
+               *(.sbss)
+               *(COMMON)
+       }
+       _ebss = .;
+       _end = .;
+       . = ALIGN(0x1000);
+       _stack = .;
+       .stack . : {
+               . = 0x4000;
+       }
+       _estack = .;
+        _heap = .;
+        .heap . : {
+                . = ALIGN(4);
+        }
+        _eheap = .;
+       /* The ram segment
+        * This is all address of the memory resident copy of coreboot.
+        */
+       _ram_seg = _text; 
+       _eram_seg = _eheap;
+
+       _bogus = ASSERT( ( _eram_seg <= ((DCACHE_RAM_BASE + DCACHE_RAM_SIZE - DCACHE_RAM_GLOBAL_VAR_SIZE))) , "coreboot_apc is too big");
+
+       /DISCARD/ : {
+               *(.comment)
+               *(.note)
+               *(.note.*)
+       }
+}
diff --git a/src/config/coreboot_ram.ld b/src/config/coreboot_ram.ld
new file mode 100644 (file)
index 0000000..5af6e74
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ *     Memory map:
+ *
+ *     _RAMBASE                
+ *                             : data segment
+ *                             : bss segment
+ *                             : heap
+ *                             : stack
+ */
+/*
+ * Bootstrap code for the STPC Consumer
+ * Copyright (c) 1999 by Net Insight AB. All Rights Reserved.
+ */
+
+/*
+ *     Written by Johan Rydberg, based on work by Daniel Kahlin.
+ *      Rewritten by Eric Biederman
+ *  2005.12 yhlu add coreboot_ram cross the vga font buffer handling
+ */
+/*
+ *     We use ELF as output format. So that we can
+ *     debug the code in some form. 
+ */
+INCLUDE ldoptions
+
+ENTRY(_start)
+
+SECTIONS
+{
+       . = _RAMBASE;
+       /*
+        * First we place the code and read only data (typically const declared).
+        * This get placed in rom.
+        */
+       .text : {
+               _text = .;
+               *(.text);
+               *(.text.*);
+               . = ALIGN(16);
+               _etext = .;
+       }
+       .rodata : {
+               _rodata = .;
+               . = ALIGN(4);
+               console_drivers = .;
+               *(.rodata.console_drivers)
+               econsole_drivers = . ;
+               . = ALIGN(4);
+               pci_drivers = . ;
+               *(.rodata.pci_driver)
+               epci_drivers = . ;
+               cpu_drivers = . ;
+               *(.rodata.cpu_driver)
+               ecpu_drivers = . ;
+               *(.rodata)
+               *(.rodata.*)
+               /*
+                * kevinh/Ispiri - Added an align, because the objcopy tool
+                * incorrectly converts sections that are not long word aligned.
+                * This breaks the coreboot.strip target.
+                */
+                . = ALIGN(4);
+
+               _erodata = .;
+       }       
+       /*
+        * After the code we place initialized data (typically initialized
+        * global variables). This gets copied into ram by startup code.
+        * __data_start and __data_end shows where in ram this should be placed,
+        * whereas __data_loadstart and __data_loadend shows where in rom to
+        * copy from.
+        */
+       .data : {
+               _data = .;
+               *(.data)
+               _edata = .;
+       }
+       /*
+        * bss does not contain data, it is just a space that should be zero
+        * initialized on startup. (typically uninitialized global variables)
+        * crt0.S fills between _bss and _ebss with zeroes.
+        */
+       _bss = .;
+       .bss . : {
+               *(.bss)
+               *(.sbss)
+               *(COMMON)
+       }
+       _ebss = .;
+       _end = .;
+       . = ALIGN(STACK_SIZE);
+       _stack = .;
+       .stack . : {
+               /* Reserve a stack for each possible cpu */
+               /* the stack for ap will be put after pgtbl in 1M to CONFIG_LB_MEM_TOPK range when VGA and ROM_RUN and CONFIG_LB_MEM_TOPK>1024*/
+               . = ((CONFIG_CONSOLE_VGA || CONFIG_PCI_ROM_RUN)&&(_RAMBASE<0x100000)&&(CONFIG_LB_MEM_TOPK>(0x100000>>10)) ) ? STACK_SIZE : (CONFIG_MAX_CPUS*STACK_SIZE);
+       }
+       _estack = .;
+        _heap = .;
+        .heap . : {
+                /* Reserve 256K for the heap */
+                . = HEAP_SIZE ;
+                . = ALIGN(4);
+        }
+        _eheap = .;
+       /* The ram segment
+        * This is all address of the memory resident copy of coreboot.
+        */
+       _ram_seg = _text; 
+       _eram_seg = _eheap;
+
+       _bogus = ASSERT( ( (_eram_seg>>10) < (CONFIG_LB_MEM_TOPK)) , "please increase CONFIG_LB_MEM_TOPK");
+
+        _bogus = ASSERT( !((CONFIG_CONSOLE_VGA || CONFIG_PCI_ROM_RUN) && ((_ram_seg<0xa0000) && (_eram_seg>0xa0000))) , "please increase CONFIG_LB_MEM_TOPK and if still fail, try to set _RAMBASE more than 1M");
+
+       /DISCARD/ : {
+               *(.comment)
+               *(.note)
+               *(.note.*)
+       }
+}
diff --git a/src/config/linuxbios_apc.ld b/src/config/linuxbios_apc.ld
deleted file mode 100644 (file)
index 9bca028..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *     Memory map:
- *
- *     DCACHE_RAM_BASE         
- *                             : data segment
- *                             : bss segment
- *                             : heap
- *                             : stack
- */
-/*
- * Bootstrap code for the STPC Consumer
- * Copyright (c) 1999 by Net Insight AB. All Rights Reserved.
- */
-
-/*
- *     Written by Johan Rydberg, based on work by Daniel Kahlin.
- *      Rewritten by Eric Biederman
- *  2005.12 yhlu add coreboot_ram cross the vga font buffer handling
- *  2006.05 yhlu tailed it to use it for AP code in cache
- */
-/*
- *     We use ELF as output format. So that we can
- *     debug the code in some form. 
- */
-INCLUDE ldoptions
-
-ENTRY(_start)
-
-SECTIONS
-{
-       . = DCACHE_RAM_BASE;
-       /*
-        * First we place the code and read only data (typically const declared).
-        * This get placed in rom.
-        */
-       .text : {
-               _text = .;
-               *(.text);
-               *(.text.*);
-               . = ALIGN(16);
-               _etext = .;
-       }
-       .rodata : {
-               _rodata = .;
-               . = ALIGN(4);
-               *(.rodata)
-               *(.rodata.*)
-                . = ALIGN(4);
-               _erodata = .;
-       }       
-       /*
-        * After the code we place initialized data (typically initialized
-        * global variables). This gets copied into ram by startup code.
-        * __data_start and __data_end shows where in ram this should be placed,
-        * whereas __data_loadstart and __data_loadend shows where in rom to
-        * copy from.
-        */
-       .data : {
-               _data = .;
-               *(.data)
-               _edata = .;
-       }
-       /*
-        * bss does not contain data, it is just a space that should be zero
-        * initialized on startup. (typically uninitialized global variables)
-        * crt0.S fills between _bss and _ebss with zeroes.
-        */
-       _bss = .;
-       .bss . : {
-               *(.bss)
-               *(.sbss)
-               *(COMMON)
-       }
-       _ebss = .;
-       _end = .;
-       . = ALIGN(0x1000);
-       _stack = .;
-       .stack . : {
-               . = 0x4000;
-       }
-       _estack = .;
-        _heap = .;
-        .heap . : {
-                . = ALIGN(4);
-        }
-        _eheap = .;
-       /* The ram segment
-        * This is all address of the memory resident copy of coreboot.
-        */
-       _ram_seg = _text; 
-       _eram_seg = _eheap;
-
-       _bogus = ASSERT( ( _eram_seg <= ((DCACHE_RAM_BASE + DCACHE_RAM_SIZE - DCACHE_RAM_GLOBAL_VAR_SIZE))) , "coreboot_apc is too big");
-
-       /DISCARD/ : {
-               *(.comment)
-               *(.note)
-               *(.note.*)
-       }
-}
diff --git a/src/config/linuxbios_ram.ld b/src/config/linuxbios_ram.ld
deleted file mode 100644 (file)
index 5af6e74..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *     Memory map:
- *
- *     _RAMBASE                
- *                             : data segment
- *                             : bss segment
- *                             : heap
- *                             : stack
- */
-/*
- * Bootstrap code for the STPC Consumer
- * Copyright (c) 1999 by Net Insight AB. All Rights Reserved.
- */
-
-/*
- *     Written by Johan Rydberg, based on work by Daniel Kahlin.
- *      Rewritten by Eric Biederman
- *  2005.12 yhlu add coreboot_ram cross the vga font buffer handling
- */
-/*
- *     We use ELF as output format. So that we can
- *     debug the code in some form. 
- */
-INCLUDE ldoptions
-
-ENTRY(_start)
-
-SECTIONS
-{
-       . = _RAMBASE;
-       /*
-        * First we place the code and read only data (typically const declared).
-        * This get placed in rom.
-        */
-       .text : {
-               _text = .;
-               *(.text);
-               *(.text.*);
-               . = ALIGN(16);
-               _etext = .;
-       }
-       .rodata : {
-               _rodata = .;
-               . = ALIGN(4);
-               console_drivers = .;
-               *(.rodata.console_drivers)
-               econsole_drivers = . ;
-               . = ALIGN(4);
-               pci_drivers = . ;
-               *(.rodata.pci_driver)
-               epci_drivers = . ;
-               cpu_drivers = . ;
-               *(.rodata.cpu_driver)
-               ecpu_drivers = . ;
-               *(.rodata)
-               *(.rodata.*)
-               /*
-                * kevinh/Ispiri - Added an align, because the objcopy tool
-                * incorrectly converts sections that are not long word aligned.
-                * This breaks the coreboot.strip target.
-                */
-                . = ALIGN(4);
-
-               _erodata = .;
-       }       
-       /*
-        * After the code we place initialized data (typically initialized
-        * global variables). This gets copied into ram by startup code.
-        * __data_start and __data_end shows where in ram this should be placed,
-        * whereas __data_loadstart and __data_loadend shows where in rom to
-        * copy from.
-        */
-       .data : {
-               _data = .;
-               *(.data)
-               _edata = .;
-       }
-       /*
-        * bss does not contain data, it is just a space that should be zero
-        * initialized on startup. (typically uninitialized global variables)
-        * crt0.S fills between _bss and _ebss with zeroes.
-        */
-       _bss = .;
-       .bss . : {
-               *(.bss)
-               *(.sbss)
-               *(COMMON)
-       }
-       _ebss = .;
-       _end = .;
-       . = ALIGN(STACK_SIZE);
-       _stack = .;
-       .stack . : {
-               /* Reserve a stack for each possible cpu */
-               /* the stack for ap will be put after pgtbl in 1M to CONFIG_LB_MEM_TOPK range when VGA and ROM_RUN and CONFIG_LB_MEM_TOPK>1024*/
-               . = ((CONFIG_CONSOLE_VGA || CONFIG_PCI_ROM_RUN)&&(_RAMBASE<0x100000)&&(CONFIG_LB_MEM_TOPK>(0x100000>>10)) ) ? STACK_SIZE : (CONFIG_MAX_CPUS*STACK_SIZE);
-       }
-       _estack = .;
-        _heap = .;
-        .heap . : {
-                /* Reserve 256K for the heap */
-                . = HEAP_SIZE ;
-                . = ALIGN(4);
-        }
-        _eheap = .;
-       /* The ram segment
-        * This is all address of the memory resident copy of coreboot.
-        */
-       _ram_seg = _text; 
-       _eram_seg = _eheap;
-
-       _bogus = ASSERT( ( (_eram_seg>>10) < (CONFIG_LB_MEM_TOPK)) , "please increase CONFIG_LB_MEM_TOPK");
-
-        _bogus = ASSERT( !((CONFIG_CONSOLE_VGA || CONFIG_PCI_ROM_RUN) && ((_ram_seg<0xa0000) && (_eram_seg>0xa0000))) , "please increase CONFIG_LB_MEM_TOPK and if still fail, try to set _RAMBASE more than 1M");
-
-       /DISCARD/ : {
-               *(.comment)
-               *(.note)
-               *(.note.*)
-       }
-}
diff --git a/src/include/boot/coreboot_tables.h b/src/include/boot/coreboot_tables.h
new file mode 100644 (file)
index 0000000..84bd99f
--- /dev/null
@@ -0,0 +1,216 @@
+#ifndef COREBOOT_TABLES_H
+#define COREBOOT_TABLES_H
+
+#include <stdint.h>
+
+/* 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/src/include/boot/linuxbios_tables.h b/src/include/boot/linuxbios_tables.h
deleted file mode 100644 (file)
index 84bd99f..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-#ifndef COREBOOT_TABLES_H
-#define COREBOOT_TABLES_H
-
-#include <stdint.h>
-
-/* 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 */
index 6c309b3c26a87eeb64664c7b30b92b1587db6eaf..f9e91a4e189cda4ccf4abc41ef239cb2402e9f28 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef BOOT_TABLES_H
 #define BOOT_TABLES_H
 
-#include <boot/linuxbios_tables.h>
+#include <boot/coreboot_tables.h>
 
 struct lb_memory *write_tables(void);
 
index e182955e652d386ac2cfa616b52d3287178b4977..5da888071ffba2e84f1f596caee189853bbc4af4 100644 (file)
@@ -1,7 +1,7 @@
 #include <console/console.h>
 #include <arch/io.h>
 #include <pc80/mc146818rtc.h>
-#include <boot/linuxbios_tables.h>
+#include <boot/coreboot_tables.h>
 #include <string.h>
 
 #define CMOS_READ(addr) ({ \
index 94288c4bfa14d7b8a02c632316fb4b634b59535b..235aa21f1571307f9b5b763f62d0f8c53383b627 100644 (file)
@@ -7,7 +7,7 @@
 #include <string.h>
 #include <errno.h>
 #include <sys/mman.h>
-#include "../../src/include/boot/linuxbios_tables.h"
+#include "../../src/include/boot/coreboot_tables.h"
 
 void print_lb_records(struct lb_record *rec, struct lb_record *last, unsigned long addr);
 
index 0a27c39e1d1cbe3a5afcb55e0683106ce8def91d..d8e1b5d586055615cb3a5d05b4855454957d3b15 100644 (file)
@@ -4,7 +4,7 @@
 #include <ctype.h>
 #include <errno.h>
 #include "../../src/include/pc80/mc146818rtc.h"
-#include "../../src/include/boot/linuxbios_tables.h"
+#include "../../src/include/boot/coreboot_tables.h"
 
 #define CMOS_IMAGE_BUFFER_SIZE 128
 #define INPUT_LINE_MAX 256