]> git.proxmox.com Git - mirror_edk2.git/blame - UefiPayloadPkg/BlSupportPei/BlSupportPei.c
FmpDevicePkg: Add FmpDependencyCheck library class and instances
[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
04a0c3e8 167 UINT32 *Signature;\r
04af8bf2
DG
168 EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *MmCfgHdr;\r
169 EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *MmCfgBase;\r
170\r
171 Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)AcpiTableBase;\r
172 DEBUG ((DEBUG_INFO, "Rsdp at 0x%p\n", Rsdp));\r
173 DEBUG ((DEBUG_INFO, "Rsdt at 0x%x, Xsdt at 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));\r
174\r
175 //\r
176 // Search Rsdt First\r
177 //\r
178 Fadt = NULL;\r
179 MmCfgHdr = NULL;\r
180 Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);\r
181 if (Rsdt != NULL) {\r
182 Entry32 = (UINT32 *)(Rsdt + 1);\r
183 Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;\r
184 for (Idx = 0; Idx < Entry32Num; Idx++) {\r
04a0c3e8
LE
185 Signature = (UINT32 *)(UINTN)Entry32[Idx];\r
186 if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
187 Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;\r
04af8bf2
DG
188 DEBUG ((DEBUG_INFO, "Found Fadt in Rsdt\n"));\r
189 }\r
190\r
04a0c3e8
LE
191 if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
192 MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;\r
04af8bf2
DG
193 DEBUG ((DEBUG_INFO, "Found MM config address in Rsdt\n"));\r
194 }\r
195\r
196 if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
197 goto Done;\r
198 }\r
199 }\r
200 }\r
201\r
202 //\r
203 // Search Xsdt Second\r
204 //\r
205 Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);\r
206 if (Xsdt != NULL) {\r
207 Entry64 = (UINT64 *)(Xsdt + 1);\r
208 Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;\r
209 for (Idx = 0; Idx < Entry64Num; Idx++) {\r
04a0c3e8
LE
210 Signature = (UINT32 *)(UINTN)Entry64[Idx];\r
211 if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
212 Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;\r
04af8bf2
DG
213 DEBUG ((DEBUG_INFO, "Found Fadt in Xsdt\n"));\r
214 }\r
215\r
04a0c3e8
LE
216 if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
217 MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;\r
04af8bf2
DG
218 DEBUG ((DEBUG_INFO, "Found MM config address in Xsdt\n"));\r
219 }\r
220\r
221 if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
222 goto Done;\r
223 }\r
224 }\r
225 }\r
226\r
227 if (Fadt == NULL) {\r
228 return RETURN_NOT_FOUND;\r
229 }\r
230\r
231Done:\r
232\r
233 AcpiBoardInfo->PmCtrlRegBase = Fadt->Pm1aCntBlk;\r
234 AcpiBoardInfo->PmTimerRegBase = Fadt->PmTmrBlk;\r
235 AcpiBoardInfo->ResetRegAddress = Fadt->ResetReg.Address;\r
236 AcpiBoardInfo->ResetValue = Fadt->ResetValue;\r
237 AcpiBoardInfo->PmEvtBase = Fadt->Pm1aEvtBlk;\r
238 AcpiBoardInfo->PmGpeEnBase = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
239\r
240 if (MmCfgHdr != NULL) {\r
241 MmCfgBase = (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)((UINT8*) MmCfgHdr + sizeof (*MmCfgHdr));\r
242 AcpiBoardInfo->PcieBaseAddress = MmCfgBase->BaseAddress;\r
243 } else {\r
244 AcpiBoardInfo->PcieBaseAddress = 0;\r
245 }\r
246 DEBUG ((DEBUG_INFO, "PmCtrl Reg 0x%lx\n", AcpiBoardInfo->PmCtrlRegBase));\r
247 DEBUG ((DEBUG_INFO, "PmTimer Reg 0x%lx\n", AcpiBoardInfo->PmTimerRegBase));\r
248 DEBUG ((DEBUG_INFO, "Reset Reg 0x%lx\n", AcpiBoardInfo->ResetRegAddress));\r
249 DEBUG ((DEBUG_INFO, "Reset Value 0x%x\n", AcpiBoardInfo->ResetValue));\r
250 DEBUG ((DEBUG_INFO, "PmEvt Reg 0x%lx\n", AcpiBoardInfo->PmEvtBase));\r
251 DEBUG ((DEBUG_INFO, "PmGpeEn Reg 0x%lx\n", AcpiBoardInfo->PmGpeEnBase));\r
252 DEBUG ((DEBUG_INFO, "PcieBaseAddr 0x%lx\n", AcpiBoardInfo->PcieBaseAddress));\r
253\r
254 //\r
255 // Verify values for proper operation\r
256 //\r
257 ASSERT(Fadt->Pm1aCntBlk != 0);\r
258 ASSERT(Fadt->PmTmrBlk != 0);\r
259 ASSERT(Fadt->ResetReg.Address != 0);\r
260 ASSERT(Fadt->Pm1aEvtBlk != 0);\r
261 ASSERT(Fadt->Gpe0Blk != 0);\r
262\r
263 DEBUG_CODE_BEGIN ();\r
264 BOOLEAN SciEnabled;\r
265\r
266 //\r
267 // Check the consistency of SCI enabling\r
268 //\r
269\r
270 //\r
271 // Get SCI_EN value\r
272 //\r
273 if (Fadt->Pm1CntLen == 4) {\r
274 SciEnabled = (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
275 } else {\r
276 //\r
277 // if (Pm1CntLen == 2), use 16 bit IO read;\r
278 // if (Pm1CntLen != 2 && Pm1CntLen != 4), use 16 bit IO read as a fallback\r
279 //\r
280 SciEnabled = (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
281 }\r
282\r
283 if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) &&\r
284 (Fadt->SmiCmd == 0) &&\r
285 !SciEnabled) {\r
286 //\r
287 // The ACPI enabling status is inconsistent: SCI is not enabled but ACPI\r
288 // table does not provide a means to enable it through FADT->SmiCmd\r
289 //\r
290 DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsistent: SCI is not"\r
291 " enabled but the ACPI table does not provide a means to enable it through FADT->SmiCmd."\r
292 " This may cause issues in OS.\n"));\r
293 }\r
294 DEBUG_CODE_END ();\r
295\r
296 return RETURN_SUCCESS;\r
297}\r
298\r
299EFI_STATUS\r
300MemInfoCallback (\r
301 IN MEMROY_MAP_ENTRY *MemoryMapEntry,\r
302 IN VOID *Params\r
303 )\r
304{\r
305 PAYLOAD_MEM_INFO *MemInfo;\r
306 UINTN Attribue;\r
307 EFI_PHYSICAL_ADDRESS Base;\r
308 EFI_RESOURCE_TYPE Type;\r
309 UINT64 Size;\r
310 UINT32 SystemLowMemTop;\r
311\r
312 Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
313 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
314 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
315 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
316 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
317 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
318 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;\r
319\r
320 MemInfo = (PAYLOAD_MEM_INFO *)Params;\r
321 Type = (MemoryMapEntry->Type == 1) ? EFI_RESOURCE_SYSTEM_MEMORY : EFI_RESOURCE_MEMORY_RESERVED;\r
322 Base = MemoryMapEntry->Base;\r
323 Size = MemoryMapEntry->Size;\r
324\r
325 if ((Base < 0x100000) && ((Base + Size) > 0x100000)) {\r
326 Size -= (0x100000 - Base);\r
327 Base = 0x100000;\r
328 }\r
329\r
330 if (Base >= 0x100000) {\r
331 if (Type == EFI_RESOURCE_SYSTEM_MEMORY) {\r
332 if (Base < 0x100000000ULL) {\r
333 MemInfo->UsableLowMemTop = (UINT32)(Base + Size);\r
334 } else {\r
335 Attribue &= ~EFI_RESOURCE_ATTRIBUTE_TESTED;\r
336 }\r
337 BuildResourceDescriptorHob (\r
338 EFI_RESOURCE_SYSTEM_MEMORY,\r
339 Attribue,\r
340 (EFI_PHYSICAL_ADDRESS)Base,\r
341 Size\r
342 );\r
343 } else if (Type == EFI_RESOURCE_MEMORY_RESERVED) {\r
344 BuildResourceDescriptorHob (\r
345 EFI_RESOURCE_MEMORY_RESERVED,\r
346 Attribue,\r
347 (EFI_PHYSICAL_ADDRESS)Base,\r
348 Size\r
349 );\r
350 if (Base < 0x100000000ULL) {\r
351 SystemLowMemTop = ((UINT32)(Base + Size) + 0x0FFFFFFF) & 0xF0000000;\r
352 if (SystemLowMemTop > MemInfo->SystemLowMemTop) {\r
353 MemInfo->SystemLowMemTop = SystemLowMemTop;\r
354 }\r
355 }\r
356 }\r
357 }\r
358\r
359 return EFI_SUCCESS;\r
360}\r
361\r
362/**\r
363 This is the entrypoint of PEIM\r
364\r
365 @param FileHandle Handle of the file being invoked.\r
366 @param PeiServices Describes the list of possible PEI Services.\r
367\r
368 @retval EFI_SUCCESS if it completed successfully.\r
369**/\r
370EFI_STATUS\r
371EFIAPI\r
372BlPeiEntryPoint (\r
373 IN EFI_PEI_FILE_HANDLE FileHandle,\r
374 IN CONST EFI_PEI_SERVICES **PeiServices\r
375 )\r
376{\r
377 EFI_STATUS Status;\r
378 UINT64 LowMemorySize;\r
379 UINT64 PeiMemSize = SIZE_64MB;\r
380 EFI_PHYSICAL_ADDRESS PeiMemBase = 0;\r
381 UINT32 RegEax;\r
382 UINT8 PhysicalAddressBits;\r
383 PAYLOAD_MEM_INFO PldMemInfo;\r
384 SYSTEM_TABLE_INFO SysTableInfo;\r
385 SYSTEM_TABLE_INFO *NewSysTableInfo;\r
386 ACPI_BOARD_INFO AcpiBoardInfo;\r
387 ACPI_BOARD_INFO *NewAcpiBoardInfo;\r
388 EFI_PEI_GRAPHICS_INFO_HOB GfxInfo;\r
389 EFI_PEI_GRAPHICS_INFO_HOB *NewGfxInfo;\r
390 EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo;\r
391 EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *NewGfxDeviceInfo;\r
392\r
393\r
394 //\r
395 // Report lower 640KB of RAM. Attribute EFI_RESOURCE_ATTRIBUTE_TESTED\r
396 // is intentionally omitted to prevent erasing of the coreboot header\r
397 // record before it is processed by ParseMemoryInfo.\r
398 //\r
399 BuildResourceDescriptorHob (\r
400 EFI_RESOURCE_SYSTEM_MEMORY,\r
401 (\r
402 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
403 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
404 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
405 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
406 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
407 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
408 ),\r
409 (EFI_PHYSICAL_ADDRESS)(0),\r
410 (UINT64)(0xA0000)\r
411 );\r
412\r
413 BuildResourceDescriptorHob (\r
414 EFI_RESOURCE_MEMORY_RESERVED,\r
415 (\r
416 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
417 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
418 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
419 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
420 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
421 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
422 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
423 ),\r
424 (EFI_PHYSICAL_ADDRESS)(0xA0000),\r
425 (UINT64)(0x60000)\r
426 );\r
427\r
428\r
429 //\r
430 // Parse memory info\r
431 //\r
432 ZeroMem (&PldMemInfo, sizeof(PldMemInfo));\r
433 Status = ParseMemoryInfo (MemInfoCallback, &PldMemInfo);\r
434 if (EFI_ERROR(Status)) {\r
435 return Status;\r
436 }\r
437\r
438 //\r
439 // Install memory\r
440 //\r
441 LowMemorySize = PldMemInfo.UsableLowMemTop;\r
442 PeiMemBase = (LowMemorySize - PeiMemSize) & (~(BASE_64KB - 1));\r
443 DEBUG ((DEBUG_INFO, "Low memory 0x%lx\n", LowMemorySize));\r
444 DEBUG ((DEBUG_INFO, "SystemLowMemTop 0x%x\n", PldMemInfo.SystemLowMemTop));\r
445 DEBUG ((DEBUG_INFO, "PeiMemBase: 0x%lx.\n", PeiMemBase));\r
446 DEBUG ((DEBUG_INFO, "PeiMemSize: 0x%lx.\n", PeiMemSize));\r
447 Status = PeiServicesInstallPeiMemory (PeiMemBase, PeiMemSize);\r
448 ASSERT_EFI_ERROR (Status);\r
449\r
450 //\r
451 // Set cache on the physical memory\r
452 //\r
453 MtrrSetMemoryAttribute (BASE_1MB, LowMemorySize - BASE_1MB, CacheWriteBack);\r
454 MtrrSetMemoryAttribute (0, 0xA0000, CacheWriteBack);\r
455\r
456 //\r
457 // Create Memory Type Information HOB\r
458 //\r
459 BuildGuidDataHob (\r
460 &gEfiMemoryTypeInformationGuid,\r
461 mDefaultMemoryTypeInformation,\r
462 sizeof(mDefaultMemoryTypeInformation)\r
463 );\r
464\r
465 //\r
466 // Create Fv hob\r
467 //\r
468 PeiReportRemainedFvs ();\r
469\r
470 BuildMemoryAllocationHob (\r
471 PcdGet32 (PcdPayloadFdMemBase),\r
472 PcdGet32 (PcdPayloadFdMemSize),\r
473 EfiBootServicesData\r
474 );\r
475\r
476 //\r
477 // Build CPU memory space and IO space hob\r
478 //\r
479 AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);\r
480 if (RegEax >= 0x80000008) {\r
481 AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);\r
482 PhysicalAddressBits = (UINT8) RegEax;\r
483 } else {\r
484 PhysicalAddressBits = 36;\r
485 }\r
486\r
487 //\r
488 // Create a CPU hand-off information\r
489 //\r
490 BuildCpuHob (PhysicalAddressBits, 16);\r
491\r
492 //\r
493 // Report Local APIC range\r
494 //\r
495 BuildMemoryMappedIoRangeHob (0xFEC80000, SIZE_512KB);\r
496\r
497 //\r
498 // Boot mode\r
499 //\r
500 Status = PeiServicesSetBootMode (BOOT_WITH_FULL_CONFIGURATION);\r
501 ASSERT_EFI_ERROR (Status);\r
502\r
503 Status = PeiServicesInstallPpi (mPpiBootMode);\r
504 ASSERT_EFI_ERROR (Status);\r
505\r
506 //\r
507 // Create guid hob for frame buffer information\r
508 //\r
509 Status = ParseGfxInfo (&GfxInfo);\r
510 if (!EFI_ERROR (Status)) {\r
511 NewGfxInfo = BuildGuidHob (&gEfiGraphicsInfoHobGuid, sizeof (GfxInfo));\r
512 ASSERT (NewGfxInfo != NULL);\r
513 CopyMem (NewGfxInfo, &GfxInfo, sizeof (GfxInfo));\r
514 DEBUG ((DEBUG_INFO, "Created graphics info hob\n"));\r
515 }\r
516\r
517\r
518 Status = ParseGfxDeviceInfo (&GfxDeviceInfo);\r
519 if (!EFI_ERROR (Status)) {\r
520 NewGfxDeviceInfo = BuildGuidHob (&gEfiGraphicsDeviceInfoHobGuid, sizeof (GfxDeviceInfo));\r
521 ASSERT (NewGfxDeviceInfo != NULL);\r
522 CopyMem (NewGfxDeviceInfo, &GfxDeviceInfo, sizeof (GfxDeviceInfo));\r
523 DEBUG ((DEBUG_INFO, "Created graphics device info hob\n"));\r
524 }\r
525\r
526\r
527 //\r
528 // Create guid hob for system tables like acpi table and smbios table\r
529 //\r
530 Status = ParseSystemTable(&SysTableInfo);\r
531 ASSERT_EFI_ERROR (Status);\r
532 if (!EFI_ERROR (Status)) {\r
533 NewSysTableInfo = BuildGuidHob (&gUefiSystemTableInfoGuid, sizeof (SYSTEM_TABLE_INFO));\r
534 ASSERT (NewSysTableInfo != NULL);\r
535 CopyMem (NewSysTableInfo, &SysTableInfo, sizeof (SYSTEM_TABLE_INFO));\r
536 DEBUG ((DEBUG_INFO, "Detected Acpi Table at 0x%lx, length 0x%x\n", SysTableInfo.AcpiTableBase, SysTableInfo.AcpiTableSize));\r
537 DEBUG ((DEBUG_INFO, "Detected Smbios Table at 0x%lx, length 0x%x\n", SysTableInfo.SmbiosTableBase, SysTableInfo.SmbiosTableSize));\r
538 }\r
539\r
540 //\r
541 // Create guid hob for acpi board information\r
542 //\r
543 Status = ParseAcpiInfo (SysTableInfo.AcpiTableBase, &AcpiBoardInfo);\r
544 ASSERT_EFI_ERROR (Status);\r
545 if (!EFI_ERROR (Status)) {\r
546 NewAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
547 ASSERT (NewAcpiBoardInfo != NULL);\r
548 CopyMem (NewAcpiBoardInfo, &AcpiBoardInfo, sizeof (ACPI_BOARD_INFO));\r
549 DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n"));\r
550 }\r
551\r
552 //\r
553 // Parse platform specific information.\r
554 //\r
555 Status = ParsePlatformInfo ();\r
556 if (EFI_ERROR (Status)) {\r
557 DEBUG ((DEBUG_ERROR, "Error when parsing platform info, Status = %r\n", Status));\r
558 return Status;\r
559 }\r
560\r
561 //\r
562 // Mask off all legacy 8259 interrupt sources\r
563 //\r
564 IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);\r
565 IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);\r
566\r
567 return EFI_SUCCESS;\r
568}\r
569\r