mirror of https://github.com/acidanthera/audk.git
89 lines
3.2 KiB
C
89 lines
3.2 KiB
C
/** @file
|
|
|
|
Copyright (c) 2014-2017, Linaro Limited. All rights reserved.
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include <Base.h>
|
|
#include <Library/ArmLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/MemoryAllocationLib.h>
|
|
|
|
// Number of Virtual Memory Map Descriptors
|
|
#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 5
|
|
|
|
//
|
|
// mach-virt's core peripherals such as the UART, the GIC and the RTC are
|
|
// all mapped in the 'miscellaneous device I/O' region, which we just map
|
|
// in its entirety rather than device by device. Note that it does not
|
|
// cover any of the NOR flash banks or PCI resource windows.
|
|
//
|
|
#define MACH_VIRT_PERIPH_BASE 0x08000000
|
|
#define MACH_VIRT_PERIPH_SIZE SIZE_128MB
|
|
|
|
/**
|
|
Return the Virtual Memory Map of your platform
|
|
|
|
This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU
|
|
on your platform.
|
|
|
|
@param[out] VirtualMemoryMap Array of ARM_MEMORY_REGION_DESCRIPTOR
|
|
describing a Physical-to-Virtual Memory
|
|
mapping. This array must be ended by a
|
|
zero-filled entry. The allocated memory
|
|
will not be freed.
|
|
|
|
**/
|
|
VOID
|
|
ArmVirtGetMemoryMap (
|
|
OUT ARM_MEMORY_REGION_DESCRIPTOR **VirtualMemoryMap
|
|
)
|
|
{
|
|
ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable;
|
|
|
|
ASSERT (VirtualMemoryMap != NULL);
|
|
|
|
VirtualMemoryTable = AllocatePool (sizeof (ARM_MEMORY_REGION_DESCRIPTOR) *
|
|
MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS);
|
|
|
|
if (VirtualMemoryTable == NULL) {
|
|
DEBUG ((DEBUG_ERROR, "%a: Error: Failed AllocatePool()\n", __FUNCTION__));
|
|
return;
|
|
}
|
|
|
|
// System DRAM
|
|
VirtualMemoryTable[0].PhysicalBase = PcdGet64 (PcdSystemMemoryBase);
|
|
VirtualMemoryTable[0].VirtualBase = VirtualMemoryTable[0].PhysicalBase;
|
|
VirtualMemoryTable[0].Length = PcdGet64 (PcdSystemMemorySize);
|
|
VirtualMemoryTable[0].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
|
|
|
|
DEBUG ((DEBUG_INFO, "%a: Dumping System DRAM Memory Map:\n"
|
|
"\tPhysicalBase: 0x%lX\n"
|
|
"\tVirtualBase: 0x%lX\n"
|
|
"\tLength: 0x%lX\n",
|
|
__FUNCTION__,
|
|
VirtualMemoryTable[0].PhysicalBase,
|
|
VirtualMemoryTable[0].VirtualBase,
|
|
VirtualMemoryTable[0].Length));
|
|
|
|
// Memory mapped peripherals (UART, RTC, GIC, virtio-mmio, etc)
|
|
VirtualMemoryTable[1].PhysicalBase = MACH_VIRT_PERIPH_BASE;
|
|
VirtualMemoryTable[1].VirtualBase = MACH_VIRT_PERIPH_BASE;
|
|
VirtualMemoryTable[1].Length = MACH_VIRT_PERIPH_SIZE;
|
|
VirtualMemoryTable[1].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
|
|
|
|
// Map the FV region as normal executable memory
|
|
VirtualMemoryTable[2].PhysicalBase = PcdGet64 (PcdFvBaseAddress);
|
|
VirtualMemoryTable[2].VirtualBase = VirtualMemoryTable[2].PhysicalBase;
|
|
VirtualMemoryTable[2].Length = FixedPcdGet32 (PcdFvSize);
|
|
VirtualMemoryTable[2].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
|
|
|
|
// End of Table
|
|
ZeroMem (&VirtualMemoryTable[3], sizeof (ARM_MEMORY_REGION_DESCRIPTOR));
|
|
|
|
*VirtualMemoryMap = VirtualMemoryTable;
|
|
}
|