[coreboot-gerrit] New patch to review for coreboot: 633fd78 cbmem: make do_car_migrate_variables external, add pointer

Martin Roth (gaumless@gmail.com) gerrit at coreboot.org
Mon Jan 5 05:53:46 CET 2015


Martin Roth (gaumless at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8095

-gerrit

commit 633fd78cd5040821d8cdadae7c85ee0e18d192aa
Author: Martin Roth <martin.roth at 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 at 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);
 }



More information about the coreboot-gerrit mailing list