Home | History | Annotate | Download | only in ArmVirtMemoryInitPeiLib
      1 /** @file
      2 *
      3 *  Copyright (c) 2011-2014, ARM Limited. All rights reserved.
      4 *  Copyright (c) 2014, Linaro Limited. All rights reserved.
      5 *
      6 *  This program and the accompanying materials
      7 *  are licensed and made available under the terms and conditions of the BSD License
      8 *  which accompanies this distribution.  The full text of the license may be found at
      9 *  http://opensource.org/licenses/bsd-license.php
     10 *
     11 *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 *
     14 **/
     15 
     16 #include <PiPei.h>
     17 
     18 #include <Library/ArmMmuLib.h>
     19 #include <Library/ArmPlatformLib.h>
     20 #include <Library/DebugLib.h>
     21 #include <Library/HobLib.h>
     22 #include <Library/MemoryAllocationLib.h>
     23 #include <Library/PcdLib.h>
     24 #include <Library/CacheMaintenanceLib.h>
     25 
     26 VOID
     27 BuildMemoryTypeInformationHob (
     28   VOID
     29   );
     30 
     31 VOID
     32 InitMmu (
     33   VOID
     34   )
     35 {
     36   ARM_MEMORY_REGION_DESCRIPTOR  *MemoryTable;
     37   VOID                          *TranslationTableBase;
     38   UINTN                         TranslationTableSize;
     39   RETURN_STATUS                 Status;
     40 
     41   // Get Virtual Memory Map from the Platform Library
     42   ArmPlatformGetVirtualMemoryMap (&MemoryTable);
     43 
     44   //Note: Because we called PeiServicesInstallPeiMemory() before to call InitMmu() the MMU Page Table resides in
     45   //      DRAM (even at the top of DRAM as it is the first permanent memory allocation)
     46   Status = ArmConfigureMmu (MemoryTable, &TranslationTableBase, &TranslationTableSize);
     47   if (EFI_ERROR (Status)) {
     48     DEBUG ((EFI_D_ERROR, "Error: Failed to enable MMU\n"));
     49   }
     50 }
     51 
     52 EFI_STATUS
     53 EFIAPI
     54 MemoryPeim (
     55   IN EFI_PHYSICAL_ADDRESS               UefiMemoryBase,
     56   IN UINT64                             UefiMemorySize
     57   )
     58 {
     59   EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttributes;
     60   UINT64                      SystemMemoryTop;
     61 
     62   // Ensure PcdSystemMemorySize has been set
     63   ASSERT (PcdGet64 (PcdSystemMemorySize) != 0);
     64 
     65   //
     66   // Now, the permanent memory has been installed, we can call AllocatePages()
     67   //
     68   ResourceAttributes = (
     69       EFI_RESOURCE_ATTRIBUTE_PRESENT |
     70       EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
     71       EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |
     72       EFI_RESOURCE_ATTRIBUTE_TESTED
     73   );
     74 
     75   SystemMemoryTop = PcdGet64 (PcdSystemMemoryBase) +
     76                     PcdGet64 (PcdSystemMemorySize);
     77 
     78   if (SystemMemoryTop - 1 > MAX_ADDRESS) {
     79     BuildResourceDescriptorHob (
     80         EFI_RESOURCE_SYSTEM_MEMORY,
     81         ResourceAttributes,
     82         PcdGet64 (PcdSystemMemoryBase),
     83         (UINT64)MAX_ADDRESS - PcdGet64 (PcdSystemMemoryBase) + 1
     84         );
     85     BuildResourceDescriptorHob (
     86         EFI_RESOURCE_SYSTEM_MEMORY,
     87         ResourceAttributes,
     88         (UINT64)MAX_ADDRESS + 1,
     89         SystemMemoryTop - MAX_ADDRESS - 1
     90         );
     91   } else {
     92     BuildResourceDescriptorHob (
     93         EFI_RESOURCE_SYSTEM_MEMORY,
     94         ResourceAttributes,
     95         PcdGet64 (PcdSystemMemoryBase),
     96         PcdGet64 (PcdSystemMemorySize)
     97         );
     98   }
     99 
    100   //
    101   // When running under virtualization, the PI/UEFI memory region may be
    102   // clean but not invalidated in system caches or in lower level caches
    103   // on other CPUs. So invalidate the region by virtual address, to ensure
    104   // that the contents we put there with the caches and MMU off will still
    105   // be visible after turning them on.
    106   //
    107   InvalidateDataCacheRange ((VOID*)(UINTN)UefiMemoryBase, UefiMemorySize);
    108 
    109   // Build Memory Allocation Hob
    110   InitMmu ();
    111 
    112   if (FeaturePcdGet (PcdPrePiProduceMemoryTypeInformationHob)) {
    113     // Optional feature that helps prevent EFI memory map fragmentation.
    114     BuildMemoryTypeInformationHob ();
    115   }
    116 
    117   return EFI_SUCCESS;
    118 }
    119