]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/FspSupport/Library/PeiFspHobProcessLibVlv2/FspHobProcessLibVlv2.c
Sync the branch changes to trunk.
[mirror_edk2.git] / Vlv2TbltDevicePkg / FspSupport / Library / PeiFspHobProcessLibVlv2 / FspHobProcessLibVlv2.c
CommitLineData
3cbfba02
DW
1/** @file\r
2 Null instance of Platform Sec Lib.\r
3\r
4 Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\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 <PiPei.h>\r
16\r
17#include <Library/PeiServicesLib.h>\r
18#include <Library/PeiServicesTablePointerLib.h>\r
19#include <Library/BaseLib.h>\r
20#include <Library/DebugLib.h>\r
21#include <Library/BaseMemoryLib.h>\r
22#include <Library/HobLib.h>\r
23#include <Library/PcdLib.h>\r
24#include <Library/FspPlatformInfoLib.h>\r
25\r
26#include <Guid/GuidHobFsp.h>\r
27#include <Guid/MemoryTypeInformation.h>\r
28#include <Ppi/Capsule.h>\r
29\r
30#include <PlatformFspLib.h>\r
31#include <Guid/SmramMemoryReserve.h>\r
32EFI_GUID gFspReservedMemoryResourceHobTsegGuid = {0xd038747c, 0xd00c, 0x4980, {0xb3, 0x19, 0x49, 0x01, 0x99, 0xa4, 0x7d, 0x55}};\r
33\r
34//\r
35// Additional pages are used by DXE memory manager.\r
36// It should be consistent between RetrieveRequiredMemorySize() and GetPeiMemSize()\r
37//\r
38#define PEI_ADDITIONAL_MEMORY_SIZE (16 * EFI_PAGE_SIZE)\r
39\r
40/**\r
41 Get the mem size in memory type infromation table.\r
42\r
43 @param PeiServices PEI Services table.\r
44\r
45 @return the mem size in memory type infromation table.\r
46**/\r
47UINT64\r
48GetMemorySizeInMemoryTypeInformation (\r
49 IN EFI_PEI_SERVICES **PeiServices\r
50 )\r
51{\r
52 EFI_STATUS Status;\r
53 EFI_PEI_HOB_POINTERS Hob;\r
54 EFI_MEMORY_TYPE_INFORMATION *MemoryData;\r
55 UINT8 Index;\r
56 UINTN TempPageNum;\r
57\r
58 MemoryData = NULL;\r
59 Status = (*PeiServices)->GetHobList (PeiServices, (VOID **) &Hob.Raw);\r
60 while (!END_OF_HOB_LIST (Hob)) {\r
61 if (Hob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION &&\r
62 CompareGuid (&Hob.Guid->Name, &gEfiMemoryTypeInformationGuid)) {\r
63 MemoryData = (EFI_MEMORY_TYPE_INFORMATION *) (Hob.Raw + sizeof (EFI_HOB_GENERIC_HEADER) + sizeof (EFI_GUID));\r
64 break;\r
65 }\r
66\r
67 Hob.Raw = GET_NEXT_HOB (Hob);\r
68 }\r
69\r
70 if (MemoryData == NULL) {\r
71 return 0;\r
72 }\r
73\r
74 TempPageNum = 0;\r
75 for (Index = 0; MemoryData[Index].Type != EfiMaxMemoryType; Index++) {\r
76 //\r
77 // Accumulate default memory size requirements\r
78 //\r
79 TempPageNum += MemoryData[Index].NumberOfPages;\r
80 }\r
81\r
82 return TempPageNum * EFI_PAGE_SIZE;\r
83}\r
84\r
85/**\r
86 Get the mem size need to be reserved in PEI phase.\r
87\r
88 @param PeiServices PEI Services table.\r
89\r
90 @return the mem size need to be reserved in PEI phase.\r
91**/\r
92UINT64\r
93RetrieveRequiredMemorySize (\r
94 IN EFI_PEI_SERVICES **PeiServices\r
95 )\r
96{\r
97 UINT64 Size;\r
98\r
99 Size = GetMemorySizeInMemoryTypeInformation (PeiServices);\r
100 return Size + PEI_ADDITIONAL_MEMORY_SIZE;\r
101}\r
102\r
103/**\r
104 Get the mem size need to be consumed and reserved in PEI phase.\r
105\r
106 @param PeiServices PEI Services table.\r
107 @param BootMode Current boot mode.\r
108\r
109 @return the mem size need to be consumed and reserved in PEI phase.\r
110**/\r
111UINT64\r
112GetPeiMemSize (\r
113 IN EFI_PEI_SERVICES **PeiServices,\r
114 IN UINT32 BootMode\r
115 )\r
116{\r
117 UINT64 Size;\r
118 UINT64 MinSize;\r
119\r
120 if (BootMode == BOOT_IN_RECOVERY_MODE) {\r
121 return PcdGet32 (PcdPeiRecoveryMinMemSize);\r
122 }\r
123\r
124 Size = GetMemorySizeInMemoryTypeInformation (PeiServices);\r
125\r
126 if (BootMode == BOOT_ON_FLASH_UPDATE) {\r
127 //\r
128 // Maybe more size when in CapsuleUpdate phase ?\r
129 //\r
130 MinSize = PcdGet32 (PcdPeiMinMemSize);\r
131 } else {\r
132 MinSize = PcdGet32 (PcdPeiMinMemSize);\r
133 }\r
134\r
135 return MinSize + Size + PEI_ADDITIONAL_MEMORY_SIZE;\r
136}\r
137\r
138/**\r
139 BIOS process FspBobList.\r
140\r
141 @param FspHobList Pointer to the HOB data structure produced by FSP.\r
142\r
143 @return If platform process the FSP hob list successfully.\r
144**/\r
145EFI_STATUS\r
146EFIAPI\r
359497b7 147FspHobProcessForMemoryResource (\r
3cbfba02
DW
148 IN VOID *FspHobList\r
149 )\r
150{\r
151 EFI_PEI_HOB_POINTERS Hob;\r
152 UINT64 LowMemorySize;\r
153 UINT64 FspMemorySize;\r
154 EFI_PHYSICAL_ADDRESS FspMemoryBase;\r
155 UINT64 PeiMemSize;\r
156 EFI_PHYSICAL_ADDRESS PeiMemBase;\r
157 UINT64 S3PeiMemSize;\r
158 EFI_PHYSICAL_ADDRESS S3PeiMemBase;\r
159 BOOLEAN FoundFspMemHob;\r
160 EFI_STATUS Status;\r
161 EFI_BOOT_MODE BootMode;\r
162 PEI_CAPSULE_PPI *Capsule;\r
163 VOID *CapsuleBuffer;\r
164 UINTN CapsuleBufferLength;\r
165 UINT64 RequiredMemSize;\r
166 EFI_PEI_SERVICES **PeiServices;\r
167 UINT64 TsegSize;\r
168 EFI_PHYSICAL_ADDRESS TsegBase;\r
169 BOOLEAN FoundTsegHob;\r
170\r
171 PeiServices = (EFI_PEI_SERVICES **)GetPeiServicesTablePointer ();\r
172\r
173 PeiServicesGetBootMode (&BootMode);\r
174\r
175 PeiMemBase = 0;\r
176 LowMemorySize = 0;\r
177 FspMemorySize = 0;\r
178 FspMemoryBase = 0;\r
179 FoundFspMemHob = FALSE;\r
180 TsegSize = 0;\r
181 TsegBase = 0;\r
182 FoundTsegHob = FALSE;\r
183\r
184 //\r
185 // Parse the hob list from fsp\r
186 // Report all the resource hob except the memory between 1M and 4G\r
187 //\r
188 Hob.Raw = (UINT8 *)(UINTN)FspHobList;\r
189 DEBUG((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));\r
190\r
191 while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw)) != NULL) {\r
192 DEBUG((DEBUG_INFO, "\nResourceType: 0x%x\n", Hob.ResourceDescriptor->ResourceType));\r
193 if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) ||\r
194 (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED)) {\r
195 DEBUG((DEBUG_INFO, "ResourceAttribute: 0x%x\n", Hob.ResourceDescriptor->ResourceAttribute));\r
196 DEBUG((DEBUG_INFO, "PhysicalStart: 0x%x\n", Hob.ResourceDescriptor->PhysicalStart));\r
197 DEBUG((DEBUG_INFO, "ResourceLength: 0x%x\n", Hob.ResourceDescriptor->ResourceLength));\r
198 DEBUG((DEBUG_INFO, "Owner: %g\n\n", &Hob.ResourceDescriptor->Owner));\r
199 }\r
200\r
201 if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) // Found the low memory length below 4G\r
202 && (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB)\r
203 && (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= BASE_4GB)) {\r
204 LowMemorySize += Hob.ResourceDescriptor->ResourceLength;\r
205 Hob.Raw = GET_NEXT_HOB (Hob);\r
206 continue;\r
207 }\r
208\r
209 if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED) // Found the low memory length below 4G\r
210 && (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB)\r
211 && (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= BASE_4GB)\r
212 && (CompareGuid (&Hob.ResourceDescriptor->Owner, &gFspReservedMemoryResourceHobGuid))) {\r
213 FoundFspMemHob = TRUE;\r
214 FspMemoryBase = Hob.ResourceDescriptor->PhysicalStart;\r
215 FspMemorySize = Hob.ResourceDescriptor->ResourceLength;\r
216 DEBUG((DEBUG_INFO, "Find fsp mem hob, base 0x%x, len 0x%x\n", FspMemoryBase, FspMemorySize));\r
217 }\r
218\r
219 if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED) // Found the low memory length below 4G\r
220 && (Hob.ResourceDescriptor->PhysicalStart >= 0x100000)\r
221 && (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= 0x100000000)\r
222 && (CompareGuid (&Hob.ResourceDescriptor->Owner, &gFspReservedMemoryResourceHobTsegGuid))) {\r
223 FoundTsegHob = TRUE;\r
224 TsegBase = Hob.ResourceDescriptor->PhysicalStart;\r
225\r
226\r
227 if ((Hob.ResourceDescriptor->ResourceLength == 0 ) || (Hob.ResourceDescriptor->ResourceLength > 0x800000)){\r
228 Hob.ResourceDescriptor->ResourceLength = 0x800000;\r
229 }\r
230\r
231\r
232 TsegSize = Hob.ResourceDescriptor->ResourceLength;\r
233 DEBUG((EFI_D_ERROR, "Find Tseg mem hob, base 0x%lx, len 0x%lx\n", TsegBase, TsegSize));\r
234 }\r
235\r
236 //\r
237 // Report the resource hob\r
238 //\r
239 BuildResourceDescriptorHob (\r
240 Hob.ResourceDescriptor->ResourceType,\r
241 Hob.ResourceDescriptor->ResourceAttribute,\r
242 Hob.ResourceDescriptor->PhysicalStart,\r
243 Hob.ResourceDescriptor->ResourceLength\r
244 );\r
245\r
246 Hob.Raw = GET_NEXT_HOB (Hob);\r
247 }\r
248\r
249 if (!FoundFspMemHob) {\r
250 DEBUG((DEBUG_INFO, "Didn't find the fsp used memory information.\n"));\r
251 //ASSERT(FALSE);\r
252 }\r
253\r
254 DEBUG((DEBUG_INFO, "LowMemorySize: 0x%x.\n", LowMemorySize));\r
255 DEBUG((DEBUG_INFO, "FspMemoryBase: 0x%x.\n", FspMemoryBase));\r
256 DEBUG((DEBUG_INFO, "FspMemorySize: 0x%x.\n", FspMemorySize));\r
257\r
258 if (BootMode == BOOT_ON_S3_RESUME) {\r
259 BuildResourceDescriptorHob (\r
260 EFI_RESOURCE_SYSTEM_MEMORY,\r
261 (\r
262 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
263 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
264 // EFI_RESOURCE_ATTRIBUTE_TESTED |\r
265 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
266 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
267 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
268 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
269 ),\r
270 BASE_1MB,\r
271 LowMemorySize\r
272 );\r
273\r
274 Status = GetS3MemoryInfo (&S3PeiMemBase, &S3PeiMemSize);\r
275 ASSERT_EFI_ERROR (Status);\r
276 DEBUG((DEBUG_INFO, "S3 memory %Xh - %Xh bytes\n", S3PeiMemBase, S3PeiMemSize));\r
277\r
278 //\r
279 // Make sure Stack and PeiMemory are not overlap - JYAO1\r
280 //\r
281\r
282 Status = PeiServicesInstallPeiMemory (\r
283 S3PeiMemBase,\r
284 S3PeiMemSize\r
285 );\r
286 ASSERT_EFI_ERROR (Status);\r
287 } else {\r
288 PeiMemSize = GetPeiMemSize (PeiServices, BootMode);\r
289 DEBUG((DEBUG_INFO, "PEI memory size = %Xh bytes\n", PeiMemSize));\r
290\r
291 //\r
292 // Capsule mode\r
293 //\r
294 Capsule = NULL;\r
295 CapsuleBuffer = NULL;\r
296 CapsuleBufferLength = 0;\r
297 if (BootMode == BOOT_ON_FLASH_UPDATE) {\r
298 Status = PeiServicesLocatePpi (\r
299 &gPeiCapsulePpiGuid,\r
300 0,\r
301 NULL,\r
302 (VOID **) &Capsule\r
303 );\r
304 ASSERT_EFI_ERROR (Status);\r
305\r
306 if (Status == EFI_SUCCESS) {\r
307 //\r
308 // Make sure Stack and CapsuleBuffer are not overlap - JYAO1\r
309 //\r
310 CapsuleBuffer = (VOID *)(UINTN)BASE_1MB;\r
311 CapsuleBufferLength = (UINTN)(LowMemorySize - PeiMemSize);\r
312 //\r
313 // Call the Capsule PPI Coalesce function to coalesce the capsule data.\r
314 //\r
315 Status = Capsule->Coalesce (PeiServices, &CapsuleBuffer, &CapsuleBufferLength);\r
316 }\r
317 }\r
318\r
319 RequiredMemSize = RetrieveRequiredMemorySize (PeiServices);\r
320 DEBUG((DEBUG_INFO, "Required memory size = %Xh bytes\n", RequiredMemSize));\r
321\r
322 //\r
323 // Report the main memory\r
324 //\r
325 BuildResourceDescriptorHob (\r
326 EFI_RESOURCE_SYSTEM_MEMORY,\r
327 (\r
328 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
329 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
330 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
331 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
332 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
333 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
334 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
335 ),\r
336 BASE_1MB,\r
337 LowMemorySize\r
338 );\r
339\r
340 //\r
341 // Make sure Stack and CapsuleBuffer are not overlap - JYAO1\r
342 //\r
343\r
344 //\r
345 // Install efi memory\r
346 //\r
347 PeiMemBase = BASE_1MB + LowMemorySize - PeiMemSize;\r
348 Status = PeiServicesInstallPeiMemory (\r
349 PeiMemBase,\r
350 PeiMemSize - RequiredMemSize\r
351 );\r
352 ASSERT_EFI_ERROR (Status);\r
353\r
354 if (Capsule != NULL) {\r
355 Status = Capsule->CreateState (PeiServices, CapsuleBuffer, CapsuleBufferLength);\r
356 }\r
357 }\r
358\r
359 //\r
360 // Report GUIDed HOB for reserving SMRAM regions\r
361 //\r
362 if (FoundTsegHob) {\r
363 EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *SmramHobDescriptorBlock;\r
364\r
365 SmramHobDescriptorBlock = BuildGuidHob (\r
366 &gEfiSmmPeiSmramMemoryReserveGuid,\r
367 sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK)\r
368 );\r
369 ASSERT (SmramHobDescriptorBlock != NULL);\r
370\r
371 SmramHobDescriptorBlock->NumberOfSmmReservedRegions = 1;\r
372\r
373 SmramHobDescriptorBlock->Descriptor[0].PhysicalStart = TsegBase;\r
374 SmramHobDescriptorBlock->Descriptor[0].CpuStart = TsegBase;\r
375 SmramHobDescriptorBlock->Descriptor[0].PhysicalSize = TsegSize;\r
376 SmramHobDescriptorBlock->Descriptor[0].RegionState = EFI_SMRAM_CLOSED;\r
377 }\r
359497b7
TH
378 return EFI_SUCCESS;\r
379}\r
380\r
381/**\r
382 BIOS process FspBobList for other data (not Memory Resource Descriptor).\r
383\r
384 @param[in] FspHobList Pointer to the HOB data structure produced by FSP.\r
385\r
386 @return If platform process the FSP hob list successfully.\r
387**/\r
388EFI_STATUS\r
389EFIAPI\r
390FspHobProcessForOtherData (\r
391 IN VOID *FspHobList\r
392 )\r
393{\r
394 EFI_PEI_SERVICES **PeiServices;\r
395\r
396 PeiServices = (EFI_PEI_SERVICES **)GetPeiServicesTablePointer ();\r
397\r
3cbfba02
DW
398 //\r
399 // Other hob for platform\r
400 //\r
401 PlatformHobCreateFromFsp ( PeiServices, FspHobList);\r
402\r
403 return EFI_SUCCESS;\r
404}\r
359497b7
TH
405\r
406/**\r
407 BIOS process FspBobList.\r
408\r
409 @param[in] FspHobList Pointer to the HOB data structure produced by FSP.\r
410\r
411 @return If platform process the FSP hob list successfully.\r
412**/\r
413EFI_STATUS\r
414EFIAPI\r
415FspHobProcess (\r
416 IN VOID *FspHobList\r
417 )\r
418{\r
419 EFI_STATUS Status;\r
420\r
421 Status = FspHobProcessForMemoryResource (FspHobList);\r
422 if (EFI_ERROR (Status)) {\r
423 return Status;\r
424 }\r
425 Status = FspHobProcessForOtherData (FspHobList);\r
426\r
427 return Status;\r
428}\r