mirror of https://github.com/acidanthera/audk.git
UefiCpuPkg: Refactor the logic for placing APs in Mwait/Runloop.
Refactor the logic for placing APs in Mwait/Runloop into a separate function. Tested-by: Gerd Hoffmann <kraxel@redhat.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: Yuanhao Xie <yuanhao.xie@intel.com>
This commit is contained in:
parent
88f436883b
commit
243212b0d0
|
@ -658,6 +658,54 @@ PlaceAPInHltLoop (
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
This function place APs in Mwait or Run loop.
|
||||
|
||||
@param[in] ApLoopMode Ap Loop Mode
|
||||
@param[in] ApStartupSignalBuffer Pointer to Ap Startup Signal Buffer
|
||||
@param[in] ApTargetCState Ap Target CState
|
||||
**/
|
||||
VOID
|
||||
PlaceAPInMwaitLoopOrRunLoop (
|
||||
IN UINT8 ApLoopMode,
|
||||
IN volatile UINT32 *ApStartupSignalBuffer,
|
||||
IN UINT8 ApTargetCState
|
||||
)
|
||||
{
|
||||
while (TRUE) {
|
||||
DisableInterrupts ();
|
||||
if (ApLoopMode == ApInMwaitLoop) {
|
||||
//
|
||||
// Place AP in MWAIT-loop
|
||||
//
|
||||
AsmMonitor ((UINTN)ApStartupSignalBuffer, 0, 0);
|
||||
if (*ApStartupSignalBuffer != WAKEUP_AP_SIGNAL) {
|
||||
//
|
||||
// Check AP start-up signal again.
|
||||
// If AP start-up signal is not set, place AP into
|
||||
// the specified C-state
|
||||
//
|
||||
AsmMwait (ApTargetCState << 4, 0);
|
||||
}
|
||||
} else if (ApLoopMode == ApInRunLoop) {
|
||||
//
|
||||
// Place AP in Run-loop
|
||||
//
|
||||
CpuPause ();
|
||||
} else {
|
||||
ASSERT (FALSE);
|
||||
}
|
||||
|
||||
//
|
||||
// If AP start-up signal is written, AP is waken up
|
||||
// otherwise place AP in loop again
|
||||
//
|
||||
if (*ApStartupSignalBuffer == WAKEUP_AP_SIGNAL) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
This function will be called from AP reset code if BSP uses WakeUpAP.
|
||||
|
||||
|
@ -838,39 +886,8 @@ ApWakeupFunction (
|
|||
//
|
||||
// Never run here
|
||||
//
|
||||
}
|
||||
|
||||
while (TRUE) {
|
||||
DisableInterrupts ();
|
||||
if (CpuMpData->ApLoopMode == ApInMwaitLoop) {
|
||||
//
|
||||
// Place AP in MWAIT-loop
|
||||
//
|
||||
AsmMonitor ((UINTN)ApStartupSignalBuffer, 0, 0);
|
||||
if (*ApStartupSignalBuffer != WAKEUP_AP_SIGNAL) {
|
||||
//
|
||||
// Check AP start-up signal again.
|
||||
// If AP start-up signal is not set, place AP into
|
||||
// the specified C-state
|
||||
//
|
||||
AsmMwait (CpuMpData->ApTargetCState << 4, 0);
|
||||
}
|
||||
} else if (CpuMpData->ApLoopMode == ApInRunLoop) {
|
||||
//
|
||||
// Place AP in Run-loop
|
||||
//
|
||||
CpuPause ();
|
||||
} else {
|
||||
ASSERT (FALSE);
|
||||
}
|
||||
|
||||
//
|
||||
// If AP start-up signal is written, AP is waken up
|
||||
// otherwise place AP in loop again
|
||||
//
|
||||
if (*ApStartupSignalBuffer == WAKEUP_AP_SIGNAL) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
PlaceAPInMwaitLoopOrRunLoop (CpuMpData->ApLoopMode, ApStartupSignalBuffer, CpuMpData->ApTargetCState);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue