/** @file | |
* | |
* Copyright (c) 2011-2015, ARM Limited. All rights reserved. | |
* | |
* This program and the accompanying materials | |
* are licensed and made available under the terms and conditions of the BSD License | |
* which accompanies this distribution. The full text of the license may be found at | |
* http://opensource.org/licenses/bsd-license.php | |
* | |
* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
* | |
**/ | |
#include <PiPei.h> | |
#include <Library/ArmMmuLib.h> | |
#include <Library/ArmPlatformLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/HobLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/PcdLib.h> | |
VOID | |
BuildMemoryTypeInformationHob ( | |
VOID | |
); | |
STATIC | |
VOID | |
InitMmu ( | |
IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable | |
) | |
{ | |
VOID *TranslationTableBase; | |
UINTN TranslationTableSize; | |
RETURN_STATUS Status; | |
//Note: Because we called PeiServicesInstallPeiMemory() before to call InitMmu() the MMU Page Table resides in | |
// DRAM (even at the top of DRAM as it is the first permanent memory allocation) | |
Status = ArmConfigureMmu (MemoryTable, &TranslationTableBase, &TranslationTableSize); | |
if (EFI_ERROR (Status)) { | |
DEBUG ((EFI_D_ERROR, "Error: Failed to enable MMU\n")); | |
} | |
} | |
/*++ | |
Routine Description: | |
Arguments: | |
FileHandle - Handle of the file being invoked. | |
PeiServices - Describes the list of possible PEI Services. | |
Returns: | |
Status - EFI_SUCCESS if the boot mode could be set | |
--*/ | |
EFI_STATUS | |
EFIAPI | |
MemoryPeim ( | |
IN EFI_PHYSICAL_ADDRESS UefiMemoryBase, | |
IN UINT64 UefiMemorySize | |
) | |
{ | |
ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable; | |
EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttributes; | |
EFI_PEI_HOB_POINTERS NextHob; | |
BOOLEAN Found; | |
// Get Virtual Memory Map from the Platform Library | |
ArmPlatformGetVirtualMemoryMap (&MemoryTable); | |
// Ensure PcdSystemMemorySize has been set | |
ASSERT (PcdGet64 (PcdSystemMemorySize) != 0); | |
// | |
// Now, the permanent memory has been installed, we can call AllocatePages() | |
// | |
ResourceAttributes = ( | |
EFI_RESOURCE_ATTRIBUTE_PRESENT | | |
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | | |
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | | |
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | | |
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE | | |
EFI_RESOURCE_ATTRIBUTE_TESTED | |
); | |
// | |
// Check if the resource for the main system memory has been declared | |
// | |
Found = FALSE; | |
NextHob.Raw = GetHobList (); | |
while ((NextHob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, NextHob.Raw)) != NULL) { | |
if ((NextHob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) && | |
(PcdGet64 (PcdSystemMemoryBase) >= NextHob.ResourceDescriptor->PhysicalStart) && | |
(NextHob.ResourceDescriptor->PhysicalStart + NextHob.ResourceDescriptor->ResourceLength <= PcdGet64 (PcdSystemMemoryBase) + PcdGet64 (PcdSystemMemorySize))) | |
{ | |
Found = TRUE; | |
break; | |
} | |
NextHob.Raw = GET_NEXT_HOB (NextHob); | |
} | |
if (!Found) { | |
// Reserved the memory space occupied by the firmware volume | |
BuildResourceDescriptorHob ( | |
EFI_RESOURCE_SYSTEM_MEMORY, | |
ResourceAttributes, | |
PcdGet64 (PcdSystemMemoryBase), | |
PcdGet64 (PcdSystemMemorySize) | |
); | |
} | |
// Build Memory Allocation Hob | |
InitMmu (MemoryTable); | |
if (FeaturePcdGet (PcdPrePiProduceMemoryTypeInformationHob)) { | |
// Optional feature that helps prevent EFI memory map fragmentation. | |
BuildMemoryTypeInformationHob (); | |
} | |
return EFI_SUCCESS; | |
} |