Martin Roth (gaumless@gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8095
-gerrit
commit 2a4da33782deaebbc69f12efc83d1ee8cecf02a8 Author: Martin Roth martin.roth@se-eng.com Date: Sun Jan 4 11:23:13 2015 -0700
cbmem: make do_car_migrate_variables external, add pointer
This is for the FSP migration. The pointer to the saved CAR data needs to be passed in for the car migration. Instead of creating special functions just for the FSP, or changing everything to pass the pointer all the way through from cbmem_recovery(), keep the BROKEN_CAR_MIGRATE in place for FSP platforms so that do_car_migrate_variables doesn't get called in the standard cbmem_recovery() path. After it returns, call do_car_migrate_variables() directly, passing in the pointer to the saved data.
Change-Id: I4967eef097bf41b033ab82fafd1fd0d4144fd5d2 Signed-off-by: Martin Roth martin.roth@se-eng.com --- src/arch/arm/include/arch/early_variables.h | 1 + src/arch/arm64/include/arch/early_variables.h | 1 + src/arch/riscv/include/arch/early_variables.h | 1 + src/arch/x86/include/arch/early_variables.h | 2 ++ src/cpu/x86/car.c | 9 ++++++--- 5 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/arch/arm/include/arch/early_variables.h b/src/arch/arm/include/arch/early_variables.h index 5b58baa..edddc7c 100644 --- a/src/arch/arm/include/arch/early_variables.h +++ b/src/arch/arm/include/arch/early_variables.h @@ -27,5 +27,6 @@ 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) static inline void car_migrate_variables(void) { } +static inline void do_car_migrate_variables(void *var) { }
#endif diff --git a/src/arch/arm64/include/arch/early_variables.h b/src/arch/arm64/include/arch/early_variables.h index 3d9fa26..779515a 100644 --- a/src/arch/arm64/include/arch/early_variables.h +++ b/src/arch/arm64/include/arch/early_variables.h @@ -31,5 +31,6 @@ 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) static inline void car_migrate_variables(void) { } +static inline void do_car_migrate_variables(void *var) { }
#endif diff --git a/src/arch/riscv/include/arch/early_variables.h b/src/arch/riscv/include/arch/early_variables.h index 3a1f20d..2487c82 100644 --- a/src/arch/riscv/include/arch/early_variables.h +++ b/src/arch/riscv/include/arch/early_variables.h @@ -31,5 +31,6 @@ 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) static inline void car_migrate_variables(void) { } +static inline void do_car_migrate_variables(void *var) { }
#endif diff --git a/src/arch/x86/include/arch/early_variables.h b/src/arch/x86/include/arch/early_variables.h index f76c048..fbbbc6b 100644 --- a/src/arch/x86/include/arch/early_variables.h +++ b/src/arch/x86/include/arch/early_variables.h @@ -55,8 +55,10 @@ static inline void *car_get_var_ptr(void *var) { return var; } #if defined(__PRE_RAM__) && IS_ENABLED(CONFIG_CACHE_AS_RAM) /* Migrate the CAR variables to memory. */ void car_migrate_variables(void); +void do_car_migrate_variables(void *var); #else static inline void car_migrate_variables(void) { } +static inline void do_car_migrate_variables(void *var) { } #endif
#endif diff --git a/src/cpu/x86/car.c b/src/cpu/x86/car.c index c9cc6d6..eb04d0c 100644 --- a/src/cpu/x86/car.c +++ b/src/cpu/x86/car.c @@ -73,7 +73,7 @@ void *car_get_var_ptr(void *var) return &migrated_base[offset]; }
-static void do_car_migrate_variables(void) +void do_car_migrate_variables(void * saved_car) { void *migrated_base; car_migration_func_t *migrate_func; @@ -90,7 +90,10 @@ static void do_car_migrate_variables(void) return; }
- memcpy(migrated_base, &_car_data_start[0], car_data_size); + if (saved_car == NULL) + memcpy(migrated_base, &_car_data_start[0], car_data_size); + else + memcpy(migrated_base, saved_car, car_data_size);
/* Mark that the data has been moved. */ car_migrated = ~0; @@ -106,5 +109,5 @@ static void do_car_migrate_variables(void) void car_migrate_variables(void) { if (!IS_ENABLED(CONFIG_BROKEN_CAR_MIGRATE)) - do_car_migrate_variables(); + do_car_migrate_variables(NULL); }