diff --git a/src/arch/arm/include/arch/early_variables.h b/src/arch/arm/include/arch/early_variables.h index 3d9fa26397..31b26c739a 100644 --- a/src/arch/arm/include/arch/early_variables.h +++ b/src/arch/arm/include/arch/early_variables.h @@ -26,7 +26,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_set_var(var, val) do { (var) = (val); } while (0) diff --git a/src/arch/arm64/include/arch/early_variables.h b/src/arch/arm64/include/arch/early_variables.h index 3d9fa26397..31b26c739a 100644 --- a/src/arch/arm64/include/arch/early_variables.h +++ b/src/arch/arm64/include/arch/early_variables.h @@ -26,7 +26,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_set_var(var, val) do { (var) = (val); } while (0) diff --git a/src/arch/mips/include/arch/early_variables.h b/src/arch/mips/include/arch/early_variables.h index a81a6b4037..4365cedd92 100644 --- a/src/arch/mips/include/arch/early_variables.h +++ b/src/arch/mips/include/arch/early_variables.h @@ -21,7 +21,6 @@ #define __MIPS_ARCH_EARLY_VARIABLES_H #define CAR_GLOBAL -#define CAR_MIGRATE(migrate_fn_) static inline void car_migrate_variables(void) {} #define car_get_var(var) (var) diff --git a/src/arch/x86/include/arch/early_variables.h b/src/arch/x86/include/arch/early_variables.h index 9ee13124ef..830212def9 100644 --- a/src/arch/x86/include/arch/early_variables.h +++ b/src/arch/x86/include/arch/early_variables.h @@ -27,12 +27,6 @@ #endif #if CONFIG_CAR_MIGRATION && defined(__PRE_RAM__) -#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); @@ -47,7 +41,6 @@ void *car_get_var_ptr(void *var); void car_migrate_variables(void); #else -#define CAR_MIGRATE(migrate_fn_) static inline void *car_get_var_ptr(void *var) { return var; } #define car_get_var(var) (var) #define car_set_var(var, val) do { (var) = (val); } while (0) diff --git a/src/arch/x86/init/romstage.ld b/src/arch/x86/init/romstage.ld index 3fbadbb7aa..0c178c6e0d 100644 --- a/src/arch/x86/init/romstage.ld +++ b/src/arch/x86/init/romstage.ld @@ -31,14 +31,14 @@ SECTIONS _rom = .; *(.rom.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 = .; - *(.car.migrate); - _car_migrate_end = .; - . = ALIGN(16); _erom = .; } diff --git a/src/cpu/x86/car.c b/src/cpu/x86/car.c index 23282cd89c..cdcfec1f40 100644 --- a/src/cpu/x86/car.c +++ b/src/cpu/x86/car.c @@ -23,11 +23,6 @@ #include #include -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[]; @@ -77,7 +72,6 @@ void *car_get_var_ptr(void *var) 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]; migrated_base = cbmem_add(CBMEM_ID_CAR_GLOBALS, car_data_size); @@ -91,11 +85,4 @@ void car_migrate_variables(void) /* 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/include/cbmem.h b/src/include/cbmem.h index 783c70f137..058fb64e88 100644 --- a/src/include/cbmem.h +++ b/src/include/cbmem.h @@ -203,13 +203,19 @@ 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); +#define CBMEM_INIT_HOOK(init_fn_) static cbmem_init_hook_t init_fn_ ## _ptr \ + __attribute__((used, section(".rodata.cbmem_init_hooks"))) = init_fn_; + #ifndef __PRE_RAM__ /* Ramstage only functions. */ void cbmem_list(void); void cbmem_arch_init(void); void cbmem_print_entry(int n, u32 id, u64 start, u64 size); +static inline void cbmem_run_init_hooks(void) {} #else static inline void cbmem_arch_init(void) {} +void cbmem_run_init_hooks(void); #endif /* __PRE_RAM__ */ #endif /* __ASSEMBLER__ */ diff --git a/src/include/timestamp.h b/src/include/timestamp.h index cf376f6ea6..33fb83058a 100644 --- a/src/include/timestamp.h +++ b/src/include/timestamp.h @@ -90,11 +90,6 @@ void timestamp_init(uint64_t base); void timestamp_add(enum timestamp_id id, uint64_t ts_time); /* Calls timestamp_add with current timestamp. */ void timestamp_add_now(enum timestamp_id id); -/* - * Sync all timestamps from timestamp_cache to cbmem area. Called by - * cbmem_initialize. - */ -void timestamp_sync(void); /* Implemented by the architecture code */ uint64_t timestamp_get(void); #else diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc index 91b16ee070..2fc3cd33d8 100644 --- a/src/lib/Makefile.inc +++ b/src/lib/Makefile.inc @@ -116,7 +116,8 @@ else ramstage-y += cbmem.c romstage-$(CONFIG_HAVE_ACPI_RESUME) += cbmem.c endif # CONFIG_DYNAMIC_CBMEM -ramstage-y += cbmem_info.c +romstage-y += cbmem_common.c +ramstage-y += cbmem_common.c ramstage-y += hexdump.c romstage-y += hexdump.c diff --git a/src/lib/cbmem.c b/src/lib/cbmem.c index a2cf8e3839..85908c9453 100644 --- a/src/lib/cbmem.c +++ b/src/lib/cbmem.c @@ -230,12 +230,11 @@ int cbmem_initialize(void) #ifndef __PRE_RAM__ cbmem_arch_init(); #endif + cbmem_run_init_hooks(); + /* Migrate cache-as-ram variables. */ car_migrate_variables(); - /* Pull in all timestamps from timestamp cache into cbmem area */ - timestamp_sync(); - return rv; } #endif @@ -271,6 +270,6 @@ void cbmem_list(void) cbmem_toc[i].size); } } -#endif +#endif /* ! __PRE_RAM__ */ diff --git a/src/lib/cbmem_info.c b/src/lib/cbmem_common.c similarity index 79% rename from src/lib/cbmem_info.c rename to src/lib/cbmem_common.c index 7b1168dc4e..467bc7c529 100644 --- a/src/lib/cbmem_info.c +++ b/src/lib/cbmem_common.c @@ -20,6 +20,8 @@ #include #include +#ifndef __PRE_RAM__ + static const struct cbmem_id_to_name cbmem_ids[] = { CBMEM_ID_TO_NAME_TABLE }; void cbmem_print_entry(int n, u32 id, u64 base, u64 size) @@ -43,3 +45,19 @@ void cbmem_print_entry(int n, u32 id, u64 base, u64 size) printk(BIOS_DEBUG, "%08llx ", base); printk(BIOS_DEBUG, "%08llx\n", size); } + +#else /* __PRE_RAM__ */ + +extern cbmem_init_hook_t _cbmem_init_hooks; +extern cbmem_init_hook_t _ecbmem_init_hooks; + +void cbmem_run_init_hooks(void) +{ + cbmem_init_hook_t *init_hook_ptr = &_cbmem_init_hooks; + while (init_hook_ptr != &_ecbmem_init_hooks) { + (*init_hook_ptr)(); + init_hook_ptr++; + } +} + +#endif /* __PRE_RAM__ */ diff --git a/src/lib/cbmem_console.c b/src/lib/cbmem_console.c index d3188670dd..0238f2eae1 100644 --- a/src/lib/cbmem_console.c +++ b/src/lib/cbmem_console.c @@ -233,5 +233,5 @@ void cbmemc_reinit(void) current_console_set(cbm_cons_p); } -/* Call cbmemc_reinit() at CAR migration time. */ -CAR_MIGRATE(cbmemc_reinit) +/* Call cbmemc_reinit() at cbmem_initialize() time. */ +CBMEM_INIT_HOOK(cbmemc_reinit) diff --git a/src/lib/dynamic_cbmem.c b/src/lib/dynamic_cbmem.c index a613596242..842c95bde2 100644 --- a/src/lib/dynamic_cbmem.c +++ b/src/lib/dynamic_cbmem.c @@ -184,20 +184,16 @@ void cbmem_initialize_empty(void) root, root->max_entries); cbmem_arch_init(); + cbmem_run_init_hooks(); /* Migrate cache-as-ram variables. */ car_migrate_variables(); - - /* Pull in all timestamps from timestamp cache into cbmem area */ - timestamp_sync(); } static inline int cbmem_fail_recovery(void) { cbmem_initialize_empty(); cbmem_handle_acpi_resume(); - /* Migrate cache-as-ram variables. */ - car_migrate_variables(); return 1; } @@ -265,13 +261,11 @@ int cbmem_initialize(void) #endif cbmem_arch_init(); + cbmem_run_init_hooks(); /* Migrate cache-as-ram variables. */ car_migrate_variables(); - /* Pull in all timestamps from timestamp cache into cbmem area */ - timestamp_sync(); - /* Recovery successful. */ return 0; } diff --git a/src/lib/romstage.ld b/src/lib/romstage.ld index c3a2643787..bbad333adf 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 1af491dc48..d3404021b7 100644 --- a/src/lib/timestamp.c +++ b/src/lib/timestamp.c @@ -155,7 +155,7 @@ static void timestamp_add_table_entry(struct timestamp_table *ts_table, tse->entry_stamp = ts_time - ts_table->base_time; } -void timestamp_sync(void) +static void timestamp_sync(void) { uint32_t i; @@ -214,6 +214,7 @@ void timestamp_sync(void) if (ts_cbmem_table->base_time == 0) ts_cbmem_table->base_time = ts_cache_table->base_time; } +CBMEM_INIT_HOOK(timestamp_sync) void timestamp_early_init(uint64_t base) { diff --git a/src/mainboard/emulation/qemu-x86/romstage.c b/src/mainboard/emulation/qemu-x86/romstage.c index c80a25de91..74e9e8a50f 100644 --- a/src/mainboard/emulation/qemu-x86/romstage.c +++ b/src/mainboard/emulation/qemu-x86/romstage.c @@ -52,10 +52,4 @@ void main(unsigned long bist) timestamp_init(rdtsc()); timestamp_add_now(TS_START_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif - } diff --git a/src/mainboard/google/butterfly/romstage.c b/src/mainboard/google/butterfly/romstage.c index e33415ef54..02040d2c74 100644 --- a/src/mainboard/google/butterfly/romstage.c +++ b/src/mainboard/google/butterfly/romstage.c @@ -289,9 +289,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/google/link/romstage.c b/src/mainboard/google/link/romstage.c index 6e07ee0843..a122b10d78 100644 --- a/src/mainboard/google/link/romstage.c +++ b/src/mainboard/google/link/romstage.c @@ -331,9 +331,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/google/nyan/romstage.c b/src/mainboard/google/nyan/romstage.c index e05ee5fa0d..a65d7f6ce4 100644 --- a/src/mainboard/google/nyan/romstage.c +++ b/src/mainboard/google/nyan/romstage.c @@ -89,10 +89,6 @@ static void __attribute__((noinline)) romstage(void) early_mainboard_init(); -#if CONFIG_CONSOLE_CBMEM - cbmemc_reinit(); -#endif - vboot_verify_firmware(romstage_handoff_find_or_add()); timestamp_add_now(TS_START_COPYRAM); diff --git a/src/mainboard/google/nyan_big/romstage.c b/src/mainboard/google/nyan_big/romstage.c index e05ee5fa0d..a65d7f6ce4 100644 --- a/src/mainboard/google/nyan_big/romstage.c +++ b/src/mainboard/google/nyan_big/romstage.c @@ -89,10 +89,6 @@ static void __attribute__((noinline)) romstage(void) early_mainboard_init(); -#if CONFIG_CONSOLE_CBMEM - cbmemc_reinit(); -#endif - vboot_verify_firmware(romstage_handoff_find_or_add()); timestamp_add_now(TS_START_COPYRAM); diff --git a/src/mainboard/google/nyan_blaze/romstage.c b/src/mainboard/google/nyan_blaze/romstage.c index 144f4168d2..837b681825 100644 --- a/src/mainboard/google/nyan_blaze/romstage.c +++ b/src/mainboard/google/nyan_blaze/romstage.c @@ -92,10 +92,6 @@ static void __attribute__((noinline)) romstage(void) cbmem_initialize_empty(); -#if CONFIG_CONSOLE_CBMEM - cbmemc_reinit(); -#endif - #if CONFIG_VBOOT2_VERIFY_FIRMWARE entry = vboot2_load_ramstage(); #else diff --git a/src/mainboard/google/parrot/romstage.c b/src/mainboard/google/parrot/romstage.c index f33852b081..78758d5935 100644 --- a/src/mainboard/google/parrot/romstage.c +++ b/src/mainboard/google/parrot/romstage.c @@ -289,9 +289,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/google/stout/romstage.c b/src/mainboard/google/stout/romstage.c index 48ff7b0834..e1d85d7db5 100644 --- a/src/mainboard/google/stout/romstage.c +++ b/src/mainboard/google/stout/romstage.c @@ -346,9 +346,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/intel/emeraldlake2/romstage.c b/src/mainboard/intel/emeraldlake2/romstage.c index 7a1d32ba22..a74358402a 100644 --- a/src/mainboard/intel/emeraldlake2/romstage.c +++ b/src/mainboard/intel/emeraldlake2/romstage.c @@ -343,9 +343,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/samsung/lumpy/romstage.c b/src/mainboard/samsung/lumpy/romstage.c index 0d7802933a..2bc5f34602 100644 --- a/src/mainboard/samsung/lumpy/romstage.c +++ b/src/mainboard/samsung/lumpy/romstage.c @@ -362,9 +362,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/mainboard/samsung/stumpy/romstage.c b/src/mainboard/samsung/stumpy/romstage.c index 6f138b8c63..523d5c00ab 100644 --- a/src/mainboard/samsung/stumpy/romstage.c +++ b/src/mainboard/samsung/stumpy/romstage.c @@ -367,9 +367,4 @@ void main(unsigned long bist) timestamp_add(TS_BEFORE_INITRAM, before_dram_time ); timestamp_add(TS_AFTER_INITRAM, after_dram_time ); timestamp_add_now(TS_END_ROMSTAGE); - -#if CONFIG_CONSOLE_CBMEM - /* Keep this the last thing this function does. */ - cbmemc_reinit(); -#endif } diff --git a/src/northbridge/intel/sandybridge/raminit.c b/src/northbridge/intel/sandybridge/raminit.c index 78eedb89db..172872d552 100644 --- a/src/northbridge/intel/sandybridge/raminit.c +++ b/src/northbridge/intel/sandybridge/raminit.c @@ -63,6 +63,9 @@ static void save_mrc_data(struct pei_data *pei_data) int output_len = ALIGN(pei_data->mrc_output_len, 16); /* Save the MRC S3 restore data to cbmem */ + /* TODO: cbmem_initialize() must not be called twice! Most sandybridge + * boards call it again from mainboard/romstage.c. Clean up these code + * paths to ensure it is called at most once with every config. */ cbmem_initialize(); mrcdata = cbmem_add (CBMEM_ID_MRCDATA, diff --git a/src/soc/intel/baytrail/romstage/romstage.c b/src/soc/intel/baytrail/romstage/romstage.c index f1ab4dcfbf..6121e8417f 100644 --- a/src/soc/intel/baytrail/romstage/romstage.c +++ b/src/soc/intel/baytrail/romstage/romstage.c @@ -154,7 +154,7 @@ static void migrate_power_state(void) } memcpy(ps_cbmem, ps_car, sizeof(*ps_cbmem)); } -CAR_MIGRATE(migrate_power_state); +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 bdb3da9c3b..bc7f15e6c7 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); +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 469f1ff7cc..390059d07a 100644 --- a/src/soc/nvidia/tegra132/romstage.c +++ b/src/soc/nvidia/tegra132/romstage.c @@ -123,8 +123,6 @@ void romstage(void) clock_halt_avp(); } - cbmemc_reinit(); - timestamp_add_now(TS_END_ROMSTAGE); ccplex_cpu_start(entry);