]> git.proxmox.com Git - mirror_edk2.git/blame - CorebootModulePkg/CbSupportPei/CbSupportPei.c
CorebootModulePkg: DEBUG print format corrections
[mirror_edk2.git] / CorebootModulePkg / CbSupportPei / CbSupportPei.c
CommitLineData
fce4ecd9
MM
1/** @file\r
2 This PEIM will parse coreboot table in memory and report resource information into pei core. \r
3 This file contains the main entrypoint of the PEIM.\r
4 \r
5Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
6This program and the accompanying materials\r
7are licensed and made available under the terms and conditions of the BSD License\r
8which accompanies this distribution. The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15#include "CbSupportPei.h"\r
16\r
17EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {\r
18 { EfiACPIReclaimMemory, 0x008 }, \r
19 { EfiACPIMemoryNVS, 0x004 }, \r
20 { EfiReservedMemoryType, 0x004 }, \r
21 { EfiRuntimeServicesData, 0x080 },\r
22 { EfiRuntimeServicesCode, 0x080 },\r
23 { EfiMaxMemoryType, 0 }\r
24};\r
25\r
26EFI_PEI_PPI_DESCRIPTOR mPpiBootMode[] = {\r
27 {\r
28 EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
29 &gEfiPeiMasterBootModePpiGuid,\r
30 NULL\r
31 }\r
32};\r
33\r
34/**\r
35 Create memory mapped io resource hob. \r
36 \r
37 @param MmioBase Base address of the memory mapped io range\r
38 @param MmioSize Length of the memory mapped io range\r
39 \r
40**/\r
41VOID\r
42BuildMemoryMappedIoRangeHob (\r
43 EFI_PHYSICAL_ADDRESS MmioBase,\r
44 UINT64 MmioSize\r
45 )\r
46{\r
47 BuildResourceDescriptorHob (\r
48 EFI_RESOURCE_MEMORY_MAPPED_IO,\r
49 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
50 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
51 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
52 EFI_RESOURCE_ATTRIBUTE_TESTED),\r
53 MmioBase,\r
54 MmioSize\r
55 );\r
56 \r
57 BuildMemoryAllocationHob (\r
58 MmioBase,\r
59 MmioSize,\r
60 EfiMemoryMappedIO\r
61 ); \r
62}\r
63\r
64/**\r
65 Check the integrity of firmware volume header\r
66\r
67 @param[in] FwVolHeader A pointer to a firmware volume header\r
68\r
69 @retval TRUE The firmware volume is consistent\r
70 @retval FALSE The firmware volume has corrupted.\r
71\r
72**/\r
73STATIC\r
74BOOLEAN\r
75IsFvHeaderValid (\r
76 IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
77 )\r
78{\r
79 UINT16 Checksum;\r
80 \r
81 // Skip nv storage fv\r
82 if (CompareMem (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem2Guid, sizeof(EFI_GUID)) != 0 ) {\r
83 return FALSE;\r
84 }\r
85 \r
86 if ( (FwVolHeader->Revision != EFI_FVH_REVISION) ||\r
87 (FwVolHeader->Signature != EFI_FVH_SIGNATURE) ||\r
88 (FwVolHeader->FvLength == ((UINTN) -1)) ||\r
89 ((FwVolHeader->HeaderLength & 0x01 ) !=0) ) {\r
90 return FALSE;\r
91 }\r
92 \r
93 Checksum = CalculateCheckSum16 ((UINT16 *) FwVolHeader, FwVolHeader->HeaderLength);\r
94 if (Checksum != 0) {\r
95 DEBUG (( DEBUG_ERROR,\r
96 "ERROR - Invalid Firmware Volume Header Checksum, change 0x%04x to 0x%04x\r\n",\r
97 FwVolHeader->Checksum,\r
98 (UINT16)( Checksum + FwVolHeader->Checksum )));\r
99 return FALSE;\r
100 }\r
101\r
102 return TRUE; \r
103}\r
104\r
105/**\r
106 Install FvInfo PPI and create fv hobs for remained fvs\r
107 \r
108**/\r
109VOID\r
110CbPeiReportRemainedFvs (\r
111 VOID\r
112 )\r
113{\r
114 UINT8* TempPtr;\r
115 UINT8* EndPtr;\r
116 \r
117 TempPtr = (UINT8* )(UINTN) PcdGet32 (PcdPayloadFdMemBase);\r
118 EndPtr = (UINT8* )(UINTN) (PcdGet32 (PcdPayloadFdMemBase) + PcdGet32 (PcdPayloadFdMemSize));\r
119 \r
120 for (;TempPtr < EndPtr;) {\r
121 if (IsFvHeaderValid ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)) {\r
122 if (TempPtr != (UINT8* )(UINTN) PcdGet32 (PcdPayloadFdMemBase)) {\r
123 // Skip the PEI FV\r
42e548a8 124 DEBUG((EFI_D_ERROR, "Found one valid fv : 0x%lx.\n", TempPtr, ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength)); \r
fce4ecd9
MM
125 \r
126 PeiServicesInstallFvInfoPpi (\r
127 NULL,\r
128 (VOID *) (UINTN) TempPtr,\r
129 (UINT32) (UINTN) ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength,\r
130 NULL,\r
131 NULL\r
132 );\r
133 BuildFvHob ((EFI_PHYSICAL_ADDRESS)(UINTN) TempPtr, ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength); \r
134 } \r
135 }\r
136 TempPtr += ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength; \r
137 } \r
138}\r
139\r
140/**\r
141 This is the entrypoint of PEIM\r
142 \r
143 @param FileHandle Handle of the file being invoked.\r
144 @param PeiServices Describes the list of possible PEI Services.\r
145\r
146 @retval EFI_SUCCESS if it completed successfully. \r
147**/\r
148EFI_STATUS\r
149EFIAPI\r
150CbPeiEntryPoint (\r
151 IN EFI_PEI_FILE_HANDLE FileHandle,\r
152 IN CONST EFI_PEI_SERVICES **PeiServices\r
153 )\r
154{\r
155 EFI_STATUS Status;\r
156 UINT64 LowMemorySize, HighMemorySize;\r
157 UINT64 PeiMemSize = SIZE_64MB; // 64 MB\r
158 EFI_PHYSICAL_ADDRESS PeiMemBase = 0;\r
159 UINT32 RegEax;\r
160 UINT8 PhysicalAddressBits;\r
161 VOID* pCbHeader;\r
162 VOID* pAcpiTable;\r
163 UINT32 AcpiTableSize;\r
164 VOID* pSmbiosTable;\r
165 UINT32 SmbiosTableSize;\r
166 SYSTEM_TABLE_INFO* pSystemTableInfo;\r
167 FRAME_BUFFER_INFO FbInfo;\r
168 FRAME_BUFFER_INFO* pFbInfo;\r
169 ACPI_BOARD_INFO* pAcpiBoardInfo;\r
170 UINTN PmCtrlRegBase, PmTimerRegBase, ResetRegAddress, ResetValue;\r
171 \r
172 LowMemorySize = 0;\r
173 HighMemorySize = 0;\r
174 \r
175 Status = CbParseMemoryInfo (&LowMemorySize, &HighMemorySize);\r
176 if (EFI_ERROR(Status)) \r
177 return Status;\r
178 \r
42e548a8
SD
179 DEBUG((EFI_D_ERROR, "LowMemorySize: 0x%lx.\n", LowMemorySize));\r
180 DEBUG((EFI_D_ERROR, "HighMemorySize: 0x%lx.\n", HighMemorySize));\r
fce4ecd9
MM
181 \r
182 ASSERT (LowMemorySize > 0);\r
183 \r
184 BuildResourceDescriptorHob ( \r
185 EFI_RESOURCE_SYSTEM_MEMORY,\r
186 (\r
187 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
188 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
189 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
190 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
191 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
192 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
193 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
194 ),\r
195 (EFI_PHYSICAL_ADDRESS)(0),\r
196 (UINT64)(0xA0000)\r
197 );\r
198 \r
199 \r
200 BuildResourceDescriptorHob ( \r
201 EFI_RESOURCE_MEMORY_RESERVED,\r
202 (\r
203 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
204 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
205 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
206 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
207 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
208 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
209 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
210 ),\r
211 (EFI_PHYSICAL_ADDRESS)(0xA0000),\r
212 (UINT64)(0x60000)\r
213 );\r
214 \r
215 BuildResourceDescriptorHob (\r
216 EFI_RESOURCE_SYSTEM_MEMORY,\r
217 (\r
218 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
219 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
220 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
221 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
222 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
223 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
224 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
225 ),\r
226 (EFI_PHYSICAL_ADDRESS)(0x100000),\r
227 (UINT64) (LowMemorySize - 0x100000)\r
228 );\r
229 \r
230 if (HighMemorySize > 0) {\r
231 BuildResourceDescriptorHob (\r
232 EFI_RESOURCE_SYSTEM_MEMORY,\r
233 (\r
234 EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
235 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
236 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
237 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
238 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
239 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
240 ),\r
c3911fd8 241 (EFI_PHYSICAL_ADDRESS)(0x100000000ULL),\r
fce4ecd9
MM
242 HighMemorySize\r
243 ); \r
244 } \r
245 \r
246 //\r
247 // Should be 64k aligned\r
248 //\r
249 PeiMemBase = (LowMemorySize - PeiMemSize) & (~(BASE_64KB - 1));\r
250 \r
42e548a8
SD
251 DEBUG((EFI_D_ERROR, "PeiMemBase: 0x%lx.\n", PeiMemBase));\r
252 DEBUG((EFI_D_ERROR, "PeiMemSize: 0x%lx.\n", PeiMemSize)); \r
fce4ecd9
MM
253 \r
254 Status = PeiServicesInstallPeiMemory (\r
255 PeiMemBase, \r
256 PeiMemSize\r
257 );\r
258 ASSERT_EFI_ERROR (Status); \r
259 \r
260 //\r
261 // Set cache on the physical memory\r
262 // \r
263 MtrrSetMemoryAttribute (BASE_1MB, LowMemorySize - BASE_1MB, CacheWriteBack);\r
264 MtrrSetMemoryAttribute (0, 0xA0000, CacheWriteBack);\r
265 \r
266 //\r
267 // Create Memory Type Information HOB\r
268 //\r
269 BuildGuidDataHob (\r
270 &gEfiMemoryTypeInformationGuid,\r
271 mDefaultMemoryTypeInformation,\r
272 sizeof(mDefaultMemoryTypeInformation)\r
273 );\r
274 \r
275 //\r
276 // Create Fv hob\r
277 //\r
278 CbPeiReportRemainedFvs (); \r
279 \r
280 BuildMemoryAllocationHob (\r
281 PcdGet32 (PcdPayloadFdMemBase),\r
282 PcdGet32 (PcdPayloadFdMemSize),\r
283 EfiBootServicesData\r
284 );\r
285 \r
286 //\r
287 // Build CPU memory space and IO space hob\r
288 //\r
289 AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);\r
290 if (RegEax >= 0x80000008) {\r
291 AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL); \r
292 PhysicalAddressBits = (UINT8) RegEax;\r
293 } else {\r
294 PhysicalAddressBits = 36;\r
295 }\r
296 //\r
297 // Create a CPU hand-off information\r
298 // \r
299 BuildCpuHob (PhysicalAddressBits, 16);\r
300 \r
301 //\r
302 // Report Local APIC range\r
303 //\r
304 BuildMemoryMappedIoRangeHob (0xFEC80000, SIZE_512KB);\r
305 \r
306 //\r
307 // Boot mode\r
308 //\r
309 Status = PeiServicesSetBootMode (BOOT_WITH_FULL_CONFIGURATION);\r
310 ASSERT_EFI_ERROR (Status);\r
311 \r
312 Status = PeiServicesInstallPpi (mPpiBootMode);\r
313 ASSERT_EFI_ERROR (Status);\r
314 \r
315 //\r
316 // Set pcd to save the upper coreboot header in case the dxecore will\r
317 // erase 0~4k memory\r
318 //\r
319 pCbHeader = NULL;\r
320 if ((CbParseGetCbHeader (1, &pCbHeader) == RETURN_SUCCESS) \r
321 && ((UINTN)pCbHeader > BASE_4KB)) {\r
42e548a8 322 DEBUG((EFI_D_ERROR, "Actual Coreboot header: %p.\n", pCbHeader)); \r
fce4ecd9
MM
323 PcdSet32 (PcdCbHeaderPointer, (UINT32)(UINTN)pCbHeader);\r
324 }\r
325 \r
326 //\r
327 // Create guid hob for system tables like acpi table and smbios table\r
328 //\r
329 pAcpiTable = NULL;\r
330 AcpiTableSize = 0;\r
331 pSmbiosTable = NULL;\r
332 SmbiosTableSize = 0;\r
333 Status = CbParseAcpiTable (&pAcpiTable, &AcpiTableSize);\r
334 if (EFI_ERROR (Status)) {\r
335 // ACPI table is oblidgible \r
336 DEBUG ((EFI_D_ERROR, "Failed to find the required acpi table\n"));\r
337 ASSERT (FALSE);\r
338 }\r
339 CbParseSmbiosTable (&pSmbiosTable, &SmbiosTableSize);\r
340 \r
341 pSystemTableInfo = NULL;\r
342 pSystemTableInfo = BuildGuidHob (&gUefiSystemTableInfoGuid, sizeof (SYSTEM_TABLE_INFO));\r
343 ASSERT (pSystemTableInfo != NULL);\r
344 pSystemTableInfo->AcpiTableBase = (UINT64) (UINTN)pAcpiTable;\r
345 pSystemTableInfo->AcpiTableSize = AcpiTableSize; \r
346 pSystemTableInfo->SmbiosTableBase = (UINT64) (UINTN)pSmbiosTable;\r
347 pSystemTableInfo->SmbiosTableSize = SmbiosTableSize;\r
42e548a8
SD
348 DEBUG ((EFI_D_ERROR, "Detected Acpi Table at 0x%lx, length 0x%x\n", pSystemTableInfo->AcpiTableBase, pSystemTableInfo->AcpiTableSize)); \r
349 DEBUG ((EFI_D_ERROR, "Detected Smbios Table at 0x%lx, length 0x%x\n", pSystemTableInfo->SmbiosTableBase, pSystemTableInfo->SmbiosTableSize)); \r
fce4ecd9
MM
350 DEBUG ((EFI_D_ERROR, "Create system table info guid hob\n"));\r
351 \r
352 //\r
353 // Create guid hob for acpi board information\r
354 // \r
355 Status = CbParseFadtInfo (&PmCtrlRegBase, &PmTimerRegBase, &ResetRegAddress, &ResetValue);\r
356 ASSERT_EFI_ERROR (Status);\r
357 pAcpiBoardInfo = NULL;\r
358 pAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
359 ASSERT (pAcpiBoardInfo != NULL);\r
360 pAcpiBoardInfo->PmCtrlRegBase = (UINT64)PmCtrlRegBase;\r
361 pAcpiBoardInfo->PmTimerRegBase = (UINT64)PmTimerRegBase;\r
362 pAcpiBoardInfo->ResetRegAddress = (UINT64)ResetRegAddress;\r
363 pAcpiBoardInfo->ResetValue = (UINT8)ResetValue; \r
364 DEBUG ((EFI_D_ERROR, "Create acpi board info guid hob\n"));\r
365 \r
366 //\r
367 // Create guid hob for frame buffer information\r
368 //\r
369 ZeroMem (&FbInfo, sizeof (FRAME_BUFFER_INFO)); \r
370 Status = CbParseFbInfo (&FbInfo);\r
371 if (!EFI_ERROR (Status)) {\r
372 pFbInfo = BuildGuidHob (&gUefiFrameBufferInfoGuid, sizeof (FRAME_BUFFER_INFO));\r
373 ASSERT (pSystemTableInfo != NULL);\r
374 CopyMem (pFbInfo, &FbInfo, sizeof (FRAME_BUFFER_INFO)); \r
375 DEBUG ((EFI_D_ERROR, "Create frame buffer info guid hob\n")); \r
376 }\r
377 \r
378 return EFI_SUCCESS;\r
379}\r
380\r