[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