[coreboot-gerrit] New patch to review for coreboot: d74affb Make CACHE_AS_RAM independent of arch

Kyösti Mälkki (kyosti.malkki@gmail.com) gerrit at coreboot.org
Tue Sep 24 01:01:46 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/3940

-gerrit

commit d74affb6ab319b99bf662caaf45f3cbd48b6d2f7
Author: Kyösti Mälkki <kyosti.malkki at gmail.com>
Date:   Tue Sep 24 01:35:24 2013 +0300

    Make CACHE_AS_RAM independent of arch
    
    This generally controls existence of global variables in romstage.
    
    Change-Id: I22b8f7c61dfa67c971a8f00e867845738608deae
    Signed-off-by: Kyösti Mälkki <kyosti.malkki at gmail.com>
---
 src/arch/armv7/Makefile.inc |   2 +
 src/arch/armv7/cbmem.c      |  27 ++++++++++++
 src/arch/armv7/romstage.ld  |  17 +++++++
 src/arch/armv7/tables.c     |   7 ---
 src/cpu/Kconfig             |   8 ++--
 src/cpu/x86/Makefile.inc    |   1 -
 src/cpu/x86/car.c           | 105 --------------------------------------------
 src/lib/Makefile.inc        |   1 +
 src/lib/car.c               | 105 ++++++++++++++++++++++++++++++++++++++++++++
 9 files changed, 156 insertions(+), 117 deletions(-)

diff --git a/src/arch/armv7/Makefile.inc b/src/arch/armv7/Makefile.inc
index 4b1c591..4a2ccc3 100644
--- a/src/arch/armv7/Makefile.inc
+++ b/src/arch/armv7/Makefile.inc
@@ -167,12 +167,14 @@ bootblock-$(CONFIG_BOOTBLOCK_CONSOLE) += early_console.c
 bootblock-y += cache.c
 
 romstage-y += cache.c
+romstage-y += cbmem.c
 romstage-y += div0.c
 romstage-$(CONFIG_EARLY_CONSOLE) += early_console.c
 
 ramstage-y += div0.c
 #ramstage-y += interrupts.c
 ramstage-y += cache.c
+ramstage-y += cbmem.c
 ramstage-y += mmu.c
 
 romstage-y += eabi_compat.c
diff --git a/src/arch/armv7/cbmem.c b/src/arch/armv7/cbmem.c
new file mode 100644
index 0000000..979bc7c
--- /dev/null
+++ b/src/arch/armv7/cbmem.c
@@ -0,0 +1,27 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
+ */
+
+#include <console/console.h>
+#include <cbmem.h>
+
+void __attribute__((weak)) get_cbmem_table(uint64_t *base, uint64_t *size)
+{
+	printk(BIOS_WARNING, "WARNING: you need to define get_cbmem_table for your board\n");
+	*base = 0;
+	*size = 0;
+}
+
diff --git a/src/arch/armv7/romstage.ld b/src/arch/armv7/romstage.ld
index 0555fc4..26c24e8 100644
--- a/src/arch/armv7/romstage.ld
+++ b/src/arch/armv7/romstage.ld
@@ -53,6 +53,10 @@ SECTIONS
 		*(.machine_param);
 		*(.data);
 		. = ALIGN(8);
+		_car_migrate_start = .;
+		*(.car.migrate);
+		_car_migrate_end = .;
+		. = ALIGN(8);
 		_erom = .;
 	}
 
@@ -69,6 +73,19 @@ SECTIONS
 		*(.sbss)
 		*(COMMON)
 	}
+
+	.car.data . (NOLOAD) : {
+		_car_data_start = .;
+		*(.car.global_data);
+		/* The cbmem_console section comes last to take advantage of
+		 * a zero-sized array to hold the memconsole contents that
+		 * grows to a bound of CONFIG_CONSOLE_CAR_BUFFER_SIZE. However,
+		 * collisions within the cache-as-ram region cannot be
+		 * statically checked because the cache-as-ram region usage is
+		 * cpu/chipset dependent. */
+		*(.car.cbmem_console);
+		_car_data_end = .;
+	}
 	_ebss = .;
 	_end = .;
 
