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