[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