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 <hongbin1.zhang@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Wei6 Xu <wei6.xu@intel.com>
Cc: Sami Mujawar <sami.mujawar@arm.com>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
This commit is contained in:
Zhang Hongbin 2024-07-02 17:57:58 +08:00 committed by mergify[bot]
parent 0d91ebd96f
commit c775cc762e
2 changed files with 136 additions and 1 deletions

View File

@ -7,6 +7,10 @@
**/
#include <StandaloneMmIplPei.h>
#include <Guid/MpInformation2.h>
#include <Guid/AcpiS3Context.h>
#include <Guid/MmAcpiS3Enable.h>
#include <Guid/MmCpuSyncConfig.h>
/**
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 {

View File

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