aboutsummaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/amd/car/cache_as_ram.inc4
-rw-r--r--src/cpu/amd/family_10h-family_15h/init_cpus.c16
2 files changed, 20 insertions, 0 deletions
diff --git a/src/cpu/amd/car/cache_as_ram.inc b/src/cpu/amd/car/cache_as_ram.inc
index 3295ccc3b1..cbb1e39854 100644
--- a/src/cpu/amd/car/cache_as_ram.inc
+++ b/src/cpu/amd/car/cache_as_ram.inc
@@ -359,12 +359,16 @@ clear_fixed_var_mtrr_out:
simplemask CacheSize, 0
wrmsr
+ jmp_if_fam15h(fam15_skip_dram_mtrr_setup)
+
/* Enable memory access for first MBs using top_mem. */
movl $TOP_MEM, %ecx
xorl %edx, %edx
movl $(((CONFIG_RAMTOP) + TOP_MEM_MASK) & ~TOP_MEM_MASK) , %eax
wrmsr
+fam15_skip_dram_mtrr_setup:
+
#if CONFIG_XIP_ROM_SIZE
/* Enable write base caching so we can do execute in place (XIP)
diff --git a/src/cpu/amd/family_10h-family_15h/init_cpus.c b/src/cpu/amd/family_10h-family_15h/init_cpus.c
index c9dca765c4..e4721a43f3 100644
--- a/src/cpu/amd/family_10h-family_15h/init_cpus.c
+++ b/src/cpu/amd/family_10h-family_15h/init_cpus.c
@@ -313,6 +313,22 @@ static void STOP_CAR_AND_CPU(uint8_t skip_sharedc_config, uint32_t apicid)
msr = rdmsr(BU_CFG2);
msr.lo &= ~(1 << ClLinesToNbDis);
wrmsr(BU_CFG2, msr);
+ } else {
+ /* Family 15h or later
+ * DRAM setup is delayed on Fam15 in order to prevent
+ * any DRAM access before ECC check bits are initialized.
+ * Each core also needs to have its initial DRAM map initialized
+ * before it is put to sleep, otherwise it will fail to wake
+ * in ramstage. To meet both of these goals, delay DRAM map
+ * setup until the last possible moment, where speculative
+ * memory access is highly unlikely before core halt...
+ */
+ if (!skip_sharedc_config) {
+ /* Enable memory access for first MBs using top_mem */
+ msr.hi = 0;
+ msr.lo = (CONFIG_RAMTOP + TOP_MEM_MASK) & (~TOP_MEM_MASK);
+ wrmsr(TOP_MEM, msr);
+ }
}
disable_cache_as_ram(skip_sharedc_config); // inline