]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPlatformPkg/MemoryInitPei/MemoryInitPeiLib.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ArmPlatformPkg / MemoryInitPei / MemoryInitPeiLib.c
CommitLineData
3a6eaccf 1/** @file\r
5a5440d0
PG
2\r
3 Copyright (c) 2011-2015, ARM Limited. All rights reserved.\r
4\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
3a6eaccf 7**/\r
8\r
9#include <PiPei.h>\r
10\r
5db1cce1 11#include <Library/ArmMmuLib.h>\r
3a6eaccf 12#include <Library/ArmPlatformLib.h>\r
13#include <Library/DebugLib.h>\r
14#include <Library/HobLib.h>\r
15#include <Library/MemoryAllocationLib.h>\r
16#include <Library/PcdLib.h>\r
17\r
3a6eaccf 18VOID\r
19BuildMemoryTypeInformationHob (\r
20 VOID\r
21 );\r
22\r
40a3f38f 23STATIC\r
3a6eaccf 24VOID\r
25InitMmu (\r
40a3f38f 26 IN ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable\r
3a6eaccf 27 )\r
28{\r
40b0b23e
MK
29 VOID *TranslationTableBase;\r
30 UINTN TranslationTableSize;\r
31 RETURN_STATUS Status;\r
40a3f38f 32\r
40b0b23e 33 // Note: Because we called PeiServicesInstallPeiMemory() before to call InitMmu() the MMU Page Table resides in\r
3a6eaccf 34 // DRAM (even at the top of DRAM as it is the first permanent memory allocation)\r
6f050ad6
OM
35 Status = ArmConfigureMmu (MemoryTable, &TranslationTableBase, &TranslationTableSize);\r
36 if (EFI_ERROR (Status)) {\r
1d2482e1 37 DEBUG ((DEBUG_ERROR, "Error: Failed to enable MMU\n"));\r
6f050ad6 38 }\r
3a6eaccf 39}\r
40\r
41/*++\r
42\r
43Routine Description:\r
44\r
45\r
46\r
47Arguments:\r
48\r
49 FileHandle - Handle of the file being invoked.\r
50 PeiServices - Describes the list of possible PEI Services.\r
51\r
52Returns:\r
53\r
54 Status - EFI_SUCCESS if the boot mode could be set\r
55\r
56--*/\r
57EFI_STATUS\r
58EFIAPI\r
59MemoryPeim (\r
40b0b23e
MK
60 IN EFI_PHYSICAL_ADDRESS UefiMemoryBase,\r
61 IN UINT64 UefiMemorySize\r
3a6eaccf 62 )\r
63{\r
40b0b23e
MK
64 ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable;\r
65 EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttributes;\r
66 UINT64 ResourceLength;\r
67 EFI_PEI_HOB_POINTERS NextHob;\r
68 EFI_PHYSICAL_ADDRESS FdTop;\r
69 EFI_PHYSICAL_ADDRESS SystemMemoryTop;\r
70 EFI_PHYSICAL_ADDRESS ResourceTop;\r
71 BOOLEAN Found;\r
40a3f38f
OM
72\r
73 // Get Virtual Memory Map from the Platform Library\r
74 ArmPlatformGetVirtualMemoryMap (&MemoryTable);\r
3a6eaccf 75\r
76 // Ensure PcdSystemMemorySize has been set\r
c357fd6a 77 ASSERT (PcdGet64 (PcdSystemMemorySize) != 0);\r
3a6eaccf 78\r
3a6eaccf 79 //\r
80 // Now, the permanent memory has been installed, we can call AllocatePages()\r
81 //\r
d269095b 82 ResourceAttributes = (\r
40b0b23e
MK
83 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
84 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
85 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
86 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
87 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |\r
88 EFI_RESOURCE_ATTRIBUTE_TESTED\r
89 );\r
3a6eaccf 90\r
40a3f38f
OM
91 //\r
92 // Check if the resource for the main system memory has been declared\r
93 //\r
40b0b23e 94 Found = FALSE;\r
40a3f38f
OM
95 NextHob.Raw = GetHobList ();\r
96 while ((NextHob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, NextHob.Raw)) != NULL) {\r
97 if ((NextHob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) &&\r
98 (PcdGet64 (PcdSystemMemoryBase) >= NextHob.ResourceDescriptor->PhysicalStart) &&\r
99 (NextHob.ResourceDescriptor->PhysicalStart + NextHob.ResourceDescriptor->ResourceLength <= PcdGet64 (PcdSystemMemoryBase) + PcdGet64 (PcdSystemMemorySize)))\r
100 {\r
101 Found = TRUE;\r
102 break;\r
103 }\r
40b0b23e 104\r
40a3f38f
OM
105 NextHob.Raw = GET_NEXT_HOB (NextHob);\r
106 }\r
107\r
108 if (!Found) {\r
109 // Reserved the memory space occupied by the firmware volume\r
110 BuildResourceDescriptorHob (\r
40b0b23e
MK
111 EFI_RESOURCE_SYSTEM_MEMORY,\r
112 ResourceAttributes,\r
113 PcdGet64 (PcdSystemMemoryBase),\r
114 PcdGet64 (PcdSystemMemorySize)\r
115 );\r
40a3f38f
OM
116 }\r
117\r
e7f0a829
AB
118 //\r
119 // Reserved the memory space occupied by the firmware volume\r
120 //\r
121\r
122 SystemMemoryTop = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdSystemMemoryBase) + (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdSystemMemorySize);\r
40b0b23e 123 FdTop = (EFI_PHYSICAL_ADDRESS)PcdGet64 (PcdFdBaseAddress) + (EFI_PHYSICAL_ADDRESS)PcdGet32 (PcdFdSize);\r
e7f0a829
AB
124\r
125 // EDK2 does not have the concept of boot firmware copied into DRAM. To avoid the DXE\r
44d2e8d7
AB
126 // core to overwrite this area we must create a memory allocation HOB for the region,\r
127 // but this only works if we split off the underlying resource descriptor as well.\r
e7f0a829
AB
128 if ((PcdGet64 (PcdFdBaseAddress) >= PcdGet64 (PcdSystemMemoryBase)) && (FdTop <= SystemMemoryTop)) {\r
129 Found = FALSE;\r
130\r
131 // Search for System Memory Hob that contains the firmware\r
132 NextHob.Raw = GetHobList ();\r
133 while ((NextHob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, NextHob.Raw)) != NULL) {\r
134 if ((NextHob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) &&\r
135 (PcdGet64 (PcdFdBaseAddress) >= NextHob.ResourceDescriptor->PhysicalStart) &&\r
136 (FdTop <= NextHob.ResourceDescriptor->PhysicalStart + NextHob.ResourceDescriptor->ResourceLength))\r
137 {\r
138 ResourceAttributes = NextHob.ResourceDescriptor->ResourceAttribute;\r
40b0b23e
MK
139 ResourceLength = NextHob.ResourceDescriptor->ResourceLength;\r
140 ResourceTop = NextHob.ResourceDescriptor->PhysicalStart + ResourceLength;\r
e7f0a829
AB
141\r
142 if (PcdGet64 (PcdFdBaseAddress) == NextHob.ResourceDescriptor->PhysicalStart) {\r
44d2e8d7
AB
143 if (SystemMemoryTop != FdTop) {\r
144 // Create the System Memory HOB for the firmware\r
40b0b23e
MK
145 BuildResourceDescriptorHob (\r
146 EFI_RESOURCE_SYSTEM_MEMORY,\r
147 ResourceAttributes,\r
148 PcdGet64 (PcdFdBaseAddress),\r
149 PcdGet32 (PcdFdSize)\r
150 );\r
e7f0a829
AB
151\r
152 // Top of the FD is system memory available for UEFI\r
40b0b23e
MK
153 NextHob.ResourceDescriptor->PhysicalStart += PcdGet32 (PcdFdSize);\r
154 NextHob.ResourceDescriptor->ResourceLength -= PcdGet32 (PcdFdSize);\r
e7f0a829
AB
155 }\r
156 } else {\r
44d2e8d7 157 // Create the System Memory HOB for the firmware\r
40b0b23e
MK
158 BuildResourceDescriptorHob (\r
159 EFI_RESOURCE_SYSTEM_MEMORY,\r
160 ResourceAttributes,\r
161 PcdGet64 (PcdFdBaseAddress),\r
162 PcdGet32 (PcdFdSize)\r
163 );\r
e7f0a829
AB
164\r
165 // Update the HOB\r
166 NextHob.ResourceDescriptor->ResourceLength = PcdGet64 (PcdFdBaseAddress) - NextHob.ResourceDescriptor->PhysicalStart;\r
167\r
168 // If there is some memory available on the top of the FD then create a HOB\r
169 if (FdTop < NextHob.ResourceDescriptor->PhysicalStart + ResourceLength) {\r
170 // Create the System Memory HOB for the remaining region (top of the FD)\r
40b0b23e
MK
171 BuildResourceDescriptorHob (\r
172 EFI_RESOURCE_SYSTEM_MEMORY,\r
173 ResourceAttributes,\r
174 FdTop,\r
175 ResourceTop - FdTop\r
176 );\r
e7f0a829
AB
177 }\r
178 }\r
44d2e8d7
AB
179\r
180 // Mark the memory covering the Firmware Device as boot services data\r
40b0b23e
MK
181 BuildMemoryAllocationHob (\r
182 PcdGet64 (PcdFdBaseAddress),\r
183 PcdGet32 (PcdFdSize),\r
184 EfiBootServicesData\r
185 );\r
44d2e8d7 186\r
e7f0a829
AB
187 Found = TRUE;\r
188 break;\r
189 }\r
40b0b23e 190\r
e7f0a829
AB
191 NextHob.Raw = GET_NEXT_HOB (NextHob);\r
192 }\r
193\r
40b0b23e 194 ASSERT (Found);\r
e7f0a829
AB
195 }\r
196\r
3a6eaccf 197 // Build Memory Allocation Hob\r
40a3f38f 198 InitMmu (MemoryTable);\r
3a6eaccf 199\r
200 if (FeaturePcdGet (PcdPrePiProduceMemoryTypeInformationHob)) {\r
201 // Optional feature that helps prevent EFI memory map fragmentation.\r
202 BuildMemoryTypeInformationHob ();\r
203 }\r
204\r
205 return EFI_SUCCESS;\r
206}\r