Move option table (cmos.layout's binary representation)
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
This commit is contained in:
parent
024ec852c2
commit
244793784c
|
@ -27,7 +27,10 @@ subdirs-y += smp
|
||||||
|
|
||||||
OPTION_TABLE_H:=
|
OPTION_TABLE_H:=
|
||||||
ifeq ($(CONFIG_HAVE_OPTION_TABLE),y)
|
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
|
OPTION_TABLE_H:=$(obj)/option_table.h
|
||||||
endif
|
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)); )
|
$(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)))
|
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 $@
|
rm -f $@
|
||||||
$(CBFSTOOL) $@ create $(CONFIG_COREBOOT_ROMSIZE_KB)K $(obj)/coreboot.bootblock
|
$(CBFSTOOL) $@ create $(CONFIG_COREBOOT_ROMSIZE_KB)K $(obj)/coreboot.bootblock
|
||||||
$(prebuild-files)
|
$(prebuild-files)
|
||||||
|
@ -121,9 +124,9 @@ $(OPTION_TABLE_H): $(objutil)/options/build_opt_tbl $(top)/src/mainboard/$(MAINB
|
||||||
@printf " OPTION $(subst $(obj)/,,$(@))\n"
|
@printf " OPTION $(subst $(obj)/,,$(@))\n"
|
||||||
$(objutil)/options/build_opt_tbl --config $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout --header $@
|
$(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"
|
@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
|
$(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"
|
@printf " HOSTCC $(subst $(obj)/,,$(@))\n"
|
||||||
|
|
|
@ -542,11 +542,14 @@ unsigned long write_coreboot_table(
|
||||||
|
|
||||||
#if (CONFIG_USE_OPTION_TABLE == 1)
|
#if (CONFIG_USE_OPTION_TABLE == 1)
|
||||||
{
|
{
|
||||||
struct lb_record *rec_dest = lb_new_record(head);
|
struct cmos_option_table option_table = cbfs_find_file("cmos_layout.bin", 0x1aa);
|
||||||
/* Copy the option config table, it's already a lb_record... */
|
if (option_table) {
|
||||||
memcpy(rec_dest, &option_table, option_table.size);
|
struct lb_record *rec_dest = lb_new_record(head);
|
||||||
/* Create cmos checksum entry in coreboot table */
|
/* Copy the option config table, it's already a lb_record... */
|
||||||
lb_cmos_checksum(head);
|
memcpy(rec_dest, &option_table, option_table.size);
|
||||||
|
/* Create cmos checksum entry in coreboot table */
|
||||||
|
lb_cmos_checksum(head);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* Record where RAM is located */
|
/* Record where RAM is located */
|
||||||
|
|
|
@ -16,8 +16,6 @@ void lb_memory_range(struct lb_memory *mem,
|
||||||
*/
|
*/
|
||||||
struct lb_memory *get_lb_mem(void);
|
struct lb_memory *get_lb_mem(void);
|
||||||
|
|
||||||
extern struct cmos_option_table option_table;
|
|
||||||
|
|
||||||
/* defined by mainboard.c if the mainboard requires extra resources */
|
/* defined by mainboard.c if the mainboard requires extra resources */
|
||||||
int add_mainboard_resources(struct lb_memory *mem);
|
int add_mainboard_resources(struct lb_memory *mem);
|
||||||
int add_northbridge_resources(struct lb_memory *mem);
|
int add_northbridge_resources(struct lb_memory *mem);
|
||||||
|
|
|
@ -71,6 +71,9 @@
|
||||||
#define CBFS_TYPE_VSA 0x51
|
#define CBFS_TYPE_VSA 0x51
|
||||||
#define CBFS_TYPE_MBI 0x52
|
#define CBFS_TYPE_MBI 0x52
|
||||||
#define CBFS_TYPE_MICROCODE 0x53
|
#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
|
/** this is the master cbfs header - it need to be
|
||||||
located somewhere in the bootblock. Where it
|
located somewhere in the bootblock. Where it
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#if CONFIG_USE_OPTION_TABLE
|
#if CONFIG_USE_OPTION_TABLE
|
||||||
#include "option_table.h"
|
#include "option_table.h"
|
||||||
|
#include <cbfs.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* control registers - Moto names
|
/* 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)
|
int get_option(void *dest, const char *name)
|
||||||
{
|
{
|
||||||
extern struct cmos_option_table option_table;
|
|
||||||
struct cmos_option_table *ct;
|
struct cmos_option_table *ct;
|
||||||
struct cmos_entries *ce;
|
struct cmos_entries *ce;
|
||||||
size_t namelen;
|
size_t namelen;
|
||||||
|
@ -227,7 +227,7 @@ int get_option(void *dest, const char *name)
|
||||||
namelen = strnlen(name, CMOS_MAX_NAME_LENGTH);
|
namelen = strnlen(name, CMOS_MAX_NAME_LENGTH);
|
||||||
|
|
||||||
/* find the requested entry record */
|
/* 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);
|
ce=(struct cmos_entries*)((unsigned char *)ct + ct->header_length);
|
||||||
for(;ce->tag==LB_TAG_OPTION;
|
for(;ce->tag==LB_TAG_OPTION;
|
||||||
ce=(struct cmos_entries*)((unsigned char *)ce + ce->size)) {
|
ce=(struct cmos_entries*)((unsigned char *)ce + ce->size)) {
|
||||||
|
|
|
@ -65,7 +65,7 @@ static inline int do_normal_boot(void)
|
||||||
|
|
||||||
if (cmos_error() || !cmos_chksum_valid()) {
|
if (cmos_error() || !cmos_chksum_valid()) {
|
||||||
#if CONFIG_USE_CMOS_RECOVERY
|
#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) {
|
if (cmos_default) {
|
||||||
printk_warning("WARNING - CMOS CORRUPTED. RESTORING DEFAULTS.\n");
|
printk_warning("WARNING - CMOS CORRUPTED. RESTORING DEFAULTS.\n");
|
||||||
/* First 14 bytes are reserved for
|
/* First 14 bytes are reserved for
|
||||||
|
|
|
@ -77,6 +77,7 @@ struct cbfs_payload {
|
||||||
#define CBFS_COMPONENT_MBI 0x52
|
#define CBFS_COMPONENT_MBI 0x52
|
||||||
#define CBFS_COMPONENT_MICROCODE 0x53
|
#define CBFS_COMPONENT_MICROCODE 0x53
|
||||||
#define CBFS_COMPONENT_CMOS_DEFAULT 0xaa
|
#define CBFS_COMPONENT_CMOS_DEFAULT 0xaa
|
||||||
|
#define CBFS_COMPONENT_CMOS_LAYOUT 0x01aa
|
||||||
|
|
||||||
/* The deleted type is chosen to be a value
|
/* The deleted type is chosen to be a value
|
||||||
* that can be written in a FLASH from all other
|
* that can be written in a FLASH from all other
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#define INPUT_LINE_MAX 256
|
#define INPUT_LINE_MAX 256
|
||||||
#define MAX_VALUE_BYTE_LENGTH 64
|
#define MAX_VALUE_BYTE_LENGTH 64
|
||||||
|
|
||||||
#define TMPFILE_LEN 256
|
#define TMPFILE_LEN 25600
|
||||||
#define TMPFILE_TEMPLATE "/build_opt_tbl_XXXXXX"
|
#define TMPFILE_TEMPLATE "/build_opt_tbl_XXXXXX"
|
||||||
|
|
||||||
static unsigned char cmos_table[4096];
|
static unsigned char cmos_table[4096];
|
||||||
|
@ -142,8 +142,9 @@ static void display_usage(char *name)
|
||||||
printf(" [--option filename]\n");
|
printf(" [--option filename]\n");
|
||||||
printf(" [--header filename]\n\n");
|
printf(" [--header filename]\n\n");
|
||||||
printf("--config = Build the definitions table from the given file.\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("--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);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,6 +254,7 @@ int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *config=0;
|
char *config=0;
|
||||||
|
char *binary=0;
|
||||||
char *option=0;
|
char *option=0;
|
||||||
char *header=0;
|
char *header=0;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
@ -288,6 +290,12 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
config=argv[++i];
|
config=argv[++i];
|
||||||
break;
|
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 */
|
case 'o': /* use a cmos definitions table file */
|
||||||
if(strcmp(&argv[i][2],"option")) {
|
if(strcmp(&argv[i][2],"option")) {
|
||||||
display_usage(argv[0]);
|
display_usage(argv[0]);
|
||||||
|
@ -519,8 +527,7 @@ int main(int argc, char **argv)
|
||||||
/* See if we want to output a C source file */
|
/* See if we want to output a C source file */
|
||||||
if(option) {
|
if(option) {
|
||||||
int err=0;
|
int err=0;
|
||||||
strncpy(tempfilename, dirname(strdup(option)), TMPFILE_LEN);
|
snprintf(tempfilename, TMPFILE_LEN, "%s%s", dirname(strdup(option)), TMPFILE_TEMPLATE);
|
||||||
strncat(tempfilename, TMPFILE_TEMPLATE, TMPFILE_LEN);
|
|
||||||
tempfile = mkstemp(tempfilename);
|
tempfile = mkstemp(tempfilename);
|
||||||
if(tempfile == -1) {
|
if(tempfile == -1) {
|
||||||
perror("Error - Could not create temporary file");
|
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 */
|
/* See if we also want to output a C header file */
|
||||||
if (header) {
|
if (header) {
|
||||||
struct cmos_option_table *hdr;
|
struct cmos_option_table *hdr;
|
||||||
struct lb_record *ptr, *end;
|
struct lb_record *ptr, *end;
|
||||||
|
|
||||||
strncpy(tempfilename, dirname(strdup(header)), TMPFILE_LEN);
|
snprintf(tempfilename, TMPFILE_LEN, "%s%s", dirname(strdup(header)), TMPFILE_TEMPLATE);
|
||||||
strncat(tempfilename, TMPFILE_TEMPLATE, TMPFILE_LEN);
|
|
||||||
tempfile = mkstemp(tempfilename);
|
tempfile = mkstemp(tempfilename);
|
||||||
if(tempfile == -1) {
|
if(tempfile == -1) {
|
||||||
perror("Error - Could not create temporary file");
|
perror("Error - Could not create temporary file");
|
||||||
|
|
Loading…
Reference in New Issue