[coreboot-gerrit] Patch set updated for coreboot: 3691089 Add get_cbmem_table for x86
Kyösti Mälkki (kyosti.malkki@gmail.com)
gerrit at coreboot.org
Wed Sep 4 15:20:33 CEST 2013
Kyösti Mälkki (kyosti.malkki at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3558
-gerrit
commit 3691089f1fb61e6267c94cf97b670ed67b7ddf53
Author: Kyösti Mälkki <kyosti.malkki at 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 at gmail.com>
---
src/arch/x86/boot/ramtop.c | 15 +++++++++++++++
src/include/cbmem.h | 1 +
src/lib/cbmem.c | 41 +++++++++++++++--------------------------
3 files changed, 31 insertions(+), 26 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 b44a3fe..6c7b85c 100644
--- a/src/include/cbmem.h
+++ b/src/include/cbmem.h
@@ -145,6 +145,7 @@ int cbmem_reinit(u64 baseaddr);
unsigned long get_top_of_ram(void);
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 6bc081e..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,22 +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__
- extern unsigned long get_top_of_ram(void);
- 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__
More information about the coreboot-gerrit
mailing list