2 This PEIM will parse coreboot table in memory and report resource information into pei core.
3 This file contains the main entrypoint of the PEIM.
5 Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "CbSupportPei.h"
17 #define LEGACY_8259_MASK_REGISTER_MASTER 0x21
18 #define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1
20 EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation
[] = {
21 { EfiACPIReclaimMemory
, 0x008 },
22 { EfiACPIMemoryNVS
, 0x004 },
23 { EfiReservedMemoryType
, 0x004 },
24 { EfiRuntimeServicesData
, 0x080 },
25 { EfiRuntimeServicesCode
, 0x080 },
26 { EfiMaxMemoryType
, 0 }
29 EFI_PEI_PPI_DESCRIPTOR mPpiBootMode
[] = {
31 EFI_PEI_PPI_DESCRIPTOR_PPI
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
,
32 &gEfiPeiMasterBootModePpiGuid
,
38 Create memory mapped io resource hob.
40 @param MmioBase Base address of the memory mapped io range
41 @param MmioSize Length of the memory mapped io range
45 BuildMemoryMappedIoRangeHob (
46 EFI_PHYSICAL_ADDRESS MmioBase
,
50 BuildResourceDescriptorHob (
51 EFI_RESOURCE_MEMORY_MAPPED_IO
,
52 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
53 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
54 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
55 EFI_RESOURCE_ATTRIBUTE_TESTED
),
60 BuildMemoryAllocationHob (
68 Check the integrity of firmware volume header
70 @param[in] FwVolHeader A pointer to a firmware volume header
72 @retval TRUE The firmware volume is consistent
73 @retval FALSE The firmware volume has corrupted.
79 IN EFI_FIRMWARE_VOLUME_HEADER
*FwVolHeader
85 if (CompareMem (&FwVolHeader
->FileSystemGuid
, &gEfiFirmwareFileSystem2Guid
, sizeof(EFI_GUID
)) != 0 ) {
89 if ( (FwVolHeader
->Revision
!= EFI_FVH_REVISION
) ||
90 (FwVolHeader
->Signature
!= EFI_FVH_SIGNATURE
) ||
91 (FwVolHeader
->FvLength
== ((UINTN
) -1)) ||
92 ((FwVolHeader
->HeaderLength
& 0x01 ) !=0) ) {
96 Checksum
= CalculateCheckSum16 ((UINT16
*) FwVolHeader
, FwVolHeader
->HeaderLength
);
99 "ERROR - Invalid Firmware Volume Header Checksum, change 0x%04x to 0x%04x\r\n",
100 FwVolHeader
->Checksum
,
101 (UINT16
)( Checksum
+ FwVolHeader
->Checksum
)));
109 Install FvInfo PPI and create fv hobs for remained fvs
113 CbPeiReportRemainedFvs (
120 TempPtr
= (UINT8
* )(UINTN
) PcdGet32 (PcdPayloadFdMemBase
);
121 EndPtr
= (UINT8
* )(UINTN
) (PcdGet32 (PcdPayloadFdMemBase
) + PcdGet32 (PcdPayloadFdMemSize
));
123 for (;TempPtr
< EndPtr
;) {
124 if (IsFvHeaderValid ((EFI_FIRMWARE_VOLUME_HEADER
* )TempPtr
)) {
125 if (TempPtr
!= (UINT8
* )(UINTN
) PcdGet32 (PcdPayloadFdMemBase
)) {
127 DEBUG((EFI_D_ERROR
, "Found one valid fv : 0x%lx.\n", TempPtr
, ((EFI_FIRMWARE_VOLUME_HEADER
* )TempPtr
)->FvLength
));
129 PeiServicesInstallFvInfoPpi (
131 (VOID
*) (UINTN
) TempPtr
,
132 (UINT32
) (UINTN
) ((EFI_FIRMWARE_VOLUME_HEADER
* )TempPtr
)->FvLength
,
136 BuildFvHob ((EFI_PHYSICAL_ADDRESS
)(UINTN
) TempPtr
, ((EFI_FIRMWARE_VOLUME_HEADER
* )TempPtr
)->FvLength
);
139 TempPtr
+= ((EFI_FIRMWARE_VOLUME_HEADER
* )TempPtr
)->FvLength
;
144 This is the entrypoint of PEIM
146 @param FileHandle Handle of the file being invoked.
147 @param PeiServices Describes the list of possible PEI Services.
149 @retval EFI_SUCCESS if it completed successfully.
154 IN EFI_PEI_FILE_HANDLE FileHandle
,
155 IN CONST EFI_PEI_SERVICES
**PeiServices
159 UINT64 LowMemorySize
, HighMemorySize
;
160 UINT64 PeiMemSize
= SIZE_64MB
; // 64 MB
161 EFI_PHYSICAL_ADDRESS PeiMemBase
= 0;
163 UINT8 PhysicalAddressBits
;
166 UINT32 AcpiTableSize
;
168 UINT32 SmbiosTableSize
;
169 SYSTEM_TABLE_INFO
* pSystemTableInfo
;
170 FRAME_BUFFER_INFO FbInfo
;
171 FRAME_BUFFER_INFO
* pFbInfo
;
172 ACPI_BOARD_INFO
* pAcpiBoardInfo
;
173 UINTN PmCtrlRegBase
, PmTimerRegBase
, ResetRegAddress
, ResetValue
;
178 Status
= CbParseMemoryInfo (&LowMemorySize
, &HighMemorySize
);
179 if (EFI_ERROR(Status
))
182 DEBUG((EFI_D_ERROR
, "LowMemorySize: 0x%lx.\n", LowMemorySize
));
183 DEBUG((EFI_D_ERROR
, "HighMemorySize: 0x%lx.\n", HighMemorySize
));
185 ASSERT (LowMemorySize
> 0);
187 BuildResourceDescriptorHob (
188 EFI_RESOURCE_SYSTEM_MEMORY
,
190 EFI_RESOURCE_ATTRIBUTE_PRESENT
|
191 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
192 EFI_RESOURCE_ATTRIBUTE_TESTED
|
193 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
194 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
195 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
196 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
198 (EFI_PHYSICAL_ADDRESS
)(0),
203 BuildResourceDescriptorHob (
204 EFI_RESOURCE_MEMORY_RESERVED
,
206 EFI_RESOURCE_ATTRIBUTE_PRESENT
|
207 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
208 EFI_RESOURCE_ATTRIBUTE_TESTED
|
209 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
210 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
211 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
212 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
214 (EFI_PHYSICAL_ADDRESS
)(0xA0000),
218 BuildResourceDescriptorHob (
219 EFI_RESOURCE_SYSTEM_MEMORY
,
221 EFI_RESOURCE_ATTRIBUTE_PRESENT
|
222 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
223 EFI_RESOURCE_ATTRIBUTE_TESTED
|
224 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
225 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
226 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
227 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
229 (EFI_PHYSICAL_ADDRESS
)(0x100000),
230 (UINT64
) (LowMemorySize
- 0x100000)
233 if (HighMemorySize
> 0) {
234 BuildResourceDescriptorHob (
235 EFI_RESOURCE_SYSTEM_MEMORY
,
237 EFI_RESOURCE_ATTRIBUTE_PRESENT
|
238 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
239 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
240 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
241 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
242 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
244 (EFI_PHYSICAL_ADDRESS
)(0x100000000ULL
),
250 // Should be 64k aligned
252 PeiMemBase
= (LowMemorySize
- PeiMemSize
) & (~(BASE_64KB
- 1));
254 DEBUG((EFI_D_ERROR
, "PeiMemBase: 0x%lx.\n", PeiMemBase
));
255 DEBUG((EFI_D_ERROR
, "PeiMemSize: 0x%lx.\n", PeiMemSize
));
257 Status
= PeiServicesInstallPeiMemory (
261 ASSERT_EFI_ERROR (Status
);
264 // Set cache on the physical memory
266 MtrrSetMemoryAttribute (BASE_1MB
, LowMemorySize
- BASE_1MB
, CacheWriteBack
);
267 MtrrSetMemoryAttribute (0, 0xA0000, CacheWriteBack
);
270 // Create Memory Type Information HOB
273 &gEfiMemoryTypeInformationGuid
,
274 mDefaultMemoryTypeInformation
,
275 sizeof(mDefaultMemoryTypeInformation
)
281 CbPeiReportRemainedFvs ();
283 BuildMemoryAllocationHob (
284 PcdGet32 (PcdPayloadFdMemBase
),
285 PcdGet32 (PcdPayloadFdMemSize
),
290 // Build CPU memory space and IO space hob
292 AsmCpuid (0x80000000, &RegEax
, NULL
, NULL
, NULL
);
293 if (RegEax
>= 0x80000008) {
294 AsmCpuid (0x80000008, &RegEax
, NULL
, NULL
, NULL
);
295 PhysicalAddressBits
= (UINT8
) RegEax
;
297 PhysicalAddressBits
= 36;
300 // Create a CPU hand-off information
302 BuildCpuHob (PhysicalAddressBits
, 16);
305 // Report Local APIC range
307 BuildMemoryMappedIoRangeHob (0xFEC80000, SIZE_512KB
);
312 Status
= PeiServicesSetBootMode (BOOT_WITH_FULL_CONFIGURATION
);
313 ASSERT_EFI_ERROR (Status
);
315 Status
= PeiServicesInstallPpi (mPpiBootMode
);
316 ASSERT_EFI_ERROR (Status
);
319 // Set pcd to save the upper coreboot header in case the dxecore will
323 if ((CbParseGetCbHeader (1, &pCbHeader
) == RETURN_SUCCESS
)
324 && ((UINTN
)pCbHeader
> BASE_4KB
)) {
325 DEBUG((EFI_D_ERROR
, "Actual Coreboot header: %p.\n", pCbHeader
));
326 PcdSet32 (PcdCbHeaderPointer
, (UINT32
)(UINTN
)pCbHeader
);
330 // Create guid hob for system tables like acpi table and smbios table
336 Status
= CbParseAcpiTable (&pAcpiTable
, &AcpiTableSize
);
337 if (EFI_ERROR (Status
)) {
338 // ACPI table is oblidgible
339 DEBUG ((EFI_D_ERROR
, "Failed to find the required acpi table\n"));
342 CbParseSmbiosTable (&pSmbiosTable
, &SmbiosTableSize
);
344 pSystemTableInfo
= NULL
;
345 pSystemTableInfo
= BuildGuidHob (&gUefiSystemTableInfoGuid
, sizeof (SYSTEM_TABLE_INFO
));
346 ASSERT (pSystemTableInfo
!= NULL
);
347 pSystemTableInfo
->AcpiTableBase
= (UINT64
) (UINTN
)pAcpiTable
;
348 pSystemTableInfo
->AcpiTableSize
= AcpiTableSize
;
349 pSystemTableInfo
->SmbiosTableBase
= (UINT64
) (UINTN
)pSmbiosTable
;
350 pSystemTableInfo
->SmbiosTableSize
= SmbiosTableSize
;
351 DEBUG ((EFI_D_ERROR
, "Detected Acpi Table at 0x%lx, length 0x%x\n", pSystemTableInfo
->AcpiTableBase
, pSystemTableInfo
->AcpiTableSize
));
352 DEBUG ((EFI_D_ERROR
, "Detected Smbios Table at 0x%lx, length 0x%x\n", pSystemTableInfo
->SmbiosTableBase
, pSystemTableInfo
->SmbiosTableSize
));
353 DEBUG ((EFI_D_ERROR
, "Create system table info guid hob\n"));
356 // Create guid hob for acpi board information
358 Status
= CbParseFadtInfo (&PmCtrlRegBase
, &PmTimerRegBase
, &ResetRegAddress
, &ResetValue
);
359 ASSERT_EFI_ERROR (Status
);
360 pAcpiBoardInfo
= NULL
;
361 pAcpiBoardInfo
= BuildGuidHob (&gUefiAcpiBoardInfoGuid
, sizeof (ACPI_BOARD_INFO
));
362 ASSERT (pAcpiBoardInfo
!= NULL
);
363 pAcpiBoardInfo
->PmCtrlRegBase
= (UINT64
)PmCtrlRegBase
;
364 pAcpiBoardInfo
->PmTimerRegBase
= (UINT64
)PmTimerRegBase
;
365 pAcpiBoardInfo
->ResetRegAddress
= (UINT64
)ResetRegAddress
;
366 pAcpiBoardInfo
->ResetValue
= (UINT8
)ResetValue
;
367 DEBUG ((EFI_D_ERROR
, "Create acpi board info guid hob\n"));
370 // Create guid hob for frame buffer information
372 ZeroMem (&FbInfo
, sizeof (FRAME_BUFFER_INFO
));
373 Status
= CbParseFbInfo (&FbInfo
);
374 if (!EFI_ERROR (Status
)) {
375 pFbInfo
= BuildGuidHob (&gUefiFrameBufferInfoGuid
, sizeof (FRAME_BUFFER_INFO
));
376 ASSERT (pSystemTableInfo
!= NULL
);
377 CopyMem (pFbInfo
, &FbInfo
, sizeof (FRAME_BUFFER_INFO
));
378 DEBUG ((EFI_D_ERROR
, "Create frame buffer info guid hob\n"));
382 // Mask off all legacy 8259 interrupt sources
384 IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER
, 0xFF);
385 IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE
, 0xFF);