UefiCpuPkg/MpInitLib: Fix S3 resume hang issue.
When resume from S3 and CPU loop mode is MWait mode, if driver calls APs to do task at EndOfPei point, the APs can't been wake up and bios hang at that point. The root cause is PiSmmCpuDxeSmm driver wakes up APs with HLT mode during S3 resume phase to do SMM relocation. After this task, PiSmmCpuDxeSmm driver not restore APs context which make CpuMpPei driver saved wake up buffer not works. The solution for this issue is let CpuMpPei driver hook S3SmmInitDone ppi notification. In this notify function, it check whether Cpu Loop mode is not HLT mode. If yes, CpuMpPei driver will set a flag to force BSP use INIT-SIPI -SIPI command to wake up the APs. Cc: Laszlo Ersek <lersek@redhat.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
@@ -985,13 +985,15 @@ WakeUpAP (
|
||||
CpuMpData->FinishedCount = 0;
|
||||
ResetVectorRequired = FALSE;
|
||||
|
||||
if (CpuMpData->ApLoopMode == ApInHltLoop ||
|
||||
if (CpuMpData->WakeUpByInitSipiSipi ||
|
||||
CpuMpData->InitFlag != ApInitDone) {
|
||||
ResetVectorRequired = TRUE;
|
||||
AllocateResetVector (CpuMpData);
|
||||
FillExchangeInfoData (CpuMpData);
|
||||
SaveLocalApicTimerSetting (CpuMpData);
|
||||
} else if (CpuMpData->ApLoopMode == ApInMwaitLoop) {
|
||||
}
|
||||
|
||||
if (CpuMpData->ApLoopMode == ApInMwaitLoop) {
|
||||
//
|
||||
// Get AP target C-state each time when waking up AP,
|
||||
// for it maybe updated by platform again
|
||||
@@ -1076,6 +1078,13 @@ WakeUpAP (
|
||||
if (ResetVectorRequired) {
|
||||
FreeResetVector (CpuMpData);
|
||||
}
|
||||
|
||||
//
|
||||
// After one round of Wakeup Ap actions, need to re-sync ApLoopMode with
|
||||
// WakeUpByInitSipiSipi flag. WakeUpByInitSipiSipi flag maybe changed by
|
||||
// S3SmmInitDone Ppi.
|
||||
//
|
||||
CpuMpData->WakeUpByInitSipiSipi = (CpuMpData->ApLoopMode == ApInHltLoop);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1648,6 +1657,9 @@ MpInitLibInitialize (
|
||||
//
|
||||
CpuMpData->ApLoopMode = ApLoopMode;
|
||||
DEBUG ((DEBUG_INFO, "AP Loop Mode is %d\n", CpuMpData->ApLoopMode));
|
||||
|
||||
CpuMpData->WakeUpByInitSipiSipi = (CpuMpData->ApLoopMode == ApInHltLoop);
|
||||
|
||||
//
|
||||
// Set up APs wakeup signal buffer
|
||||
//
|
||||
|
Reference in New Issue
Block a user