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/3558
-gerrit
commit 5597188fd6e0e6807fb6935893356acb560fae09 Author: Kyösti Mälkki kyosti.malkki@gmail.com Date: Wed Sep 4 13:31:39 2013 +0300
Add get_cbmem_table for x86
For x86 CBMEM tables are located right below top of low ram and have fixed size of HIGH_MEMORY_SIZE in EARLY_CBMEM_INIT implementation.
NOTE: Boards will need to have get_top_of_ram() added for ramstage.
Change-Id: Ie8d16eb30cd5c3860fff243f36bd4e7d8827a782 Signed-off-by: Kyösti Mälkki kyosti.malkki@gmail.com --- src/arch/x86/boot/ramtop.c | 15 +++++++++++++++ src/include/cbmem.h | 1 + src/lib/cbmem.c | 40 +++++++++++++++------------------------- 3 files changed, 31 insertions(+), 25 deletions(-)
diff --git a/src/arch/x86/boot/ramtop.c b/src/arch/x86/boot/ramtop.c index 16faf48e..84bd6d9 100644 --- a/src/arch/x86/boot/ramtop.c +++ b/src/arch/x86/boot/ramtop.c @@ -24,6 +24,21 @@ unsigned long __attribute__((weak)) get_top_of_ram(void) return 0; }
+#if !CONFIG_DYNAMIC_CBMEM +void get_cbmem_table(uint64_t *base, uint64_t *size) +{ + uint64_t top_of_ram = get_top_of_ram(); + + if (top_of_ram >= HIGH_MEMORY_SIZE) { + *base = top_of_ram - HIGH_MEMORY_SIZE; + *size = HIGH_MEMORY_SIZE; + } else { + *base = 0; + *size = 0; + } +} +#endif + #if !CONFIG_DYNAMIC_CBMEM && !defined(__PRE_RAM__) void __attribute__((weak)) backup_top_of_ram(uint64_t ramtop) { diff --git a/src/include/cbmem.h b/src/include/cbmem.h index 87b7e9b..9638a03 100644 --- a/src/include/cbmem.h +++ b/src/include/cbmem.h @@ -144,6 +144,7 @@ void cbmem_init(u64 baseaddr, u64 size); int cbmem_reinit(u64 baseaddr);
struct cbmem_entry *get_cbmem_toc(void); +void get_cbmem_table(uint64_t *base, uint64_t *size);
#endif /* CONFIG_DYNAMIC_CBMEM */
diff --git a/src/lib/cbmem.c b/src/lib/cbmem.c index 27c1a27..3f8f243 100644 --- a/src/lib/cbmem.c +++ b/src/lib/cbmem.c @@ -41,22 +41,22 @@ struct cbmem_entry { u64 size; } __attribute__((packed));
-#ifndef __PRE_RAM__ -static struct cbmem_entry *bss_cbmem_toc; - -struct cbmem_entry *__attribute__((weak)) get_cbmem_toc(void) +static void cbmem_locate_table(uint64_t *base, uint64_t *size) { - return bss_cbmem_toc; -} - +#ifdef __PRE_RAM__ + get_cbmem_table(base, size); #else + *base = high_tables_base; + *size = high_tables_size; +#endif +}
-struct cbmem_entry *__attribute__((weak)) get_cbmem_toc(void) +struct cbmem_entry *get_cbmem_toc(void) { - printk(BIOS_WARNING, "WARNING: you need to define get_cbmem_toc() for your chipset\n"); - return NULL; + uint64_t base, size; + cbmem_locate_table(&base, &size); + return (struct cbmem_entry *)(unsigned long)base; } -#endif
#if !defined(__PRE_RAM__) void set_cbmem_table(uint64_t base, uint64_t size) @@ -85,10 +85,6 @@ void cbmem_init(u64 baseaddr, u64 size) struct cbmem_entry *cbmem_toc; cbmem_toc = (struct cbmem_entry *)(unsigned long)baseaddr;
-#ifndef __PRE_RAM__ - bss_cbmem_toc = cbmem_toc; -#endif - printk(BIOS_DEBUG, "Initializing CBMEM area to 0x%llx (%lld bytes)\n", baseaddr, size);
@@ -115,10 +111,6 @@ int cbmem_reinit(u64 baseaddr) printk(BIOS_DEBUG, "Re-Initializing CBMEM area to 0x%lx\n", (unsigned long)baseaddr);
-#ifndef __PRE_RAM__ - bss_cbmem_toc = cbmem_toc; -#endif - return (cbmem_toc[0].magic == CBMEM_MAGIC); }
@@ -211,21 +203,19 @@ void *cbmem_find(u32 id) /* Returns True if it was not initialized before. */ int cbmem_initialize(void) { + uint64_t base = 0, size = 0; int rv = 0;
-#ifdef __PRE_RAM__ - uint64_t high_tables_base = get_top_of_ram() - HIGH_MEMORY_SIZE; - uint64_t high_tables_size = HIGH_MEMORY_SIZE; -#endif + cbmem_locate_table(&base, &size);
/* We expect the romstage to always initialize it. */ - if (!cbmem_reinit(high_tables_base)) { + if (!cbmem_reinit(base)) { #if CONFIG_HAVE_ACPI_RESUME && !defined(__PRE_RAM__) /* Something went wrong, our high memory area got wiped */ if (acpi_slp_type == 3 || acpi_slp_type == 2) acpi_slp_type = 0; #endif - cbmem_init(high_tables_base, high_tables_size); + cbmem_init(base, size); rv = 1; } #ifndef __PRE_RAM__