diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c index dbcc5279a3..aae283e79b 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c @@ -1924,6 +1924,7 @@ InitializeMpServiceData ( CPUID_VERSION_INFO_EDX RegEdx; UINT32 MaxExtendedFunction; CPUID_VIR_PHY_ADDRESS_SIZE_EAX VirPhyAddressSize; + BOOLEAN RelaxedMode; // // Determine if this CPU supports machine check @@ -1943,7 +1944,10 @@ InitializeMpServiceData ( (sizeof (SMM_CPU_DATA_BLOCK) + sizeof (BOOLEAN)) * gSmmCpuPrivate->SmmCoreEntryContext.NumberOfCpus; mSmmMpSyncData = (SMM_DISPATCHER_MP_SYNC_DATA *)AllocatePages (EFI_SIZE_TO_PAGES (mSmmMpSyncDataSize)); ASSERT (mSmmMpSyncData != NULL); - mCpuSmmSyncMode = (SMM_CPU_SYNC_MODE)PcdGet8 (PcdCpuSmmSyncMode); + + RelaxedMode = FALSE; + GetSmmCpuSyncConfigData (&RelaxedMode, NULL, NULL); + mCpuSmmSyncMode = RelaxedMode ? SmmCpuSyncModeRelaxedAp : SmmCpuSyncModeTradition; InitializeMpSyncData (); // diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h index 821c0b9488..a5b40f864e 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h @@ -1078,6 +1078,22 @@ RestoreSmmConfigurationInS3 ( VOID ); +/** + Get SmmCpuSyncConfig data: RelaxedMode, SyncTimeout, SyncTimeout2. + + @param[in,out] RelaxedMode It indicates if Relaxed CPU synchronization method or + traditional CPU synchronization method is used when processing an SMI. + @param[in,out] SyncTimeout It indicates the 1st BSP/AP synchronization timeout value in SMM. + @param[in,out] SyncTimeout2 It indicates the 2nd BSP/AP synchronization timeout value in SMM. + + **/ +VOID +GetSmmCpuSyncConfigData ( + IN OUT BOOLEAN *RelaxedMode, OPTIONAL + IN OUT UINT64 *SyncTimeout, OPTIONAL + IN OUT UINT64 *SyncTimeout2 OPTIONAL + ); + /** Get ACPI S3 enable flag. diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c index d1280db490..5f126a5f23 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c @@ -11,6 +11,35 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "PiSmmCpuCommon.h" +/** + Get SmmCpuSyncConfig data: RelaxedMode, SyncTimeout, SyncTimeout2. + + @param[in,out] RelaxedMode It indicates if Relaxed CPU synchronization method or + traditional CPU synchronization method is used when processing an SMI. + @param[in,out] SyncTimeout It indicates the 1st BSP/AP synchronization timeout value in SMM. + @param[in,out] SyncTimeout2 It indicates the 2nd BSP/AP synchronization timeout value in SMM. + + **/ +VOID +GetSmmCpuSyncConfigData ( + IN OUT BOOLEAN *RelaxedMode, OPTIONAL + IN OUT UINT64 *SyncTimeout, OPTIONAL + IN OUT UINT64 *SyncTimeout2 OPTIONAL + ) +{ + if (RelaxedMode != NULL) { + *RelaxedMode = (BOOLEAN)(PcdGet8 (PcdCpuSmmSyncMode) == SmmCpuSyncModeRelaxedAp); + } + + if (SyncTimeout != NULL) { + *SyncTimeout = PcdGet64 (PcdCpuSmmApSyncTimeout); + } + + if (SyncTimeout2 != NULL) { + *SyncTimeout2 = PcdGet64 (PcdCpuSmmApSyncTimeout2); + } +} + /** Get ACPI S3 enable flag. diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SyncTimer.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SyncTimer.c index ad15313224..fcf002c5e3 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SyncTimer.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SyncTimer.c @@ -31,16 +31,22 @@ InitializeSmmTimer ( ) { UINT64 TimerFrequency; + UINT64 SyncTimeout; + UINT64 SyncTimeout2; UINT64 Start; UINT64 End; + SyncTimeout = 0; + SyncTimeout2 = 0; + GetSmmCpuSyncConfigData (NULL, &SyncTimeout, &SyncTimeout2); + TimerFrequency = GetPerformanceCounterProperties (&Start, &End); mTimeoutTicker = DivU64x32 ( - MultU64x64 (TimerFrequency, PcdGet64 (PcdCpuSmmApSyncTimeout)), + MultU64x64 (TimerFrequency, SyncTimeout), 1000 * 1000 ); mTimeoutTicker2 = DivU64x32 ( - MultU64x64 (TimerFrequency, PcdGet64 (PcdCpuSmmApSyncTimeout2)), + MultU64x64 (TimerFrequency, SyncTimeout2), 1000 * 1000 ); if (End < Start) {