mb/ocp/wedge100s/romstage: Workaround broken platform state
Sometimes the platform boots in an invalid state, that will cause FSP-M to fail. As a board_reset() doesn't fix it, issue an full_reset() as soon as the IA32_FEATURE_CONTROL MSR is locked at beging of romstage. Tested on wedge100s. After full reset the system behaves as normal. Change-Id: I1a382b8fb650311b0c24b48e0986d22edfa2d261 Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-on: https://review.coreboot.org/c/30290 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nico Huber <nico.h@gmx.de> Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
This commit is contained in:
parent
990c84db9d
commit
817994c1be
|
@ -17,6 +17,9 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <soc/romstage.h>
|
#include <soc/romstage.h>
|
||||||
#include <drivers/intel/fsp1_0/fsp_util.h>
|
#include <drivers/intel/fsp1_0/fsp_util.h>
|
||||||
|
#include <cpu/x86/msr.h>
|
||||||
|
#include <cf9_reset.h>
|
||||||
|
#include <console/console.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* /brief mainboard call for setup that needs to be done before fsp init
|
* /brief mainboard call for setup that needs to be done before fsp init
|
||||||
|
@ -24,7 +27,22 @@
|
||||||
*/
|
*/
|
||||||
void early_mainboard_romstage_entry(void)
|
void early_mainboard_romstage_entry(void)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Sometimes the system boots in an invalid state, where random values
|
||||||
|
* have been written to MSRs and then the MSRs are locked.
|
||||||
|
* Seems to always happen on warm reset.
|
||||||
|
*
|
||||||
|
* Power cycling or a board_reset() isn't sufficient in this case, so
|
||||||
|
* issue a full_reset() to "fix" this issue.
|
||||||
|
*
|
||||||
|
* It seems to be a deficiency in the reset logic, as other
|
||||||
|
* FSP broadwell DE boards are not affected.
|
||||||
|
*/
|
||||||
|
msr_t msr = rdmsr(IA32_FEATURE_CONTROL);
|
||||||
|
if (msr.lo & 1) {
|
||||||
|
printk(BIOS_EMERG, "Detected broken platform state. Issuing full reset\n");
|
||||||
|
full_reset();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue