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
$(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)
@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"
#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 */
*/
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);
#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
#include <string.h>
#if CONFIG_USE_OPTION_TABLE
#include "option_table.h"
+#include <cbfs.h>
#endif
/* control registers - Moto names
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;
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)) {
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
#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
#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];
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);
}
{
int i;
char *config=0;
+ char *binary=0;
char *option=0;
char *header=0;
FILE *fp;
}
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]);
/* 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");
}
}
+ /* 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");