summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/Makefile.inc11
-rw-r--r--src/arch/x86/boot/coreboot_table.c13
-rw-r--r--src/arch/x86/include/arch/coreboot_tables.h2
-rw-r--r--src/include/cbfs.h3
-rw-r--r--src/pc80/mc146818rtc.c4
-rw-r--r--src/pc80/mc146818rtc_early.c2
-rw-r--r--util/cbfstool/cbfs.h1
-rw-r--r--util/options/build_opt_tbl.c52
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");