diff options
author | Martin Roth <gaumless@gmail.com> | 2015-01-11 14:29:29 -0700 |
---|---|---|
committer | Martin Roth <gaumless@gmail.com> | 2015-02-06 00:53:13 +0100 |
commit | 582b2aee0f5ac84339853551cca1f4d21e1e3fca (patch) | |
tree | 5d391c29595795e1a14d51e6a20259ee0706e679 /src/cpu | |
parent | 0490f74d7808e96b079c83764d712f794ecb4198 (diff) | |
download | coreboot-582b2aee0f5ac84339853551cca1f4d21e1e3fca.tar.xz |
FSP & CBMEM: Fix broken cbmem CAR transition.
1) Save the pointer to the FSP HOB list to low memory at address 0x614.
This is the same location as CBMEM_RESUME_BACKUP - the two aren't used
in the same platform, so overlapping should be OK. I didn't see any
documentation that actually said that this location was free to use, and
didn't need to be restored after use in S3 resume, but it looks like
the DOS boot vector gets loaded juat above this location, so it SHOULD
be ok. The alternative is to copy the memory out and store it in cbmem
until we're ready to restore it.
2) When a request for the pointer to a CAR variable comes in, pass back
the location inside the FSP hob structure.
3) Skip the memcopy of the CAR Data. The CAR variables do not
get transitioned back into cbmem, but used out of the HOB structure.
4) Remove the BROKEN_CAR_MIGRATE Kconfig option from the FSP platform.
Change-Id: Iaf566dce1b41a3bcb17e4134877f68262b5e113f
Signed-off-by: Martin Roth <gaumless@gmail.com>
Reviewed-on: http://review.coreboot.org/8196
Reviewed-by: Aaron Durbin <adurbin@google.com>
Tested-by: build bot (Jenkins)
Reviewed-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Diffstat (limited to 'src/cpu')
-rw-r--r-- | src/cpu/intel/fsp_model_206ax/Kconfig | 1 | ||||
-rw-r--r-- | src/cpu/intel/fsp_model_406dx/Kconfig | 1 | ||||
-rw-r--r-- | src/cpu/x86/car.c | 23 |
3 files changed, 16 insertions, 9 deletions
diff --git a/src/cpu/intel/fsp_model_206ax/Kconfig b/src/cpu/intel/fsp_model_206ax/Kconfig index ea99ee0c7d..05bdce4efe 100644 --- a/src/cpu/intel/fsp_model_206ax/Kconfig +++ b/src/cpu/intel/fsp_model_206ax/Kconfig @@ -41,7 +41,6 @@ config CPU_SPECIFIC_OPTIONS select PARALLEL_CPU_INIT select TSC_SYNC_MFENCE select LAPIC_MONOTONIC_TIMER - select BROKEN_CAR_MIGRATE config BOOTBLOCK_CPU_INIT string diff --git a/src/cpu/intel/fsp_model_406dx/Kconfig b/src/cpu/intel/fsp_model_406dx/Kconfig index c3acc7846a..ec4be847b0 100644 --- a/src/cpu/intel/fsp_model_406dx/Kconfig +++ b/src/cpu/intel/fsp_model_406dx/Kconfig @@ -36,7 +36,6 @@ config CPU_SPECIFIC_OPTIONS select PARALLEL_CPU_INIT select TSC_SYNC_MFENCE select LAPIC_MONOTONIC_TIMER - select BROKEN_CAR_MIGRATE choice prompt "Rangeley CPU Stepping" diff --git a/src/cpu/x86/car.c b/src/cpu/x86/car.c index cca9afd694..9f1a26e3d3 100644 --- a/src/cpu/x86/car.c +++ b/src/cpu/x86/car.c @@ -23,6 +23,9 @@ #include <cbmem.h> #include <arch/early_variables.h> +#if IS_ENABLED(CONFIG_PLATFORM_USES_FSP) +#include <drivers/intel/fsp/fsp_util.h> +#endif typedef void (* const car_migration_func_t)(void); extern car_migration_func_t _car_migrate_start; @@ -41,10 +44,13 @@ extern char _car_data_end[]; */ static int car_migrated CAR_GLOBAL; - +/** @brief returns pointer to a CAR variable, before or after migration. + * + * @param var pointer to the CAR variable + */ void *car_get_var_ptr(void *var) { - char *migrated_base; + char *migrated_base = NULL; int offset; void * _car_start = &_car_data_start; void * _car_end = &_car_data_end; @@ -61,12 +67,15 @@ void *car_get_var_ptr(void *var) return var; } +#if IS_ENABLED(CONFIG_PLATFORM_USES_FSP) + migrated_base=(char *)find_saved_temp_mem( + *(void **)CBMEM_FSP_HOB_PTR); +#else migrated_base = cbmem_find(CBMEM_ID_CAR_GLOBALS); +#endif - if (migrated_base == NULL) { - printk(BIOS_ERR, "CAR: Could not find migration base!\n"); - return var; - } + if (migrated_base == NULL) + die( "CAR: Could not find migration base!\n"); offset = (char *)var - (char *)_car_start; @@ -140,7 +149,7 @@ static void do_car_migrate_hooks(void) void car_migrate_variables(void) { - if (!IS_ENABLED(CONFIG_BROKEN_CAR_MIGRATE)) + if (!IS_ENABLED(CONFIG_BROKEN_CAR_MIGRATE) && !IS_ENABLED(PLATFORM_USES_FSP)) do_car_migrate_variables(); if (!IS_ENABLED(CONFIG_BROKEN_CAR_MIGRATE)) |