| /** @file | |
| Copyright (c) 2011, ARM Limited. All rights reserved. | |
| Copyright (c) 2022, Google LLC. All rights reserved. | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <PiPei.h> | |
| #include <Library/ArmPlatformLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/HobLib.h> | |
| #include <Library/PeimEntryPoint.h> | |
| #include <Library/PeiServicesLib.h> | |
| #include <Library/PcdLib.h> | |
| #include <Guid/MemoryTypeInformation.h> | |
| EFI_STATUS | |
| EFIAPI | |
| MemoryPeim ( | |
| IN EFI_PHYSICAL_ADDRESS UefiMemoryBase, | |
| IN UINT64 UefiMemorySize | |
| ); | |
| /** | |
| Build the memory type information HOB that describes how many pages of each | |
| type to preallocate when initializing the GCD memory map. | |
| **/ | |
| VOID | |
| EFIAPI | |
| BuildMemoryTypeInformationHob ( | |
| VOID | |
| ) | |
| { | |
| EFI_MEMORY_TYPE_INFORMATION Info[10]; | |
| Info[0].Type = EfiACPIReclaimMemory; | |
| Info[0].NumberOfPages = FixedPcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory); | |
| Info[1].Type = EfiACPIMemoryNVS; | |
| Info[1].NumberOfPages = FixedPcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS); | |
| Info[2].Type = EfiReservedMemoryType; | |
| Info[2].NumberOfPages = FixedPcdGet32 (PcdMemoryTypeEfiReservedMemoryType); | |
| Info[3].Type = EfiRuntimeServicesData; | |
| Info[3].NumberOfPages = FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesData); | |
| Info[4].Type = EfiRuntimeServicesCode; | |
| Info[4].NumberOfPages = FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode); | |
| Info[5].Type = EfiBootServicesCode; | |
| Info[5].NumberOfPages = FixedPcdGet32 (PcdMemoryTypeEfiBootServicesCode); | |
| Info[6].Type = EfiBootServicesData; | |
| Info[6].NumberOfPages = FixedPcdGet32 (PcdMemoryTypeEfiBootServicesData); | |
| Info[7].Type = EfiLoaderCode; | |
| Info[7].NumberOfPages = FixedPcdGet32 (PcdMemoryTypeEfiLoaderCode); | |
| Info[8].Type = EfiLoaderData; | |
| Info[8].NumberOfPages = FixedPcdGet32 (PcdMemoryTypeEfiLoaderData); | |
| // Terminator for the list | |
| Info[9].Type = EfiMaxMemoryType; | |
| Info[9].NumberOfPages = 0; | |
| BuildGuidDataHob (&gEfiMemoryTypeInformationGuid, &Info, sizeof (Info)); | |
| } | |
| /** | |
| Module entry point. | |
| @param[in] FileHandle Handle of the file being invoked. | |
| @param[in] PeiServices Describes the list of possible PEI Services. | |
| @return EFI_SUCCESS unless the operation failed. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| InitializeMemory ( | |
| IN EFI_PEI_FILE_HANDLE FileHandle, | |
| IN CONST EFI_PEI_SERVICES **PeiServices | |
| ) | |
| { | |
| UINTN UefiMemoryBase; | |
| EFI_STATUS Status; | |
| ASSERT (FixedPcdGet64 (PcdSystemMemoryBase) < (UINT64)MAX_ALLOC_ADDRESS); | |
| // | |
| // Put the permanent PEI memory in the first 128 MiB of DRAM so that | |
| // it is covered by the statically configured ID map. | |
| // | |
| UefiMemoryBase = (UINTN)FixedPcdGet64 (PcdSystemMemoryBase) + SIZE_128MB | |
| - FixedPcdGet32 (PcdSystemMemoryUefiRegionSize); | |
| Status = PeiServicesInstallPeiMemory ( | |
| UefiMemoryBase, | |
| FixedPcdGet32 (PcdSystemMemoryUefiRegionSize) | |
| ); | |
| ASSERT_EFI_ERROR (Status); | |
| Status = MemoryPeim ( | |
| UefiMemoryBase, | |
| FixedPcdGet32 (PcdSystemMemoryUefiRegionSize) | |
| ); | |
| ASSERT_EFI_ERROR (Status); | |
| return Status; | |
| } |