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.
|
This function will be called from AP reset code if BSP uses WakeUpAP.
|
||||||
|
|
||||||
|
@ -838,39 +886,8 @@ ApWakeupFunction (
|
||||||
//
|
//
|
||||||
// Never run here
|
// Never run here
|
||||||
//
|
//
|
||||||
}
|
} else {
|
||||||
|
PlaceAPInMwaitLoopOrRunLoop (CpuMpData->ApLoopMode, ApStartupSignalBuffer, CpuMpData->ApTargetCState);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue