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