]> git.proxmox.com Git - mirror_edk2.git/blame - UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c
MdePkg: Fix DEVICE_SECURITY_EVENT_DATA_HEADER version definition
[mirror_edk2.git] / UefiPayloadPkg / UefiPayloadEntry / UefiPayloadEntry.c
CommitLineData
04af8bf2 1/** @file\r
04af8bf2 2\r
302a8f35 3 Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR>\r
7c4ab1c2 4 SPDX-License-Identifier: BSD-2-Clause-Patent\r
04af8bf2
DG
5\r
6**/\r
04af8bf2 7\r
7c4ab1c2 8#include "UefiPayloadEntry.h"\r
04af8bf2 9\r
1e5e58d3
PR
10STATIC UINT32 mTopOfLowerUsableDram = 0;\r
11\r
04af8bf2 12/**\r
7c4ab1c2 13 Callback function to build resource descriptor HOB\r
04af8bf2 14\r
7c4ab1c2 15 This function build a HOB based on the memory map entry info.\r
1e5e58d3
PR
16 It creates only EFI_RESOURCE_MEMORY_MAPPED_IO and EFI_RESOURCE_MEMORY_RESERVED\r
17 resources.\r
18\r
19 @param MemoryMapEntry Memory map entry info got from bootloader.\r
20 @param Params A pointer to ACPI_BOARD_INFO.\r
21\r
22 @retval EFI_SUCCESS Successfully build a HOB.\r
23 @retval EFI_INVALID_PARAMETER Invalid parameter provided.\r
24**/\r
25EFI_STATUS\r
26MemInfoCallbackMmio (\r
27 IN MEMROY_MAP_ENTRY *MemoryMapEntry,\r
28 IN VOID *Params\r
29 )\r
30{\r
31 EFI_PHYSICAL_ADDRESS Base;\r
32 EFI_RESOURCE_TYPE Type;\r
33 UINT64 Size;\r
34 EFI_RESOURCE_ATTRIBUTE_TYPE Attribue;\r
35 ACPI_BOARD_INFO *AcpiBoardInfo;\r
36\r
37 AcpiBoardInfo = (ACPI_BOARD_INFO *)Params;\r
38 if (AcpiBoardInfo == NULL) {\r
39 return EFI_INVALID_PARAMETER;\r
40 }\r
41\r
42 //\r
43 // Skip types already handled in MemInfoCallback\r
44 //\r
45 if (MemoryMapEntry->Type == E820_RAM || MemoryMapEntry->Type == E820_ACPI) {\r
46 return EFI_SUCCESS;\r
47 }\r
48\r
49 if (MemoryMapEntry->Base == AcpiBoardInfo->PcieBaseAddress) {\r
50 //\r
51 // MMCONF is always MMIO\r
52 //\r
53 Type = EFI_RESOURCE_MEMORY_MAPPED_IO;\r
54 } else if (MemoryMapEntry->Base < mTopOfLowerUsableDram) {\r
55 //\r
56 // It's in DRAM and thus must be reserved\r
57 //\r
58 Type = EFI_RESOURCE_MEMORY_RESERVED;\r
59 } else if ((MemoryMapEntry->Base < 0x100000000ULL) && (MemoryMapEntry->Base >= mTopOfLowerUsableDram)) {\r
60 //\r
61 // It's not in DRAM, must be MMIO\r
62 //\r
63 Type = EFI_RESOURCE_MEMORY_MAPPED_IO;\r
64 } else {\r
65 Type = EFI_RESOURCE_MEMORY_RESERVED;\r
66 }\r
67\r
68 Base = MemoryMapEntry->Base;\r
69 Size = MemoryMapEntry->Size;\r
70\r
71 Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
72 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
73 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
74 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
75 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
76 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
77 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;\r
78\r
79 BuildResourceDescriptorHob (Type, Attribue, (EFI_PHYSICAL_ADDRESS)Base, Size);\r
80 DEBUG ((DEBUG_INFO , "buildhob: base = 0x%lx, size = 0x%lx, type = 0x%x\n", Base, Size, Type));\r
81\r
82 if (MemoryMapEntry->Type == E820_UNUSABLE ||\r
83 MemoryMapEntry->Type == E820_DISABLED) {\r
84 BuildMemoryAllocationHob (Base, Size, EfiUnusableMemory);\r
85 } else if (MemoryMapEntry->Type == E820_PMEM) {\r
86 BuildMemoryAllocationHob (Base, Size, EfiPersistentMemory);\r
87 }\r
88\r
89 return EFI_SUCCESS;\r
90}\r
91\r
92\r
93/**\r
94 Callback function to find TOLUD (Top of Lower Usable DRAM)\r
95\r
96 Estimate where TOLUD (Top of Lower Usable DRAM) resides. The exact position\r
97 would require platform specific code.\r
98\r
99 @param MemoryMapEntry Memory map entry info got from bootloader.\r
100 @param Params Not used for now.\r
101\r
102 @retval EFI_SUCCESS Successfully updated mTopOfLowerUsableDram.\r
103**/\r
104EFI_STATUS\r
105FindToludCallback (\r
106 IN MEMROY_MAP_ENTRY *MemoryMapEntry,\r
107 IN VOID *Params\r
108 )\r
109{\r
110 //\r
111 // This code assumes that the memory map on this x86 machine below 4GiB is continous\r
112 // until TOLUD. In addition it assumes that the bootloader provided memory tables have\r
113 // no "holes" and thus the first memory range not covered by e820 marks the end of\r
114 // usable DRAM. In addition it's assumed that every reserved memory region touching\r
115 // usable RAM is also covering DRAM, everything else that is marked reserved thus must be\r
116 // MMIO not detectable by bootloader/OS\r
117 //\r
118\r
119 //\r
120 // Skip memory types not RAM or reserved\r
121 //\r
122 if ((MemoryMapEntry->Type == E820_UNUSABLE) || (MemoryMapEntry->Type == E820_DISABLED) ||\r
123 (MemoryMapEntry->Type == E820_PMEM)) {\r
124 return EFI_SUCCESS;\r
125 }\r
126\r
127 //\r
128 // Skip resources above 4GiB\r
129 //\r
130 if ((MemoryMapEntry->Base + MemoryMapEntry->Size) > 0x100000000ULL) {\r
131 return EFI_SUCCESS;\r
132 }\r
133\r
134 if ((MemoryMapEntry->Type == E820_RAM) || (MemoryMapEntry->Type == E820_ACPI) ||\r
135 (MemoryMapEntry->Type == E820_NVS)) {\r
136 //\r
137 // It's usable DRAM. Update TOLUD.\r
138 //\r
139 if (mTopOfLowerUsableDram < (MemoryMapEntry->Base + MemoryMapEntry->Size)) {\r
140 mTopOfLowerUsableDram = (UINT32)(MemoryMapEntry->Base + MemoryMapEntry->Size);\r
141 }\r
142 } else {\r
143 //\r
144 // It might be 'reserved DRAM' or 'MMIO'.\r
145 //\r
146 // If it touches usable DRAM at Base assume it's DRAM as well,\r
147 // as it could be bootloader installed tables, TSEG, GTT, ...\r
148 //\r
149 if (mTopOfLowerUsableDram == MemoryMapEntry->Base) {\r
150 mTopOfLowerUsableDram = (UINT32)(MemoryMapEntry->Base + MemoryMapEntry->Size);\r
151 }\r
152 }\r
153\r
154 return EFI_SUCCESS;\r
155}\r
156\r
157\r
158/**\r
159 Callback function to build resource descriptor HOB\r
160\r
161 This function build a HOB based on the memory map entry info.\r
162 Only add EFI_RESOURCE_SYSTEM_MEMORY.\r
04af8bf2 163\r
7c4ab1c2
GD
164 @param MemoryMapEntry Memory map entry info got from bootloader.\r
165 @param Params Not used for now.\r
04af8bf2 166\r
7c4ab1c2 167 @retval RETURN_SUCCESS Successfully build a HOB.\r
04af8bf2 168**/\r
7c4ab1c2
GD
169EFI_STATUS\r
170MemInfoCallback (\r
171 IN MEMROY_MAP_ENTRY *MemoryMapEntry,\r
172 IN VOID *Params\r
04af8bf2
DG
173 )\r
174{\r
7c4ab1c2
GD
175 EFI_PHYSICAL_ADDRESS Base;\r
176 EFI_RESOURCE_TYPE Type;\r
177 UINT64 Size;\r
178 EFI_RESOURCE_ATTRIBUTE_TYPE Attribue;\r
04af8bf2 179\r
1e5e58d3
PR
180 //\r
181 // Skip everything not known to be usable DRAM.\r
182 // It will be added later.\r
183 //\r
184 if ((MemoryMapEntry->Type != E820_RAM) && (MemoryMapEntry->Type != E820_ACPI) &&\r
185 (MemoryMapEntry->Type != E820_NVS)) {\r
186 return RETURN_SUCCESS;\r
187 }\r
188\r
189 Type = EFI_RESOURCE_SYSTEM_MEMORY;\r
7c4ab1c2
GD
190 Base = MemoryMapEntry->Base;\r
191 Size = MemoryMapEntry->Size;\r
04af8bf2 192\r
7c4ab1c2
GD
193 Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
194 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
195 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
196 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
197 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
198 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
199 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;\r
04af8bf2 200\r
7c4ab1c2
GD
201 BuildResourceDescriptorHob (Type, Attribue, (EFI_PHYSICAL_ADDRESS)Base, Size);\r
202 DEBUG ((DEBUG_INFO , "buildhob: base = 0x%lx, size = 0x%lx, type = 0x%x\n", Base, Size, Type));\r
04af8bf2 203\r
1e5e58d3
PR
204 if (MemoryMapEntry->Type == E820_ACPI) {\r
205 BuildMemoryAllocationHob (Base, Size, EfiACPIReclaimMemory);\r
206 } else if (MemoryMapEntry->Type == E820_NVS) {\r
207 BuildMemoryAllocationHob (Base, Size, EfiACPIMemoryNVS);\r
208 }\r
209\r
7c4ab1c2 210 return RETURN_SUCCESS;\r
04af8bf2
DG
211}\r
212\r
213\r
7c4ab1c2 214\r
04af8bf2
DG
215/**\r
216 Find the board related info from ACPI table\r
217\r
218 @param AcpiTableBase ACPI table start address in memory\r
219 @param AcpiBoardInfo Pointer to the acpi board info strucutre\r
220\r
221 @retval RETURN_SUCCESS Successfully find out all the required information.\r
222 @retval RETURN_NOT_FOUND Failed to find the required info.\r
223\r
224**/\r
225RETURN_STATUS\r
226ParseAcpiInfo (\r
227 IN UINT64 AcpiTableBase,\r
228 OUT ACPI_BOARD_INFO *AcpiBoardInfo\r
229 )\r
230{\r
231 EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;\r
232 EFI_ACPI_DESCRIPTION_HEADER *Rsdt;\r
233 UINT32 *Entry32;\r
234 UINTN Entry32Num;\r
235 EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt;\r
236 EFI_ACPI_DESCRIPTION_HEADER *Xsdt;\r
237 UINT64 *Entry64;\r
238 UINTN Entry64Num;\r
239 UINTN Idx;\r
04a0c3e8 240 UINT32 *Signature;\r
04af8bf2
DG
241 EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *MmCfgHdr;\r
242 EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *MmCfgBase;\r
243\r
244 Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)AcpiTableBase;\r
245 DEBUG ((DEBUG_INFO, "Rsdp at 0x%p\n", Rsdp));\r
246 DEBUG ((DEBUG_INFO, "Rsdt at 0x%x, Xsdt at 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));\r
247\r
248 //\r
249 // Search Rsdt First\r
250 //\r
251 Fadt = NULL;\r
252 MmCfgHdr = NULL;\r
253 Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);\r
254 if (Rsdt != NULL) {\r
255 Entry32 = (UINT32 *)(Rsdt + 1);\r
256 Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;\r
257 for (Idx = 0; Idx < Entry32Num; Idx++) {\r
04a0c3e8
LE
258 Signature = (UINT32 *)(UINTN)Entry32[Idx];\r
259 if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
260 Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;\r
04af8bf2
DG
261 DEBUG ((DEBUG_INFO, "Found Fadt in Rsdt\n"));\r
262 }\r
263\r
04a0c3e8
LE
264 if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
265 MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;\r
04af8bf2
DG
266 DEBUG ((DEBUG_INFO, "Found MM config address in Rsdt\n"));\r
267 }\r
268\r
269 if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
270 goto Done;\r
271 }\r
272 }\r
273 }\r
274\r
275 //\r
276 // Search Xsdt Second\r
277 //\r
278 Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);\r
279 if (Xsdt != NULL) {\r
280 Entry64 = (UINT64 *)(Xsdt + 1);\r
281 Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;\r
282 for (Idx = 0; Idx < Entry64Num; Idx++) {\r
04a0c3e8
LE
283 Signature = (UINT32 *)(UINTN)Entry64[Idx];\r
284 if (*Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
285 Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)Signature;\r
04af8bf2
DG
286 DEBUG ((DEBUG_INFO, "Found Fadt in Xsdt\n"));\r
287 }\r
288\r
04a0c3e8
LE
289 if (*Signature == EFI_ACPI_5_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE) {\r
290 MmCfgHdr = (EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER *)Signature;\r
04af8bf2
DG
291 DEBUG ((DEBUG_INFO, "Found MM config address in Xsdt\n"));\r
292 }\r
293\r
294 if ((Fadt != NULL) && (MmCfgHdr != NULL)) {\r
295 goto Done;\r
296 }\r
297 }\r
298 }\r
299\r
300 if (Fadt == NULL) {\r
301 return RETURN_NOT_FOUND;\r
302 }\r
303\r
304Done:\r
305\r
306 AcpiBoardInfo->PmCtrlRegBase = Fadt->Pm1aCntBlk;\r
307 AcpiBoardInfo->PmTimerRegBase = Fadt->PmTmrBlk;\r
308 AcpiBoardInfo->ResetRegAddress = Fadt->ResetReg.Address;\r
309 AcpiBoardInfo->ResetValue = Fadt->ResetValue;\r
310 AcpiBoardInfo->PmEvtBase = Fadt->Pm1aEvtBlk;\r
311 AcpiBoardInfo->PmGpeEnBase = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
312\r
313 if (MmCfgHdr != NULL) {\r
314 MmCfgBase = (EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE *)((UINT8*) MmCfgHdr + sizeof (*MmCfgHdr));\r
315 AcpiBoardInfo->PcieBaseAddress = MmCfgBase->BaseAddress;\r
28d7eea9 316 AcpiBoardInfo->PcieBaseSize = (MmCfgBase->EndBusNumber + 1 - MmCfgBase->StartBusNumber) * 4096 * 32 * 8;\r
04af8bf2
DG
317 } else {\r
318 AcpiBoardInfo->PcieBaseAddress = 0;\r
28d7eea9 319 AcpiBoardInfo->PcieBaseSize = 0;\r
04af8bf2
DG
320 }\r
321 DEBUG ((DEBUG_INFO, "PmCtrl Reg 0x%lx\n", AcpiBoardInfo->PmCtrlRegBase));\r
322 DEBUG ((DEBUG_INFO, "PmTimer Reg 0x%lx\n", AcpiBoardInfo->PmTimerRegBase));\r
323 DEBUG ((DEBUG_INFO, "Reset Reg 0x%lx\n", AcpiBoardInfo->ResetRegAddress));\r
324 DEBUG ((DEBUG_INFO, "Reset Value 0x%x\n", AcpiBoardInfo->ResetValue));\r
325 DEBUG ((DEBUG_INFO, "PmEvt Reg 0x%lx\n", AcpiBoardInfo->PmEvtBase));\r
326 DEBUG ((DEBUG_INFO, "PmGpeEn Reg 0x%lx\n", AcpiBoardInfo->PmGpeEnBase));\r
327 DEBUG ((DEBUG_INFO, "PcieBaseAddr 0x%lx\n", AcpiBoardInfo->PcieBaseAddress));\r
28d7eea9 328 DEBUG ((DEBUG_INFO, "PcieBaseSize 0x%lx\n", AcpiBoardInfo->PcieBaseSize));\r
04af8bf2
DG
329\r
330 //\r
331 // Verify values for proper operation\r
332 //\r
333 ASSERT(Fadt->Pm1aCntBlk != 0);\r
334 ASSERT(Fadt->PmTmrBlk != 0);\r
335 ASSERT(Fadt->ResetReg.Address != 0);\r
336 ASSERT(Fadt->Pm1aEvtBlk != 0);\r
337 ASSERT(Fadt->Gpe0Blk != 0);\r
338\r
339 DEBUG_CODE_BEGIN ();\r
340 BOOLEAN SciEnabled;\r
341\r
342 //\r
343 // Check the consistency of SCI enabling\r
344 //\r
345\r
346 //\r
347 // Get SCI_EN value\r
348 //\r
349 if (Fadt->Pm1CntLen == 4) {\r
350 SciEnabled = (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
351 } else {\r
352 //\r
353 // if (Pm1CntLen == 2), use 16 bit IO read;\r
354 // if (Pm1CntLen != 2 && Pm1CntLen != 4), use 16 bit IO read as a fallback\r
355 //\r
356 SciEnabled = (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
357 }\r
358\r
359 if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) &&\r
360 (Fadt->SmiCmd == 0) &&\r
361 !SciEnabled) {\r
362 //\r
363 // The ACPI enabling status is inconsistent: SCI is not enabled but ACPI\r
364 // table does not provide a means to enable it through FADT->SmiCmd\r
365 //\r
366 DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsistent: SCI is not"\r
367 " enabled but the ACPI table does not provide a means to enable it through FADT->SmiCmd."\r
368 " This may cause issues in OS.\n"));\r
369 }\r
370 DEBUG_CODE_END ();\r
371\r
372 return RETURN_SUCCESS;\r
373}\r
374\r
04af8bf2
DG
375\r
376/**\r
7c4ab1c2 377 It will build HOBs based on information from bootloaders.\r
04af8bf2 378\r
7c4ab1c2
GD
379 @retval EFI_SUCCESS If it completed successfully.\r
380 @retval Others If it failed to build required HOBs.\r
04af8bf2
DG
381**/\r
382EFI_STATUS\r
7c4ab1c2
GD
383BuildHobFromBl (\r
384 VOID\r
04af8bf2
DG
385 )\r
386{\r
387 EFI_STATUS Status;\r
04af8bf2
DG
388 SYSTEM_TABLE_INFO SysTableInfo;\r
389 SYSTEM_TABLE_INFO *NewSysTableInfo;\r
390 ACPI_BOARD_INFO AcpiBoardInfo;\r
391 ACPI_BOARD_INFO *NewAcpiBoardInfo;\r
392 EFI_PEI_GRAPHICS_INFO_HOB GfxInfo;\r
393 EFI_PEI_GRAPHICS_INFO_HOB *NewGfxInfo;\r
394 EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo;\r
395 EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *NewGfxDeviceInfo;\r
302a8f35 396 UNIVERSAL_PAYLOAD_SMBIOS_TABLE *SmBiosTableHob;\r
8c0d6780 397 UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTableHob;\r
04af8bf2 398\r
04af8bf2 399 //\r
1e5e58d3
PR
400 // First find TOLUD\r
401 //\r
402 DEBUG ((DEBUG_INFO , "Guessing Top of Lower Usable DRAM:\n"));\r
403 Status = ParseMemoryInfo (FindToludCallback, NULL);\r
404 if (EFI_ERROR(Status)) {\r
405 return Status;\r
406 }\r
407 DEBUG ((DEBUG_INFO , "Assuming TOLUD = 0x%x\n", mTopOfLowerUsableDram));\r
408\r
409 //\r
410 // Parse memory info and build memory HOBs for Usable RAM\r
04af8bf2 411 //\r
1e5e58d3 412 DEBUG ((DEBUG_INFO , "Building ResourceDescriptorHobs for usable memory:\n"));\r
7c4ab1c2 413 Status = ParseMemoryInfo (MemInfoCallback, NULL);\r
04af8bf2
DG
414 if (EFI_ERROR(Status)) {\r
415 return Status;\r
416 }\r
417\r
04af8bf2
DG
418 //\r
419 // Create guid hob for frame buffer information\r
420 //\r
421 Status = ParseGfxInfo (&GfxInfo);\r
422 if (!EFI_ERROR (Status)) {\r
423 NewGfxInfo = BuildGuidHob (&gEfiGraphicsInfoHobGuid, sizeof (GfxInfo));\r
424 ASSERT (NewGfxInfo != NULL);\r
425 CopyMem (NewGfxInfo, &GfxInfo, sizeof (GfxInfo));\r
426 DEBUG ((DEBUG_INFO, "Created graphics info hob\n"));\r
427 }\r
428\r
429\r
430 Status = ParseGfxDeviceInfo (&GfxDeviceInfo);\r
431 if (!EFI_ERROR (Status)) {\r
432 NewGfxDeviceInfo = BuildGuidHob (&gEfiGraphicsDeviceInfoHobGuid, sizeof (GfxDeviceInfo));\r
433 ASSERT (NewGfxDeviceInfo != NULL);\r
434 CopyMem (NewGfxDeviceInfo, &GfxDeviceInfo, sizeof (GfxDeviceInfo));\r
435 DEBUG ((DEBUG_INFO, "Created graphics device info hob\n"));\r
436 }\r
437\r
438\r
439 //\r
440 // Create guid hob for system tables like acpi table and smbios table\r
441 //\r
442 Status = ParseSystemTable(&SysTableInfo);\r
443 ASSERT_EFI_ERROR (Status);\r
444 if (!EFI_ERROR (Status)) {\r
445 NewSysTableInfo = BuildGuidHob (&gUefiSystemTableInfoGuid, sizeof (SYSTEM_TABLE_INFO));\r
446 ASSERT (NewSysTableInfo != NULL);\r
447 CopyMem (NewSysTableInfo, &SysTableInfo, sizeof (SYSTEM_TABLE_INFO));\r
448 DEBUG ((DEBUG_INFO, "Detected Acpi Table at 0x%lx, length 0x%x\n", SysTableInfo.AcpiTableBase, SysTableInfo.AcpiTableSize));\r
449 DEBUG ((DEBUG_INFO, "Detected Smbios Table at 0x%lx, length 0x%x\n", SysTableInfo.SmbiosTableBase, SysTableInfo.SmbiosTableSize));\r
450 }\r
302a8f35
ZL
451 //\r
452 // Creat SmBios table Hob\r
453 //\r
454 SmBiosTableHob = BuildGuidHob (&gUniversalPayloadSmbiosTableGuid, sizeof (UNIVERSAL_PAYLOAD_SMBIOS_TABLE));\r
455 ASSERT (SmBiosTableHob != NULL);\r
456 SmBiosTableHob->Header.Revision = UNIVERSAL_PAYLOAD_SMBIOS_TABLE_REVISION;\r
457 SmBiosTableHob->Header.Length = sizeof (UNIVERSAL_PAYLOAD_SMBIOS_TABLE);\r
458 SmBiosTableHob->SmBiosEntryPoint = SysTableInfo.SmbiosTableBase;\r
459 DEBUG ((DEBUG_INFO, "Create smbios table gUniversalPayloadSmbiosTableGuid guid hob\n"));\r
04af8bf2 460\r
8c0d6780
ZL
461 //\r
462 // Creat ACPI table Hob\r
463 //\r
464 AcpiTableHob = BuildGuidHob (&gUniversalPayloadAcpiTableGuid, sizeof (UNIVERSAL_PAYLOAD_ACPI_TABLE));\r
465 ASSERT (AcpiTableHob != NULL);\r
466 AcpiTableHob->Header.Revision = UNIVERSAL_PAYLOAD_ACPI_TABLE_REVISION;\r
467 AcpiTableHob->Header.Length = sizeof (UNIVERSAL_PAYLOAD_ACPI_TABLE);\r
468 AcpiTableHob->Rsdp = SysTableInfo.AcpiTableBase;\r
469 DEBUG ((DEBUG_INFO, "Create smbios table gUniversalPayloadAcpiTableGuid guid hob\n"));\r
470\r
04af8bf2
DG
471 //\r
472 // Create guid hob for acpi board information\r
473 //\r
474 Status = ParseAcpiInfo (SysTableInfo.AcpiTableBase, &AcpiBoardInfo);\r
475 ASSERT_EFI_ERROR (Status);\r
476 if (!EFI_ERROR (Status)) {\r
477 NewAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
478 ASSERT (NewAcpiBoardInfo != NULL);\r
479 CopyMem (NewAcpiBoardInfo, &AcpiBoardInfo, sizeof (ACPI_BOARD_INFO));\r
480 DEBUG ((DEBUG_INFO, "Create acpi board info guid hob\n"));\r
481 }\r
482\r
1e5e58d3
PR
483 //\r
484 // Parse memory info and build memory HOBs for reserved DRAM and MMIO\r
485 //\r
486 DEBUG ((DEBUG_INFO , "Building ResourceDescriptorHobs for reserved memory:\n"));\r
487 Status = ParseMemoryInfo (MemInfoCallbackMmio, &AcpiBoardInfo);\r
488 if (EFI_ERROR(Status)) {\r
489 return Status;\r
490 }\r
491\r
04af8bf2
DG
492 //\r
493 // Parse platform specific information.\r
494 //\r
495 Status = ParsePlatformInfo ();\r
496 if (EFI_ERROR (Status)) {\r
497 DEBUG ((DEBUG_ERROR, "Error when parsing platform info, Status = %r\n", Status));\r
498 return Status;\r
499 }\r
500\r
7c4ab1c2
GD
501 return EFI_SUCCESS;\r
502}\r
503\r
504\r
505/**\r
506 This function will build some generic HOBs that doesn't depend on information from bootloaders.\r
507\r
508**/\r
509VOID\r
510BuildGenericHob (\r
511 VOID\r
512 )\r
513{\r
514 UINT32 RegEax;\r
515 UINT8 PhysicalAddressBits;\r
516 EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute;\r
517\r
518 // The UEFI payload FV\r
519 BuildMemoryAllocationHob (PcdGet32 (PcdPayloadFdMemBase), PcdGet32 (PcdPayloadFdMemSize), EfiBootServicesData);\r
520\r
521 //\r
522 // Build CPU memory space and IO space hob\r
523 //\r
524 AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);\r
525 if (RegEax >= 0x80000008) {\r
526 AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);\r
527 PhysicalAddressBits = (UINT8) RegEax;\r
528 } else {\r
529 PhysicalAddressBits = 36;\r
530 }\r
531\r
532 BuildCpuHob (PhysicalAddressBits, 16);\r
533\r
534 //\r
535 // Report Local APIC range, cause sbl HOB to be NULL, comment now\r
536 //\r
537 ResourceAttribute = (\r
538 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
539 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
540 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
541 EFI_RESOURCE_ATTRIBUTE_TESTED\r
542 );\r
543 BuildResourceDescriptorHob (EFI_RESOURCE_MEMORY_MAPPED_IO, ResourceAttribute, 0xFEC80000, SIZE_512KB);\r
544 BuildMemoryAllocationHob ( 0xFEC80000, SIZE_512KB, EfiMemoryMappedIO);\r
545\r
546}\r
547\r
548\r
549/**\r
550 Entry point to the C language phase of UEFI payload.\r
551\r
552 @retval It will not return if SUCCESS, and return error when passing bootloader parameter.\r
553**/\r
554EFI_STATUS\r
555EFIAPI\r
556PayloadEntry (\r
557 IN UINTN BootloaderParameter\r
558 )\r
559{\r
560 EFI_STATUS Status;\r
561 PHYSICAL_ADDRESS DxeCoreEntryPoint;\r
7c4ab1c2 562 UINTN MemBase;\r
7c4ab1c2
GD
563 UINTN HobMemBase;\r
564 UINTN HobMemTop;\r
565 EFI_PEI_HOB_POINTERS Hob;\r
566\r
567 // Call constructor for all libraries\r
568 ProcessLibraryConstructorList ();\r
569\r
570 DEBUG ((DEBUG_INFO, "GET_BOOTLOADER_PARAMETER() = 0x%lx\n", GET_BOOTLOADER_PARAMETER()));\r
571 DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof(UINTN)));\r
572\r
573 // Initialize floating point operating environment to be compliant with UEFI spec.\r
574 InitializeFloatingPointUnits ();\r
575\r
576 // HOB region is used for HOB and memory allocation for this module\r
577 MemBase = PcdGet32 (PcdPayloadFdMemBase);\r
578 HobMemBase = ALIGN_VALUE (MemBase + PcdGet32 (PcdPayloadFdMemSize), SIZE_1MB);\r
579 HobMemTop = HobMemBase + FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);\r
580\r
d63595c3 581 HobConstructor ((VOID *)MemBase, (VOID *)HobMemTop, (VOID *)HobMemBase, (VOID *)HobMemTop);\r
7c4ab1c2
GD
582\r
583 // Build HOB based on information from Bootloader\r
584 Status = BuildHobFromBl ();\r
585 if (EFI_ERROR (Status)) {\r
586 DEBUG ((DEBUG_ERROR, "BuildHobFromBl Status = %r\n", Status));\r
587 return Status;\r
588 }\r
589\r
590 // Build other HOBs required by DXE\r
591 BuildGenericHob ();\r
592\r
593 // Load the DXE Core\r
594 Status = LoadDxeCore (&DxeCoreEntryPoint);\r
595 ASSERT_EFI_ERROR (Status);\r
596\r
597 DEBUG ((DEBUG_INFO, "DxeCoreEntryPoint = 0x%lx\n", DxeCoreEntryPoint));\r
598\r
04af8bf2
DG
599 //\r
600 // Mask off all legacy 8259 interrupt sources\r
601 //\r
602 IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);\r
603 IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);\r
604\r
fea7901d 605 Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *) GetFirstHob(EFI_HOB_TYPE_HANDOFF);\r
7c4ab1c2
GD
606 HandOffToDxeCore (DxeCoreEntryPoint, Hob);\r
607\r
608 // Should not get here\r
609 CpuDeadLoop ();\r
04af8bf2
DG
610 return EFI_SUCCESS;\r
611}\r