diff --git a/src/arch/armv7/tables.c b/src/arch/armv7/tables.c
index b566ff6..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)
 
-void __attribute__((weak)) get_cbmem_table(uint64_t *base, uint64_t *size)
-{
-	printk(BIOS_WARNING, "WARNING: you need to define get_cbmem_table for your board\n");
-	*base = 0;
-	*size = 0;
-}
-
 void cbmem_arch_init(void)
 {
 }
diff --git a/src/cpu/Kconfig b/src/cpu/Kconfig
index e48fe87..fa0a858 100644
--- a/src/cpu/Kconfig
+++ b/src/cpu/Kconfig
@@ -18,10 +18,6 @@ source src/cpu/via/Kconfig
 source src/cpu/qemu-x86/Kconfig
 source src/cpu/x86/Kconfig
 
-config CACHE_AS_RAM
-	bool
-	default !ROMCC
-
 config DCACHE_RAM_BASE
 	hex
 
@@ -73,6 +69,10 @@ config SSE2
 
 endif # ARCH_X86
 
+config CACHE_AS_RAM
+	bool
+	default !ROMCC
+
 config CPU_MICROCODE_IN_CBFS
 	bool
 	default n
diff --git a/src/cpu/x86/Makefile.inc b/src/cpu/x86/Makefile.inc
index 311dcc1..e69de29 100644
--- a/src/cpu/x86/Makefile.inc
+++ b/src/cpu/x86/Makefile.inc
@@ -1 +0,0 @@
-romstage-$(CONFIG_CACHE_AS_RAM) += car.c
diff --git a/src/cpu/x86/car.c b/src/cpu/x86/car.c
deleted file mode 100644
index 481153d..0000000
--- a/src/cpu/x86/car.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2013 Google, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <string.h>
-#include <stddef.h>
-#include <console/console.h>
-#include <cbmem.h>
-#include <arch/early_variables.h>
-
-typedef void (* const car_migration_func_t)(void);
-
-extern car_migration_func_t _car_migrate_start;
-extern car_migration_func_t _car_migrate_end;
-
-extern char _car_data_start[];
-extern char _car_data_end[];
-
-/*
- * The car_migrated global variable determines if the cache-as-ram space has
- * been migrated to real RAM. It does this by assuming the following things:
- *   1. cache-as-ram space is zero'd out once it is set up.
- *   2. Either the cache-as-ram space is memory-backed after getting torn down
- *      or the space returns 0xff's for each byte read.
- * Based on these 2 attributes there is the ability to tell when the
- * cache-as-ram region has been migrated.
- */
-static int car_migrated CAR_GLOBAL;
-
-
-void *car_get_var_ptr(void *var)
-{
-	char *migrated_base;
-	int offset;
-	void * _car_start = &_car_data_start;
-	void * _car_end = &_car_data_end;
-
-	/* If the cache-as-ram has not been migrated return the pointer
-	 * passed in. */
-	if (!car_migrated)
-		return var;
-
-	if (var < _car_start || var >= _car_end) {
-		printk(BIOS_ERR,
-		       "Requesting CAR variable outside of CAR region: %p\n",
-		       var);
-		return var;
-	}
-
-	migrated_base = cbmem_find(CBMEM_ID_CAR_GLOBALS);
-
-	if (migrated_base == NULL) {
-		printk(BIOS_ERR, "CAR: Could not find migration base!\n");
-		return var;
-	}
-
-	offset = (char *)var - (char *)_car_start;
-
-	return &migrated_base[offset];
-}
-
-void car_migrate_variables(void)
-{
-	void *migrated_base;
-	car_migration_func_t *migrate_func;
-	size_t car_data_size = &_car_data_end[0] - &_car_data_start[0];
-
-	/* Check if already migrated. */
-	if (car_migrated)
-		return;
-
-	migrated_base = cbmem_add(CBMEM_ID_CAR_GLOBALS, car_data_size);
-
-	if (migrated_base == NULL) {
-		printk(BIOS_ERR, "Could not migrate CAR data!\n");
-		return;
-	}
-
-	memcpy(migrated_base, &_car_data_start[0], car_data_size);
-
-	/* Mark that the data has been moved. */
-	car_migrated = ~0;
-
-	/* Call all the migration functions. */
-	migrate_func = &_car_migrate_start;
-	while (migrate_func != &_car_migrate_end) {
-		(*migrate_func)();
-		migrate_func++;
-	}
-}
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index 1455e4c..3e11896 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -111,6 +111,7 @@ ramstage-y += cbmem.c
 romstage-$(CONFIG_CACHE_AS_RAM) += cbmem.c
 endif # CONFIG_DYNAMIC_CBMEM
 ramstage-y += cbmem_info.c
