mirror of https://github.com/acidanthera/audk.git
UefiCpuPkg/CpuMpPei: Wake up APs by proper method
If ApLoopMode is ApInHltLoop, BSP will send INIT-SIPI-SIPI to wake up APs. If ApLoopMode is ApInMwaitLoop or ApInRunLoop, BSP will write one semaphore to wake up APs. Contributed-under: TianoCore Contribution Agreement 1.0 Cc: Feng Tian <feng.tian@intel.com> Cc: Michael Kinney <michael.d.kinney@intel.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan <jeff.fan@intel.com> Tested-by: Michael Kinney <michael.d.kinney@intel.com> Reviewed-by: Michael Kinney <michael.d.kinney@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19346 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
c87e41b445
commit
a09647f3fe
|
@ -399,7 +399,7 @@ ApCFunction (
|
||||||
@param PeiCpuMpData Pointer to PEI CPU MP Data
|
@param PeiCpuMpData Pointer to PEI CPU MP Data
|
||||||
@param Broadcast TRUE: Send broadcast IPI to all APs
|
@param Broadcast TRUE: Send broadcast IPI to all APs
|
||||||
FALSE: Send IPI to AP by ApicId
|
FALSE: Send IPI to AP by ApicId
|
||||||
@param ApicId Apic ID for the processor to be waked
|
@param ProcessorNumber The handle number of specified processor
|
||||||
@param Procedure The function to be invoked by AP
|
@param Procedure The function to be invoked by AP
|
||||||
@param ProcedureArgument The argument to be passed into AP function
|
@param ProcedureArgument The argument to be passed into AP function
|
||||||
**/
|
**/
|
||||||
|
@ -407,12 +407,13 @@ VOID
|
||||||
WakeUpAP (
|
WakeUpAP (
|
||||||
IN PEI_CPU_MP_DATA *PeiCpuMpData,
|
IN PEI_CPU_MP_DATA *PeiCpuMpData,
|
||||||
IN BOOLEAN Broadcast,
|
IN BOOLEAN Broadcast,
|
||||||
IN UINT32 ApicId,
|
IN UINTN ProcessorNumber,
|
||||||
IN EFI_AP_PROCEDURE Procedure, OPTIONAL
|
IN EFI_AP_PROCEDURE Procedure, OPTIONAL
|
||||||
IN VOID *ProcedureArgument OPTIONAL
|
IN VOID *ProcedureArgument OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
volatile MP_CPU_EXCHANGE_INFO *ExchangeInfo;
|
volatile MP_CPU_EXCHANGE_INFO *ExchangeInfo;
|
||||||
|
UINTN Index;
|
||||||
|
|
||||||
PeiCpuMpData->ApFunction = (UINTN) Procedure;
|
PeiCpuMpData->ApFunction = (UINTN) Procedure;
|
||||||
PeiCpuMpData->ApFunctionArgument = (UINTN) ProcedureArgument;
|
PeiCpuMpData->ApFunctionArgument = (UINTN) ProcedureArgument;
|
||||||
|
@ -436,12 +437,40 @@ WakeUpAP (
|
||||||
CopyMem ((VOID *)&ExchangeInfo->GdtrProfile, &mGdt, sizeof(mGdt));
|
CopyMem ((VOID *)&ExchangeInfo->GdtrProfile, &mGdt, sizeof(mGdt));
|
||||||
AsmReadIdtr ((IA32_DESCRIPTOR *) &ExchangeInfo->IdtrProfile);
|
AsmReadIdtr ((IA32_DESCRIPTOR *) &ExchangeInfo->IdtrProfile);
|
||||||
|
|
||||||
if (Broadcast) {
|
if (PeiCpuMpData->ApLoopMode == ApInMwaitLoop) {
|
||||||
SendInitSipiSipiAllExcludingSelf ((UINT32) ExchangeInfo->BufferStart);
|
//
|
||||||
} else {
|
// Get AP target C-state each time when waking up AP,
|
||||||
SendInitSipiSipi (ApicId, (UINT32) ExchangeInfo->BufferStart);
|
// for it maybe updated by platform again
|
||||||
|
//
|
||||||
|
PeiCpuMpData->ApTargetCState = PcdGet8 (PcdCpuApTargetCstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Wakeup APs per AP loop state
|
||||||
|
//
|
||||||
|
if (PeiCpuMpData->ApLoopMode == ApInHltLoop || PeiCpuMpData->InitFlag) {
|
||||||
|
if (Broadcast) {
|
||||||
|
SendInitSipiSipiAllExcludingSelf ((UINT32) ExchangeInfo->BufferStart);
|
||||||
|
} else {
|
||||||
|
SendInitSipiSipi (
|
||||||
|
PeiCpuMpData->CpuData[ProcessorNumber].ApicId,
|
||||||
|
(UINT32) ExchangeInfo->BufferStart
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else if ((PeiCpuMpData->ApLoopMode == ApInMwaitLoop) ||
|
||||||
|
(PeiCpuMpData->ApLoopMode == ApInRunLoop)) {
|
||||||
|
if (Broadcast) {
|
||||||
|
for (Index = 0; Index < PeiCpuMpData->CpuCount; Index++) {
|
||||||
|
if (Index != PeiCpuMpData->BspNumber) {
|
||||||
|
*(PeiCpuMpData->CpuData[Index].StartupApSignal) = WAKEUP_AP_SIGNAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*(PeiCpuMpData->CpuData[ProcessorNumber].StartupApSignal) = WAKEUP_AP_SIGNAL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ASSERT (FALSE);
|
||||||
|
}
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -600,7 +629,7 @@ CountProcessorNumber (
|
||||||
if (PeiCpuMpData->X2ApicEnable) {
|
if (PeiCpuMpData->X2ApicEnable) {
|
||||||
DEBUG ((EFI_D_INFO, "Force x2APIC mode!\n"));
|
DEBUG ((EFI_D_INFO, "Force x2APIC mode!\n"));
|
||||||
//
|
//
|
||||||
// Send 2nd broadcast IPI to all APs to enable x2APIC mode
|
// Wakeup all APs to enable x2APIC mode
|
||||||
//
|
//
|
||||||
WakeUpAP (PeiCpuMpData, TRUE, 0, ApFuncEnableX2Apic, NULL);
|
WakeUpAP (PeiCpuMpData, TRUE, 0, ApFuncEnableX2Apic, NULL);
|
||||||
//
|
//
|
||||||
|
|
|
@ -255,7 +255,7 @@ CpuMpEndOfPeiCallback (
|
||||||
@param PeiCpuMpData Pointer to PEI CPU MP Data
|
@param PeiCpuMpData Pointer to PEI CPU MP Data
|
||||||
@param Broadcast TRUE: Send broadcast IPI to all APs
|
@param Broadcast TRUE: Send broadcast IPI to all APs
|
||||||
FALSE: Send IPI to AP by ApicId
|
FALSE: Send IPI to AP by ApicId
|
||||||
@param ApicId Apic ID for the processor to be waked
|
@param ProcessorNumber The handle number of specified processor
|
||||||
@param Procedure The function to be invoked by AP
|
@param Procedure The function to be invoked by AP
|
||||||
@param ProcedureArgument The argument to be passed into AP function
|
@param ProcedureArgument The argument to be passed into AP function
|
||||||
**/
|
**/
|
||||||
|
@ -263,7 +263,7 @@ VOID
|
||||||
WakeUpAP (
|
WakeUpAP (
|
||||||
IN PEI_CPU_MP_DATA *PeiCpuMpData,
|
IN PEI_CPU_MP_DATA *PeiCpuMpData,
|
||||||
IN BOOLEAN Broadcast,
|
IN BOOLEAN Broadcast,
|
||||||
IN UINT32 ApicId,
|
IN UINTN ProcessorNumber,
|
||||||
IN EFI_AP_PROCEDURE Procedure, OPTIONAL
|
IN EFI_AP_PROCEDURE Procedure, OPTIONAL
|
||||||
IN VOID *ProcedureArgument OPTIONAL
|
IN VOID *ProcedureArgument OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
|
@ -83,6 +83,7 @@
|
||||||
gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress ## CONSUMES
|
gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress ## CONSUMES
|
||||||
gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize ## CONSUMES
|
gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize ## CONSUMES
|
||||||
gUefiCpuPkgTokenSpaceGuid.PcdCpuApLoopMode ## CONSUMES
|
gUefiCpuPkgTokenSpaceGuid.PcdCpuApLoopMode ## CONSUMES
|
||||||
|
gUefiCpuPkgTokenSpaceGuid.PcdCpuApTargetCstate ## SOMETIMES_CONSUMES
|
||||||
|
|
||||||
[Depex]
|
[Depex]
|
||||||
gEfiPeiMemoryDiscoveredPpiGuid
|
gEfiPeiMemoryDiscoveredPpiGuid
|
||||||
|
|
|
@ -520,7 +520,7 @@ PeiStartupAllAPs (
|
||||||
if (Index == CallerNumber) {
|
if (Index == CallerNumber) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
WakeUpAP (PeiCpuMpData, FALSE, PeiCpuMpData->CpuData[Index].ApicId, Procedure, ProcedureArgument);
|
WakeUpAP (PeiCpuMpData, FALSE, Index, Procedure, ProcedureArgument);
|
||||||
//
|
//
|
||||||
// Wait to finish
|
// Wait to finish
|
||||||
//
|
//
|
||||||
|
@ -655,7 +655,7 @@ PeiStartupThisAP (
|
||||||
WaitCountIndex = 0;
|
WaitCountIndex = 0;
|
||||||
FinishedCount = &PeiCpuMpData->FinishedCount;
|
FinishedCount = &PeiCpuMpData->FinishedCount;
|
||||||
|
|
||||||
WakeUpAP (PeiCpuMpData, FALSE, PeiCpuMpData->CpuData[ProcessorNumber].ApicId, Procedure, ProcedureArgument);
|
WakeUpAP (PeiCpuMpData, FALSE, ProcessorNumber, Procedure, ProcedureArgument);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Wait to finish
|
// Wait to finish
|
||||||
|
@ -791,7 +791,7 @@ PeiSwitchBSP (
|
||||||
//
|
//
|
||||||
// Need to wakeUp AP (future BSP).
|
// Need to wakeUp AP (future BSP).
|
||||||
//
|
//
|
||||||
WakeUpAP (PeiCpuMpData, FALSE, PeiCpuMpData->CpuData[ProcessorNumber].ApicId, FutureBSPProc, PeiCpuMpData);
|
WakeUpAP (PeiCpuMpData, FALSE, ProcessorNumber, FutureBSPProc, PeiCpuMpData);
|
||||||
|
|
||||||
AsmExchangeRole (&PeiCpuMpData->BSPInfo, &PeiCpuMpData->APInfo);
|
AsmExchangeRole (&PeiCpuMpData->BSPInfo, &PeiCpuMpData->APInfo);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue