summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/arch/arm/include/arch/early_variables.h1
-rw-r--r--src/arch/arm64/include/arch/early_variables.h1
-rw-r--r--src/arch/x86/boot/cbmem.c22
-rw-r--r--src/arch/x86/boot/gdt.c3
-rw-r--r--src/arch/x86/include/arch/early_variables.h12
-rw-r--r--src/arch/x86/init/romstage.ld9
-rw-r--r--src/cpu/x86/car.c18
-rw-r--r--src/drivers/usb/ehci_debug.c2
-rw-r--r--src/include/cbmem.h22
-rw-r--r--src/include/console/cbmem_console.h6
-rw-r--r--src/include/cpu/x86/gdt.h3
-rw-r--r--src/include/symbols.h4
-rw-r--r--src/include/timestamp.h2
-rw-r--r--src/lib/cbmem_common.c22
-rw-r--r--src/lib/cbmem_console.c7
-rw-r--r--src/lib/ramstage.ld3
-rw-r--r--src/lib/rmodule.ld3
-rw-r--r--src/lib/romstage.ld4
-rw-r--r--src/lib/timestamp.c7
-rw-r--r--src/soc/intel/baytrail/romstage/romstage.c2
-rw-r--r--src/soc/intel/broadwell/romstage/power_state.c2
-rw-r--r--src/soc/nvidia/tegra132/romstage.c2
22 files changed, 65 insertions, 92 deletions
diff --git a/src/arch/arm/include/arch/early_variables.h b/src/arch/arm/include/arch/early_variables.h
index 725650a84d..5e09448a93 100644
--- a/src/arch/arm/include/arch/early_variables.h
+++ b/src/arch/arm/include/arch/early_variables.h
@@ -22,7 +22,6 @@
#define CAR_GLOBAL
-#define CAR_MIGRATE(migrate_fn_)
static inline void *car_get_var_ptr(void *var) { return var; }
#define car_get_var(var) (var)
#define car_sync_var(var) (var)
diff --git a/src/arch/arm64/include/arch/early_variables.h b/src/arch/arm64/include/arch/early_variables.h
index 725650a84d..5e09448a93 100644
--- a/src/arch/arm64/include/arch/early_variables.h
+++ b/src/arch/arm64/include/arch/early_variables.h
@@ -22,7 +22,6 @@
#define CAR_GLOBAL
-#define CAR_MIGRATE(migrate_fn_)
static inline void *car_get_var_ptr(void *var) { return var; }
#define car_get_var(var) (var)
#define car_sync_var(var) (var)
diff --git a/src/arch/x86/boot/cbmem.c b/src/arch/x86/boot/cbmem.c
index a9127d7c07..e279db960c 100644
--- a/src/arch/x86/boot/cbmem.c
+++ b/src/arch/x86/boot/cbmem.c
@@ -20,12 +20,6 @@
#include <cbmem.h>
#include <arch/acpi.h>
-/* FIXME: Remove after CBMEM_INIT_HOOKS. */
-#include <arch/early_variables.h>
-#include <cpu/x86/gdt.h>
-#include <console/cbmem_console.h>
-#include <timestamp.h>
-
#if IS_ENABLED(CONFIG_LATE_CBMEM_INIT)
#if !defined(__PRE_RAM__)
@@ -71,22 +65,6 @@ void *cbmem_top(void)
#endif /* LATE_CBMEM_INIT */
-void cbmem_run_init_hooks(void)
-{
- /* Migrate car.global_data. */
- car_migrate_variables();
-
-#if !defined(__PRE_RAM__)
- /* Relocate CBMEM console. */
- cbmemc_reinit();
-
- /* Relocate timestamps stash. */
- timestamp_reinit();
-
- move_gdt();
-#endif
-}
-
/* Something went wrong, our high memory area got wiped */
void cbmem_fail_resume(void)
{
diff --git a/src/arch/x86/boot/gdt.c b/src/arch/x86/boot/gdt.c
index 9d9517afb8..e13d3bc4da 100644
--- a/src/arch/x86/boot/gdt.c
+++ b/src/arch/x86/boot/gdt.c
@@ -32,7 +32,7 @@ struct gdtarg {
/* Copy GDT to new location and reload it.
* FIXME: We only do this for BSP CPU.
*/
-void move_gdt(void)
+static void move_gdt(void)
{
void *newgdt;
u16 num_gdt_bytes = (u32)&gdt_end - (u32)&gdt;
@@ -55,3 +55,4 @@ void move_gdt(void)
__asm__ __volatile__ ("lgdt %0\n\t" : : "m" (gdtarg));
printk(BIOS_DEBUG, "ok\n");
}
+RAMSTAGE_CBMEM_INIT_HOOK(move_gdt)
diff --git a/src/arch/x86/include/arch/early_variables.h b/src/arch/x86/include/arch/early_variables.h
index bfb12014e8..d9f1cd76e6 100644
--- a/src/arch/x86/include/arch/early_variables.h
+++ b/src/arch/x86/include/arch/early_variables.h
@@ -29,13 +29,6 @@ asm(".previous");
#define CAR_GLOBAL __attribute__((used,section(".car.global_data#")))
#endif /* __clang__ */
-#define CAR_MIGRATE_ATTR __attribute__ ((used,section (".car.migrate")))
-
-/* Call migrate_fn_() when CAR globals are migrated. */
-#define CAR_MIGRATE(migrate_fn_) \
- static void (* const migrate_fn_ ## _ptr)(void) CAR_MIGRATE_ATTR = \
- migrate_fn_;
-
/* Get the correct pointer for the CAR global variable. */
void *car_get_var_ptr(void *var);
@@ -50,17 +43,12 @@ void *car_sync_var_ptr(void *var);
#define car_set_var(var, val) \
do { car_get_var(var) = (val); } while(0)
-/* Migrate the CAR variables to memory. */
-void car_migrate_variables(void);
-
#else
#define CAR_GLOBAL
-#define CAR_MIGRATE(migrate_fn_)
static inline void *car_get_var_ptr(void *var) { return var; }
#define car_get_var(var) (var)
#define car_sync_var(var) (var)
#define car_set_var(var, val) do { (var) = (val); } while (0)
-static inline void car_migrate_variables(void) { }
#endif
#endif
diff --git a/src/arch/x86/init/romstage.ld b/src/arch/x86/init/romstage.ld
index ae7049b423..74e665f4af 100644
--- a/src/arch/x86/init/romstage.ld
+++ b/src/arch/x86/init/romstage.ld
@@ -34,15 +34,14 @@ SECTIONS
*(.text);
*(.text.*);
*(.rom.data);
+ . = ALIGN(4);
+ _cbmem_init_hooks = .;
+ KEEP(*(.rodata.cbmem_init_hooks));
+ _ecbmem_init_hooks = .;
*(.rodata);
*(.rodata.*);
*(.rom.data.*);
. = ALIGN(16);
- _car_migrate_start = .;
- KEEP(*(.car.migrate));
- LONG(0);
- _car_migrate_end = .;
- . = ALIGN(16);
_erom = .;
}
diff --git a/src/cpu/x86/car.c b/src/cpu/x86/car.c
index 165a0e660b..ffcf0dbf9f 100644
--- a/src/cpu/x86/car.c
+++ b/src/cpu/x86/car.c
@@ -136,21 +136,9 @@ static void do_car_migrate_variables(void)
car_migrated = ~0;
}
-static void do_car_migrate_hooks(void)
+static void car_migrate_variables(void)
{
- car_migration_func_t *migrate_func;
- /* Call all the migration functions. */
- migrate_func = &_car_migrate_start;
- while (*migrate_func != NULL) {
- (*migrate_func)();
- migrate_func++;
- }
-}
-
-void car_migrate_variables(void)
-{
- if (!IS_ENABLED(PLATFORM_USES_FSP1_0))
+ if (!IS_ENABLED(CONFIG_BROKEN_CAR_MIGRATE) && !IS_ENABLED(PLATFORM_USES_FSP1_0))
do_car_migrate_variables();
-
- do_car_migrate_hooks();
}
+ROMSTAGE_CBMEM_INIT_HOOK(car_migrate_variables)
diff --git a/src/drivers/usb/ehci_debug.c b/src/drivers/usb/ehci_debug.c
index 68fd0fac8c..a6de8b27cc 100644
--- a/src/drivers/usb/ehci_debug.c
+++ b/src/drivers/usb/ehci_debug.c
@@ -682,7 +682,7 @@ static void migrate_ehci_debug(void)
memcpy(dbg_info_cbmem, dbg_info, sizeof(*dbg_info));
car_set_var(glob_dbg_info_p, dbg_info_cbmem);
}
-CAR_MIGRATE(migrate_ehci_debug);
+ROMSTAGE_CBMEM_INIT_HOOK(migrate_ehci_debug);
#endif
int dbgp_ep_is_active(struct dbgp_pipe *pipe)
diff --git a/src/include/cbmem.h b/src/include/cbmem.h
index 7afe960116..55b04b4106 100644
--- a/src/include/cbmem.h
+++ b/src/include/cbmem.h
@@ -22,6 +22,7 @@
#define _CBMEM_H_
#include <cbmem_id.h>
+#include <rules.h>
#if IS_ENABLED(CONFIG_HAVE_ACPI_RESUME) && \
! IS_ENABLED(CONFIG_RELOCATABLE_RAMSTAGE)
@@ -112,6 +113,7 @@ void *cbmem_add(u32 id, u64 size);
/* Find a cbmem entry of a given id. These return NULL on failure. */
void *cbmem_find(u32 id);
+typedef void (* const cbmem_init_hook_t)(void);
void cbmem_run_init_hooks(void);
void cbmem_fail_resume(void);
@@ -122,6 +124,26 @@ void cbmem_add_bootmem(void);
void cbmem_list(void);
#endif /* __PRE_RAM__ */
+#if ENV_RAMSTAGE
+#define ROMSTAGE_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
+ init_fn_ ## _unused_ __attribute__((unused)) = init_fn_;
+#define RAMSTAGE_CBMEM_INIT_HOOK(init_fn_) \
+ static cbmem_init_hook_t init_fn_ ## _ptr_ __attribute__((used, \
+ section(".rodata.cbmem_init_hooks"))) = init_fn_;
+#elif ENV_ROMSTAGE
+#define ROMSTAGE_CBMEM_INIT_HOOK(init_fn_) \
+ static cbmem_init_hook_t init_fn_ ## _ptr_ __attribute__((used, \
+ section(".rodata.cbmem_init_hooks"))) = init_fn_;
+#define RAMSTAGE_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
+ init_fn_ ## _unused_ __attribute__((unused)) = init_fn_;
+#else
+#define ROMSTAGE_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
+ init_fn_ ## _unused_ __attribute__((unused)) = init_fn_;
+#define RAMSTAGE_CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t \
+ init_fn_ ## _unused2_ __attribute__((unused)) = init_fn_;
+#endif /* ENV_RAMSTAGE */
+
+
/* These are for compatibility with old boards only. Any new chipset and board
* must implement cbmem_top() for both romstage and ramstage to support
* early features like COLLECT_TIMESTAMPS and CBMEM_CONSOLE.
diff --git a/src/include/console/cbmem_console.h b/src/include/console/cbmem_console.h
index e9ec66ee9e..06013f2a22 100644
--- a/src/include/console/cbmem_console.h
+++ b/src/include/console/cbmem_console.h
@@ -25,12 +25,6 @@
void cbmemc_init(void);
void cbmemc_tx_byte(unsigned char data);
-#if CONFIG_CONSOLE_CBMEM
-void cbmemc_reinit(void);
-#else
-static inline void cbmemc_reinit(void) {}
-#endif
-
#define __CBMEM_CONSOLE_ENABLE__ CONFIG_CONSOLE_CBMEM && \
(ENV_RAMSTAGE || (IS_ENABLED(CONFIG_EARLY_CBMEM_INIT) && \
(ENV_ROMSTAGE || (ENV_BOOTBLOCK && CONFIG_BOOTBLOCK_CONSOLE))))
diff --git a/src/include/cpu/x86/gdt.h b/src/include/cpu/x86/gdt.h
index 8525a3cd44..a96b0e4083 100644
--- a/src/include/cpu/x86/gdt.h
+++ b/src/include/cpu/x86/gdt.h
@@ -28,7 +28,4 @@ extern char _secondary_gdt_addr[];
extern char _secondary_start[];
extern char _secondary_start_end[];
-/* Defined in src/arch/x86/boot/gdt.c */
-void move_gdt(void);
-
#endif /* CPU_X86_GDT */
diff --git a/src/include/symbols.h b/src/include/symbols.h
index 4a47de1f41..9102e82952 100644
--- a/src/include/symbols.h
+++ b/src/include/symbols.h
@@ -33,6 +33,10 @@ extern u8 _epreram_cbmem_console[];
#define _preram_cbmem_console_size \
(_epreram_cbmem_console - _preram_cbmem_console)
+extern u8 _cbmem_init_hooks[];
+extern u8 _ecbmem_init_hooks[];
+#define _cbmem_init_hooks_size (_ecbmem_init_hooks - _cbmem_init_hooks)
+
extern u8 _stack[];
extern u8 _estack[];
#define _stack_size (_estack - _stack)
diff --git a/src/include/timestamp.h b/src/include/timestamp.h
index d9afeea0c1..a248ea45cd 100644
--- a/src/include/timestamp.h
+++ b/src/include/timestamp.h
@@ -92,12 +92,10 @@ enum timestamp_id {
void timestamp_init(uint64_t base);
void timestamp_add(enum timestamp_id id, uint64_t ts_time);
void timestamp_add_now(enum timestamp_id id);
-void timestamp_reinit(void);
#else
#define timestamp_init(base)
#define timestamp_add(id, time)
#define timestamp_add_now(id)
-#define timestamp_reinit()
#endif
/* Implemented by the architecture code */
diff --git a/src/lib/cbmem_common.c b/src/lib/cbmem_common.c
index e9beb5fe6a..496bafa986 100644
--- a/src/lib/cbmem_common.c
+++ b/src/lib/cbmem_common.c
@@ -20,30 +20,28 @@
#include <cbmem.h>
#include <bootstate.h>
#include <rules.h>
+#include <symbols.h>
#if IS_ENABLED(CONFIG_ARCH_X86) && !IS_ENABLED(CONFIG_EARLY_CBMEM_INIT)
#include <arch/acpi.h>
#endif
-/* FIXME: Remove after CBMEM_INIT_HOOKS. */
-#include <console/cbmem_console.h>
-#include <timestamp.h>
-
-
-/* FIXME: Replace with CBMEM_INIT_HOOKS API. */
-#if !IS_ENABLED(CONFIG_ARCH_X86)
void cbmem_run_init_hooks(void)
{
- /* Relocate CBMEM console. */
- cbmemc_reinit();
+ cbmem_init_hook_t *init_hook_ptr = (cbmem_init_hook_t*) &_cbmem_init_hooks;
+ cbmem_init_hook_t *einit_hook_ptr = (cbmem_init_hook_t*) &_ecbmem_init_hooks;
- /* Relocate timestamps stash. */
- timestamp_reinit();
+ if (_cbmem_init_hooks_size == 0)
+ return;
+
+ while (init_hook_ptr != einit_hook_ptr) {
+ (*init_hook_ptr)();
+ init_hook_ptr++;
+ }
}
void __attribute__((weak)) cbmem_fail_resume(void)
{
}
-#endif
#if ENV_RAMSTAGE && !IS_ENABLED(CONFIG_EARLY_CBMEM_INIT)
static void init_cbmem_post_device(void *unused)
diff --git a/src/lib/cbmem_console.c b/src/lib/cbmem_console.c
index e9607f3a35..48664543fc 100644
--- a/src/lib/cbmem_console.c
+++ b/src/lib/cbmem_console.c
@@ -208,7 +208,7 @@ static void copy_console_buffer(struct cbmem_console *old_cons_p,
new_cons_p->buffer_cursor = cursor;
}
-void cbmemc_reinit(void)
+static void cbmemc_reinit(void)
{
struct cbmem_console *cbm_cons_p;
const size_t size = CONFIG_CONSOLE_CBMEM_BUFFER_SIZE;
@@ -233,6 +233,8 @@ void cbmemc_reinit(void)
init_console_ptr(cbm_cons_p, size, flags);
}
+ROMSTAGE_CBMEM_INIT_HOOK(cbmemc_reinit)
+RAMSTAGE_CBMEM_INIT_HOOK(cbmemc_reinit)
#if IS_ENABLED(CONFIG_CONSOLE_CBMEM_DUMP_TO_UART)
void cbmem_dump_console(void)
@@ -249,6 +251,3 @@ void cbmem_dump_console(void)
uart_tx_byte(0, cbm_cons_p->buffer_body[cursor]);
}
#endif
-
-/* Call cbmemc_reinit() at CAR migration time. */
-CAR_MIGRATE(cbmemc_reinit)
diff --git a/src/lib/ramstage.ld b/src/lib/ramstage.ld
index 30b18a7bea..402f495714 100644
--- a/src/lib/ramstage.ld
+++ b/src/lib/ramstage.ld
@@ -64,6 +64,9 @@
LONG(0);
LONG(0);
_bs_init_end = .;
+ _cbmem_init_hooks = .;
+ KEEP(*(.rodata.cbmem_init_hooks));
+ _ecbmem_init_hooks = .;
*(.rodata)
*(.rodata.*)
diff --git a/src/lib/rmodule.ld b/src/lib/rmodule.ld
index 70a2d3df8e..0e9c8804e8 100644
--- a/src/lib/rmodule.ld
+++ b/src/lib/rmodule.ld
@@ -55,6 +55,9 @@ SECTIONS
LONG(0);
LONG(0);
_bs_init_end = .;
+ _cbmem_init_hooks = .;
+ KEEP(*(.rodata.cbmem_init_hooks));
+ _ecbmem_init_hooks = .;
. = ALIGN(8);
diff --git a/src/lib/romstage.ld b/src/lib/romstage.ld
index 34e76c0c48..7d552a76b1 100644
--- a/src/lib/romstage.ld
+++ b/src/lib/romstage.ld
@@ -29,6 +29,10 @@
} : to_load
.data . : {
+ . = ALIGN(8);
+ _cbmem_init_hooks = .;
+ KEEP(*(.rodata.cbmem_init_hooks));
+ _ecbmem_init_hooks = .;
*(.rodata);
*(.rodata.*);
*(.data);
diff --git a/src/lib/timestamp.c b/src/lib/timestamp.c
index 8c82649863..3b886b62c6 100644
--- a/src/lib/timestamp.c
+++ b/src/lib/timestamp.c
@@ -157,7 +157,7 @@ void timestamp_init(uint64_t base)
#endif
}
-void timestamp_reinit(void)
+static void timestamp_reinit(void)
{
if (!timestamp_should_run())
return;
@@ -172,8 +172,9 @@ void timestamp_reinit(void)
timestamp_do_sync();
}
-/* Call timestamp_reinit at CAR migration time. */
-CAR_MIGRATE(timestamp_reinit)
+/* Call timestamp_reinit CBMEM init hooks. */
+ROMSTAGE_CBMEM_INIT_HOOK(timestamp_reinit)
+RAMSTAGE_CBMEM_INIT_HOOK(timestamp_reinit)
/* Provide default timestamp implementation using monotonic timer. */
uint64_t __attribute__((weak)) timestamp_get(void)
diff --git a/src/soc/intel/baytrail/romstage/romstage.c b/src/soc/intel/baytrail/romstage/romstage.c
index a32db02df5..3f35bdeb93 100644
--- a/src/soc/intel/baytrail/romstage/romstage.c
+++ b/src/soc/intel/baytrail/romstage/romstage.c
@@ -158,7 +158,7 @@ static void migrate_power_state(void)
}
memcpy(ps_cbmem, ps_car, sizeof(*ps_cbmem));
}
-CAR_MIGRATE(migrate_power_state);
+ROMSTAGE_CBMEM_INIT_HOOK(migrate_power_state)
static struct chipset_power_state *fill_power_state(void)
{
diff --git a/src/soc/intel/broadwell/romstage/power_state.c b/src/soc/intel/broadwell/romstage/power_state.c
index 22ec8a6813..ce52b49b85 100644
--- a/src/soc/intel/broadwell/romstage/power_state.c
+++ b/src/soc/intel/broadwell/romstage/power_state.c
@@ -50,7 +50,7 @@ static void migrate_power_state(void)
}
memcpy(ps_cbmem, ps_car, sizeof(*ps_cbmem));
}
-CAR_MIGRATE(migrate_power_state);
+ROMSTAGE_CBMEM_INIT_HOOK(migrate_power_state)
/* Return 0, 3, or 5 to indicate the previous sleep state. */
static int prev_sleep_state(struct chipset_power_state *ps)
diff --git a/src/soc/nvidia/tegra132/romstage.c b/src/soc/nvidia/tegra132/romstage.c
index fedc1d4e8b..6476e06031 100644
--- a/src/soc/nvidia/tegra132/romstage.c
+++ b/src/soc/nvidia/tegra132/romstage.c
@@ -76,8 +76,6 @@ void romstage(void)
romstage_mainboard_init();
- cbmemc_reinit();
-
run_ramstage();
}