nb/intel/haswell: Ensure MCH has acked raminit
Haswell MRC.bin can return zero even when raminit did not complete successfully. When this happens, the memory controller will not have acknowledged raminit: the mc_init_done_ack bit in the MC_INIT_STATE_G register will be zero, and memory accesses will lock up the system. To handle this situation more gracefully, check the mc_init_done_ack bit after running MRC. If the bit is not set, log a fatal error and halt. Tested on Asrock B85M Pro4: - With badly-seated DIMMs, MRC raminit fails and coreboot dies. - After reseating the DIMMs, the board still boots successfully. Change-Id: I144bf827f65cd0be319c44bf3d407ddc116b129d Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/51940 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
This commit is contained in:
parent
cc36c4c235
commit
6462cbb2c2
|
@ -169,6 +169,16 @@ static void sdram_initialize(struct pei_data *pei_data)
|
||||||
(version >> 24) & 0xff, (version >> 16) & 0xff,
|
(version >> 24) & 0xff, (version >> 16) & 0xff,
|
||||||
(version >> 8) & 0xff, (version >> 0) & 0xff);
|
(version >> 8) & 0xff, (version >> 0) & 0xff);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MRC may return zero even when raminit did not complete successfully.
|
||||||
|
* Ensure the mc_init_done_ack bit is set before continuing. Otherwise,
|
||||||
|
* attempting to access memory will lock up the system.
|
||||||
|
*/
|
||||||
|
if (!(MCHBAR32(MC_INIT_STATE_G) & (1 << 5))) {
|
||||||
|
printk(BIOS_EMERG, "Memory controller did not acknowledge raminit.\n");
|
||||||
|
die("MRC raminit failed\n");
|
||||||
|
}
|
||||||
|
|
||||||
report_memory_config();
|
report_memory_config();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue