summaryrefslogtreecommitdiffstats
path: root/StandaloneMmPkg
diff options
context:
space:
mode:
authorZhang Hongbin <hongbin1.zhang@intel.com>2024-07-02 17:57:58 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2024-08-28 15:25:27 +0000
commitc775cc762e5380c391e42f7910e68c6821836bca (patch)
treeb3f742e5d353aa7470675a3ad9c0d1a1026e5211 /StandaloneMmPkg
parent0d91ebd96f1c5c463b74ac060c8bb0a616f17372 (diff)
downloadedk2-c775cc762e5380c391e42f7910e68c6821836bca.tar.gz
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>
Diffstat (limited to 'StandaloneMmPkg')
-rw-r--r--StandaloneMmPkg/Drivers/StandaloneMmIplPei/MmFoundationHob.c125
-rw-r--r--StandaloneMmPkg/Drivers/StandaloneMmIplPei/StandaloneMmIplPei.inf12
2 files changed, 136 insertions, 1 deletions
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 <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.
@@ -80,6 +84,85 @@ MmIplBuildFvHob (
}
/**
+ 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
This function builds a customized HOB tagged with a GUID for identification, copies the
@@ -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