/******************************************************************************* | |
Copyright (C) 2016 Marvell International Ltd. | |
Marvell BSD License Option | |
If you received this File from Marvell, you may opt to use, redistribute and/or | |
modify this File under the following licensing terms. | |
Redistribution and use in source and binary forms, with or without modification, | |
are permitted provided that the following conditions are met: | |
* Redistributions of source code must retain the above copyright notice, | |
this list of conditions and the following disclaimer. | |
* Redistributions in binary form must reproduce the above copyright | |
notice, this list of conditions and the following disclaimer in the | |
documentation and/or other materials provided with the distribution. | |
* Neither the name of Marvell nor the names of its contributors may be | |
used to endorse or promote products derived from this software without | |
specific prior written permission. | |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | |
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
*******************************************************************************/ | |
#include <Base.h> | |
#include <Library/ArmPlatformLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
// The total number of descriptors, including the final "end-of-table" descriptor. | |
#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 16 | |
// DDR attributes | |
#define DDR_ATTRIBUTES_CACHED ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK | |
#define DDR_ATTRIBUTES_UNCACHED ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED | |
/** | |
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 | |
**/ | |
VOID | |
ArmPlatformGetVirtualMemoryMap ( | |
IN ARM_MEMORY_REGION_DESCRIPTOR** VirtualMemoryMap | |
) | |
{ | |
ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable; | |
UINTN 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; | |
} | |
// DDR | |
VirtualMemoryTable[Index].PhysicalBase = PcdGet64 (PcdSystemMemoryBase); | |
VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdSystemMemoryBase); | |
VirtualMemoryTable[Index].Length = PcdGet64 (PcdSystemMemorySize); | |
VirtualMemoryTable[Index].Attributes = DDR_ATTRIBUTES_CACHED; | |
// Configuration space 0xF000_0000 - 0xFFFF_FFFF | |
VirtualMemoryTable[++Index].PhysicalBase = 0xF0000000; | |
VirtualMemoryTable[Index].VirtualBase = 0xF0000000; | |
VirtualMemoryTable[Index].Length = 0x10000000; | |
VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; | |
// End of Table | |
VirtualMemoryTable[++Index].PhysicalBase = 0; | |
VirtualMemoryTable[Index].VirtualBase = 0; | |
VirtualMemoryTable[Index].Length = 0; | |
VirtualMemoryTable[Index].Attributes = 0; | |
ASSERT((Index + 1) <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS); | |
*VirtualMemoryMap = VirtualMemoryTable; | |
} |