UefiCpuPkg/PiSmmCpuDxe: use MpService2Ppi to wakeup AP in s3

Use MpService2Ppi to wakeup AP in s3 boot flow during initializing
CPU. If mSmmS3ResumeState->MpService2Ppi is not 0, then BSP will
use MpService2Ppi->StartupAllCPUs to do CPU initialization for both
BSP and AP instead of only sending InitSipiSipi for AP.

Signed-off-by: Dun Tan <dun.tan@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
This commit is contained in:
Dun Tan 2023-07-26 17:36:02 +08:00 committed by mergify[bot]
parent cf82c09bac
commit 2ce5ae43c2

View File

@ -7,6 +7,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#include "PiSmmCpuDxeSmm.h" #include "PiSmmCpuDxeSmm.h"
#include <PiPei.h>
#include <Ppi/MpServices2.h>
#pragma pack(1) #pragma pack(1)
typedef struct { typedef struct {
@ -594,18 +596,21 @@ InitializeCpuAfterRebase (
UINT8 Stack[128]; UINT8 Stack[128];
SetRegister (FALSE); SetRegister (FALSE);
if (IsBsp) {
while (mNumberToFinish > 0) { if (mSmmS3ResumeState->MpService2Ppi == 0) {
CpuPause (); if (IsBsp) {
while (mNumberToFinish > 0) {
CpuPause ();
}
} else {
//
// Place AP into the safe code, count down the number with lock mechanism in the safe code.
//
TopOfStack = (UINTN)Stack + sizeof (Stack);
TopOfStack &= ~(UINTN)(CPU_STACK_ALIGNMENT - 1);
CopyMem ((VOID *)(UINTN)mApHltLoopCode, mApHltLoopCodeTemplate, sizeof (mApHltLoopCodeTemplate));
TransferApToSafeState ((UINTN)mApHltLoopCode, TopOfStack, (UINTN)&mNumberToFinish);
} }
} else {
//
// Place AP into the safe code, count down the number with lock mechanism in the safe code.
//
TopOfStack = (UINTN)Stack + sizeof (Stack);
TopOfStack &= ~(UINTN)(CPU_STACK_ALIGNMENT - 1);
CopyMem ((VOID *)(UINTN)mApHltLoopCode, mApHltLoopCodeTemplate, sizeof (mApHltLoopCodeTemplate));
TransferApToSafeState ((UINTN)mApHltLoopCode, TopOfStack, (UINTN)&mNumberToFinish);
} }
} }
@ -783,11 +788,12 @@ SmmRestoreCpu (
VOID VOID
) )
{ {
SMM_S3_RESUME_STATE *SmmS3ResumeState; SMM_S3_RESUME_STATE *SmmS3ResumeState;
IA32_DESCRIPTOR Ia32Idtr; IA32_DESCRIPTOR Ia32Idtr;
IA32_DESCRIPTOR X64Idtr; IA32_DESCRIPTOR X64Idtr;
IA32_IDT_GATE_DESCRIPTOR IdtEntryTable[EXCEPTION_VECTOR_NUMBER]; IA32_IDT_GATE_DESCRIPTOR IdtEntryTable[EXCEPTION_VECTOR_NUMBER];
EFI_STATUS Status; EFI_STATUS Status;
EDKII_PEI_MP_SERVICES2_PPI *Mp2ServicePpi;
DEBUG ((DEBUG_INFO, "SmmRestoreCpu()\n")); DEBUG ((DEBUG_INFO, "SmmRestoreCpu()\n"));
@ -852,15 +858,21 @@ SmmRestoreCpu (
// //
mInitApsAfterSmmBaseReloc = FALSE; mInitApsAfterSmmBaseReloc = FALSE;
PrepareApStartupVector (mAcpiCpuData.StartupVector); if (mSmmS3ResumeState->MpService2Ppi != 0) {
// Mp2ServicePpi = (EDKII_PEI_MP_SERVICES2_PPI *)(UINTN)mSmmS3ResumeState->MpService2Ppi;
// Send INIT IPI - SIPI to all APs Mp2ServicePpi->StartupAllCPUs (Mp2ServicePpi, InitializeCpuProcedure, 0, NULL);
// } else {
SendInitSipiSipiAllExcludingSelf ((UINT32)mAcpiCpuData.StartupVector); PrepareApStartupVector (mAcpiCpuData.StartupVector);
//
// Send INIT IPI - SIPI to all APs
//
SendInitSipiSipiAllExcludingSelf ((UINT32)mAcpiCpuData.StartupVector);
InitializeCpuProcedure (NULL);
}
} else {
InitializeCpuProcedure (NULL);
} }
InitializeCpuProcedure (NULL);
// //
// Set a flag to restore SMM configuration in S3 path. // Set a flag to restore SMM configuration in S3 path.
// //