/** NxpQoriqLsMem.c * * Board memory specific Library. * * Based on BeagleBoardPkg/Library/BeagleBoardLib/BeagleBoardMem.c * * Copyright (c) 2011, ARM Limited. All rights reserved. * Copyright (c) 2016, Freescale Semiconductor, Inc. All rights reserved. * Copyright 2017, 2019-2020 NXP * * SPDX-License-Identifier: BSD-2-Clause-Patent * **/ #include #include #include #include #include #define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 25 /** 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 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 ( IN ARM_MEMORY_REGION_DESCRIPTOR **VirtualMemoryMap ) { UINTN Index; ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable; Index = 0; ASSERT (VirtualMemoryMap != NULL); VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR*)AllocatePages ( EFI_SIZE_TO_PAGES (sizeof (ARM_MEMORY_REGION_DESCRIPTOR) * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS)); if (VirtualMemoryTable == NULL) { return; } VirtualMemoryTable[Index].PhysicalBase = LS1043A_DRAM0_PHYS_ADDRESS; VirtualMemoryTable[Index].VirtualBase = LS1043A_DRAM0_PHYS_ADDRESS; VirtualMemoryTable[Index].Length = LS1043A_DRAM0_SIZE; VirtualMemoryTable[Index++].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; VirtualMemoryTable[Index].PhysicalBase = LS1043A_DRAM1_PHYS_ADDRESS; VirtualMemoryTable[Index].VirtualBase = LS1043A_DRAM1_PHYS_ADDRESS; VirtualMemoryTable[Index].Length = LS1043A_DRAM1_SIZE; VirtualMemoryTable[Index++].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; // CCSR Space VirtualMemoryTable[Index].PhysicalBase = LS1043A_CCSR_PHYS_ADDRESS; VirtualMemoryTable[Index].VirtualBase = LS1043A_CCSR_PHYS_ADDRESS; VirtualMemoryTable[Index].Length = LS1043A_CCSR_SIZE; VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; // IFC region 1 // // A-009241 : Unaligned write transactions to IFC may result in corruption of data // Affects : IFC // Description: 16 byte unaligned write from system bus to IFC may result in extra unintended // writes on external IFC interface that can corrupt data on external flash. // Impact : Data corruption on external flash may happen in case of unaligned writes to // IFC memory space. // Workaround: Following are the workarounds: // For write transactions from core, IFC interface memories (including IFC SRAM) // should be configured as device type memory in MMU. // For write transactions from non-core masters (like system DMA), the address // should be 16 byte aligned and the data size should be multiple of 16 bytes. // VirtualMemoryTable[++Index].PhysicalBase = LS1043A_IFC0_PHYS_ADDRESS; VirtualMemoryTable[Index].VirtualBase = LS1043A_IFC0_PHYS_ADDRESS; VirtualMemoryTable[Index].Length = LS1043A_IFC0_SIZE; VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; // QMAN SWP VirtualMemoryTable[++Index].PhysicalBase = LS1043A_QMAN_SW_PORTAL_PHYS_ADDRESS; VirtualMemoryTable[Index].VirtualBase = LS1043A_QMAN_SW_PORTAL_PHYS_ADDRESS; VirtualMemoryTable[Index].Length = LS1043A_QMAN_SW_PORTAL_SIZE; VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED; // BMAN SWP VirtualMemoryTable[++Index].PhysicalBase = LS1043A_BMAN_SW_PORTAL_PHYS_ADDRESS; VirtualMemoryTable[Index].VirtualBase = LS1043A_BMAN_SW_PORTAL_PHYS_ADDRESS; VirtualMemoryTable[Index].Length = LS1043A_QMAN_SW_PORTAL_SIZE; VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED; // IFC region 2 VirtualMemoryTable[++Index].PhysicalBase = LS1043A_IFC1_PHYS_ADDRESS; VirtualMemoryTable[Index].VirtualBase = LS1043A_IFC1_PHYS_ADDRESS; VirtualMemoryTable[Index].Length = LS1043A_IFC1_SIZE; VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; // PCIe1 VirtualMemoryTable[++Index].PhysicalBase = LS1043A_PCI0_PHYS_ADDRESS; VirtualMemoryTable[Index].VirtualBase = LS1043A_PCI0_PHYS_ADDRESS; VirtualMemoryTable[Index].Length = LS1043A_PCI_SIZE; VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; // PCIe2 VirtualMemoryTable[++Index].PhysicalBase = LS1043A_PCI1_PHYS_ADDRESS; VirtualMemoryTable[Index].VirtualBase = LS1043A_PCI1_PHYS_ADDRESS; VirtualMemoryTable[Index].Length = LS1043A_PCI_SIZE; VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; // PCIe3 VirtualMemoryTable[++Index].PhysicalBase = LS1043A_PCI2_PHYS_ADDRESS; VirtualMemoryTable[Index].VirtualBase = LS1043A_PCI2_PHYS_ADDRESS; VirtualMemoryTable[Index].Length = LS1043A_PCI_SIZE; VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; // QSPI region VirtualMemoryTable[++Index].PhysicalBase = LS1043A_QSPI_PHYS_ADDRESS; VirtualMemoryTable[Index].VirtualBase = LS1043A_QSPI_PHYS_ADDRESS; VirtualMemoryTable[Index].Length = LS1043A_QSPI_SIZE; VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED; // 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 + 1) <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS); *VirtualMemoryMap = VirtualMemoryTable; }