Kyösti Mälkki (kyosti.malkki@gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3559
-gerrit
commit 54468a70d951ab0322a0ce52c7b165c261eb9b9e Author: Kyösti Mälkki kyosti.malkki@gmail.com Date: Wed Sep 4 14:11:08 2013 +0300
Move high_tables globals from arch
Change-Id: I89c012bce1b86d0710748719a8840ec532ce6939 Signed-off-by: Kyösti Mälkki kyosti.malkki@gmail.com --- src/arch/armv7/tables.c | 13 +------------ src/arch/x86/boot/tables.c | 12 +++--------- src/include/cbmem.h | 10 ++++------ src/lib/cbmem.c | 38 +++++++++++++++++++++++++++++++++----- src/lib/coreboot_table.c | 5 ----- 5 files changed, 41 insertions(+), 37 deletions(-)
diff --git a/src/arch/armv7/tables.c b/src/arch/armv7/tables.c index 0fc7399..de6b6fa 100644 --- a/src/arch/armv7/tables.c +++ b/src/arch/armv7/tables.c @@ -29,13 +29,6 @@
#define MAX_COREBOOT_TABLE_SIZE (8 * 1024)
-/* - * TODO: "High" tables are a convention used on x86. Maybe we can - * clean up that naming at some point. - */ -uint64_t high_tables_base = 0; -uint64_t high_tables_size; - void cbmem_arch_init(void) { } @@ -44,11 +37,7 @@ struct lb_memory *write_tables(void) { unsigned long table_pointer, new_table_pointer;
- if (!high_tables_base) { - printk(BIOS_ERR, "ERROR: high_tables_base is not set.\n"); - } - - printk(BIOS_DEBUG, "high_tables_base: %llx.\n", high_tables_base); + cbmem_base_check();
post_code(0x9d);
diff --git a/src/arch/x86/boot/tables.c b/src/arch/x86/boot/tables.c index 67d7911..ca1b61b 100644 --- a/src/arch/x86/boot/tables.c +++ b/src/arch/x86/boot/tables.c @@ -32,8 +32,6 @@ #include <lib.h> #include <smbios.h>
-uint64_t high_tables_base = 0; -uint64_t high_tables_size;
void cbmem_arch_init(void) { @@ -45,6 +43,7 @@ struct lb_memory *write_tables(void) { unsigned long low_table_start, low_table_end; unsigned long rom_table_start, rom_table_end; + u64 high_tables_base = 0;
/* Even if high tables are configured, some tables are copied both to * the low and the high area, so payloads and OSes don't need to know @@ -53,13 +52,8 @@ struct lb_memory *write_tables(void) unsigned long high_table_pointer;
#if !CONFIG_DYNAMIC_CBMEM - if (!high_tables_base) { - printk(BIOS_ERR, "ERROR: High Tables Base is not set.\n"); - // Are there any boards without? - // Stepan thinks we should die() here! - } - - printk(BIOS_DEBUG, "High Tables Base is %llx.\n", high_tables_base); + cbmem_base_check(); + high_tables_base = (u32)get_cbmem_toc(); #endif
rom_table_start = 0xf0000; diff --git a/src/include/cbmem.h b/src/include/cbmem.h index 8ba1d21..3eeb6a1 100644 --- a/src/include/cbmem.h +++ b/src/include/cbmem.h @@ -125,19 +125,14 @@ int cbmem_entry_remove(const struct cbmem_entry *entry); void *cbmem_entry_start(const struct cbmem_entry *entry); u64 cbmem_entry_size(const struct cbmem_entry *entry);
-#ifndef __PRE_RAM__ -/* Add the cbmem memory used to the memory tables. */ -struct lb_memory; -void cbmem_add_lb_mem(struct lb_memory *mem); -#endif /* __PRE_RAM__ */
#else /* !CONFIG_DYNAMIC_CBMEM */
#ifndef __PRE_RAM__ -extern uint64_t high_tables_base, high_tables_size; void set_top_of_ram(uint64_t ramtop); void backup_top_of_ram(uint64_t ramtop); void set_cbmem_table(uint64_t base, uint64_t size); +int cbmem_base_check(void); #endif
int cbmem_reinit(u64 baseaddr); @@ -162,6 +157,9 @@ void *cbmem_find(u32 id);
#ifndef __PRE_RAM__ /* Ramstage only functions. */ +/* Add the cbmem memory used to the memory tables. */ +struct lb_memory; +void cbmem_add_lb_mem(struct lb_memory *mem); void cbmem_list(void); void cbmem_arch_init(void); void cbmem_print_entry(int n, u32 id, u64 start, u64 size); diff --git a/src/lib/cbmem.c b/src/lib/cbmem.c index eb18725..963ca4d 100644 --- a/src/lib/cbmem.c +++ b/src/lib/cbmem.c @@ -21,6 +21,7 @@ #include <string.h> #include <bootstate.h> #include <cbmem.h> +#include <boot/coreboot_tables.h> #include <console/console.h> #include <cpu/x86/car.h> #if CONFIG_HAVE_ACPI_RESUME && !defined(__PRE_RAM__) @@ -41,13 +42,20 @@ struct cbmem_entry { u64 size; } __attribute__((packed));
+#ifndef __PRE_RAM__ +static uint64_t bss_cbmem_base = 0; +static uint64_t bss_cbmem_size = 0; +#endif + static void cbmem_locate_table(uint64_t *base, uint64_t *size) { #ifdef __PRE_RAM__ get_cbmem_table(base, size); #else - *base = high_tables_base; - *size = high_tables_size; + if (!(bss_cbmem_base && bss_cbmem_size)) + get_cbmem_table(&bss_cbmem_base, &bss_cbmem_size); + *base = bss_cbmem_base; + *size = bss_cbmem_size; #endif }
@@ -61,12 +69,12 @@ struct cbmem_entry *get_cbmem_toc(void) #if !defined(__PRE_RAM__) void set_cbmem_table(uint64_t base, uint64_t size) { - if (base == high_tables_base && size == high_tables_size) + if (base == bss_cbmem_base && size == bss_cbmem_size) return;
printk(BIOS_DEBUG, "CBMEM region %llx-%llx\n", base, base+size-1); - high_tables_base = base; - high_tables_size = size; + bss_cbmem_base = base; + bss_cbmem_size = size; } #endif
@@ -244,6 +252,26 @@ BOOT_STATE_INIT_ENTRIES(cbmem_bscb) = { init_cbmem_post_device, NULL), };
+int cbmem_base_check(void) +{ + uint64_t base, size; + cbmem_locate_table(&base, &size); + if (!base) { + printk(BIOS_ERR, "ERROR: CBMEM Base is not set.\n"); + // Are there any boards without? + // Stepan thinks we should die() here! + } + printk(BIOS_DEBUG, "CBMEM Base is %llx.\n", base); + return !!base; +} + +void cbmem_add_lb_mem(struct lb_memory *mem) +{ + uint64_t base, size; + cbmem_locate_table(&base, &size); + lb_add_memory_range(mem, LB_MEM_TABLE, base, size); +} + void cbmem_list(void) { struct cbmem_entry *cbmem_toc; diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c index 3fad4c7..e5729ba 100644 --- a/src/lib/coreboot_table.c +++ b/src/lib/coreboot_table.c @@ -539,12 +539,7 @@ unsigned long write_coreboot_table( lb_add_memory_range(mem, LB_MEM_TABLE, rom_table_start, rom_table_end - rom_table_start);
-#if CONFIG_DYNAMIC_CBMEM cbmem_add_lb_mem(mem); -#else /* CONFIG_DYNAMIC_CBMEM */ - lb_add_memory_range(mem, LB_MEM_TABLE, - high_tables_base, high_tables_size); -#endif /* CONFIG_DYNAMIC_CBMEM */
/* No other memory areas can be added after the memory table has been * committed as the entries won't show up in the serialize mem table. */