CBMEM: Tidy up CAR migration

Move the  CAR migration call to arch -specific part of CBMEM init,
it is truly a x86 specific thing.

Change-Id: I715417e54f197b8745e0670d6b900a5660178141
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: http://review.coreboot.org/7860
Reviewed-by: Aaron Durbin <adurbin@google.com>
Tested-by: build bot (Jenkins)
diff --git a/src/Kconfig b/src/Kconfig
index 92714d5..a58e04a 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -159,20 +159,6 @@
 config EARLY_CBMEM_INIT
 	def_bool !LATE_CBMEM_INIT
 
-config LATE_CBMEM_INIT
-	def_bool n
-	help
-	  Enable this in chipset's Kconfig if northbridge does not implement
-	  early get_top_of_ram() call for romstage. CBMEM tables will be
-	  allocated late in ramstage, after PCI devices resources are known.
-
-config BROKEN_CAR_MIGRATE
-	def_bool LATE_CBMEM_INIT
-	help
-	  Many boards use CAR_GLOBAL but have no EARLY_CBMEM_INIT and
-	  manage CAR migration on S3 resume path only. Couple boards use
-	  CAR_GLOBAL and never do CAR migration.
-
 config DYNAMIC_CBMEM
 	bool
 	default n
diff --git a/src/arch/arm/include/arch/early_variables.h b/src/arch/arm/include/arch/early_variables.h
index cb0872e..97bc0cd 100644
--- a/src/arch/arm/include/arch/early_variables.h
+++ b/src/arch/arm/include/arch/early_variables.h
@@ -27,6 +27,5 @@
 #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
diff --git a/src/arch/arm64/include/arch/early_variables.h b/src/arch/arm64/include/arch/early_variables.h
index cb0872e..97bc0cd 100644
--- a/src/arch/arm64/include/arch/early_variables.h
+++ b/src/arch/arm64/include/arch/early_variables.h
@@ -27,6 +27,5 @@
 #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
diff --git a/src/arch/riscv/include/arch/early_variables.h b/src/arch/riscv/include/arch/early_variables.h
index f9516a4..97bc0cd 100644
--- a/src/arch/riscv/include/arch/early_variables.h
+++ b/src/arch/riscv/include/arch/early_variables.h
@@ -20,10 +20,6 @@
 #ifndef ARCH_EARLY_VARIABLES_H
 #define ARCH_EARLY_VARIABLES_H
 
-#if defined(CONFIG_CAR_MIGRATION) && CONFIG_CAR_MIGRATION
-	#error "This is RISCV, silly... we don't have CAR here."
-#endif
-
 #define CAR_GLOBAL
 
 #define CAR_MIGRATE(migrate_fn_)
@@ -31,6 +27,5 @@
 #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
diff --git a/src/arch/x86/Kconfig b/src/arch/x86/Kconfig
index edbc67a..dfb91fa 100644
--- a/src/arch/x86/Kconfig
+++ b/src/arch/x86/Kconfig
@@ -51,6 +51,21 @@
 	bool
 	default n
 
+config BROKEN_CAR_MIGRATE
+	def_bool n
+	help
+	  Many boards use CAR_GLOBAL but have no EARLY_CBMEM_INIT and
+	  manage CAR migration on S3 resume path only. Couple boards use
+	  CAR_GLOBAL and never do CAR migration.
+
+config LATE_CBMEM_INIT
+	def_bool n
+	select BROKEN_CAR_MIGRATE
+	help
+	  Enable this in chipset's Kconfig if northbridge does not implement
+	  early get_top_of_ram() call for romstage. CBMEM tables will be
+	  allocated late in ramstage, after PCI devices resources are known.
+
 config PC80_SYSTEM
 	bool
 	default y if ARCH_X86
diff --git a/src/arch/x86/boot/cbmem.c b/src/arch/x86/boot/cbmem.c
index af42edd..80588c3 100644
--- a/src/arch/x86/boot/cbmem.c
+++ b/src/arch/x86/boot/cbmem.c
@@ -21,6 +21,7 @@
 #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>
@@ -76,6 +77,9 @@
 
 void cbmem_run_init_hooks(void)
 {
+	/* Migrate car.global_data. */
+	car_migrate_variables();
+
 #if !defined(__PRE_RAM__)
 	/* Relocate CBMEM console. */
 	cbmemc_reinit();
diff --git a/src/cpu/x86/car.c b/src/cpu/x86/car.c
index e757f09..cca9afd 100644
--- a/src/cpu/x86/car.c
+++ b/src/cpu/x86/car.c
@@ -108,7 +108,6 @@
 static void do_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];
 
 	/* Check if already migrated. */
@@ -126,7 +125,11 @@
 
 	/* Mark that the data has been moved. */
 	car_migrated = ~0;
+}
 
+static void do_car_migrate_hooks(void)
+{
+	car_migration_func_t *migrate_func;
 	/* Call all the migration functions. */
 	migrate_func = &_car_migrate_start;
 	while (*migrate_func != NULL) {
@@ -139,4 +142,7 @@
 {
 	if (!IS_ENABLED(CONFIG_BROKEN_CAR_MIGRATE))
 		do_car_migrate_variables();
+
+	if (!IS_ENABLED(CONFIG_BROKEN_CAR_MIGRATE))
+		do_car_migrate_hooks();
 }
diff --git a/src/lib/cbmem.c b/src/lib/cbmem.c
index ba6560c..d5f89a1 100644
--- a/src/lib/cbmem.c
+++ b/src/lib/cbmem.c
@@ -242,8 +242,9 @@
 		cbmem_fail_resume();
 	}
 
+	/* Complete migration to CBMEM. */
 	cbmem_run_init_hooks();
-	car_migrate_variables();
+
 	return !found;
 }
 
diff --git a/src/lib/dynamic_cbmem.c b/src/lib/dynamic_cbmem.c
index a5f2fc2..6455217 100644
--- a/src/lib/dynamic_cbmem.c
+++ b/src/lib/dynamic_cbmem.c
@@ -170,18 +170,14 @@
 	printk(BIOS_DEBUG, "CBMEM: root @ %p %d entries.\n",
 	       root, root->max_entries);
 
+	/* Complete migration to CBMEM. */
 	cbmem_run_init_hooks();
-
-	/* Migrate cache-as-ram variables. */
-	car_migrate_variables();
 }
 
 static inline int cbmem_fail_recovery(void)
 {
 	cbmem_initialize_empty();
 	cbmem_fail_resume();
-	/* Migrate cache-as-ram variables. */
-	car_migrate_variables();
 	return 1;
 }
 
@@ -248,11 +244,9 @@
 	root->locked = 1;
 #endif
 
+	/* Complete migration to CBMEM. */
 	cbmem_run_init_hooks();
 
-	/* Migrate cache-as-ram variables. */
-	car_migrate_variables();
-
 	/* Recovery successful. */
 	return 0;
 }