]> git.proxmox.com Git - mirror_edk2.git/blame - UefiPayloadPkg/BlSupportPei/BlSupportPei.c
CryptoPkg/OpensslLib: fix VS2017 build failure
[mirror_edk2.git] / UefiPayloadPkg / BlSupportPei / BlSupportPei.c
CommitLineData
04af8bf2
DG
1/** @file\r
2 This PEIM will parse bootloader information and report resource information into pei core.\r
3 This file contains the main entrypoint of the PEIM.\r
4\r
5Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>\r
6SPDX-License-Identifier: BSD-2-Clause-Patent\r
7\r
8**/\r
9#include "BlSupportPei.h"\r
10\r
11#define LEGACY_8259_MASK_REGISTER_MASTER 0x21\r
12#define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1\r
13\r
14EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {\r
15 { EfiACPIReclaimMemory, FixedPcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory) },\r
16 { EfiACPIMemoryNVS, FixedPcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS) },\r
17 { EfiReservedMemoryType, FixedPcdGet32 (PcdMemoryTypeEfiReservedMemoryType) },\r
18 { EfiRuntimeServicesData, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesData) },\r
19 { EfiRuntimeServicesCode, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode) },\r
20 { EfiMaxMemoryType, 0 }\r
21};\r
22\r
23EFI_PEI_PPI_DESCRIPTOR mPpiBootMode[] = {\r
24 {\r
25 EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
26 &gEfiPeiMasterBootModePpiGuid,\r
27 NULL\r
28 }\r
29};\r
30\r
31EFI_PEI_GRAPHICS_DEVICE_INFO_HOB mDefaultGraphicsDeviceInfo = {\r
32 MAX_UINT16, MAX_UINT16, MAX_UINT16, MAX_UINT16, MAX_UINT8, MAX_UINT8\r
33};\r
34\r
35/**\r
36 Create memory mapped io resource hob.\r
37\r
38 @param MmioBase Base address of the memory mapped io range\r
39 @param MmioSize Length of the memory mapped io range\r
40\r
41**/\r
42VOID\r
43BuildMemoryMappedIoRangeHob (\r
44 EFI_PHYSICAL_ADDRESS MmioBase,\r
45 UINT64 MmioSize\r
46 )\r
47{\r
48 BuildResourceDescriptorHob (\r
49 EFI_RESOURCE_MEMORY_MAPPED_IO,\r
50 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
51 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
52 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
53 EFI_RESOURCE_ATTRIBUTE_TESTED),\r
54 MmioBase,\r
55 MmioSize\r
56 );\r
57\r
58 BuildMemoryAllocationHob (\r
59 MmioBase,\r
60 MmioSize,\r
61 EfiMemoryMappedIO\r
62 );\r
63}\r
64\r
65/**\r
66 Check the integrity of firmware volume header\r
67\r
68 @param[in] FwVolHeader A pointer to a firmware volume header\r
69\r
70 @retval TRUE The firmware volume is consistent\r
71 @retval FALSE The firmware volume has corrupted.\r
72\r
73**/\r
74STATIC\r
75BOOLEAN\r
76IsFvHeaderValid (\r
77 IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
78 )\r
79{\r
80 UINT16 Checksum;\r
81\r
82 // Skip nv storage fv\r
83 if (CompareMem (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem2Guid, sizeof(EFI_GUID)) != 0 ) {\r
84 return FALSE;\r
85 }\r
86\r
87 if ( (FwVolHeader->Revision != EFI_FVH_REVISION) ||\r
88 (FwVolHeader->Signature != EFI_FVH_SIGNATURE) ||\r
89 (FwVolHeader->FvLength == ((UINTN) -1)) ||\r
90 ((FwVolHeader->HeaderLength & 0x01 ) !=0) ) {\r
91 return FALSE;\r
92 }\r
93\r
94 Checksum = CalculateCheckSum16 ((UINT16 *) FwVolHeader, FwVolHeader->HeaderLength);\r
95 if (Checksum != 0) {\r
96 DEBUG (( DEBUG_ERROR,\r
97 "ERROR - Invalid Firmware Volume Header Checksum, change 0x%04x to 0x%04x\r\n",\r
98 FwVolHeader->Checksum,\r
99 (UINT16)( Checksum + FwVolHeader->Checksum )));\r
100 return TRUE; //FALSE; Need update UEFI build tool when patching entrypoin @start of fd.\r
101 }\r
102\r
103 return TRUE;\r
104}\r
105\r
106/**\r
107 Install FvInfo PPI and create fv hobs for remained fvs\r
108\r
109**/\r
110VOID\r
111PeiReportRemainedFvs (\r
112 VOID\r
113 )\r
114{\r
115 UINT8* TempPtr;\r
116 UINT8* EndPtr;\r
117\r
118 TempPtr = (UINT8* )(UINTN) PcdGet32 (PcdPayloadFdMemBase);\r
119 EndPtr = (UINT8* )(UINTN) (PcdGet32 (PcdPayloadFdMemBase) + PcdGet32 (PcdPayloadFdMemSize));\r
120\r
121 for (;TempPtr < EndPtr;) {\r
122 if (IsFvHeaderValid ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)) {\r
123 if (TempPtr != (UINT8* )(UINTN) PcdGet32 (PcdPayloadFdMemBase)) {\r
124 // Skip the PEI FV\r
125 DEBUG((DEBUG_INFO, "Found one valid fv : 0x%lx.\n", TempPtr, ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength));\r
126\r
127 PeiServicesInstallFvInfoPpi (\r
128 NULL,\r
129 (VOID *) (UINTN) TempPtr,\r
130 (UINT32) (UINTN) ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength,\r
131 NULL,\r
132 NULL\r
133 );\r
134 BuildFvHob ((EFI_PHYSICAL_ADDRESS)(UINTN) TempPtr, ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength);\r
135 }\r
136 }\r
137 TempPtr += ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength;\r
138 }\r
139}\r
140\r
141\r
142/**\r
143 Find the board related info from ACPI table\r
144\r
145 @param AcpiTableBase ACPI table start address in memory\r
146 @param AcpiBoardInfo Pointer to the acpi board info strucutre\r
147\r
148 @retval RETURN_SUCCESS Successfully find out all the required information.\r
149 @retval RETURN_NOT_FOUND Failed to find the required info.\r
150\r
151**/\r
152RETURN_STATUS\r
153ParseAcpiInfo (\r
154 IN UINT64 AcpiTableBase,\r
155 OUT ACPI_BOARD_INFO *AcpiBoardInfo\r
156 )\r
157{\r
158 EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;\r
159 EFI_ACPI_DESCRIPTION_HEADER *Rsdt;\r
160 UINT32 *Entry32;\r
161 UINTN Entry32Num;\r
162 EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt;\r
163 EFI_ACPI_DESCRIPTION_HEADER *Xsdt;\r
164 UINT64 *Entry64;\r
165 UINTN Entry64Num;\r
166 UINTN Idx;\r
167 EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *MmCfgHdr;\r
168 EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *MmCfgBase;\r
169\r
170 Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)AcpiTableBase;\r
171 DEBUG ((DEBUG_INFO, "Rsdp at 0x%p\n", Rsdp));\r
172 DEBUG ((DEBUG_INFO, "Rsdt at 0x%x, Xsdt at 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));\r
173\r
174 //\r
175 // Search Rsdt First\r
176 //\r
177 Fadt = NULL;\r
178 MmCfgHdr = NULL;\r
179 Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);\r
180 if (Rsdt != NULL) {\r
181 Entry32 = (UINT32 *)(Rsdt + 1);\r
182 Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;\r
183 for (Idx = 0; Idx < Entry32Num; Idx++) {\r
184 if (*(UINT32 *)(UINTN)(Entry32[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
185 Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry32[Idx]);\r
186 DEBUG ((DEBUG_INFO, "Found Fadt in Rsdt\n"));\r
187 }\r
188\r
189 if (*(UINT32 *)(UINTN)(Entry32[Idx]) == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
190 MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)(UINTN)(Entry32[Idx]);\r
191 DEBUG ((DEBUG_INFO, "Found MM config address in Rsdt\n"));\r
192 }\r
193\r
194 if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
195 goto Done;\r
196 }\r
197 }\r
198 }\r
199\r
200 //\r
201 // Search Xsdt Second\r
202 //\r
203 Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);\r
204 if (Xsdt != NULL) {\r
205 Entry64 = (UINT64 *)(Xsdt + 1);\r
206 Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;\r
207 for (Idx = 0; Idx < Entry64Num; Idx++) {\r
208 if (*(UINT32 *)(UINTN)(Entry64[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
209 Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry64[Idx]);\r
210 DEBUG ((DEBUG_INFO, "Found Fadt in Xsdt\n"));\r
211 }\r
212\r
213 if (*(UINT32 *)(UINTN)(Entry64[Idx]) == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
214 MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)(UINTN)(Entry32[Idx]);\r
215 DEBUG ((DEBUG_INFO, "Found MM config address in Xsdt\n"));\r
216 }\r
217\r
218 if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
219 goto Done;\r
220 }\r
221 }\r
222 }\r
223\r
224 if (Fadt == NULL) {\r
225 return RETURN_NOT_FOUND;\r
226 }\r
227\r
228Done:\r
229\r
230 AcpiBoardInfo->PmCtrlRegBase = Fadt->Pm1aCntBlk;\r
231 AcpiBoardInfo->PmTimerRegBase = Fadt->PmTmrBlk;\r
232 AcpiBoardInfo->ResetRegAddress = Fadt->ResetReg.Address;\r
233 AcpiBoardInfo->ResetValue = Fadt->ResetValue;\r
234 AcpiBoardInfo->PmEvtBase = Fadt->Pm1aEvtBlk;\r
235 AcpiBoardInfo->PmGpeEnBase = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
236\r
237 if (MmCfgHdr != NULL) {\r
238 MmCfgBase = (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)((UINT8*) MmCfgHdr + sizeof (*MmCfgHdr));\r
239 AcpiBoardInfo->PcieBaseAddress = MmCfgBase->BaseAddress;\r
240 } else {\r
241 AcpiBoardInfo->PcieBaseAddress = 0;\r
242 }\r
243 DEBUG ((DEBUG_INFO, "PmCtrl Reg 0x%lx\n", AcpiBoardInfo->PmCtrlRegBase));\r
244 DEBUG ((DEBUG_INFO, "PmTimer Reg 0x%lx\n", AcpiBoardInfo->PmTimerRegBase));\r
245 DEBUG ((DEBUG_INFO, "Reset Reg 0x%lx\n", AcpiBoardInfo->ResetRegAddress));\r
246 DEBUG ((DEBUG_INFO, "Reset Value 0x%x\n", AcpiBoardInfo->ResetValue));\r
247 DEBUG ((DEBUG_INFO, "PmEvt Reg 0x%lx\n", AcpiBoardInfo->PmEvtBase));\r
248 DEBUG ((DEBUG_INFO, "PmGpeEn Reg 0x%lx\n", AcpiBoardInfo->PmGpeEnBase));\r
249 DEBUG ((DEBUG_INFO, "PcieBaseAddr 0x%lx\n", AcpiBoardInfo->PcieBaseAddress));\r
250\r
251 //\r
252 // Verify values for proper operation\r
253 //\r
254 ASSERT(Fadt->Pm1aCntBlk != 0);\r
255 ASSERT(Fadt->PmTmrBlk != 0);\r
256 ASSERT(Fadt->ResetReg.Address != 0);\r
257 ASSERT(Fadt->Pm1aEvtBlk != 0);\r
258 ASSERT(Fadt->Gpe0Blk != 0);\r
259\r
260 DEBUG_CODE_BEGIN ();\r
261 BOOLEAN SciEnabled;\r
262\r
263 //\r
264 // Check the consistency of SCI enabling\r
265 //\r
266\r
267 //\r
268 // Get SCI_EN value\r
269 //\r
270 if (Fadt->Pm1CntLen == 4) {\r
271 SciEnabled = (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
272 } else {\r
273 //\r
274 // if (Pm1CntLen == 2), use 16 bit IO read;\r
275 // if (Pm1CntLen != 2 && Pm1CntLen != 4), use 16 bit IO read as a fallback\r
276 //\r
277 SciEnabled = (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
278 }\r
279\r
280 if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) &&\r
281 (Fadt->SmiCmd == 0) &&\r
282 !SciEnabled) {\r
283 //\r
284 // The ACPI enabling status is inconsistent: SCI is not enabled but ACPI\r
285 // table does not provide a means to enable it through FADT->SmiCmd\r
286 //\r
287 DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsistent: SCI is not"\r
288 " enabled but the ACPI table does not provide a means to enable it through FADT->SmiCmd."\r
289 " This may cause issues in OS.\n"));\r
290 }\r
291 DEBUG_CODE_END ();\r
292\r
293 return RETURN_SUCCESS;\r
294}\r
295\r
296EFI_STATUS\r
297MemInfoCallback (\r
298 IN MEMROY_MAP_ENTRY *MemoryMapEntry,\r
299 IN VOID *Params\r
300 )\r
301{\r
302 PAYLOAD_MEM_INFO *MemInfo;\r
303 UINTN Attribue;\r
304 EFI_PHYSICAL_ADDRESS Base;\r
305 EFI_RESOURCE_TYPE Type;\r
306 UINT64 Size;\r
307 UINT32 SystemLowMemTop;\r
308\r
309 Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
310 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
311 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
312 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
313 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
314 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
315 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;\r
316\r
317 MemInfo = (PAYLOAD_MEM_INFO *)Params;\r
318 Type = (MemoryMapEntry->Type == 1) ? EFI_RESOURCE_SYSTEM_MEMORY : EFI_RESOURCE_MEMORY_RESERVED;\r
319 Base = MemoryMapEntry->Base;\r
320 Size = MemoryMapEntry->Size;\r
321\r
322 if ((Base < 0x100000) && ((Base + Size) > 0x100000)) {\r
323 Size -= (0x100000 - Base);\r
324 Base = 0x100000;\r
325 }\r
326\r
327 if (Base >= 0x100000) {\r
328 if (Type == EFI_RESOURCE_SYSTEM_MEMORY) {\r
329 if (Base < 0x100000000ULL) {\r
330 MemInfo->UsableLowMemTop = (UINT32)(Base + Size);\r
331 } else {\r
332 Attribue &= ~EFI_RESOURCE_ATTRIBUTE_TESTED;\r
333 }\r
334 BuildResourceDescriptorHob (\r
335 EFI_RESOURCE_SYSTEM_MEMORY,\r
336 Attribue,\r
337 (EFI_PHYSICAL_ADDRESS)Base,\r
338 Size\r
339 );\r
340 } else if (Type == EFI_RESOURCE_MEMORY_RESERVED) {\r
341 BuildResourceDescriptorHob (\r
342 EFI_RESOURCE_MEMORY_RESERVED,\r
343 Attribue,\r
344 (EFI_PHYSICAL_ADDRESS)Base,\r
345 Size\r
346 );\r
347 if (Base < 0x100000000ULL) {\r
348 SystemLowMemTop = ((UINT32)(Base + Size) + 0x0FFFFFFF) & 0xF0000000;\r
349 if (SystemLowMemTop > MemInfo->SystemLowMemTop) {\r
350 MemInfo->SystemLowMemTop = SystemLowMemTop;\r
351 }\r
352 }\r
353 }\r
354 }\r
355\r
356 return EFI_SUCCESS;\r
357}\r
358\r
359/**\r
360 This is the entrypoint of PEIM\r
361\r
362 @param FileHandle Handle of the file being invoked.\r
363 @param PeiServices Describes the list of possible PEI Services.\r
364\r
365 @retval EFI_SUCCESS if it completed successfully.\r
366**/\r
367EFI_STATUS\r
368EFIAPI\r
369BlPeiEntryPoint (\r
370 IN EFI_PEI_FILE_HANDLE FileHandle,\r
371 IN CONST EFI_PEI_SERVICES **PeiServices\r
372 )\r
373{\r
374 EFI_STATUS Status;\r
375 UINT64 LowMemorySize;\r
376 UINT64 PeiMemSize = SIZE_64MB;\r
377 EFI_PHYSICAL_ADDRESS PeiMemBase = 0;\r
378 UINT32 RegEax;\r
379 UINT8 PhysicalAddressBits;\r
380 PAYLOAD_MEM_INFO PldMemInfo;\r
381 SYSTEM_TABLE_INFO SysTableInfo;\r
382 SYSTEM_TABLE_INFO *NewSysTableInfo;\r
383 ACPI_BOARD_INFO AcpiBoardInfo;\r
384 ACPI_BOARD_INFO *NewAcpiBoardInfo;\r
385 EFI_PEI_GRAPHICS_INFO_HOB GfxInfo;\r
386 EFI_PEI_GRAPHICS_INFO_HOB *NewGfxInfo;\r
387 EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo;\r
388 EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *NewGfxDeviceInfo;\r
389\r
390\r
391 //\r
392 // Report lower 640KB of RAM. Attribute EFI_RESOURCE_ATTRIBUTE_TESTED\r
393 // is intentionally omitted to prevent erasing of the coreboot header\r
394 // record before it is processed by ParseMemoryInfo.\r
395 //\r
396 BuildResourceDescriptorHob (\r
397 EFI_RESOURCE_SYSTEM_MEMORY,\r
398 (\r
399 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
400 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
401 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
402 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
403 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
404 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
405 ),\r
406 (EFI_PHYSICAL_ADDRESS)(0),\r
407 (UINT64)(0xA0000)\r
408 );\r
409\r
410 BuildResourceDescriptorHob (\r
411 EFI_RESOURCE_MEMORY_RESERVED,\r
412 (\r
413 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
414 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
415 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
416 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
417 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
418 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
419 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
420 ),\r
421 (EFI_PHYSICAL_ADDRESS)(0xA0000),\r
422 (UINT64)(0x60000)\r
423 );\r
424\r
425\r
426 //\r
427 // Parse memory info\r
428 //\r
429 ZeroMem (&PldMemInfo, sizeof(PldMemInfo));\r
430 Status = ParseMemoryInfo (MemInfoCallback, &PldMemInfo);\r
431 if (EFI_ERROR(Status)) {\r
432 return Status;\r
433 }\r
434\r
435 //\r
436 // Install memory\r
437 //\r
438 LowMemorySize = PldMemInfo.UsableLowMemTop;\r
439 PeiMemBase = (LowMemorySize - PeiMemSize) & (~(BASE_64KB - 1));\r
440 DEBUG ((DEBUG_INFO, "Low memory 0x%lx\n", LowMemorySize));\r
441 DEBUG ((DEBUG_INFO, "SystemLowMemTop 0x%x\n", PldMemInfo.SystemLowMemTop));\r
442 DEBUG ((DEBUG_INFO, "PeiMemBase: 0x%lx.\n", PeiMemBase));\r
443 DEBUG ((DEBUG_INFO, "PeiMemSize: 0x%lx.\n", PeiMemSize));\r
444 Status = PeiServicesInstallPeiMemory (PeiMemBase, PeiMemSize);\r
445 ASSERT_EFI_ERROR (Status);\r
446\r
447 //\r
448 // Set cache on the physical memory\r
449 //\r
450 MtrrSetMemoryAttribute (BASE_1MB, LowMemorySize - BASE_1MB, CacheWriteBack);\r
451 MtrrSetMemoryAttribute (0, 0xA0000, CacheWriteBack);\r
452\r
453 //\r
454 // Create Memory Type Information HOB\r
455 //\r
456 BuildGuidDataHob (\r
457 &gEfiMemoryTypeInformationGuid,\r
458 mDefaultMemoryTypeInformation,\r
459 sizeof(mDefaultMemoryTypeInformation)\r
460 );\r
461\r
462 //\r
463 // Create Fv hob\r
464 //\r
465 PeiReportRemainedFvs ();\r
466\r
467 BuildMemoryAllocationHob (\r
468 PcdGet32 (PcdPayloadFdMemBase),\r
469 PcdGet32 (PcdPayloadFdMemSize),\r
470 EfiBootServicesData\r
471 );\r
472\r
473 //\r
474 // Build CPU memory space and IO space hob\r
475 //\r
476 AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);\r
477 if (RegEax >= 0x80000008) {\r
478 AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);\r
479 PhysicalAddressBits = (UINT8) RegEax;\r
480 } else {\r
481 PhysicalAddressBits = 36;\r
482 }\r
483\r
484 //\r
485 // Create a CPU hand-off information\r
486 //\r
487 BuildCpuHob (PhysicalAddressBits, 16);\r
488\r
489 //\r
490 // Report Local APIC range\r
491 //\r
492 BuildMemoryMappedIoRangeHob (0xFEC80000, SIZE_512KB);\r
493\r
494 //\r
495 // Boot mode\r
496 //\r
497 Status = PeiServicesSetBootMode (BOOT_WITH_FULL_CONFIGURATION);\r
498 ASSERT_EFI_ERROR (Status);\r
499\r
500 Status = PeiServicesInstallPpi (mPpiBootMode);\r
501 ASSERT_EFI_ERROR (Status);\r
502\r
503 //\r
504 // Create guid hob for frame buffer information\r
505 //\r
506 Status = ParseGfxInfo (&GfxInfo);\r
507 if (!EFI_ERROR (Status)) {\r
508 NewGfxInfo = BuildGuidHob (&gEfiGraphicsInfoHobGuid, sizeof (GfxInfo));\r
509 ASSERT (NewGfxInfo != NULL);\r
510 CopyMem (NewGfxInfo, &GfxInfo, sizeof (GfxInfo));\r
511 DEBUG ((DEBUG_INFO, "Created graphics info hob\n"));\r
512 }\r
513\r
514\r
515 Status = ParseGfxDeviceInfo (&GfxDeviceInfo);\r
516 if (!EFI_ERROR (Status)) {\r
517 NewGfxDeviceInfo = BuildGuidHob (&gEfiGraphicsDeviceInfoHobGuid, sizeof (GfxDeviceInfo));\r
518 ASSERT (NewGfxDeviceInfo != NULL);\r
519 CopyMem (NewGfxDeviceInfo, &GfxDeviceInfo, sizeof (GfxDeviceInfo));\r
520 DEBUG ((DEBUG_INFO, "Created graphics device info hob\n"));\r
521 }\r
522\r
523\r
524 //\r
525 // Create guid hob for system tables like acpi table and smbios table\r
526 //\r
527 Status = ParseSystemTable(&SysTableInfo);\r
528 ASSERT_EFI_ERROR (Status);\r
529 if (!EFI_ERROR (Status)) {\r
530 NewSysTableInfo = BuildGuidHob (&gUefiSystemTableInfoGuid, sizeof (SYSTEM_TABLE_INFO));\r
531 ASSERT (NewSysTableInfo != NULL);\r
532 CopyMem (NewSysTableInfo, &SysTableInfo, sizeof (SYSTEM_TABLE_INFO));\r
533 DEBUG ((DEBUG_INFO, "Detected Acpi Table at 0x%lx, length 0x%x\n", SysTableInfo.AcpiTableBase, SysTableInfo.AcpiTableSize));\r
534 DEBUG ((DEBUG_INFO, "Detected Smbios Table at 0x%lx, length 0x%x\n", SysTableInfo.SmbiosTableBase, SysTableInfo.SmbiosTableSize));\r
535 }\r
536\r
537 //\r
538 // Create guid hob for acpi board information\r
539 //\r
540 Status = ParseAcpiInfo (SysTableInfo.AcpiTableBase, &AcpiBoardInfo);\r
541 ASSERT_EFI_ERROR (Status);\r
542 if (!EFI_ERROR (Status)) {\r
543 NewAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
544 ASSERT (NewAcpiBoardInfo != NULL);\r
545 CopyMem (NewAcpiBoardInfo, &AcpiBoardInfo, sizeof (ACPI_BOARD_INFO));\r
546 DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n"));\r
547 }\r
548\r
549 //\r
550 // Parse platform specific information.\r
551 //\r
552 Status = ParsePlatformInfo ();\r
553 if (EFI_ERROR (Status)) {\r
554 DEBUG ((DEBUG_ERROR, "Error when parsing platform info, Status = %r\n", Status));\r
555 return Status;\r
556 }\r
557\r
558 //\r
559 // Mask off all legacy 8259 interrupt sources\r
560 //\r
561 IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);\r
562 IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);\r
563\r
564 return EFI_SUCCESS;\r
565}\r
566\r