[coreboot-gerrit] Patch set updated for coreboot: e2be5f3 CBMEM: Replace cbmem_initialize() with cbmem_recovery()

Kyösti Mälkki (kyosti.malkki@gmail.com) gerrit at coreboot.org
Sat Jan 11 21:48:36 CET 2014


Kyösti Mälkki (kyosti.malkki at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4668

-gerrit

commit e2be5f3e3f0c992b750b9adb229a33eebc80410a
Author: Kyösti Mälkki <kyosti.malkki at gmail.com>
Date:   Mon Jan 6 17:20:31 2014 +0200

    CBMEM: Replace cbmem_initialize() with cbmem_recovery()
    
    The replacement function confirms CBMEM region is wiped clean on power
    cycles and resets. It also introduces compatibility interface to ease
    up transition to DYNAMIC_CBMEM.
    
    Change-Id: Ic5445c5bff4aff22a43821f3064f2df458b9f250
    Signed-off-by: Kyösti Mälkki <kyosti.malkki at gmail.com>
---
 src/include/cbmem.h                           |  9 ++++--
 src/lib/cbmem.c                               | 40 +++++++++++++++------------
 src/lib/dynamic_cbmem.c                       | 10 +++++++
 src/mainboard/getac/p470/romstage.c           |  2 +-
 src/mainboard/google/butterfly/romstage.c     |  2 +-
 src/mainboard/google/link/romstage.c          |  2 +-
 src/mainboard/google/parrot/romstage.c        |  2 +-
 src/mainboard/google/stout/romstage.c         |  2 +-
 src/mainboard/ibase/mb899/romstage.c          |  2 +-
 src/mainboard/intel/cougar_canyon2/romstage.c |  2 +-
 src/mainboard/intel/d945gclf/romstage.c       |  2 +-
 src/mainboard/intel/emeraldlake2/romstage.c   |  2 +-
 src/mainboard/kontron/986lcd-m/romstage.c     |  2 +-
 src/mainboard/kontron/ktqm77/romstage.c       |  2 +-
 src/mainboard/lenovo/t60/romstage.c           |  2 +-
 src/mainboard/lenovo/x201/romstage.c          |  6 +++-
 src/mainboard/lenovo/x60/romstage.c           |  2 +-
 src/mainboard/roda/rk886ex/romstage.c         |  2 +-
 src/mainboard/samsung/lumpy/romstage.c        |  2 +-
 src/mainboard/samsung/stumpy/romstage.c       |  2 +-
 src/mainboard/via/epia-m850/romstage.c        |  2 +-
 src/northbridge/intel/nehalem/raminit.c       |  2 +-
 22 files changed, 62 insertions(+), 39 deletions(-)

diff --git a/src/include/cbmem.h b/src/include/cbmem.h
index 5f1ac3c..eff1895 100644
--- a/src/include/cbmem.h
+++ b/src/include/cbmem.h
@@ -90,6 +90,9 @@ struct cbmem_entry;
 
 #define DYN_CBMEM_ALIGN_SIZE (4096)
 
+/* By default cbmem is attempted to be recovered. Returns 0 if cbmem was
+ * recovered or 1 if cbmem had to be reinitialized. */
+int cbmem_initialize(void);
 /* Initialize cbmem to be empty. */
 void cbmem_initialize_empty(void);
 
@@ -153,9 +156,9 @@ struct cbmem_entry *get_cbmem_toc(void);
 
 unsigned long get_top_of_ram(void);
 
-/* By default cbmem is attempted to be recovered. Returns 0 if cbmem was
- * recovered or 1 if cbmem had to be reinitialized. */
-int cbmem_initialize(void);
+/* Returns 0 if old cbmem was recovered. Recovery is only attempted if
+ * s3resume is non-zero. */
+int cbmem_recovery(int s3resume);
 /* Add a cbmem entry of a given size and id. These return NULL on failure. The
  * add function performs a find first and do not check against the original
  * size. */
diff --git a/src/lib/cbmem.c b/src/lib/cbmem.c
index 6cdf772..704733f 100644
--- a/src/lib/cbmem.c
+++ b/src/lib/cbmem.c
@@ -95,8 +95,7 @@ void cbmem_late_set_table(uint64_t base, uint64_t size)
  *  - suspend/resume backup memory
  */
 
-#if CONFIG_EARLY_CBMEM_INIT || !defined(__PRE_RAM__)
-static void cbmem_init(void)
+static void cbmem_initialize_empty(void)
 {
 	uint64_t baseaddr, size;
 	struct cbmem_entry *cbmem_toc;
@@ -119,7 +118,6 @@ static void cbmem_init(void)
 		.size	= size - CBMEM_TOC_RESERVED
 	};
 }
