mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-10 14:23:31 +01:00
125 lines
3.9 KiB
C
125 lines
3.9 KiB
C
|
/** @file
|
||
|
|
||
|
Copyright (c) 2014-2017, Linaro Limited. All rights reserved.
|
||
|
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#include <Uefi.h>
|
||
|
#include <Pi/PiMultiPhase.h>
|
||
|
#include <Library/ArmLib.h>
|
||
|
#include <Library/BaseMemoryLib.h>
|
||
|
#include <Library/DebugLib.h>
|
||
|
#include <Library/HobLib.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
|
||
|
|
||
|
/**
|
||
|
Default library constructur that obtains the memory size from a PCD.
|
||
|
|
||
|
@return Always returns RETURN_SUCCESS
|
||
|
|
||
|
**/
|
||
|
RETURN_STATUS
|
||
|
EFIAPI
|
||
|
QemuVirtMemInfoLibConstructor (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
UINT64 Size;
|
||
|
VOID *Hob;
|
||
|
|
||
|
Size = PcdGet64 (PcdSystemMemorySize);
|
||
|
Hob = BuildGuidDataHob (&gArmVirtSystemMemorySizeGuid, &Size, sizeof Size);
|
||
|
ASSERT (Hob != NULL);
|
||
|
|
||
|
return RETURN_SUCCESS;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
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;
|
||
|
VOID *MemorySizeHob;
|
||
|
|
||
|
ASSERT (VirtualMemoryMap != NULL);
|
||
|
|
||
|
MemorySizeHob = GetFirstGuidHob (&gArmVirtSystemMemorySizeGuid);
|
||
|
ASSERT (MemorySizeHob != NULL);
|
||
|
if (MemorySizeHob == NULL) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
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 = *(UINT64 *)GET_GUID_HOB_DATA (MemorySizeHob);
|
||
|
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;
|
||
|
}
|