| /** @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; | |
| } |