/** @file\r
- This PEIM will parse coreboot table in memory and report resource information into pei core. \r
+ This PEIM will parse coreboot table in memory and report resource information into pei core.\r
This file contains the main entrypoint of the PEIM.\r
- \r
+\r
Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
#define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1\r
\r
EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {\r
- { EfiACPIReclaimMemory, 0x008 }, \r
- { EfiACPIMemoryNVS, 0x004 }, \r
- { EfiReservedMemoryType, 0x004 }, \r
+ { EfiACPIReclaimMemory, 0x008 },\r
+ { EfiACPIMemoryNVS, 0x004 },\r
+ { EfiReservedMemoryType, 0x004 },\r
{ EfiRuntimeServicesData, 0x080 },\r
{ EfiRuntimeServicesCode, 0x080 },\r
{ EfiMaxMemoryType, 0 }\r
};\r
\r
/**\r
- Create memory mapped io resource hob. \r
- \r
+ Create memory mapped io resource hob.\r
+\r
@param MmioBase Base address of the memory mapped io range\r
@param MmioSize Length of the memory mapped io range\r
- \r
+\r
**/\r
VOID\r
BuildMemoryMappedIoRangeHob (\r
UINT64 MmioSize\r
)\r
{\r
- BuildResourceDescriptorHob (\r
+ BuildResourceDescriptorHob (\r
EFI_RESOURCE_MEMORY_MAPPED_IO,\r
(EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
MmioBase,\r
MmioSize\r
);\r
- \r
+\r
BuildMemoryAllocationHob (\r
MmioBase,\r
MmioSize,\r
EfiMemoryMappedIO\r
- ); \r
+ );\r
}\r
\r
/**\r
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader\r
)\r
{\r
- UINT16 Checksum;\r
- \r
- // Skip nv storage fv\r
- if (CompareMem (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem2Guid, sizeof(EFI_GUID)) != 0 ) {\r
- return FALSE;\r
- }\r
- \r
- if ( (FwVolHeader->Revision != EFI_FVH_REVISION) ||\r
- (FwVolHeader->Signature != EFI_FVH_SIGNATURE) ||\r
- (FwVolHeader->FvLength == ((UINTN) -1)) ||\r
- ((FwVolHeader->HeaderLength & 0x01 ) !=0) ) {\r
- return FALSE;\r
- }\r
- \r
- Checksum = CalculateCheckSum16 ((UINT16 *) FwVolHeader, FwVolHeader->HeaderLength);\r
+ UINT16 Checksum;\r
+\r
+ // Skip nv storage fv\r
+ if (CompareMem (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem2Guid, sizeof(EFI_GUID)) != 0 ) {\r
+ return FALSE;\r
+ }\r
+\r
+ if ( (FwVolHeader->Revision != EFI_FVH_REVISION) ||\r
+ (FwVolHeader->Signature != EFI_FVH_SIGNATURE) ||\r
+ (FwVolHeader->FvLength == ((UINTN) -1)) ||\r
+ ((FwVolHeader->HeaderLength & 0x01 ) !=0) ) {\r
+ return FALSE;\r
+ }\r
+\r
+ Checksum = CalculateCheckSum16 ((UINT16 *) FwVolHeader, FwVolHeader->HeaderLength);\r
if (Checksum != 0) {\r
DEBUG (( DEBUG_ERROR,\r
"ERROR - Invalid Firmware Volume Header Checksum, change 0x%04x to 0x%04x\r\n",\r
return FALSE;\r
}\r
\r
- return TRUE; \r
+ return TRUE;\r
}\r
\r
/**\r
Install FvInfo PPI and create fv hobs for remained fvs\r
- \r
+\r
**/\r
VOID\r
CbPeiReportRemainedFvs (\r
VOID\r
)\r
{\r
- UINT8* TempPtr;\r
- UINT8* EndPtr;\r
- \r
- TempPtr = (UINT8* )(UINTN) PcdGet32 (PcdPayloadFdMemBase);\r
- EndPtr = (UINT8* )(UINTN) (PcdGet32 (PcdPayloadFdMemBase) + PcdGet32 (PcdPayloadFdMemSize));\r
- \r
- for (;TempPtr < EndPtr;) {\r
- if (IsFvHeaderValid ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)) {\r
- if (TempPtr != (UINT8* )(UINTN) PcdGet32 (PcdPayloadFdMemBase)) {\r
- // Skip the PEI FV\r
- DEBUG((EFI_D_ERROR, "Found one valid fv : 0x%lx.\n", TempPtr, ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength)); \r
- \r
- PeiServicesInstallFvInfoPpi (\r
- NULL,\r
- (VOID *) (UINTN) TempPtr,\r
- (UINT32) (UINTN) ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength,\r
- NULL,\r
- NULL\r
- );\r
- BuildFvHob ((EFI_PHYSICAL_ADDRESS)(UINTN) TempPtr, ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength); \r
- } \r
- }\r
- TempPtr += ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength; \r
- } \r
+ UINT8* TempPtr;\r
+ UINT8* EndPtr;\r
+\r
+ TempPtr = (UINT8* )(UINTN) PcdGet32 (PcdPayloadFdMemBase);\r
+ EndPtr = (UINT8* )(UINTN) (PcdGet32 (PcdPayloadFdMemBase) + PcdGet32 (PcdPayloadFdMemSize));\r
+\r
+ for (;TempPtr < EndPtr;) {\r
+ if (IsFvHeaderValid ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)) {\r
+ if (TempPtr != (UINT8* )(UINTN) PcdGet32 (PcdPayloadFdMemBase)) {\r
+ // Skip the PEI FV\r
+ DEBUG((EFI_D_ERROR, "Found one valid fv : 0x%lx.\n", TempPtr, ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength));\r
+\r
+ PeiServicesInstallFvInfoPpi (\r
+ NULL,\r
+ (VOID *) (UINTN) TempPtr,\r
+ (UINT32) (UINTN) ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength,\r
+ NULL,\r
+ NULL\r
+ );\r
+ BuildFvHob ((EFI_PHYSICAL_ADDRESS)(UINTN) TempPtr, ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength);\r
+ }\r
+ }\r
+ TempPtr += ((EFI_FIRMWARE_VOLUME_HEADER* )TempPtr)->FvLength;\r
+ }\r
}\r
\r
/**\r
This is the entrypoint of PEIM\r
- \r
+\r
@param FileHandle Handle of the file being invoked.\r
@param PeiServices Describes the list of possible PEI Services.\r
\r
- @retval EFI_SUCCESS if it completed successfully. \r
+ @retval EFI_SUCCESS if it completed successfully.\r
**/\r
EFI_STATUS\r
EFIAPI\r
IN CONST EFI_PEI_SERVICES **PeiServices\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT64 LowMemorySize, HighMemorySize;\r
- UINT64 PeiMemSize = SIZE_64MB; // 64 MB\r
- EFI_PHYSICAL_ADDRESS PeiMemBase = 0;\r
- UINT32 RegEax;\r
+ EFI_STATUS Status;\r
+ UINT64 LowMemorySize, HighMemorySize;\r
+ UINT64 PeiMemSize = SIZE_64MB; // 64 MB\r
+ EFI_PHYSICAL_ADDRESS PeiMemBase = 0;\r
+ UINT32 RegEax;\r
UINT8 PhysicalAddressBits;\r
VOID* pCbHeader;\r
VOID* pAcpiTable;\r
- UINT32 AcpiTableSize;\r
- VOID* pSmbiosTable;\r
- UINT32 SmbiosTableSize;\r
- SYSTEM_TABLE_INFO* pSystemTableInfo;\r
- FRAME_BUFFER_INFO FbInfo;\r
- FRAME_BUFFER_INFO* pFbInfo;\r
- ACPI_BOARD_INFO* pAcpiBoardInfo;\r
- UINTN PmCtrlRegBase, PmTimerRegBase, ResetRegAddress, ResetValue;\r
- \r
- LowMemorySize = 0;\r
- HighMemorySize = 0;\r
- \r
- Status = CbParseMemoryInfo (&LowMemorySize, &HighMemorySize);\r
- if (EFI_ERROR(Status)) \r
- return Status;\r
- \r
- DEBUG((EFI_D_ERROR, "LowMemorySize: 0x%lx.\n", LowMemorySize));\r
- DEBUG((EFI_D_ERROR, "HighMemorySize: 0x%lx.\n", HighMemorySize));\r
- \r
- ASSERT (LowMemorySize > 0);\r
- \r
- BuildResourceDescriptorHob ( \r
+ UINT32 AcpiTableSize;\r
+ VOID* pSmbiosTable;\r
+ UINT32 SmbiosTableSize;\r
+ SYSTEM_TABLE_INFO* pSystemTableInfo;\r
+ FRAME_BUFFER_INFO FbInfo;\r
+ FRAME_BUFFER_INFO* pFbInfo;\r
+ ACPI_BOARD_INFO* pAcpiBoardInfo;\r
+ UINTN PmCtrlRegBase, PmTimerRegBase, ResetRegAddress, ResetValue;\r
+\r
+ LowMemorySize = 0;\r
+ HighMemorySize = 0;\r
+\r
+ Status = CbParseMemoryInfo (&LowMemorySize, &HighMemorySize);\r
+ if (EFI_ERROR(Status))\r
+ return Status;\r
+\r
+ DEBUG((EFI_D_ERROR, "LowMemorySize: 0x%lx.\n", LowMemorySize));\r
+ DEBUG((EFI_D_ERROR, "HighMemorySize: 0x%lx.\n", HighMemorySize));\r
+\r
+ ASSERT (LowMemorySize > 0);\r
+\r
+ BuildResourceDescriptorHob (\r
EFI_RESOURCE_SYSTEM_MEMORY,\r
(\r
EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
(EFI_PHYSICAL_ADDRESS)(0),\r
(UINT64)(0xA0000)\r
);\r
- \r
- \r
- BuildResourceDescriptorHob ( \r
+\r
+\r
+ BuildResourceDescriptorHob (\r
EFI_RESOURCE_MEMORY_RESERVED,\r
(\r
EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
(EFI_PHYSICAL_ADDRESS)(0xA0000),\r
(UINT64)(0x60000)\r
);\r
- \r
+\r
BuildResourceDescriptorHob (\r
- EFI_RESOURCE_SYSTEM_MEMORY,\r
- (\r
+ EFI_RESOURCE_SYSTEM_MEMORY,\r
+ (\r
EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
EFI_RESOURCE_ATTRIBUTE_TESTED |\r
(EFI_PHYSICAL_ADDRESS)(0x100000),\r
(UINT64) (LowMemorySize - 0x100000)\r
);\r
- \r
+\r
if (HighMemorySize > 0) {\r
- BuildResourceDescriptorHob (\r
- EFI_RESOURCE_SYSTEM_MEMORY,\r
- (\r
+ BuildResourceDescriptorHob (\r
+ EFI_RESOURCE_SYSTEM_MEMORY,\r
+ (\r
EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
),\r
(EFI_PHYSICAL_ADDRESS)(0x100000000ULL),\r
HighMemorySize\r
- ); \r
- } \r
- \r
- //\r
- // Should be 64k aligned\r
- //\r
- PeiMemBase = (LowMemorySize - PeiMemSize) & (~(BASE_64KB - 1));\r
- \r
- DEBUG((EFI_D_ERROR, "PeiMemBase: 0x%lx.\n", PeiMemBase));\r
- DEBUG((EFI_D_ERROR, "PeiMemSize: 0x%lx.\n", PeiMemSize)); \r
- \r
- Status = PeiServicesInstallPeiMemory (\r
- PeiMemBase, \r
- PeiMemSize\r
- );\r
- ASSERT_EFI_ERROR (Status); \r
- \r
- //\r
- // Set cache on the physical memory\r
- // \r
- MtrrSetMemoryAttribute (BASE_1MB, LowMemorySize - BASE_1MB, CacheWriteBack);\r
+ );\r
+ }\r
+\r
+ //\r
+ // Should be 64k aligned\r
+ //\r
+ PeiMemBase = (LowMemorySize - PeiMemSize) & (~(BASE_64KB - 1));\r
+\r
+ DEBUG((EFI_D_ERROR, "PeiMemBase: 0x%lx.\n", PeiMemBase));\r
+ DEBUG((EFI_D_ERROR, "PeiMemSize: 0x%lx.\n", PeiMemSize));\r
+\r
+ Status = PeiServicesInstallPeiMemory (\r
+ PeiMemBase,\r
+ PeiMemSize\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Set cache on the physical memory\r
+ //\r
+ MtrrSetMemoryAttribute (BASE_1MB, LowMemorySize - BASE_1MB, CacheWriteBack);\r
MtrrSetMemoryAttribute (0, 0xA0000, CacheWriteBack);\r
- \r
- //\r
+\r
+ //\r
// Create Memory Type Information HOB\r
//\r
BuildGuidDataHob (\r
mDefaultMemoryTypeInformation,\r
sizeof(mDefaultMemoryTypeInformation)\r
);\r
- \r
- //\r
- // Create Fv hob\r
- //\r
- CbPeiReportRemainedFvs (); \r
- \r
- BuildMemoryAllocationHob (\r
+\r
+ //\r
+ // Create Fv hob\r
+ //\r
+ CbPeiReportRemainedFvs ();\r
+\r
+ BuildMemoryAllocationHob (\r
PcdGet32 (PcdPayloadFdMemBase),\r
PcdGet32 (PcdPayloadFdMemSize),\r
EfiBootServicesData\r
);\r
- \r
+\r
//\r
// Build CPU memory space and IO space hob\r
//\r
AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);\r
if (RegEax >= 0x80000008) {\r
- AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL); \r
+ AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);\r
PhysicalAddressBits = (UINT8) RegEax;\r
} else {\r
PhysicalAddressBits = 36;\r
}\r
//\r
// Create a CPU hand-off information\r
- // \r
+ //\r
BuildCpuHob (PhysicalAddressBits, 16);\r
- \r
+\r
//\r
// Report Local APIC range\r
//\r
BuildMemoryMappedIoRangeHob (0xFEC80000, SIZE_512KB);\r
- \r
- //\r
- // Boot mode\r
- //\r
- Status = PeiServicesSetBootMode (BOOT_WITH_FULL_CONFIGURATION);\r
+\r
+ //\r
+ // Boot mode\r
+ //\r
+ Status = PeiServicesSetBootMode (BOOT_WITH_FULL_CONFIGURATION);\r
ASSERT_EFI_ERROR (Status);\r
- \r
+\r
Status = PeiServicesInstallPpi (mPpiBootMode);\r
ASSERT_EFI_ERROR (Status);\r
- \r
+\r
//\r
// Set pcd to save the upper coreboot header in case the dxecore will\r
// erase 0~4k memory\r
//\r
pCbHeader = NULL;\r
- if ((CbParseGetCbHeader (1, &pCbHeader) == RETURN_SUCCESS) \r
- && ((UINTN)pCbHeader > BASE_4KB)) {\r
- DEBUG((EFI_D_ERROR, "Actual Coreboot header: %p.\n", pCbHeader)); \r
- PcdSet32 (PcdCbHeaderPointer, (UINT32)(UINTN)pCbHeader);\r
+ if ((CbParseGetCbHeader (1, &pCbHeader) == RETURN_SUCCESS)\r
+ && ((UINTN)pCbHeader > BASE_4KB)) {\r
+ DEBUG((EFI_D_ERROR, "Actual Coreboot header: %p.\n", pCbHeader));\r
+ PcdSet32 (PcdCbHeaderPointer, (UINT32)(UINTN)pCbHeader);\r
}\r
- \r
+\r
//\r
// Create guid hob for system tables like acpi table and smbios table\r
//\r
SmbiosTableSize = 0;\r
Status = CbParseAcpiTable (&pAcpiTable, &AcpiTableSize);\r
if (EFI_ERROR (Status)) {\r
- // ACPI table is oblidgible \r
- DEBUG ((EFI_D_ERROR, "Failed to find the required acpi table\n"));\r
- ASSERT (FALSE);\r
+ // ACPI table is oblidgible\r
+ DEBUG ((EFI_D_ERROR, "Failed to find the required acpi table\n"));\r
+ ASSERT (FALSE);\r
}\r
CbParseSmbiosTable (&pSmbiosTable, &SmbiosTableSize);\r
- \r
- pSystemTableInfo = NULL;\r
- pSystemTableInfo = BuildGuidHob (&gUefiSystemTableInfoGuid, sizeof (SYSTEM_TABLE_INFO));\r
- ASSERT (pSystemTableInfo != NULL);\r
- pSystemTableInfo->AcpiTableBase = (UINT64) (UINTN)pAcpiTable;\r
- pSystemTableInfo->AcpiTableSize = AcpiTableSize; \r
- pSystemTableInfo->SmbiosTableBase = (UINT64) (UINTN)pSmbiosTable;\r
- pSystemTableInfo->SmbiosTableSize = SmbiosTableSize;\r
- DEBUG ((EFI_D_ERROR, "Detected Acpi Table at 0x%lx, length 0x%x\n", pSystemTableInfo->AcpiTableBase, pSystemTableInfo->AcpiTableSize)); \r
- DEBUG ((EFI_D_ERROR, "Detected Smbios Table at 0x%lx, length 0x%x\n", pSystemTableInfo->SmbiosTableBase, pSystemTableInfo->SmbiosTableSize)); \r
- DEBUG ((EFI_D_ERROR, "Create system table info guid hob\n"));\r
- \r
- //\r
- // Create guid hob for acpi board information\r
- // \r
- Status = CbParseFadtInfo (&PmCtrlRegBase, &PmTimerRegBase, &ResetRegAddress, &ResetValue);\r
- ASSERT_EFI_ERROR (Status);\r
- pAcpiBoardInfo = NULL;\r
- pAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
- ASSERT (pAcpiBoardInfo != NULL);\r
- pAcpiBoardInfo->PmCtrlRegBase = (UINT64)PmCtrlRegBase;\r
- pAcpiBoardInfo->PmTimerRegBase = (UINT64)PmTimerRegBase;\r
- pAcpiBoardInfo->ResetRegAddress = (UINT64)ResetRegAddress;\r
- pAcpiBoardInfo->ResetValue = (UINT8)ResetValue; \r
- DEBUG ((EFI_D_ERROR, "Create acpi board info guid hob\n"));\r
- \r
- //\r
- // Create guid hob for frame buffer information\r
- //\r
- ZeroMem (&FbInfo, sizeof (FRAME_BUFFER_INFO)); \r
- Status = CbParseFbInfo (&FbInfo);\r
- if (!EFI_ERROR (Status)) {\r
- pFbInfo = BuildGuidHob (&gUefiFrameBufferInfoGuid, sizeof (FRAME_BUFFER_INFO));\r
- ASSERT (pSystemTableInfo != NULL);\r
- CopyMem (pFbInfo, &FbInfo, sizeof (FRAME_BUFFER_INFO)); \r
- DEBUG ((EFI_D_ERROR, "Create frame buffer info guid hob\n")); \r
- }\r
+\r
+ pSystemTableInfo = NULL;\r
+ pSystemTableInfo = BuildGuidHob (&gUefiSystemTableInfoGuid, sizeof (SYSTEM_TABLE_INFO));\r
+ ASSERT (pSystemTableInfo != NULL);\r
+ pSystemTableInfo->AcpiTableBase = (UINT64) (UINTN)pAcpiTable;\r
+ pSystemTableInfo->AcpiTableSize = AcpiTableSize;\r
+ pSystemTableInfo->SmbiosTableBase = (UINT64) (UINTN)pSmbiosTable;\r
+ pSystemTableInfo->SmbiosTableSize = SmbiosTableSize;\r
+ DEBUG ((EFI_D_ERROR, "Detected Acpi Table at 0x%lx, length 0x%x\n", pSystemTableInfo->AcpiTableBase, pSystemTableInfo->AcpiTableSize));\r
+ DEBUG ((EFI_D_ERROR, "Detected Smbios Table at 0x%lx, length 0x%x\n", pSystemTableInfo->SmbiosTableBase, pSystemTableInfo->SmbiosTableSize));\r
+ DEBUG ((EFI_D_ERROR, "Create system table info guid hob\n"));\r
+\r
+ //\r
+ // Create guid hob for acpi board information\r
+ //\r
+ Status = CbParseFadtInfo (&PmCtrlRegBase, &PmTimerRegBase, &ResetRegAddress, &ResetValue);\r
+ ASSERT_EFI_ERROR (Status);\r
+ pAcpiBoardInfo = NULL;\r
+ pAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
+ ASSERT (pAcpiBoardInfo != NULL);\r
+ pAcpiBoardInfo->PmCtrlRegBase = (UINT64)PmCtrlRegBase;\r
+ pAcpiBoardInfo->PmTimerRegBase = (UINT64)PmTimerRegBase;\r
+ pAcpiBoardInfo->ResetRegAddress = (UINT64)ResetRegAddress;\r
+ pAcpiBoardInfo->ResetValue = (UINT8)ResetValue;\r
+ DEBUG ((EFI_D_ERROR, "Create acpi board info guid hob\n"));\r
+\r
+ //\r
+ // Create guid hob for frame buffer information\r
+ //\r
+ ZeroMem (&FbInfo, sizeof (FRAME_BUFFER_INFO));\r
+ Status = CbParseFbInfo (&FbInfo);\r
+ if (!EFI_ERROR (Status)) {\r
+ pFbInfo = BuildGuidHob (&gUefiFrameBufferInfoGuid, sizeof (FRAME_BUFFER_INFO));\r
+ ASSERT (pSystemTableInfo != NULL);\r
+ CopyMem (pFbInfo, &FbInfo, sizeof (FRAME_BUFFER_INFO));\r
+ DEBUG ((EFI_D_ERROR, "Create frame buffer info guid hob\n"));\r
+ }\r
\r
//\r
// Mask off all legacy 8259 interrupt sources\r