diff options
author | Aaron Durbin <adurbin@chromium.org> | 2013-03-27 20:57:28 -0500 |
---|---|---|
committer | Ronald G. Minnich <rminnich@gmail.com> | 2013-04-01 23:24:32 +0200 |
commit | af3158c0cfd6034bbdc42a0488382c4be1a7a388 (patch) | |
tree | a8012866f1715552dedb68f3ee727366fb4fc0c3 /src/cpu | |
parent | 9ebd8ea7cfd379cca56a2c48324bdfbe52ff6bab (diff) |
lynxpoint: split clearing and enabling of smm
Previously southbridge_smm_init() was provided that did both
the clearing of the SMM state and enabling SMIs. This is
troublesome in how haswell machines bring up the APs. The BSP
enters SMM once to determine if parallel SMM relocation is possible.
If it is possible the BSP releases the APs to do SMM relocation.
Normally, after the APs complete the SMM relocation, the BSP would then
re-enter the relocation handler to relocate its own SMM space.
However, because SMIs were previously enabled it is possible for an SMI
event to occur before the APs are complete or have entered the
relocation handler. This is bad because the BSP will turn off parallel
SMM save state. Additionally, this is a problem because the relocation
handler is not written to handle regular SMIs which can cause an
SMI storm which effectively looks like a hung machine. Correct these
issues by turning on SMIs after all the SMM relocation has occurred.
Change-Id: Id4f07553b110b9664d51d2e670a14e6617591500
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/2977
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'src/cpu')
-rw-r--r-- | src/cpu/intel/haswell/smmrelocate.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/cpu/intel/haswell/smmrelocate.c b/src/cpu/intel/haswell/smmrelocate.c index 65ac36388f..a8ab841492 100644 --- a/src/cpu/intel/haswell/smmrelocate.c +++ b/src/cpu/intel/haswell/smmrelocate.c @@ -396,7 +396,8 @@ int smm_initialize(void) if (cpu_smm_setup()) return -1; - southbridge_smm_init(); + /* Clear the SMM state in the southbridge. */ + southbridge_smm_clear_state(); /* Run the relocation handler. */ smm_initiate_relocation(); @@ -412,6 +413,10 @@ int smm_initialize(void) release_aps_for_smm_relocation(0); } + /* Now that all APs have been relocated as well as the BSP let SMIs + * start flowing. */ + southbridge_smm_enable_smi(); + /* Lock down the SMRAM space. */ smm_lock(); |