/** @file
Copyright (c) 2011-2014, ARM Limited. All rights reserved.
Copyright (c) 2014 - 2016 AMD Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
/**
Derived from:
ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c
**/
#include
#include
#include
#include
#include
#include
#include
#include
VOID
BuildMemoryTypeInformationHob (
VOID
);
VOID
InitMmu (
VOID
)
{
ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable;
VOID *TranslationTableBase;
UINTN TranslationTableSize;
RETURN_STATUS Status;
// Get Virtual Memory Map from the Platform Library
ArmPlatformGetVirtualMemoryMap (&MemoryTable);
// 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"));
}
}
STATIC
VOID
MoveNvStoreImage (
VOID
)
{
VOID *OldBase, *NewBase;
UINTN Size;
EFI_STATUS Status;
//
// Move the in-memory image of the NV store firmware volume to a dynamically
// allocated buffer. This gets rid of the annoying static memory reservation
// at the base of memory where all other UEFI allocations are near the top.
//
OldBase = (VOID *)FixedPcdGet64 (PcdFlashNvStorageOriginalBase);
Size = FixedPcdGet32 (PcdFlashNvStorageVariableSize) +
FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize);
NewBase = AllocateAlignedRuntimePages (EFI_SIZE_TO_PAGES (Size), SIZE_64KB);
ASSERT (NewBase != NULL);
CopyMem (NewBase, OldBase, Size);
DEBUG ((EFI_D_INFO, "%a: Relocating NV store FV from %p to %p\n",
__FUNCTION__, OldBase, NewBase));
Status = PcdSet64S (PcdFlashNvStorageVariableBase64, (UINT64)NewBase);
ASSERT_EFI_ERROR (Status);
Status = PcdSet64S (PcdFlashNvStorageFtwWorkingBase64,
(UINT64)NewBase + FixedPcdGet32 (PcdFlashNvStorageVariableSize));
ASSERT_EFI_ERROR (Status);
Status = PcdSet64S (PcdFlashNvStorageFtwSpareBase64, (UINT64)NewBase +
FixedPcdGet32 (PcdFlashNvStorageVariableSize) +
FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize));
ASSERT_EFI_ERROR (Status);
}
/*++
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
)
{
UINT64 Base, Size;
// Ensure PcdSystemMemorySize has been set
ASSERT (PcdGet64 (PcdSystemMemorySize) != 0);
//
// Now, the permanent memory has been installed, we can call AllocatePages()
//
Base = PcdGet64 (PcdSystemMemoryBase);
Size = PcdGet64 (PcdSystemMemorySize);
//
// For now, we assume that the trusted firmware region is at the base of
// system memory, since that is much easier to deal with.
//
ASSERT (Base == PcdGet64 (PcdTrustedFWMemoryBase));
Base += PcdGet64 (PcdTrustedFWMemorySize);
Size -= PcdGet64 (PcdTrustedFWMemorySize);
// Reserved Trusted Firmware region
BuildResourceDescriptorHob (
EFI_RESOURCE_SYSTEM_MEMORY,
( 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 ),
PcdGet64 (PcdTrustedFWMemoryBase),
PcdGet64 (PcdTrustedFWMemorySize)
);
BuildMemoryAllocationHob (
PcdGet64 (PcdTrustedFWMemoryBase),
PcdGet64 (PcdTrustedFWMemorySize),
EfiReservedMemoryType
);
// Declare system memory
BuildResourceDescriptorHob (
EFI_RESOURCE_SYSTEM_MEMORY,
( 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 ),
Base,
Size
);
// Build Memory Allocation Hob
InitMmu ();
// Optional feature that helps prevent EFI memory map fragmentation.
if (FeaturePcdGet (PcdPrePiProduceMemoryTypeInformationHob)) {
BuildMemoryTypeInformationHob ();
}
MoveNvStoreImage ();
return EFI_SUCCESS;
}