]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPlatformPkg/ArmJunoPkg/Library/ArmJunoLib/ArmJunoMem.c
ArmPlatformPkg: remove EFI_MEMORY_UC attribute from normal memory
[mirror_edk2.git] / ArmPlatformPkg / ArmJunoPkg / Library / ArmJunoLib / ArmJunoMem.c
1 /** @file
2 *
3 * Copyright (c) 2013-2015, ARM Limited. All rights reserved.
4 *
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
9 *
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.
12 *
13 **/
14
15 #include <Library/ArmPlatformLib.h>
16 #include <Library/DebugLib.h>
17 #include <Library/HobLib.h>
18 #include <Library/PcdLib.h>
19 #include <Library/IoLib.h>
20 #include <Library/MemoryAllocationLib.h>
21
22 #include <ArmPlatform.h>
23
24 // The total number of descriptors, including the final "end-of-table" descriptor.
25 #define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 16
26
27 // DDR attributes
28 #define DDR_ATTRIBUTES_CACHED ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK
29 #define DDR_ATTRIBUTES_UNCACHED ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED
30
31 /**
32 Return the Virtual Memory Map of your platform
33
34 This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU on your platform.
35
36 @param[out] VirtualMemoryMap Array of ARM_MEMORY_REGION_DESCRIPTOR describing a Physical-to-
37 Virtual Memory mapping. This array must be ended by a zero-filled
38 entry
39
40 **/
41 VOID
42 ArmPlatformGetVirtualMemoryMap (
43 IN ARM_MEMORY_REGION_DESCRIPTOR** VirtualMemoryMap
44 )
45 {
46 ARM_MEMORY_REGION_ATTRIBUTES CacheAttributes;
47 UINTN Index = 0;
48 ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable;
49 EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttributes;
50
51 ASSERT (VirtualMemoryMap != NULL);
52
53 //
54 // Declared the additional 6GB of memory
55 //
56 ResourceAttributes =
57 EFI_RESOURCE_ATTRIBUTE_PRESENT |
58 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
59 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
60 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
61 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |
62 EFI_RESOURCE_ATTRIBUTE_TESTED;
63
64 BuildResourceDescriptorHob (
65 EFI_RESOURCE_SYSTEM_MEMORY,
66 ResourceAttributes,
67 ARM_JUNO_EXTRA_SYSTEM_MEMORY_BASE,
68 ARM_JUNO_EXTRA_SYSTEM_MEMORY_SZ);
69
70 VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR*)AllocatePages(EFI_SIZE_TO_PAGES (sizeof(ARM_MEMORY_REGION_DESCRIPTOR) * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS));
71 if (VirtualMemoryTable == NULL) {
72 return;
73 }
74
75 if (FeaturePcdGet(PcdCacheEnable) == TRUE) {
76 CacheAttributes = DDR_ATTRIBUTES_CACHED;
77 } else {
78 CacheAttributes = DDR_ATTRIBUTES_UNCACHED;
79 }
80
81 // SMB CS0 - NOR0 Flash
82 VirtualMemoryTable[Index].PhysicalBase = ARM_VE_SMB_NOR0_BASE;
83 VirtualMemoryTable[Index].VirtualBase = ARM_VE_SMB_NOR0_BASE;
84 VirtualMemoryTable[Index].Length = SIZE_256KB * 255;
85 VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
86 // Environment Variables region
87 VirtualMemoryTable[++Index].PhysicalBase = ARM_VE_SMB_NOR0_BASE + (SIZE_256KB * 255);
88 VirtualMemoryTable[Index].VirtualBase = ARM_VE_SMB_NOR0_BASE + (SIZE_256KB * 255);
89 VirtualMemoryTable[Index].Length = SIZE_64KB * 4;
90 VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
91
92 // SMB CS2 & CS3 - Off-chip (motherboard) peripherals
93 VirtualMemoryTable[++Index].PhysicalBase = ARM_VE_SMB_PERIPH_BASE;
94 VirtualMemoryTable[Index].VirtualBase = ARM_VE_SMB_PERIPH_BASE;
95 VirtualMemoryTable[Index].Length = ARM_VE_SMB_PERIPH_SZ;
96 VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
97
98 // Juno OnChip non-secure ROM
99 VirtualMemoryTable[++Index].PhysicalBase = ARM_JUNO_NON_SECURE_ROM_BASE;
100 VirtualMemoryTable[Index].VirtualBase = ARM_JUNO_NON_SECURE_ROM_BASE;
101 VirtualMemoryTable[Index].Length = ARM_JUNO_NON_SECURE_ROM_SZ;
102 VirtualMemoryTable[Index].Attributes = CacheAttributes;
103
104 // Juno OnChip peripherals
105 VirtualMemoryTable[++Index].PhysicalBase = ARM_JUNO_PERIPHERALS_BASE;
106 VirtualMemoryTable[Index].VirtualBase = ARM_JUNO_PERIPHERALS_BASE;
107 VirtualMemoryTable[Index].Length = ARM_JUNO_PERIPHERALS_SZ;
108 VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
109
110 // Juno OnChip non-secure SRAM
111 VirtualMemoryTable[++Index].PhysicalBase = ARM_JUNO_NON_SECURE_SRAM_BASE;
112 VirtualMemoryTable[Index].VirtualBase = ARM_JUNO_NON_SECURE_SRAM_BASE;
113 VirtualMemoryTable[Index].Length = ARM_JUNO_NON_SECURE_SRAM_SZ;
114 VirtualMemoryTable[Index].Attributes = CacheAttributes;
115
116 // PCI Root Complex
117 VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdPcieControlBaseAddress);
118 VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdPcieControlBaseAddress);
119 VirtualMemoryTable[Index].Length = SIZE_128KB;
120 VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
121
122 //
123 // PCI Configuration Space
124 //
125 VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdPciConfigurationSpaceBaseAddress);
126 VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdPciConfigurationSpaceBaseAddress);
127 VirtualMemoryTable[Index].Length = PcdGet64 (PcdPciConfigurationSpaceSize);
128 VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
129
130 //
131 // PCI Memory Space
132 //
133 VirtualMemoryTable[++Index].PhysicalBase = PcdGet32 (PcdPciMmio32Base);
134 VirtualMemoryTable[Index].VirtualBase = PcdGet32 (PcdPciMmio32Base);
135 VirtualMemoryTable[Index].Length = PcdGet32 (PcdPciMmio32Size);
136 VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
137
138 //
139 // 64-bit PCI Memory Space
140 //
141 VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdPciMmio64Base);
142 VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdPciMmio64Base);
143 VirtualMemoryTable[Index].Length = PcdGet64 (PcdPciMmio64Size);
144 VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
145
146 // Juno SOC peripherals
147 VirtualMemoryTable[++Index].PhysicalBase = ARM_JUNO_SOC_PERIPHERALS_BASE;
148 VirtualMemoryTable[Index].VirtualBase = ARM_JUNO_SOC_PERIPHERALS_BASE;
149 VirtualMemoryTable[Index].Length = ARM_JUNO_SOC_PERIPHERALS_SZ;
150 VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
151
152 // DDR - 2GB
153 VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdSystemMemoryBase);
154 VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdSystemMemoryBase);
155 VirtualMemoryTable[Index].Length = PcdGet64 (PcdSystemMemorySize);
156 VirtualMemoryTable[Index].Attributes = CacheAttributes;
157
158 // DDR - 6GB
159 VirtualMemoryTable[++Index].PhysicalBase = ARM_JUNO_EXTRA_SYSTEM_MEMORY_BASE;
160 VirtualMemoryTable[Index].VirtualBase = ARM_JUNO_EXTRA_SYSTEM_MEMORY_BASE;
161 VirtualMemoryTable[Index].Length = ARM_JUNO_EXTRA_SYSTEM_MEMORY_SZ;
162 VirtualMemoryTable[Index].Attributes = CacheAttributes;
163
164 // End of Table
165 VirtualMemoryTable[++Index].PhysicalBase = 0;
166 VirtualMemoryTable[Index].VirtualBase = 0;
167 VirtualMemoryTable[Index].Length = 0;
168 VirtualMemoryTable[Index].Attributes = (ARM_MEMORY_REGION_ATTRIBUTES)0;
169
170 ASSERT((Index + 1) <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS);
171
172 *VirtualMemoryMap = VirtualMemoryTable;
173 }