Move option table (cmos.layout's binary representation)
authorPatrick Georgi <patrick.georgi@secunet.com>
Tue, 18 Jan 2011 13:56:36 +0000 (13:56 +0000)
committerPatrick Georgi <patrick.georgi@coresystems.de>
Tue, 18 Jan 2011 13:56:36 +0000 (13:56 +0000)
to CBFS and adapt coreboot to use it.

Comments by Stefan and Mathias taken into account (except for
the build time failure if the table is missing when it should
exist and the "memory leak" in build_opt_tbl)

Signed-off-by: Patrick Georgi <patrick.georgi@secunet.com>
Acked-by: Stefan Reinauer <stepan@coreboot.org>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@6268 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

src/arch/x86/Makefile.inc
src/arch/x86/boot/coreboot_table.c
src/arch/x86/include/arch/coreboot_tables.h
src/include/cbfs.h
src/pc80/mc146818rtc.c
src/pc80/mc146818rtc_early.c
util/cbfstool/cbfs.h
util/options/build_opt_tbl.c

index 92c4f670ef8db8424ae63908ffcdb0d2fd0b678b..6cd475f0f285227b93f2c3f6003e1729151d08c4 100644 (file)
@@ -27,7 +27,10 @@ subdirs-y += smp
 
 OPTION_TABLE_H:=
 ifeq ($(CONFIG_HAVE_OPTION_TABLE),y)
-ramstage-srcs += $(obj)/option_table.c
+cbfs-files-y += $(obj)/cmos_layout.bin
+$(obj)/cmos_layout.bin-name = cmos_layout.bin
+$(obj)/cmos_layout.bin-type = 0x01aa
+
 OPTION_TABLE_H:=$(obj)/option_table.h
 endif
 
@@ -64,7 +67,7 @@ prebuild-files = \
                $(CBFSTOOL) $@ add $(call extract_nth,1,$(file)) $(call extract_nth,2,$(file)) $(call extract_nth,3,$(file)) $(call extract_nth,4,$(file)); )
 prebuilt-files = $(foreach file,$(cbfs-files), $(call extract_nth,1,$(file)))
 
-$(obj)/coreboot.pre1: $(obj)/coreboot.bootblock $(prebuilt-files) $(CBFSTOOL)
+$(obj)/coreboot.pre1: $(obj)/coreboot.bootblock $$(prebuilt-files) $(CBFSTOOL)
        rm -f $@
        $(CBFSTOOL) $@ create $(CONFIG_COREBOOT_ROMSIZE_KB)K $(obj)/coreboot.bootblock
        $(prebuild-files)
