/** @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; }