/** @file
Copyright (c) 2021, ARM Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
// The total number of descriptors, including the final "end-of-table" descriptor.
#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 12
#if !defined(MDEPKG_NDEBUG)
STATIC CONST CHAR8 *gTblAttrDesc[] = {
"UNCACHED_UNBUFFERED ",
"NONSECURE_UNCACHED_UNBUFFERED",
"WRITE_BACK ",
"NONSECURE_WRITE_BACK ",
"WB_NONSHAREABLE ",
"NONSECURE_WB_NONSHAREABLE ",
"WRITE_THROUGH ",
"NONSECURE_WRITE_THROUGH ",
"DEVICE ",
"NONSECURE_DEVICE "
};
#endif
#define LOG_MEM(desc) DEBUG (( \
DEBUG_ERROR, \
desc, \
VirtualMemoryTable[Index].PhysicalBase, \
(VirtualMemoryTable[Index].PhysicalBase + \
VirtualMemoryTable[Index].Length - 1), \
VirtualMemoryTable[Index].Length, \
gTblAttrDesc[VirtualMemoryTable[Index].Attributes] \
));
/**
Returns the Virtual Memory Map of the 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.
**/
VOID
ArmPlatformGetVirtualMemoryMap (
OUT ARM_MEMORY_REGION_DESCRIPTOR** VirtualMemoryMap
)
{
UINTN Index;
ARM_MEMORY_REGION_DESCRIPTOR * VirtualMemoryTable;
EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttributes;
MORELLO_PLAT_INFO * PlatInfo;
UINT64 DramBlock2Size;
Index = 0;
DramBlock2Size = 0;
PlatInfo = (MORELLO_PLAT_INFO *)MORELLO_PLAT_INFO_STRUCT_BASE;
if (PlatInfo->LocalDdrSize > MORELLO_DRAM_BLOCK1_SIZE) {
DramBlock2Size = PlatInfo->LocalDdrSize - MORELLO_DRAM_BLOCK1_SIZE;
}
if (DramBlock2Size != 0) {
ResourceAttributes =
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;
BuildResourceDescriptorHob (
EFI_RESOURCE_SYSTEM_MEMORY,
ResourceAttributes,
FixedPcdGet64 (PcdDramBlock2Base),
DramBlock2Size
);
}
ASSERT (VirtualMemoryMap != NULL);
VirtualMemoryTable = AllocatePool (sizeof (ARM_MEMORY_REGION_DESCRIPTOR) *
MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS);
if (VirtualMemoryTable == NULL) {
return;
}
DEBUG ((
DEBUG_ERROR,
" Memory Map\n----------------------------------------------------------\n"
));
DEBUG ((
DEBUG_ERROR,
"Description : START - END " \
"[ SIZE ] { ATTR }\n"
));
// SubSystem Peripherals - Generic Watchdog
VirtualMemoryTable[Index].PhysicalBase = MORELLO_GENERIC_WDOG_BASE;
VirtualMemoryTable[Index].VirtualBase = MORELLO_GENERIC_WDOG_BASE;
VirtualMemoryTable[Index].Length = MORELLO_GENERIC_WDOG_SZ;
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
LOG_MEM ("Generic Watchdog : 0x%016lx - 0x%016lx [ 0x%016lx ] { %a }\n");
// SubSystem Peripherals - GIC-600
VirtualMemoryTable[++Index].PhysicalBase = MORELLO_GIC_BASE;
VirtualMemoryTable[Index].VirtualBase = MORELLO_GIC_BASE;
VirtualMemoryTable[Index].Length = MORELLO_GIC_SZ;
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
LOG_MEM ("GIC-600 : 0x%016lx - 0x%016lx [ 0x%016lx ] { %a }\n");
// SubSystem Peripherals - GICR-600
VirtualMemoryTable[++Index].PhysicalBase = MORELLO_GICR_BASE;
VirtualMemoryTable[Index].VirtualBase = MORELLO_GICR_BASE;
VirtualMemoryTable[Index].Length = MORELLO_GICR_SZ;
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
LOG_MEM ("GICR-600 : 0x%016lx - 0x%016lx [ 0x%016lx ] { %a }\n");
// SubSystem non-secure SRAM
VirtualMemoryTable[++Index].PhysicalBase = MORELLO_NON_SECURE_SRAM_BASE;
VirtualMemoryTable[Index].VirtualBase = MORELLO_NON_SECURE_SRAM_BASE;
VirtualMemoryTable[Index].Length = MORELLO_NON_SECURE_SRAM_SZ;
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED;
LOG_MEM ("non-secure SRAM : 0x%016lx - 0x%016lx [ 0x%016lx ] { %a }\n");
// SubSystem Pheripherals - UART0
VirtualMemoryTable[++Index].PhysicalBase = MORELLO_UART0_BASE;
VirtualMemoryTable[Index].VirtualBase = MORELLO_UART0_BASE;
VirtualMemoryTable[Index].Length = MORELLO_UART0_SZ;
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
LOG_MEM ("UART0 : 0x%016lx - 0x%016lx [ 0x%016lx ] { %a }\n");
// DDR Primary
VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdSystemMemoryBase);
VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdSystemMemoryBase);
VirtualMemoryTable[Index].Length = PcdGet64 (PcdSystemMemorySize);
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
LOG_MEM ("DDR Primary : 0x%016lx - 0x%016lx [ 0x%016lx ] { %a }\n");
// DDR Secondary
if (DramBlock2Size != 0) {
VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdDramBlock2Base);
VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdDramBlock2Base);
VirtualMemoryTable[Index].Length = DramBlock2Size;
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
LOG_MEM ("DDR Secondary : 0x%016lx - 0x%016lx [ 0x%016lx ] { %a }\n");
}
// Expansion Peripherals
VirtualMemoryTable[++Index].PhysicalBase = MORELLO_EXP_PERIPH_BASE;
VirtualMemoryTable[Index].VirtualBase = MORELLO_EXP_PERIPH_BASE;
VirtualMemoryTable[Index].Length = MORELLO_EXP_PERIPH_BASE_SZ;
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
LOG_MEM ("Expansion Peripherals : 0x%016lx - 0x%016lx [ 0x%016lx ] { %a }\n");
// PCI Configuration Space
VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdPciExpressBaseAddress);
VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdPciExpressBaseAddress);
VirtualMemoryTable[Index].Length = (FixedPcdGet32 (PcdPciBusMax) -
FixedPcdGet32 (PcdPciBusMin) + 1) *
SIZE_1MB;
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
LOG_MEM ("PCI Configuration Space : 0x%016lx - 0x%016lx [ 0x%016lx ] { %a }\n");
// PCI MMIO32/IO Space
VirtualMemoryTable[++Index].PhysicalBase = PcdGet32 (PcdPciMmio32Base);
VirtualMemoryTable[Index].VirtualBase = PcdGet32 (PcdPciMmio32Base);
VirtualMemoryTable[Index].Length = PcdGet32 (PcdPciMmio32Size) +
PcdGet32 (PcdPciIoSize);
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
LOG_MEM ("PCI MMIO32 & IO Region : 0x%016lx - 0x%016lx [ 0x%016lx ] { %a }\n");
// PCI MMIO64 Space
VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdPciMmio64Base);
VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdPciMmio64Base);
VirtualMemoryTable[Index].Length = PcdGet64 (PcdPciMmio64Size);
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
LOG_MEM ("PCI MMIO64 Region : 0x%016lx - 0x%016lx [ 0x%016lx ] { %a }\n");
// End of Table
VirtualMemoryTable[++Index].PhysicalBase = 0;
VirtualMemoryTable[Index].VirtualBase = 0;
VirtualMemoryTable[Index].Length = 0;
VirtualMemoryTable[Index].Attributes = (ARM_MEMORY_REGION_ATTRIBUTES)0;
ASSERT ((Index) < MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS);
DEBUG ((DEBUG_INIT, "Virtual Memory Table setup complete.\n"));
*VirtualMemoryMap = VirtualMemoryTable;
}