Reviewed-by: Ray Ni <ray...@intel.com> > -----Original Message----- > From: Xie, Yuanhao <yuanhao....@intel.com> > Sent: Monday, June 26, 2023 1:57 PM > To: devel@edk2.groups.io > Cc: Gerd Hoffmann <kra...@redhat.com>; Dong, Eric <eric.d...@intel.com>; Ni, > Ray <ray...@intel.com>; Kumar, Rahul R <rahul.r.ku...@intel.com>; Tom > Lendacky <thomas.lenda...@amd.com>; Xie, Yuanhao > <yuanhao....@intel.com> > Subject: [Patch V3 2/5] UefiCpuPkg: Refactor the logic for placing APs in > Mwait/Runloop. > > Refactor the logic for placing APs in > Mwait/Runloop into a separate function. > > Cc: Gerd Hoffmann <kra...@redhat.com> > Cc: Eric Dong <eric.d...@intel.com> > Cc: Ray Ni <ray...@intel.com> > Cc: Rahul Kumar <rahul1.ku...@intel.com> > Cc: Tom Lendacky <thomas.lenda...@amd.com> > Signed-off-by: Yuanhao Xie <yuanhao....@intel.com> > --- > UefiCpuPkg/Library/MpInitLib/MpLib.c | 83 > ++++++++++++++++++++++++++++++++++++++++++++++++++----------------------- > ---------- > 1 file changed, 50 insertions(+), 33 deletions(-) > > diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c > b/UefiCpuPkg/Library/MpInitLib/MpLib.c > index 9560b39220..e8dd640f9b 100644 > --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c > +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c > @@ -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); > } > } > } > -- > 2.36.1.windows.1
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#106355): https://edk2.groups.io/g/devel/message/106355 Mute This Topic: https://groups.io/mt/99782481/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-