@@ -121,9 +124,9 @@ $(OPTION_TABLE_H): $(objutil)/options/build_opt_tbl $(top)/src/mainboard/$(MAINB
        @printf "    OPTION     $(subst $(obj)/,,$(@))\n"
        $(objutil)/options/build_opt_tbl --config $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout --header $@
 
-$(obj)/option_table.c: $(objutil)/options/build_opt_tbl $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout
+$(obj)/cmos_layout.bin: $(objutil)/options/build_opt_tbl $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout
        @printf "    OPTION     $(subst $(obj)/,,$(@))\n"
-       $(objutil)/options/build_opt_tbl --config $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout --option $@
+       $(objutil)/options/build_opt_tbl --config $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout --binary $@
 
 $(objutil)/options/build_opt_tbl: $(top)/util/options/build_opt_tbl.c $(top)/src/include/pc80/mc146818rtc.h $(top)/src/include/boot/coreboot_tables.h
        @printf "    HOSTCC     $(subst $(obj)/,,$(@))\n"
index 484340c96ac26733498cfe6fc3329c422b45a3eb..3dc8ea612bb7afaf6abb58c8450784839a93a0e7 100644 (file)
@@ -542,11 +542,14 @@ unsigned long write_coreboot_table(
 
 #if (CONFIG_USE_OPTION_TABLE == 1)
        {
-               struct lb_record *rec_dest = lb_new_record(head);
-               /* Copy the option config table, it's already a lb_record... */
-               memcpy(rec_dest,  &option_table, option_table.size);
-               /* Create cmos checksum entry in coreboot table */
-               lb_cmos_checksum(head);
+               struct cmos_option_table option_table = cbfs_find_file("cmos_layout.bin", 0x1aa);
+               if (option_table) {
+                       struct lb_record *rec_dest = lb_new_record(head);
+                       /* Copy the option config table, it's already a lb_record... */
+                       memcpy(rec_dest,  &option_table, option_table.size);
+                       /* Create cmos checksum entry in coreboot table */
+                       lb_cmos_checksum(head);
+               }
        }
 #endif
        /* Record where RAM is located */
index 3c9bf98f223a8484bfe38201efba95cfabb869f2..773e05383513b940ca29d8bef8975f286ba94060 100644 (file)
@@ -16,8 +16,6 @@ void lb_memory_range(struct lb_memory *mem,
  */
 struct lb_memory *get_lb_mem(void);
 
-extern struct cmos_option_table option_table;
-
 /* defined by mainboard.c if the mainboard requires extra resources */
 int add_mainboard_resources(struct lb_memory *mem);
 int add_northbridge_resources(struct lb_memory *mem);
index c17d13f64f03a39ca14d21857dade788fa609121..c1c1e33743cc1281cd481f593e9192acdce713d8 100644 (file)
@@ -71,6 +71,9 @@
 #define CBFS_TYPE_VSA        0x51
 #define CBFS_TYPE_MBI        0x52
 #define CBFS_TYPE_MICROCODE  0x53
+#define CBFS_COMPONENT_CMOS_DEFAULT 0xaa
+#define CBFS_COMPONENT_CMOS_LAYOUT 0x01aa
+
 
 /** this is the master cbfs header - it need to be
     located somewhere in the bootblock.  Where it
index ce9132596b380752be685e09217386bb906480af..32543f01c2b85380bce22f7274a78f7d94a24392 100644 (file)
@@ -4,6 +4,7 @@
 #include <string.h>
 #if CONFIG_USE_OPTION_TABLE
 #include "option_table.h"
+#include <cbfs.h>
 #endif
 
 /* control registers - Moto names
@@ -217,7 +218,6 @@ static int get_cmos_value(unsigned long bit, unsigned long length, void *vret)
 
 int get_option(void *dest, const char *name)
 {
-       extern struct cmos_option_table option_table;
        struct cmos_option_table *ct;
        struct cmos_entries *ce;
        size_t namelen;
@@ -227,7 +227,7 @@ int get_option(void *dest, const char *name)
        namelen = strnlen(name, CMOS_MAX_NAME_LENGTH);
 
        /* find the requested entry record */
-       ct=&option_table;
+       ct=cbfs_find_file("cmos_layout.bin", CMOS_COMPONENT_CMOS_LAYOUT);
        ce=(struct cmos_entries*)((unsigned char *)ct + ct->header_length);
        for(;ce->tag==LB_TAG_OPTION;
                ce=(struct cmos_entries*)((unsigned char *)ce + ce->size)) {
index bb81ca7b657d4f1d0db70c60a0b379f07fc76e75..455ed08ab9aa17624d89c72e6715ccb2ba9414fe 100644 (file)
@@ -65,7 +65,7 @@ static inline int do_normal_boot(void)
 
        if (cmos_error() || !cmos_chksum_valid()) {
 #if CONFIG_USE_CMOS_RECOVERY
-               char *cmos_default = cbfs_find_file("cmos.default", 0xaa);
+               char *cmos_default = cbfs_find_file("cmos.default", CBFS_COMPONENT_CMOS_DEFAULT);
                if (cmos_default) {
                        printk_warning("WARNING - CMOS CORRUPTED. RESTORING DEFAULTS.\n");
                        /* First 14 bytes are reserved for
index 6fb9edd68cb429e0c0252adbe9d23008f00db011..5c93838a36b1ccc0e947a923714369b572d681e5 100644 (file)
@@ -77,6 +77,7 @@ struct cbfs_payload {
 #define CBFS_COMPONENT_MBI        0x52
 #define CBFS_COMPONENT_MICROCODE  0x53
 #define CBFS_COMPONENT_CMOS_DEFAULT 0xaa
+#define CBFS_COMPONENT_CMOS_LAYOUT 0x01aa
 
 /* The deleted type is chosen to be a value
  * that can be written in a FLASH from all other
index 1d218df4ee411759e84ea79524551ffa7643f223..0b25b0c19497f4045ea7dc8a8f8df11503a972a7 100644 (file)
@@ -33,7 +33,7 @@
 #define INPUT_LINE_MAX 256
 #define MAX_VALUE_BYTE_LENGTH 64
 
-#define TMPFILE_LEN 256
+#define TMPFILE_LEN 25600
 #define TMPFILE_TEMPLATE "/build_opt_tbl_XXXXXX"
 
 static unsigned char cmos_table[4096];
@@ -142,8 +142,9 @@ static void display_usage(char *name)
        printf("                       [--option filename]\n");
        printf("                       [--header filename]\n\n");
        printf("--config = Build the definitions table from the given file.\n");
+       printf("--binary = Output a binary file with the definitions.\n");
        printf("--option = Output a C source file with the definitions.\n");
-       printf("--header = Ouput a C header file with the definitions.\n");
+       printf("--header = Output a C header file with the definitions.\n");
        exit(1);
 }
 
@@ -253,6 +254,7 @@ int main(int argc, char **argv)
 {
        int i;
        char *config=0;
+       char *binary=0;
        char *option=0;
        char *header=0;
        FILE *fp;
@@ -288,6 +290,12 @@ int main(int argc, char **argv)
                                                 }
                                                 config=argv[++i];
                                                 break;
+                                        case 'b':  /* Emit a binary file */
+                                                if(strcmp(&argv[i][2],"binary")) {
+                                                        display_usage(argv[0]);
+                                                }
+                                                binary=argv[++i];
+                                                break;
                                         case 'o':  /* use a cmos definitions table file */
                                                 if(strcmp(&argv[i][2],"option")) {
                                                         display_usage(argv[0]);
@@ -519,8 +527,7 @@ int main(int argc, char **argv)
        /* See if we want to output a C source file */
        if(option) {
                int err=0;
-               strncpy(tempfilename, dirname(strdup(option)), TMPFILE_LEN);
-               strncat(tempfilename, TMPFILE_TEMPLATE, TMPFILE_LEN);
+               snprintf(tempfilename, TMPFILE_LEN, "%s%s", dirname(strdup(option)), TMPFILE_TEMPLATE);
                tempfile = mkstemp(tempfilename);
                if(tempfile == -1) {
                         perror("Error - Could not create temporary file");
@@ -566,13 +573,46 @@ int main(int argc, char **argv)
                }
        }
 
+       /* See if we also want to output a binary file */
+       if(binary) {
+               int err=0;
+               snprintf(tempfilename, TMPFILE_LEN, "%s%s", dirname(strdup(binary)), TMPFILE_TEMPLATE);
+               tempfile = mkstemp(tempfilename);
+               if(tempfile == -1) {
+                        perror("Error - Could not create temporary file");
+                        exit(1);
+               }
+
+               if((fp=fdopen(tempfile,"wb"))==NULL){
+                       perror("Error - Could not open temporary file");
+                       unlink(tempfilename);
+                       exit(1);
+               }
+
+               /* write the array values */
+               if(!fwrite(cmos_table, (int)(ct->size-1), 1, fp)) {
+                       perror("Error - Could not write image file");
+                       fclose(fp);
+                       unlink(tempfilename);
+                       exit(1);
+               }
+
+               fclose(fp);
+               UNLINK_IF_NECESSARY(binary);
+               if (rename(tempfilename, binary)) {
+                       fprintf(stderr, "Error - Could not write %s: ", binary);
+                       perror(NULL);
+                       unlink(tempfilename);
+                       exit(1);
+               }
+       }
+
        /* See if we also want to output a C header file */
        if (header) {
                struct cmos_option_table *hdr;
                struct lb_record *ptr, *end;
 
-               strncpy(tempfilename, dirname(strdup(header)), TMPFILE_LEN);
-               strncat(tempfilename, TMPFILE_TEMPLATE, TMPFILE_LEN);
+               snprintf(tempfilename, TMPFILE_LEN, "%s%s", dirname(strdup(header)), TMPFILE_TEMPLATE);
                tempfile = mkstemp(tempfilename);
                if(tempfile == -1) {
                        perror("Error - Could not create temporary file");