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