summaryrefslogtreecommitdiff
path: root/ArmPlatformPkg/MemoryInitPei/MemoryInit.c
diff options
context:
space:
mode:
Diffstat (limited to 'ArmPlatformPkg/MemoryInitPei/MemoryInit.c')
-rw-r--r--ArmPlatformPkg/MemoryInitPei/MemoryInit.c131
1 files changed, 106 insertions, 25 deletions
diff --git a/ArmPlatformPkg/MemoryInitPei/MemoryInit.c b/ArmPlatformPkg/MemoryInitPei/MemoryInit.c
index 6f066c41f9..e616c075e1 100644
--- a/ArmPlatformPkg/MemoryInitPei/MemoryInit.c
+++ b/ArmPlatformPkg/MemoryInitPei/MemoryInit.c
@@ -32,6 +32,7 @@
#include <Library/PeiServicesLib.h>
#include <Library/ArmLib.h>
#include <Library/IoLib.h>
+#include <Library/MemoryAllocationLib.h>
#include <Library/ArmPlatformLib.h>
//
@@ -90,12 +91,6 @@ BuildMemoryTypeInformationHob (
BuildGuidDataHob (&gEfiMemoryTypeInformationGuid, &Info, sizeof (Info));
}
-EFI_STATUS
-EFIAPI
-InitializeMemory (
- IN EFI_PEI_FILE_HANDLE FileHandle,
- IN CONST EFI_PEI_SERVICES **PeiServices
- )
/*++
Routine Description:
@@ -112,43 +107,129 @@ Returns:
Status - EFI_SUCCESS if the boot mode could be set
--*/
+EFI_STATUS
+EFIAPI
+InitializeMemory (
+ IN EFI_PEI_FILE_HANDLE FileHandle,
+ IN CONST EFI_PEI_SERVICES **PeiServices
+ )
{
- EFI_STATUS Status;
- ARM_SYSTEM_MEMORY_REGION_DESCRIPTOR* EfiMemoryMap;
- UINTN PeiMemoryBase;
- UINTN PeiMemorySize;
- UINTN Index;
+ EFI_STATUS Status;
+ EFI_RESOURCE_ATTRIBUTE_TYPE Attributes;
+ ARM_SYSTEM_MEMORY_REGION_DESCRIPTOR* EfiMemoryMap;
+ UINTN Index;
+ UINTN SystemMemoryTop;
+ UINTN UefiMemoryBase;
+ UINTN UefiMemorySize;
DEBUG ((EFI_D_ERROR, "Memory Init PEIM Loaded\n"));
- // If it is not a standalone version, then we need to initialize the System Memory
- // In case of a standalone version, the DRAM is already initialized
+ // Ensure PcdSystemMemorySize has been set
+ ASSERT (FixedPcdGet32 (PcdSystemMemorySize) != 0);
+
+ SystemMemoryTop = FixedPcdGet32 (PcdSystemMemoryBase) + FixedPcdGet32 (PcdSystemMemorySize);
+
+ //
+ // Initialize the System Memory (DRAM)
+ //
if (FeaturePcdGet(PcdStandalone)) {
- // Initialize the System Memory controller (DRAM)
+ // In case of a standalone version, the DRAM is already initialized
ArmPlatformInitializeSystemMemory();
}
- // Install the Memory to PEI
- ArmPlatformGetPeiMemory (&PeiMemoryBase,&PeiMemorySize);
- Status = PeiServicesInstallPeiMemory (PeiMemoryBase,PeiMemorySize);
+ //
+ // Declare the UEFI memory to PEI
+ //
+ if (FeaturePcdGet(PcdStandalone)) {
+ // In case of standalone UEFI, we set the UEFI memory region at the top of the DRAM
+ UefiMemoryBase = SystemMemoryTop - FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
+ } else {
+ // In case of a non standalone UEFI, we set the UEFI memory below the Firmware Volume
+ UefiMemoryBase = FixedPcdGet32 (PcdNormalFdBaseAddress) - FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
+ }
+ UefiMemorySize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
+ Status = PeiServicesInstallPeiMemory (UefiMemoryBase,UefiMemorySize);
ASSERT_EFI_ERROR (Status);
//
// Now, the permanent memory has been installed, we can call AllocatePages()
//
+ Attributes = (
+ EFI_RESOURCE_ATTRIBUTE_PRESENT |
+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
+ EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
+ EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
+ EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
+ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |
+ EFI_RESOURCE_ATTRIBUTE_TESTED
+ );
+
+ // If it is not a standalone build we must reserved the space above the base address of the firmware volume
+ if (!FeaturePcdGet(PcdStandalone)) {
+ // Check if firmware volume has not be copied at the top of DRAM then we must reserve the extra space
+ // between the firmware and the top
+ if (SystemMemoryTop != FixedPcdGet32 (PcdNormalFdBaseAddress) + FixedPcdGet32 (PcdNormalFdSize)) {
+ BuildResourceDescriptorHob (
+ EFI_RESOURCE_SYSTEM_MEMORY,
+ Attributes & (~EFI_RESOURCE_ATTRIBUTE_TESTED),
+ FixedPcdGet32 (PcdNormalFdBaseAddress) + FixedPcdGet32 (PcdNormalFdSize),
+ SystemMemoryTop - (FixedPcdGet32 (PcdNormalFdBaseAddress) + FixedPcdGet32 (PcdNormalFdSize))
+ );
+ }
+
+ // Reserved the memory space occupied by the firmware volume
+ BuildResourceDescriptorHob (
+ EFI_RESOURCE_SYSTEM_MEMORY,
+ Attributes & (~EFI_RESOURCE_ATTRIBUTE_PRESENT),
+ (UINT32)FixedPcdGet32 (PcdNormalFdBaseAddress),
+ (UINT32)FixedPcdGet32 (PcdNormalFdSize)
+ );
+ }
- ArmPlatformGetEfiMemoryMap (&EfiMemoryMap);
-
- // Install the EFI Memory Map
- for (Index = 0; EfiMemoryMap[Index].ResourceAttribute != 0; Index++) {
+ // Check there is no overlap between UEFI and Fix Address Regions
+ ASSERT (FixedPcdGet32 (PcdSystemMemoryBase) + FixedPcdGet32 (PcdSystemMemoryFixRegionSize) <= UefiMemoryBase);
+
+ // Reserved the UEFI Memory Region
+ BuildResourceDescriptorHob (
+ EFI_RESOURCE_SYSTEM_MEMORY,
+ Attributes,
+ UefiMemoryBase,
+ UefiMemorySize
+ );
+
+ // Reserved the Fix Address Region
+ BuildResourceDescriptorHob (
+ EFI_RESOURCE_SYSTEM_MEMORY,
+ Attributes,
+ FixedPcdGet32 (PcdSystemMemoryBase),
+ FixedPcdGet32 (PcdSystemMemoryFixRegionSize)
+ );
+
+ // Reserved the memory between UEFI and Fix Address regions
+ if (FixedPcdGet32 (PcdSystemMemoryBase) + FixedPcdGet32 (PcdSystemMemoryFixRegionSize) != UefiMemoryBase) {
BuildResourceDescriptorHob (
EFI_RESOURCE_SYSTEM_MEMORY,
- EfiMemoryMap[Index].ResourceAttribute,
- EfiMemoryMap[Index].PhysicalStart,
- EfiMemoryMap[Index].NumberOfBytes
+ Attributes & (~EFI_RESOURCE_ATTRIBUTE_TESTED),
+ FixedPcdGet32 (PcdSystemMemoryBase) + FixedPcdGet32 (PcdSystemMemoryFixRegionSize),
+ UefiMemoryBase - (FixedPcdGet32 (PcdSystemMemoryBase) + FixedPcdGet32 (PcdSystemMemoryFixRegionSize))
);
}
+ // If a platform has system memory extensions, it can declare those in this function
+ Status = ArmPlatformGetAdditionalSystemMemory (&EfiMemoryMap);
+ if (!EFI_ERROR(Status)) {
+ // Install the EFI Memory Map
+ for (Index = 0; EfiMemoryMap[Index].ResourceAttribute != 0; Index++) {
+ BuildResourceDescriptorHob (
+ EFI_RESOURCE_SYSTEM_MEMORY,
+ EfiMemoryMap[Index].ResourceAttribute,
+ EfiMemoryMap[Index].PhysicalStart,
+ EfiMemoryMap[Index].NumberOfBytes
+ );
+ }
+ FreePool (EfiMemoryMap);
+ }
+
// Build Memory Allocation Hob
InitMmu ();
@@ -157,5 +238,5 @@ Returns:
BuildMemoryTypeInformationHob ();
}
- return Status;
+ return EFI_SUCCESS;
}