Get AP loop mode to prepare for the monitor buffer required for ApInMwaitLoop and ApInRunLoop.
Contributed-under: TianoCore Contribution Agreement 1.0 Cc: Feng Tian <feng.t...@intel.com> Cc: Michael Kinney <michael.d.kin...@intel.com> Cc: Jordan Justen <jordan.l.jus...@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan <jeff....@intel.com> Tested-by: Michael Kinney <michael.d.kin...@intel.com> --- UefiCpuPkg/CpuMpPei/CpuMpPei.c | 25 +++++++++++++++++++++++-- UefiCpuPkg/CpuMpPei/CpuMpPei.h | 3 +++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/CpuMpPei.c index ac609a0..b8fa511 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c @@ -589,6 +589,10 @@ PrepareAPStartupVector ( UINTN WakeupBuffer; UINTN WakeupBufferSize; MP_ASSEMBLY_ADDRESS_MAP AddressMap; + UINT8 ApLoopMode; + UINT16 MonitorFilterSize; + UINT8 *MonitorBuffer; + UINTN Index; AsmGetAddressMap (&AddressMap); WakeupBufferSize = AddressMap.RendezvousFunnelSize + sizeof (MP_CPU_EXCHANGE_INFO); @@ -597,11 +601,14 @@ PrepareAPStartupVector ( DEBUG ((EFI_D_INFO, "CpuMpPei: WakeupBuffer = 0x%x\n", WakeupBuffer)); // - // Allocate Pages for APs stack, CPU MP Data and backup buffer for wakeup buffer + // Allocate Pages for APs stack, CPU MP Data, backup buffer for wakeup buffer, + // and monitor buffer if required. // MaxCpuCount = PcdGet32(PcdCpuMaxLogicalProcessorNumber); BufferSize = PcdGet32 (PcdCpuApStackSize) * MaxCpuCount + sizeof (PEI_CPU_MP_DATA) + WakeupBufferSize + sizeof (PEI_CPU_DATA) * MaxCpuCount; + ApLoopMode = GetApLoopMode (&MonitorFilterSize); + BufferSize += MonitorFilterSize * MaxCpuCount; Status = PeiServicesAllocatePages ( EfiBootServicesData, EFI_SIZE_TO_PAGES (BufferSize), @@ -627,7 +634,21 @@ PrepareAPStartupVector ( InitializeSpinLock(&PeiCpuMpData->MpLock); SaveVolatileRegisters (&PeiCpuMpData->CpuData[0].VolatileRegisters); CopyMem (&PeiCpuMpData->AddressMap, &AddressMap, sizeof (MP_ASSEMBLY_ADDRESS_MAP)); - + // + // Initialize AP loop mode + // + PeiCpuMpData->ApLoopMode = ApLoopMode; + DEBUG ((EFI_D_INFO, "AP Loop Mode is %d\n", PeiCpuMpData->ApLoopMode)); + MonitorBuffer = (UINT8 *)(PeiCpuMpData->CpuData + MaxCpuCount); + if (PeiCpuMpData->ApLoopMode != ApInHltLoop) { + // + // Set up APs wakeup signal buffer + // + for (Index = 0; Index < MaxCpuCount; Index++) { + PeiCpuMpData->CpuData[Index].StartupApSignal = + (UINT32 *)(MonitorBuffer + MonitorFilterSize * Index); + } + } // // Backup original data and copy AP reset code in it // diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.h b/UefiCpuPkg/CpuMpPei/CpuMpPei.h index 4be8234..c44376e 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.h +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.h @@ -132,6 +132,7 @@ typedef struct { } CPU_VOLATILE_REGISTERS; typedef struct { + volatile UINT32 *StartupApSignal; UINT32 ApicId; EFI_HEALTH_FLAGS Health; CPU_STATE State; @@ -161,6 +162,8 @@ struct _PEI_CPU_MP_DATA { CPU_EXCHANGE_ROLE_INFO BSPInfo; CPU_EXCHANGE_ROLE_INFO APInfo; MTRR_SETTINGS MtrrTable; + UINT8 ApLoopMode; + UINT8 ApTargetCState; PEI_CPU_DATA *CpuData; volatile MP_CPU_EXCHANGE_INFO *MpCpuExchangeInfo; }; -- 1.9.5.msysgit.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel