From c775cc762e5380c391e42f7910e68c6821836bca Mon Sep 17 00:00:00 2001 From: Zhang Hongbin Date: Tue, 2 Jul 2024 17:57:58 +0800 Subject: [PATCH] StandaloneMmPkg/MmIpl: Create misc HOBs for CPU Create misc HOBs for CPU, it included MM ACPI S3 Enable HOB, MM CPU sync configuration HOB, CPU SMM base HOB, SMRAM memory HOB, MP Information2 HOB and ACPI variable HOB Signed-off-by: Hongbin1 Zhang Cc: Jiewen Yao Cc: Ray Ni Cc: Star Zeng Cc: Jiaxin Wu Cc: Wei6 Xu Cc: Sami Mujawar Cc: Ard Biesheuvel Cc: Supreeth Venkatesh --- .../StandaloneMmIplPei/MmFoundationHob.c | 125 ++++++++++++++++++ .../StandaloneMmIplPei/StandaloneMmIplPei.inf | 12 +- 2 files changed, 136 insertions(+), 1 deletion(-) diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c index df3355f3fc..dbb13b06a9 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c @@ -7,6 +7,10 @@ **/ #include +#include +#include +#include +#include /** Add a new HOB to the HOB List. @@ -79,6 +83,85 @@ MmIplBuildFvHob ( *HobBufferSize = HobLength; } +/** + Builds MM ACPI S3 Enable HOB. + + This function builds MM ACPI S3 Enable HOB. + It can only be invoked during PEI phase; + If new HOB buffer is NULL, then ASSERT(). + + @param[in] Hob The pointer of new HOB buffer. + @param[in, out] HobBufferSize The available size of the HOB buffer when as input. + The used size of when as output. + +**/ +VOID +MmIplBuildMmAcpiS3EnableHob ( + IN UINT8 *Hob, + IN OUT UINTN *HobBufferSize + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + MM_ACPI_S3_ENABLE *MmAcpiS3Enable; + UINT16 HobLength; + + ASSERT (Hob != NULL); + + HobLength = ALIGN_VALUE (sizeof (EFI_HOB_GUID_TYPE) + sizeof (MM_ACPI_S3_ENABLE), 8); + if (*HobBufferSize >= HobLength) { + MmIplCreateHob (Hob, EFI_HOB_TYPE_GUID_EXTENSION, HobLength); + + GuidHob = (EFI_HOB_GUID_TYPE *)Hob; + CopyGuid (&GuidHob->Name, &gMmAcpiS3EnableHobGuid); + + MmAcpiS3Enable = (MM_ACPI_S3_ENABLE *)(GuidHob + 1); + MmAcpiS3Enable->AcpiS3Enable = PcdGetBool (PcdAcpiS3Enable); + } + + *HobBufferSize = HobLength; +} + +/** + Builds MM cpu sync configuration HOB. + + This function builds smm cpu sync configuration HOB. + It can only be invoked during PEI phase; + If new HOB buffer is NULL, then ASSERT(). + + @param[in] Hob The pointer of new HOB buffer. + @param[in, out] HobBufferSize The available size of the HOB buffer when as input. + The used size of when as output. + +**/ +VOID +MmIplBuildMmCpuSyncConfigHob ( + IN UINT8 *Hob, + IN OUT UINTN *HobBufferSize + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + MM_CPU_SYNC_CONFIG *MmSyncModeInfoHob; + UINT16 HobLength; + + ASSERT (Hob != NULL); + + GuidHob = (EFI_HOB_GUID_TYPE *)(UINTN)Hob; + + HobLength = ALIGN_VALUE (sizeof (EFI_HOB_GUID_TYPE) + sizeof (MM_CPU_SYNC_CONFIG), 8); + if (*HobBufferSize >= HobLength) { + MmIplCreateHob (GuidHob, EFI_HOB_TYPE_GUID_EXTENSION, HobLength); + + CopyGuid (&GuidHob->Name, &gMmCpuSyncConfigHobGuid); + + MmSyncModeInfoHob = (MM_CPU_SYNC_CONFIG *)(UINTN)(GuidHob + 1); + MmSyncModeInfoHob->RelaxedApMode = (BOOLEAN)(PcdGet8 (PcdCpuSmmSyncMode) == MmCpuSyncModeRelaxedAp); + MmSyncModeInfoHob->Timeout = PcdGet64 (PcdCpuSmmApSyncTimeout); + MmSyncModeInfoHob->Timeout2 = PcdGet64 (PcdCpuSmmApSyncTimeout2); + } + + *HobBufferSize = HobLength; +} + /** Copies a data buffer to a newly-built HOB for GUID HOB @@ -281,6 +364,48 @@ CreateMmFoundationHobList ( MmIplBuildFvHob (FoundationHobList + UsedSize, &HobLength, MmFvBase, MmFvSize); UsedSize += HobLength; + // + // Build MM ACPI S3 Enable HOB + // + HobLength = GetRemainingHobSize (*FoundationHobSize, UsedSize); + MmIplBuildMmAcpiS3EnableHob (FoundationHobList + UsedSize, &HobLength); + UsedSize += HobLength; + + // + // Build MM CPU sync configuration HOB + // + HobLength = GetRemainingHobSize (*FoundationHobSize, UsedSize); + MmIplBuildMmCpuSyncConfigHob (FoundationHobList + UsedSize, &HobLength); + UsedSize += HobLength; + + // + // Build CPU SMM base HOB in MM HOB list + // + HobLength = GetRemainingHobSize (*FoundationHobSize, UsedSize); + MmIplCopyGuidHob (FoundationHobList + UsedSize, &HobLength, &gSmmBaseHobGuid, TRUE); + UsedSize += HobLength; + + // + // Build SMRAM memory Hob in MM HOB list + // + HobLength = GetRemainingHobSize (*FoundationHobSize, UsedSize); + MmIplCopyGuidHob (FoundationHobList + UsedSize, &HobLength, &gEfiSmmSmramMemoryGuid, FALSE); + UsedSize += HobLength; + + // + // Build Mp Information2 Hob in MM HOB list + // + HobLength = GetRemainingHobSize (*FoundationHobSize, UsedSize); + MmIplCopyGuidHob (FoundationHobList + UsedSize, &HobLength, &gMpInformation2HobGuid, TRUE); + UsedSize += HobLength; + + // + // Build ACPI variable HOB + // + HobLength = GetRemainingHobSize (*FoundationHobSize, UsedSize); + MmIplCopyGuidHob (FoundationHobList + UsedSize, &HobLength, &gEfiAcpiVariableGuid, FALSE); + UsedSize += HobLength; + if (*FoundationHobSize < UsedSize) { Status = RETURN_BUFFER_TOO_SMALL; } else { diff --git a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf index 94abe6eee7..bf0bdf735f 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf +++ b/StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf @@ -31,6 +31,7 @@ MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec StandaloneMmPkg/StandaloneMmPkg.dec + UefiCpuPkg/UefiCpuPkg.dec [LibraryClasses] PeimEntryPoint @@ -48,6 +49,11 @@ gMmCommBufferHobGuid gEfiSmmSmramMemoryGuid gEventMmDispatchGuid + gSmmBaseHobGuid + gMpInformation2HobGuid + gEfiAcpiVariableGuid + gMmAcpiS3EnableHobGuid + gMmCpuSyncConfigHobGuid [Ppis] gEfiPeiMmControlPpiGuid @@ -59,6 +65,10 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdMmCommBufferPages + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiS3Enable ## CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmSyncMode ## CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmApSyncTimeout ## CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmApSyncTimeout2 ## CONSUMES [Depex] - gEfiPeiMmControlPpiGuid + gEfiPeiMmControlPpiGuid AND gEfiPeiMpServicesPpiGuid