-#endif
 
 int cbmem_reinit(void)
 {
@@ -219,32 +217,40 @@ void *cbmem_find(u32 id)
 	return (void *)NULL;
 }
 
-#if CONFIG_EARLY_CBMEM_INIT || !defined(__PRE_RAM__)
 /* Returns True if it was not initialized before. */
-int cbmem_initialize(void)
+int cbmem_recovery(int is_wakeup)
 {
-	int rv = 0;
+	int found = cbmem_reinit();
+	int wipe = 0;
+
+#if defined(__PRE_RAM__) && CONFIG_EARLY_CBMEM_INIT
+	wipe = 1;
+#endif
+#if !defined(__PRE_RAM__) && !CONFIG_EARLY_CBMEM_INIT
+	wipe = 1;
+#endif
+
+	if (!is_wakeup && wipe)
+		cbmem_initialize_empty();
 
-	/* We expect the romstage to always initialize it. */
-	if (!cbmem_reinit()) {
-		cbmem_init();
+	if (is_wakeup && !found) {
+		cbmem_initialize_empty();
 		cbmem_fail_resume();
-		rv = 1;
 	}
-#ifndef __PRE_RAM__
+
 	cbmem_arch_init();
-#endif
-	/* Migrate cache-as-ram variables. */
 	car_migrate_variables();
-
-	return rv;
+	return !found;
 }
-#endif
 
 #ifndef __PRE_RAM__
 static void init_cbmem_post_device(void *unused)
 {
-	cbmem_initialize();
+#if CONFIG_HAVE_ACPI_RESUME
+	cbmem_recovery(acpi_is_wakeup());
+#else
+	cbmem_recovery(0);
+#endif
 #if CONFIG_CONSOLE_CBMEM
 	cbmemc_reinit();
 #endif
diff --git a/src/lib/dynamic_cbmem.c b/src/lib/dynamic_cbmem.c
index 0ab8f81..0cc6295 100644
--- a/src/lib/dynamic_cbmem.c
+++ b/src/lib/dynamic_cbmem.c
@@ -256,6 +256,16 @@ int cbmem_initialize(void)
 	return 0;
 }
 
+int cbmem_recovery(int is_wakeup)
+{
+	int rv = 0;
+	if (!is_wakeup)
+		cbmem_initialize_empty();
+	else
+		rv = cbmem_initialize();
+	return rv;
+}
+
 static void *cbmem_base(void)
 {
 	struct cbmem_root *root;
diff --git a/src/mainboard/getac/p470/romstage.c b/src/mainboard/getac/p470/romstage.c
index 87af8ca..a081a8a 100644
--- a/src/mainboard/getac/p470/romstage.c
+++ b/src/mainboard/getac/p470/romstage.c
@@ -357,7 +357,7 @@ void main(unsigned long bist)
 #endif
 	MCHBAR16(SSKPD) = 0xCAFE;
 
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 
 #if CONFIG_HAVE_ACPI_RESUME
 	/* If there is no high memory area, we didn't boot before, so
diff --git a/src/mainboard/google/butterfly/romstage.c b/src/mainboard/google/butterfly/romstage.c
index b7ec011..d32f3f0 100644
--- a/src/mainboard/google/butterfly/romstage.c
+++ b/src/mainboard/google/butterfly/romstage.c
@@ -244,7 +244,7 @@ void main(unsigned long bist)
 	post_code(0x3e);
 
 	MCHBAR16(SSKPD) = 0xCAFE;
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 	if (boot_mode!=2)
 		save_mrc_data(&pei_data);
 
diff --git a/src/mainboard/google/link/romstage.c b/src/mainboard/google/link/romstage.c
index 6074f85..4b3fe1f 100644
--- a/src/mainboard/google/link/romstage.c
+++ b/src/mainboard/google/link/romstage.c
@@ -286,7 +286,7 @@ void main(unsigned long bist)
 	post_code(0x3e);
 
 	MCHBAR16(SSKPD) = 0xCAFE;
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 	if (boot_mode!=2)
 		save_mrc_data(&pei_data);
 
diff --git a/src/mainboard/google/parrot/romstage.c b/src/mainboard/google/parrot/romstage.c
index b6bacae..361c19b 100644
--- a/src/mainboard/google/parrot/romstage.c
+++ b/src/mainboard/google/parrot/romstage.c
@@ -244,7 +244,7 @@ void main(unsigned long bist)
 	post_code(0x3e);
 
 	MCHBAR16(SSKPD) = 0xCAFE;
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 	if (boot_mode!=2)
 		save_mrc_data(&pei_data);
 
diff --git a/src/mainboard/google/stout/romstage.c b/src/mainboard/google/stout/romstage.c
index a775e69..0ea53e7 100644
--- a/src/mainboard/google/stout/romstage.c
+++ b/src/mainboard/google/stout/romstage.c
@@ -296,7 +296,7 @@ void main(unsigned long bist)
 	post_code(0x3e);
 
 	MCHBAR16(SSKPD) = 0xCAFE;
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 	if (boot_mode!=2)
 		save_mrc_data(&pei_data);
 
diff --git a/src/mainboard/ibase/mb899/romstage.c b/src/mainboard/ibase/mb899/romstage.c
index 222c376..0b9d408 100644
--- a/src/mainboard/ibase/mb899/romstage.c
+++ b/src/mainboard/ibase/mb899/romstage.c
@@ -311,7 +311,7 @@ void main(unsigned long bist)
 
 	MCHBAR16(SSKPD) = 0xCAFE;
 
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 
 #if CONFIG_HAVE_ACPI_RESUME
 	/* If there is no high memory area, we didn't boot before, so
diff --git a/src/mainboard/intel/cougar_canyon2/romstage.c b/src/mainboard/intel/cougar_canyon2/romstage.c
index 42b19e4..77f6a3e 100644
--- a/src/mainboard/intel/cougar_canyon2/romstage.c
+++ b/src/mainboard/intel/cougar_canyon2/romstage.c
@@ -322,7 +322,7 @@ void romstage_main_continue(EFI_STATUS status, VOID *HobListPtr) {
 	quick_ram_check();
 	post_code(0x4e);
 
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 
 	if(cbmem_was_initted) {
 		reset_system();
diff --git a/src/mainboard/intel/d945gclf/romstage.c b/src/mainboard/intel/d945gclf/romstage.c
index 166743f..69d4232 100644
--- a/src/mainboard/intel/d945gclf/romstage.c
+++ b/src/mainboard/intel/d945gclf/romstage.c
@@ -269,7 +269,7 @@ void main(unsigned long bist)
 
 	MCHBAR16(SSKPD) = 0xCAFE;
 
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 
 #if CONFIG_HAVE_ACPI_RESUME
 	/* If there is no high memory area, we didn't boot before, so
diff --git a/src/mainboard/intel/emeraldlake2/romstage.c b/src/mainboard/intel/emeraldlake2/romstage.c
index 3534700..9308e96 100644
--- a/src/mainboard/intel/emeraldlake2/romstage.c
+++ b/src/mainboard/intel/emeraldlake2/romstage.c
@@ -296,7 +296,7 @@ void main(unsigned long bist)
 	post_code(0x3e);
 
 	MCHBAR16(SSKPD) = 0xCAFE;
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 	if (boot_mode!=2)
 		save_mrc_data(&pei_data);
 
diff --git a/src/mainboard/kontron/986lcd-m/romstage.c b/src/mainboard/kontron/986lcd-m/romstage.c
index 1875a10..549facd 100644
--- a/src/mainboard/kontron/986lcd-m/romstage.c
+++ b/src/mainboard/kontron/986lcd-m/romstage.c
@@ -410,7 +410,7 @@ void main(unsigned long bist)
 
 	MCHBAR16(SSKPD) = 0xCAFE;
 
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 
 #if CONFIG_HAVE_ACPI_RESUME
 	/* If there is no high memory area, we didn't boot before, so
diff --git a/src/mainboard/kontron/ktqm77/romstage.c b/src/mainboard/kontron/ktqm77/romstage.c
index 15c10b2..b5959b1 100644
--- a/src/mainboard/kontron/ktqm77/romstage.c
+++ b/src/mainboard/kontron/ktqm77/romstage.c
@@ -295,7 +295,7 @@ void main(unsigned long bist)
 	post_code(0x3e);
 
 	MCHBAR16(SSKPD) = 0xCAFE;
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 	if (boot_mode!=2)
 		save_mrc_data(&pei_data);
 
diff --git a/src/mainboard/lenovo/t60/romstage.c b/src/mainboard/lenovo/t60/romstage.c
index 1b7e693..dae917c 100644
--- a/src/mainboard/lenovo/t60/romstage.c
+++ b/src/mainboard/lenovo/t60/romstage.c
@@ -321,7 +321,7 @@ void main(unsigned long bist)
 
 	MCHBAR16(SSKPD) = 0xCAFE;
 
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 
 #if CONFIG_HAVE_ACPI_RESUME
 	/* If there is no high memory area, we didn't boot before, so
diff --git a/src/mainboard/lenovo/x201/romstage.c b/src/mainboard/lenovo/x201/romstage.c
index 18645ac..90d31cc 100644
--- a/src/mainboard/lenovo/x201/romstage.c
+++ b/src/mainboard/lenovo/x201/romstage.c
@@ -331,7 +331,11 @@ void main(unsigned long bist)
 		outl(reg32 & ~(7 << 10), DEFAULT_PMBASE + 0x04);
 	}
 
-	cbmem_initted = !cbmem_initialize();
+	/* FIXME: If not in s3resume, raminit() calls cbmem_recovery(0),
+	 * clears all of CBMEM region and puts in MRC training results.
+	 * Tell here were are doing resume to avoid wiping CBMEM region
+	 * again. */
+	cbmem_initted = !cbmem_recovery(1);
 
 #if CONFIG_HAVE_ACPI_RESUME
 	/* If there is no high memory area, we didn't boot before, so
diff --git a/src/mainboard/lenovo/x60/romstage.c b/src/mainboard/lenovo/x60/romstage.c
index 26a7b9b..1198fb2 100644
--- a/src/mainboard/lenovo/x60/romstage.c
+++ b/src/mainboard/lenovo/x60/romstage.c
@@ -323,7 +323,7 @@ void main(unsigned long bist)
 
 	MCHBAR16(SSKPD) = 0xCAFE;
 
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 
 #if CONFIG_HAVE_ACPI_RESUME
 	/* If there is no high memory area, we didn't boot before, so
diff --git a/src/mainboard/roda/rk886ex/romstage.c b/src/mainboard/roda/rk886ex/romstage.c
index e08c1c0..ad323f5 100644
--- a/src/mainboard/roda/rk886ex/romstage.c
+++ b/src/mainboard/roda/rk886ex/romstage.c
@@ -346,7 +346,7 @@ void main(unsigned long bist)
 
 	MCHBAR16(SSKPD) = 0xCAFE;
 
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 
 #if CONFIG_HAVE_ACPI_RESUME
 	/* If there is no high memory area, we didn't boot before, so
diff --git a/src/mainboard/samsung/lumpy/romstage.c b/src/mainboard/samsung/lumpy/romstage.c
index fd3c19b..c240e44 100644
--- a/src/mainboard/samsung/lumpy/romstage.c
+++ b/src/mainboard/samsung/lumpy/romstage.c
@@ -317,7 +317,7 @@ void main(unsigned long bist)
 
 	MCHBAR16(SSKPD) = 0xCAFE;
 
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 	if (boot_mode!=2)
 		save_mrc_data(&pei_data);
 
diff --git a/src/mainboard/samsung/stumpy/romstage.c b/src/mainboard/samsung/stumpy/romstage.c
index 7630c05..e5b55b5 100644
--- a/src/mainboard/samsung/stumpy/romstage.c
+++ b/src/mainboard/samsung/stumpy/romstage.c
@@ -324,7 +324,7 @@ void main(unsigned long bist)
 	post_code(0x3e);
 
 	MCHBAR16(SSKPD) = 0xCAFE;
-	cbmem_was_initted = !cbmem_initialize();
+	cbmem_was_initted = !cbmem_recovery(boot_mode==2);
 	if (boot_mode!=2)
 		save_mrc_data(&pei_data);
 
diff --git a/src/mainboard/via/epia-m850/romstage.c b/src/mainboard/via/epia-m850/romstage.c
index 39f4253..262bee7 100644
--- a/src/mainboard/via/epia-m850/romstage.c
+++ b/src/mainboard/via/epia-m850/romstage.c
@@ -95,7 +95,7 @@ void main(unsigned long bist)
 
 	/* We got RAM working, now we can write the timestamps to RAM */
 #if CONFIG_EARLY_CBMEM_INIT
-	cbmem_initialize();
+	cbmem_recovery(0);
 #endif
 	timestamp_add_now(TS_END_ROMSTAGE);
 	/* FIXME: See if this is needed or take this out please */
diff --git a/src/northbridge/intel/nehalem/raminit.c b/src/northbridge/intel/nehalem/raminit.c
index 19af3bb..c7acd47 100644
--- a/src/northbridge/intel/nehalem/raminit.c
+++ b/src/northbridge/intel/nehalem/raminit.c
@@ -1699,7 +1699,7 @@ static void save_timings(struct raminfo *info)
 	train.reg_10b = read_1d0(0x10b, 6);
 
 	/* Save the MRC S3 restore data to cbmem */
-	cbmem_initialize();
+	cbmem_recovery(0);
 	mrcdata = cbmem_add
 	    (CBMEM_ID_MRCDATA, output_len + sizeof(struct mrc_data_container));
 



More information about the coreboot-gerrit mailing list