+romstage-$(CONFIG_CACHE_AS_RAM) += car.c
 
 ramstage-$(CONFIG_CONSOLE_NE2K) += ne2k.c
 
diff --git a/src/lib/car.c b/src/lib/car.c
new file mode 100644
index 0000000..481153d
--- /dev/null
+++ b/src/lib/car.c
@@ -0,0 +1,105 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2013 Google, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <string.h>
+#include <stddef.h>
+#include <console/console.h>
+#include <cbmem.h>
+#include <arch/early_variables.h>
+
+typedef void (* const car_migration_func_t)(void);
+
+extern car_migration_func_t _car_migrate_start;
+extern car_migration_func_t _car_migrate_end;
+
+extern char _car_data_start[];
+extern char _car_data_end[];
+
+/*
+ * The car_migrated global variable determines if the cache-as-ram space has
+ * been migrated to real RAM. It does this by assuming the following things:
+ *   1. cache-as-ram space is zero'd out once it is set up.
+ *   2. Either the cache-as-ram space is memory-backed after getting torn down
+ *      or the space returns 0xff's for each byte read.
+ * Based on these 2 attributes there is the ability to tell when the
+ * cache-as-ram region has been migrated.
+ */
+static int car_migrated CAR_GLOBAL;
+
+
+void *car_get_var_ptr(void *var)
+{
+	char *migrated_base;
+	int offset;
+	void * _car_start = &_car_data_start;
+	void * _car_end = &_car_data_end;
+
+	/* If the cache-as-ram has not been migrated return the pointer
+	 * passed in. */
+	if (!car_migrated)
+		return var;
+
+	if (var < _car_start || var >= _car_end) {
+		printk(BIOS_ERR,
+		       "Requesting CAR variable outside of CAR region: %p\n",
+		       var);
+		return var;
+	}
+
+	migrated_base = cbmem_find(CBMEM_ID_CAR_GLOBALS);
+
+	if (migrated_base == NULL) {
+		printk(BIOS_ERR, "CAR: Could not find migration base!\n");
+		return var;
+	}
+
+	offset = (char *)var - (char *)_car_start;
+
+	return &migrated_base[offset];
+}
+
+void car_migrate_variables(void)
+{
+	void *migrated_base;
+	car_migration_func_t *migrate_func;
+	size_t car_data_size = &_car_data_end[0] - &_car_data_start[0];
+
+	/* Check if already migrated. */
+	if (car_migrated)
+		return;
+
+	migrated_base = cbmem_add(CBMEM_ID_CAR_GLOBALS, car_data_size);
+
+	if (migrated_base == NULL) {
+		printk(BIOS_ERR, "Could not migrate CAR data!\n");
+		return;
+	}
+
+	memcpy(migrated_base, &_car_data_start[0], car_data_size);
+
+	/* Mark that the data has been moved. */
+	car_migrated = ~0;
+
+	/* Call all the migration functions. */
+	migrate_func = &_car_migrate_start;
+	while (migrate_func != &_car_migrate_end) {
+		(*migrate_func)();
+		migrate_func++;
+	}
+}



More information about the coreboot-gerrit mailing list