On 7/11/2023 7:36 AM, Nishant Sharma wrote:
From: Achin Gupta <achin.gu...@arm.com>
This patch adds support for creating a hoblist from the reduced boot
information retrieved from the SP manifest.
Signed-off-by: Achin Gupta <achin.gu...@arm.com>
Signed-off-by: Nishant Sharma <nishant.sha...@arm.com>
---
StandaloneMmPkg/Include/Library/Arm/StandaloneMmCoreEntryPoint.h
| 16 ++
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/CreateHobList.c
| 186 +++++++++++++++++++-
StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/StandaloneMmCoreEntryPoint.c
| 6 +-
3 files changed, 206 insertions(+), 2 deletions(-)
diff --git a/StandaloneMmPkg/Include/Library/Arm/StandaloneMmCoreEntryPoint.h
b/StandaloneMmPkg/Include/Library/Arm/StandaloneMmCoreEntryPoint.h
index 90d67a2f25b5..9daa76324221 100644
--- a/StandaloneMmPkg/Include/Library/Arm/StandaloneMmCoreEntryPoint.h
+++ b/StandaloneMmPkg/Include/Library/Arm/StandaloneMmCoreEntryPoint.h
@@ -170,6 +170,22 @@ CreateHobListFromBootInfo (
IN EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo
);
+/**
+ Use the boot information passed by the SPMC to populate a HOB list
+ suitable for consumption by the MM Core and drivers.
+
+ @param [in, out] CpuDriverEntryPoint Address of MM CPU driver entrypoint
+ @param [in] StmmBootInfo Boot information passed by privileged
+ firmware
+
+**/
+VOID *
+EFIAPI
+CreateHobListFromStmmBootInfo (
+ IN OUT PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT *CpuDriverEntryPoint,
+ IN EFI_STMM_BOOT_INFO *StmmBootInfo
+ );
+
/**
The entry point of Standalone MM Foundation.
diff --git a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/CreateHobList.c b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/CreateHobList.c
index 2ac2d354f06a..4592089a6020 100644
--- a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/CreateHobList.c
+++ b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/CreateHobList.c
@@ -2,7 +2,7 @@
Creates HOB during Standalone MM Foundation entry point
on ARM platforms.
-Copyright (c) 2017 - 2021, Arm Ltd. All rights reserved.<BR>
+Copyright (c) 2017 - 2023, Arm Ltd. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -203,3 +203,187 @@ CreateHobListFromBootInfo (
return HobStart;
}
+
+STATIC
+VOID
+CreateMmramInformationHobFromImageLayout (
+ IN EFI_STMM_BOOT_INFO *StmmBootInfo,
+ IN EFI_HOB_HANDOFF_INFO_TABLE *HobStart
+)
+{
+ UINT32 *Idx;
+ UINT32 BufferSize;
+ EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *MmramRangesHob;
+ EFI_MMRAM_DESCRIPTOR *MmramRanges;
+
+ // Find the size of the GUIDed HOB with SRAM ranges. This excludes any memory
+ // shared with the normal world or the SPMC. It includes the memory allocated
+ // to the SP image, used and unused heap.
+ BufferSize = sizeof (EFI_MMRAM_HOB_DESCRIPTOR_BLOCK);
+ BufferSize += 4 * sizeof (EFI_MMRAM_DESCRIPTOR);
+
+ // Create a GUIDed HOB with SRAM ranges
+ MmramRangesHob = BuildGuidHob (&gEfiMmPeiMmramMemoryReserveGuid, BufferSize);
+
BuildGuidHob can return NULL, we should check MmramRangesHob before
using it. Same for the other cases below.
+ // Initialise the number of MMRAM memory regions
+ MmramRangesHob->NumberOfMmReservedRegions = 0;
+ Idx = &MmramRangesHob->NumberOfMmReservedRegions ;
+
+ // Fill up the MMRAM ranges
+ MmramRanges = &MmramRangesHob->Descriptor[0];
+
+ // Base and size of memory occupied by the Standalone MM image
+ MmramRanges[*Idx].PhysicalStart = StmmBootInfo->SpMemBase;
+ MmramRanges[*Idx].CpuStart = StmmBootInfo->SpMemBase;
+ MmramRanges[*Idx].PhysicalSize = StmmBootInfo->SpMemSize;
+ MmramRanges[*Idx].RegionState = EFI_CACHEABLE | EFI_ALLOCATED;
+ (*Idx)++;
+
+ // Base and size of memory occupied by the Standalone MM image
+ MmramRanges[*Idx].PhysicalStart = StmmBootInfo->SpSharedBufBase;
+ MmramRanges[*Idx].CpuStart = StmmBootInfo->SpSharedBufBase;
+ MmramRanges[*Idx].PhysicalSize = StmmBootInfo->SpSharedBufSize;
+ MmramRanges[*Idx].RegionState = EFI_CACHEABLE | EFI_ALLOCATED;
+ (*Idx)++;
+
+ // Base and size of memory occupied by the hoblist
+ MmramRanges[*Idx].PhysicalStart = (EFI_PHYSICAL_ADDRESS) (UINTN) HobStart;
+ MmramRanges[*Idx].CpuStart = (EFI_PHYSICAL_ADDRESS) (UINTN) HobStart;
+ MmramRanges[*Idx].PhysicalSize = HobStart->EfiFreeMemoryBottom -
(EFI_PHYSICAL_ADDRESS) (UINTN) HobStart;
+ MmramRanges[*Idx].RegionState = EFI_CACHEABLE | EFI_ALLOCATED;
+ (*Idx)++;
+
+ // Base and size of heap memory shared by all cpus
+ MmramRanges[*Idx].PhysicalStart = HobStart->EfiFreeMemoryBottom;
+ MmramRanges[*Idx].CpuStart = HobStart->EfiFreeMemoryBottom;
+ MmramRanges[*Idx].PhysicalSize = HobStart->EfiFreeMemoryTop -
HobStart->EfiFreeMemoryBottom;
+ MmramRanges[*Idx].RegionState = EFI_CACHEABLE;
+ (*Idx)++;
+
+ // Sanity check number of MMRAM regions
+ ASSERT (MmramRangesHob->NumberOfMmReservedRegions == 3);
+
+ return;
+}
+
+STATIC
+VOID
+CreateMpInformationHobFromCpuInfo (
+ IN EFI_SECURE_PARTITION_CPU_INFO *CpuInfo
+)
+{
+ MP_INFORMATION_HOB_DATA *MpInformationHobData;
+ EFI_PROCESSOR_INFORMATION *ProcInfoBuffer;
+ UINT32 BufferSize;
+ UINT32 Flags;
+
+ // Find the size of the GUIDed HOB with MP information
+ BufferSize = sizeof (MP_INFORMATION_HOB_DATA);
+ BufferSize += sizeof (EFI_PROCESSOR_INFORMATION);
+
+ // Create a Guided MP information HOB to enable the ARM TF CPU driver to
+ // perform per-cpu allocations.
+ MpInformationHobData = BuildGuidHob (&gMpInformationHobGuid, BufferSize);
+
+ // Populate the MP information HOB under the assumption that this is a
+ // uniprocessor partition. Hence, only a single CPU is exposed to the MM
Core.
+ MpInformationHobData->NumberOfProcessors = 1;
+ MpInformationHobData->NumberOfEnabledProcessors = 1;
+
+ // Populate the processor information
+ ProcInfoBuffer = MpInformationHobData->ProcessorInfoBuffer;
+ ProcInfoBuffer[0].ProcessorId = CpuInfo[0].Mpidr;
+ ProcInfoBuffer[0].Location.Package = GET_CLUSTER_ID(CpuInfo[0].Mpidr);
+ ProcInfoBuffer[0].Location.Core = GET_CORE_ID(CpuInfo[0].Mpidr);
+ ProcInfoBuffer[0].Location.Thread = GET_CORE_ID(CpuInfo[0].Mpidr);
+
+ // Populate the processor information flags
+ Flags = PROCESSOR_ENABLED_BIT | PROCESSOR_HEALTH_STATUS_BIT |
PROCESSOR_AS_BSP_BIT;
+ ProcInfoBuffer[0].StatusFlag = Flags;
+
+ return;
+}
+
+/**
+ Use the FF-A boot information passed by the SPMC to populate a HOB list
+ suitable for consumption by the MM Core and drivers.
+
+ @param [in, out] CpuDriverEntryPoint Address of MM CPU driver entrypoint
+ @param [in] StmmBootInfo Boot information passed by the SPMC
+
+**/
+VOID *
+CreateHobListFromStmmBootInfo (
+ IN OUT PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT *CpuDriverEntryPoint,
+ IN EFI_STMM_BOOT_INFO *StmmBootInfo
+)
+{
+ EFI_HOB_HANDOFF_INFO_TABLE *HobStart;
+ EFI_RESOURCE_ATTRIBUTE_TYPE Attributes;
+ EFI_MMRAM_DESCRIPTOR *NsCommBufMmramRange;
+ ARM_TF_CPU_DRIVER_EP_DESCRIPTOR *CpuDriverEntryPointDesc;
+
+ // Create a hoblist with a PHIT and EOH
+ HobStart = HobConstructor (
+ (VOID *) (UINTN) StmmBootInfo->SpMemBase,
+ (UINTN) StmmBootInfo->SpMemSize,
+ (VOID *) (UINTN) StmmBootInfo->SpHeapBase,
+ (VOID *) (UINTN) (StmmBootInfo->SpHeapBase +
StmmBootInfo->SpHeapSize)
+ );
+
+ // Check that the Hoblist starts at the bottom of the Heap
+ ASSERT (HobStart == (VOID *) (UINTN) StmmBootInfo->SpHeapBase);
+
+ // Build a Boot Firmware Volume HOB
+ BuildFvHob (StmmBootInfo->SpMemBase, StmmBootInfo->SpMemSize);
+
+ // Build a resource descriptor Hob that describes the available physical
+ // memory range
+ Attributes = (
+ EFI_RESOURCE_ATTRIBUTE_PRESENT |
+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
+ EFI_RESOURCE_ATTRIBUTE_TESTED |
+ EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
+ EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
+ EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
+ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
+ );
Should we also put EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE,
EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE, and
EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE, too, so that
in the future we can add these memory protections in StMM?
Thanks,
Oliver
+
+ BuildResourceDescriptorHob (
+ EFI_RESOURCE_SYSTEM_MEMORY,
+ Attributes,
+ (UINTN) StmmBootInfo->SpMemBase,
+ StmmBootInfo->SpMemSize
+ );
+
+ // Create an MP information hob from cpu information passed in the boot
+ // information structure
+ CreateMpInformationHobFromCpuInfo(&StmmBootInfo->CpuInfo);
+
+ // Create a Guided HOB to tell the ARM TF CPU driver the location and length
+ // of the communication buffer shared with the Normal world.
+ NsCommBufMmramRange = (EFI_MMRAM_DESCRIPTOR *) BuildGuidHob (
+
&gEfiStandaloneMmNonSecureBufferGuid,
+ sizeof
(EFI_MMRAM_DESCRIPTOR)
+ );
+ NsCommBufMmramRange->PhysicalStart = StmmBootInfo->SpNsCommBufBase;
+ NsCommBufMmramRange->CpuStart = StmmBootInfo->SpNsCommBufBase;
+ NsCommBufMmramRange->PhysicalSize = StmmBootInfo->SpNsCommBufSize;
+ NsCommBufMmramRange->RegionState = EFI_CACHEABLE | EFI_ALLOCATED;
+
+ // Create a Guided HOB to enable the ARM TF CPU driver to share its entry
+ // point and populate it with the address of the shared buffer
+ CpuDriverEntryPointDesc =
+ (ARM_TF_CPU_DRIVER_EP_DESCRIPTOR *) BuildGuidHob (
+ &gEfiArmTfCpuDriverEpDescriptorGuid,
+ sizeof (ARM_TF_CPU_DRIVER_EP_DESCRIPTOR)
+ );
+
+ *CpuDriverEntryPoint = NULL;
+ CpuDriverEntryPointDesc->ArmTfCpuDriverEpPtr = CpuDriverEntryPoint;
+
+ // Create Mmram range hob from SP image layout
+ CreateMmramInformationHobFromImageLayout(StmmBootInfo, HobStart);
+
+ return HobStart;
+}
diff --git
a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/StandaloneMmCoreEntryPoint.c
b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/StandaloneMmCoreEntryPoint.c
index 505786aff07c..8131b1984969 100644
---
a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/StandaloneMmCoreEntryPoint.c
+++
b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/Arm/StandaloneMmCoreEntryPoint.c
@@ -823,7 +823,11 @@ ModuleEntryPoint (
//
// Create Hoblist based upon boot information passed by privileged software
//
- HobStart = CreateHobListFromBootInfo (&CpuDriverEntryPoint, PayloadBootInfo);
+ if (UseOnlyFfaAbis) {
+ HobStart = CreateHobListFromStmmBootInfo (&CpuDriverEntryPoint,
&StmmBootInfo);
+ } else {
+ HobStart = CreateHobListFromBootInfo (&CpuDriverEntryPoint,
PayloadBootInfo);
+ }
//
// Call the MM Core entry point
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#106882): https://edk2.groups.io/g/devel/message/106882
Mute This Topic: https://groups.io/mt/100079882/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-