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