summaryrefslogtreecommitdiff
path: root/src/northbridge
diff options
context:
space:
mode:
authorShelley Chen <shchen@google.com>2020-10-27 15:58:31 -0700
committerShelley Chen <shchen@google.com>2020-11-13 22:57:50 +0000
commit6615c6eaf798556b94ecc44d241222d6b19cd119 (patch)
tree1af1cb5e14a37f1156c4e2cc3dffd3d2a7303802 /src/northbridge
parent0c3845d2ee5e582937f65f488e15055fe49464b0 (diff)
mrc_cache: Move code for triggering memory training into mrc_cache
Currently the decision of whether or not to use mrc_cache in recovery mode is made within the individual platforms' drivers (ie: fsp2.0, fsp1.1, etc.). As this is not platform specific, but uses common vboot infrastructure, the code can be unified and moved into mrc_cache. The conditions are as follows: 1. If HAS_RECOVERY_MRC_CACHE, use mrc_cache data (unless retrain switch is true) 2. If !HAS_RECOVERY_MRC_CACHE && VBOOT_STARTS_IN_BOOTBLOCK, this means that memory training will occur after verified boot, meaning that mrc_cache will be filled with data from executing RW code. So in this case, we never want to use the training data in the mrc_cache for recovery mode. 3. If !HAS_RECOVERY_MRC_CACHE && VBOOT_STARTS_IN_ROMSTAGE, this means that memory training happens before verfied boot, meaning that the mrc_cache data is generated by RO code, so it is safe to use for a recovery boot. 4. Any platform that does not use vboot should be unaffected. Additionally, we have removed the MRC_CLEAR_NORMAL_CACHE_ON_RECOVERY_RETRAIN config because the mrc_cache driver takes care of invalidating the mrc_cache data for normal mode. If the platform: 1. !HAS_RECOVERY_MRC_CACHE, always invalidate mrc_cache data 2. HAS_RECOVERY_MRC_CACHE, only invalidate if retrain switch is set BUG=b:150502246 BRANCH=None TEST=1. run dut-control power_state:rec_force_mrc twice on lazor ensure that memory retraining happens both times run dut-control power_state:rec twice on lazor ensure that memory retraining happens only first time 2. remove HAS_RECOVERY_MRC_CACHE from lazor Kconfig boot twice to ensure caching of memory training occurred on each boot. Change-Id: I3875a7b4a4ba3c1aa8a3c1507b3993036a7155fc Signed-off-by: Shelley Chen <shchen@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/46855 Reviewed-by: Furquan Shaikh <furquan@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/northbridge')
-rw-r--r--src/northbridge/intel/haswell/raminit.c9
-rw-r--r--src/northbridge/intel/sandybridge/raminit_mrc.c8
2 files changed, 8 insertions, 9 deletions
diff --git a/src/northbridge/intel/haswell/raminit.c b/src/northbridge/intel/haswell/raminit.c
index 63d70f792f..290e402fcb 100644
--- a/src/northbridge/intel/haswell/raminit.c
+++ b/src/northbridge/intel/haswell/raminit.c
@@ -112,10 +112,11 @@ void sdram_initialize(struct pei_data *pei_data)
printk(BIOS_DEBUG, "Starting UEFI PEI System Agent\n");
- /* Do not pass MRC data in for recovery mode boot, always pass it in for S3 resume */
- if (!(CONFIG(HASWELL_VBOOT_IN_BOOTBLOCK) && vboot_recovery_mode_enabled())
- || pei_data->boot_mode == 2)
- prepare_mrc_cache(pei_data);
+ /*
+ * Always pass in mrc_cache data. The driver will determine
+ * whether to use the data or not.
+ */
+ prepare_mrc_cache(pei_data);
/* If MRC data is not found, we cannot continue S3 resume */
if (pei_data->boot_mode == 2 && !pei_data->mrc_input) {
diff --git a/src/northbridge/intel/sandybridge/raminit_mrc.c b/src/northbridge/intel/sandybridge/raminit_mrc.c
index 444ecf8cc7..8df7d1b36a 100644
--- a/src/northbridge/intel/sandybridge/raminit_mrc.c
+++ b/src/northbridge/intel/sandybridge/raminit_mrc.c
@@ -133,12 +133,10 @@ void sdram_initialize(struct pei_data *pei_data)
printk(BIOS_DEBUG, "Starting UEFI PEI System Agent\n");
/*
- * Do not pass MRC data in for recovery mode boot,
- * Always pass it in for S3 resume.
+ * Always pass in mrc_cache data. The driver will determine
+ * whether to use the data or not.
*/
- if (!(CONFIG(SANDYBRIDGE_VBOOT_IN_BOOTBLOCK) && vboot_recovery_mode_enabled()) ||
- pei_data->boot_mode == 2)
- prepare_mrc_cache(pei_data);
+ prepare_mrc_cache(pei_data);
/* If MRC data is not found we cannot continue S3 resume. */
if (pei_data->boot_mode == 2 && !pei_data->mrc_input) {