diff options
-rw-r--r-- | src/arch/x86/Makefile.inc | 11 | ||||
-rw-r--r-- | src/arch/x86/boot/coreboot_table.c | 13 | ||||
-rw-r--r-- | src/arch/x86/include/arch/coreboot_tables.h | 2 | ||||
-rw-r--r-- | src/include/cbfs.h | 3 | ||||
-rw-r--r-- | src/pc80/mc146818rtc.c | 4 | ||||
-rw-r--r-- | src/pc80/mc146818rtc_early.c | 2 | ||||
-rw-r--r-- | util/cbfstool/cbfs.h | 1 | ||||
-rw-r--r-- | util/options/build_opt_tbl.c | 52 |
8 files changed, 68 insertions, 20 deletions
diff --git a/src/arch/x86/Makefile.inc b/src/arch/x86/Makefile.inc index 92c4f670ef..6cd475f0f2 100644 --- a/src/arch/x86/Makefile.inc +++ b/src/arch/x86/Makefile.inc @@ -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" diff --git a/src/arch/x86/boot/coreboot_table.c b/src/arch/x86/boot/coreboot_table.c index 484340c96a..3dc8ea612b 100644 --- a/src/arch/x86/boot/coreboot_table.c +++ b/src/arch/x86/boot/coreboot_table.c @@ -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 */ diff --git a/src/arch/x86/include/arch/coreboot_tables.h b/src/arch/x86/include/arch/coreboot_tables.h index 3c9bf98f22..773e053835 100644 --- a/src/arch/x86/include/arch/coreboot_tables.h +++ b/src/arch/x86/include/arch/coreboot_tables.h @@ -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); diff --git a/src/include/cbfs.h b/src/include/cbfs.h index c17d13f64f..c1c1e33743 100644 --- a/src/include/cbfs.h +++ b/src/include/cbfs.h @@ -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 diff --git a/src/pc80/mc146818rtc.c b/src/pc80/mc146818rtc.c index ce9132596b..32543f01c2 100644 --- a/src/pc80/mc146818rtc.c +++ b/src/pc80/mc146818rtc.c @@ -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)) { diff --git a/src/pc80/mc146818rtc_early.c b/src/pc80/mc146818rtc_early.c index bb81ca7b65..455ed08ab9 100644 --- a/src/pc80/mc146818rtc_early.c +++ b/src/pc80/mc146818rtc_early.c @@ -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 diff --git a/util/cbfstool/cbfs.h b/util/cbfstool/cbfs.h index 6fb9edd68c..5c93838a36 100644 --- a/util/cbfstool/cbfs.h +++ b/util/cbfstool/cbfs.h @@ -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 diff --git a/util/options/build_opt_tbl.c b/util/options/build_opt_tbl.c index 1d218df4ee..0b25b0c194 100644 --- a/util/options/build_opt_tbl.c +++ b/util/options/build_opt_tbl.c @@ -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"); |