3 * Copyright (c) 2014, Linaro Limited. All rights reserved.
5 * This program and the accompanying materials
6 * are licensed and made available under the terms and conditions of the BSD License
7 * which accompanies this distribution. The full text of the license may be found at
8 * http://opensource.org/licenses/bsd-license.php
10 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include <Library/ArmPlatformLib.h>
16 #include <Library/DebugLib.h>
17 #include <Library/BaseMemoryLib.h>
18 #include <Library/PcdLib.h>
19 #include <Library/IoLib.h>
20 #include <Library/MemoryAllocationLib.h>
21 #include <Library/ArmPlatformGlobalVariableLib.h>
22 #include <ArmPlatform.h>
24 // Number of Virtual Memory Map Descriptors
25 #define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 5
28 #define DDR_ATTRIBUTES_CACHED ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK
29 #define DDR_ATTRIBUTES_UNCACHED ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED
37 Return the Virtual Memory Map of your platform
39 This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU
42 @param[out] VirtualMemoryMap Array of ARM_MEMORY_REGION_DESCRIPTOR
43 describing a Physical-to-Virtual Memory
44 mapping. This array must be ended by a
49 ArmPlatformGetVirtualMemoryMap (
50 IN ARM_MEMORY_REGION_DESCRIPTOR
** VirtualMemoryMap
53 ARM_MEMORY_REGION_ATTRIBUTES CacheAttributes
;
54 ARM_MEMORY_REGION_DESCRIPTOR
*VirtualMemoryTable
;
56 ASSERT (VirtualMemoryMap
!= NULL
);
58 VirtualMemoryTable
= AllocatePages (
60 sizeof (ARM_MEMORY_REGION_DESCRIPTOR
)
61 * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS
65 if (VirtualMemoryTable
== NULL
) {
66 DEBUG ((EFI_D_ERROR
, "%a: Error: Failed AllocatePages()\n", __FUNCTION__
));
70 if (FeaturePcdGet (PcdCacheEnable
) == TRUE
) {
71 CacheAttributes
= DDR_ATTRIBUTES_CACHED
;
73 CacheAttributes
= DDR_ATTRIBUTES_UNCACHED
;
77 VirtualMemoryTable
[0].PhysicalBase
= PcdGet64 (PcdSystemMemoryBase
);
78 VirtualMemoryTable
[0].VirtualBase
= VirtualMemoryTable
[0].PhysicalBase
;
79 VirtualMemoryTable
[0].Length
= PcdGet64 (PcdSystemMemorySize
);
80 VirtualMemoryTable
[0].Attributes
= CacheAttributes
;
82 DEBUG ((EFI_D_INFO
, "%a: Dumping System DRAM Memory Map:\n"
83 "\tPhysicalBase: 0x%lX\n"
84 "\tVirtualBase: 0x%lX\n"
87 VirtualMemoryTable
[0].PhysicalBase
,
88 VirtualMemoryTable
[0].VirtualBase
,
89 VirtualMemoryTable
[0].Length
));
91 // Peripheral space before DRAM
92 VirtualMemoryTable
[1].PhysicalBase
= 0x0;
93 VirtualMemoryTable
[1].VirtualBase
= 0x0;
94 VirtualMemoryTable
[1].Length
= VirtualMemoryTable
[0].PhysicalBase
;
95 VirtualMemoryTable
[1].Attributes
= ARM_MEMORY_REGION_ATTRIBUTE_DEVICE
;
97 // Peripheral space after DRAM
98 VirtualMemoryTable
[2].PhysicalBase
= VirtualMemoryTable
[0].Length
+ VirtualMemoryTable
[1].Length
;
99 VirtualMemoryTable
[2].VirtualBase
= VirtualMemoryTable
[2].PhysicalBase
;
100 VirtualMemoryTable
[2].Length
= ArmGetPhysAddrTop () - VirtualMemoryTable
[2].PhysicalBase
;
101 VirtualMemoryTable
[2].Attributes
= ARM_MEMORY_REGION_ATTRIBUTE_DEVICE
;
103 // Remap the FD region as normal executable memory
104 VirtualMemoryTable
[3].PhysicalBase
= FixedPcdGet64 (PcdFdBaseAddress
);
105 VirtualMemoryTable
[3].VirtualBase
= VirtualMemoryTable
[3].PhysicalBase
;
106 VirtualMemoryTable
[3].Length
= FixedPcdGet32 (PcdFdSize
);
107 VirtualMemoryTable
[3].Attributes
= CacheAttributes
;
110 ZeroMem (&VirtualMemoryTable
[4], sizeof (ARM_MEMORY_REGION_DESCRIPTOR
));
112 *VirtualMemoryMap
= VirtualMemoryTable
;