UefiCpuPkg/PiSmmCpuDxeSmm: Get SmmCpuSyncConfig data from func

MM can not use the dynamic PCD (PcdCpuSmmSyncMode &
PcdCpuSmmApSyncTimeout & PcdCpuSmmApSyncTimeout2), so, move to
DxeSmm code and implement in GetSmmCpuSyncConfigData function.

Signed-off-by: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Dun Tan <dun.tan@intel.com>
Cc: Hongbin1 Zhang <hongbin1.zhang@intel.com>
Cc: Wei6 Xu <wei6.xu@intel.com>
Cc: Yuanhao Xie <yuanhao.xie@intel.com>
This commit is contained in:
Jiaxin Wu 2024-06-25 00:25:21 +08:00 committed by mergify[bot]
parent 23c5ee6e23
commit d480f106a6
4 changed files with 58 additions and 3 deletions

View File

@ -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 ();
//

View File

@ -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.

View File

@ -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.

View File

@ -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) {