/** @file
Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "CometlakeURvpInit.h"
#include
EFI_STATUS
BoardFunctionInit (
IN UINT16 BoardId
);
/**
GPIO init function for PEI post memory phase.
@param[in] BoardId An unsigned integrer represent the board id.
@retval EFI_SUCCESS The function completed successfully.
**/
EFI_STATUS
BoardGpioInit(
IN UINT16 BoardId
)
{
//
// GPIO Table Init.
//
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSet32S (PcdBoardGpioTable, (UINTN) mGpioTableCmlULpddr3);
PcdSet16S (PcdBoardGpioTableSize, mGpioTableCmlULpddr3Size);
PcdSet32S (PcdBoardGpioTable2, 0);
PcdSet16S (PcdBoardGpioTable2Size, 0);
break;
default:
DEBUG ((DEBUG_INFO, "For Unknown Board ID..Use Default GPIO Table...\n"));
PcdSet32S (PcdBoardGpioTable, (UINTN) mGpioTableDefault);
PcdSet16S (PcdBoardGpioTableSize, mGpioTableDefaultSize);
break;
}
return EFI_SUCCESS;
}
/**
Touch panel GPIO init function for PEI post memory phase.
@param[in] BoardId An unsigned integrer represent the board id.
@retval EFI_SUCCESS The function completed successfully.
**/
EFI_STATUS
TouchPanelGpioInit (
IN UINT16 BoardId
)
{
switch (BoardId) {
default:
PcdSet32S (PcdBoardGpioTableTouchPanel, 0);
break;
}
return EFI_SUCCESS;
}
/**
Misc. init function for PEI post memory phase.
@param[in] BoardId An unsigned integrer represent the board id.
@retval EFI_SUCCESS The function completed successfully.
**/
EFI_STATUS
BoardMiscInit (
IN UINT16 BoardId
)
{
PcdSetBoolS (PcdDebugUsbUartEnable, FALSE);
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
PcdSetBoolS(PcdMipiCamGpioEnable, FALSE);
break;
default:
PcdSetBoolS(PcdMipiCamGpioEnable, FALSE);
break;
}
return EFI_SUCCESS;
}
/**
Security GPIO init function for PEI post memory phase.
@param[in] BoardId An unsigned integrer represent the board id.
@retval EFI_SUCCESS The function completed successfully.
**/
EFI_STATUS
BoardSecurityInit (
IN UINT16 BoardId
)
{
switch (BoardId) {
case BoardIdCometLakeULpddr3Rvp:
// TPM interrupt connects to GPIO_CNL_H_GPP_A_7
PcdSet32S (PcdTpm2CurrentIrqNum, 0x1F);
break;
}
return EFI_SUCCESS;
}
/**
Board configuration initialization in the post-memory boot phase.
**/
VOID
BoardConfigInit (
VOID
)
{
EFI_STATUS Status;
UINT16 BoardId;
BoardId = BoardIdCometLakeULpddr3Rvp;
Status = BoardGpioInit (BoardId);
ASSERT_EFI_ERROR (Status);
Status = TouchPanelGpioInit (BoardId);
ASSERT_EFI_ERROR (Status);
Status = HdaVerbTableInit (BoardId);
ASSERT_EFI_ERROR (Status);
Status = BoardMiscInit (BoardId);
ASSERT_EFI_ERROR (Status);
Status = BoardFunctionInit (BoardId);
ASSERT_EFI_ERROR (Status);
Status = BoardSecurityInit (BoardId);
ASSERT_EFI_ERROR (Status);
}
/**
Create the HOB for hotkey status for 'Attempt USB First' feature
@retval EFI_SUCCESS HOB Creating successful.
@retval Others HOB Creating failed.
**/
EFI_STATUS
CreateAttemptUsbFirstHotkeyInfoHob (
VOID
)
{
EFI_STATUS Status;
ATTEMPT_USB_FIRST_HOTKEY_INFO AttemptUsbFirstHotkeyInfo;
Status = EFI_SUCCESS;
ZeroMem (
&AttemptUsbFirstHotkeyInfo,
sizeof (AttemptUsbFirstHotkeyInfo)
);
AttemptUsbFirstHotkeyInfo.RevisonId = 0;
AttemptUsbFirstHotkeyInfo.HotkeyTriggered = FALSE;
///
/// Build HOB for Attempt USB First feature
///
BuildGuidDataHob (
&gAttemptUsbFirstHotkeyInfoHobGuid,
&(AttemptUsbFirstHotkeyInfo),
sizeof (ATTEMPT_USB_FIRST_HOTKEY_INFO)
);
return Status;
}
/**
Search and identify the physical address of a
file module inside the FW_BINARIES_FV_SIGNED FV
@retval EFI_SUCCESS If address has been found
@retval Others If address has not been found
**/
EFI_STATUS
FindModuleInFlash2 (
IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader,
IN EFI_GUID *GuidPtr,
IN OUT UINT32 *ModulePtr,
IN OUT UINT32 *ModuleSize
)
{
EFI_FFS_FILE_HEADER *FfsHeader;
EFI_FV_FILE_INFO FileInfo;
EFI_PEI_FILE_HANDLE FileHandle;
EFI_COMMON_SECTION_HEADER *SectionHeader;
VOID *FileBuffer;
EFI_STATUS Status;
FfsHeader = NULL;
FileHandle = NULL;
SectionHeader = NULL;
FileBuffer = NULL;
while (TRUE) {
//
// Locate FV_IMAGE file type in the FW_BINARIES_FV_SIGNED firmware volume
//
Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, FvHeader, &FileHandle);
if (EFI_ERROR (Status)) {
// unable to find FV_IMAGE file in this FV
break;
}
FfsHeader = (EFI_FFS_FILE_HEADER*)FileHandle;
DEBUG ((DEBUG_INFO, "FfsHeader 0x%X:\n", FfsHeader));
DEBUG ((DEBUG_INFO, " Name = 0x%g\n", &FfsHeader->Name));
DEBUG ((DEBUG_INFO, " Type = 0x%X\n", FfsHeader->Type));
if (IS_FFS_FILE2 (FfsHeader)) {
DEBUG ((DEBUG_INFO, " Size = 0x%X\n", FFS_FILE2_SIZE(FfsHeader)));
}
else {
DEBUG ((DEBUG_INFO, " Size = 0x%X\n", FFS_FILE_SIZE(FfsHeader)));
}
//
// Locate FW_BINARIES_FV FV_IMAGE Section
//
Status = PeiServicesFfsFindSectionData (EFI_SECTION_FIRMWARE_VOLUME_IMAGE, FileHandle, &FileBuffer);
if (EFI_ERROR (Status)) {
// continue to search for the next FV_IMAGE file
DEBUG ((DEBUG_INFO, "FW_BINARIES_FV section not found. Status = %r\n", Status));
continue;
}
SectionHeader = (EFI_COMMON_SECTION_HEADER *)FileBuffer;
DEBUG ((DEBUG_INFO, "GUIDED SectionHeader 0x%X:\n",
(UINT32)(UINT8 *)SectionHeader));
if (IS_SECTION2(SectionHeader)) {
DEBUG ((DEBUG_INFO, " Guid = 0x%g\n",
&((EFI_GUID_DEFINED_SECTION2 *)SectionHeader)->SectionDefinitionGuid));
DEBUG ((DEBUG_INFO, " DataOfset = 0x%X\n",
((EFI_GUID_DEFINED_SECTION2 *)SectionHeader)->DataOffset));
}
else {
DEBUG ((DEBUG_INFO, " Guid = 0x%g\n",
&((EFI_GUID_DEFINED_SECTION *)SectionHeader)->SectionDefinitionGuid));
DEBUG ((DEBUG_INFO, " DataOfset = 0x%X\n",
((EFI_GUID_DEFINED_SECTION *)SectionHeader)->DataOffset));
}
DEBUG ((DEBUG_INFO, " Type = 0x%X\n", SectionHeader->Type));
//
// Locate Firmware File System file within Firmware Volume
//
Status = PeiServicesFfsFindFileByName (GuidPtr, FileBuffer, (VOID **)&FfsHeader);
if (EFI_ERROR (Status)) {
// continue to search for the next FV_IMAGE file
DEBUG ((DEBUG_INFO, "Module not found. Status = %r\n", Status));
continue;
}
*ModulePtr = (UINT32)((UINT8 *)FfsHeader + sizeof(EFI_FFS_FILE_HEADER));
//
// Get File Information
//
Status = PeiServicesFfsGetFileInfo (FfsHeader, &FileInfo);
if (!EFI_ERROR (Status)) {
*ModuleSize = (UINT32)FileInfo.BufferSize;
DEBUG ((DEBUG_INFO, "Module {0x%g} found at = 0x%X, Size = 0x%X\n",
&FfsHeader->Name, *ModulePtr, *ModuleSize));
return Status;
}
}
return EFI_NOT_FOUND;
}
/**
Get the ChipsetInit Binary pointer.
@retval EFI_SUCCESS - ChipsetInit Binary found.
@retval EFI_NOT_FOUND - ChipsetInit Binary not found.
**/
EFI_STATUS
UpdateChipsetInitPtr (
VOID
)
{
EFI_STATUS Status;
PCH_STEPPING PchStep;
EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
EFI_GUID *ChipsetInitBinaryGuidPtr;
SI_POLICY_PPI *SiPolicyPpi;
PCH_HSIO_CONFIG *HsioConfig;
UINT32 ModuleAddr;
UINT32 ModuleSize;
ModuleAddr = 0;
ModuleSize = 0;
PchStep = PchStepping ();
Status = PeiServicesLocatePpi (
&gSiPolicyPpiGuid,
0,
NULL,
(VOID **)&SiPolicyPpi
);
ASSERT_EFI_ERROR (Status);
Status = GetConfigBlock ((VOID *)SiPolicyPpi, &gHsioConfigGuid, (VOID *)&HsioConfig);
ASSERT_EFI_ERROR (Status);
ChipsetInitBinaryGuidPtr = NULL;
if (IsPchLp()) {
switch (PchStep) {
case PCH_A0:
case PCH_D0:
case PCH_D1:
ChipsetInitBinaryGuidPtr = &gCnlPchLpChipsetInitTableDxGuid;
DEBUG ((DEBUG_INFO, "Using CnlPchLpChipsetInitTable_Dx table \n"));
break;
default:
return EFI_NOT_FOUND;
}
} else {
return EFI_NOT_FOUND;
}
//
// Locate Firmware Volume header
//
FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FixedPcdGet32 (PcdFlashFvPostMemoryBase);
Status = FindModuleInFlash2 (FvHeader, ChipsetInitBinaryGuidPtr, &ModuleAddr, &ModuleSize);
//
// Get ChipsetInit Binary Pointer
//
HsioConfig->ChipsetInitBinPtr = ModuleAddr;
//
// Get File Size
//
HsioConfig->ChipsetInitBinLen = ModuleSize;
DEBUG ((DEBUG_INFO, "ChipsetInit Binary Location: %x\n", HsioConfig->ChipsetInitBinPtr));
DEBUG ((DEBUG_INFO, "ChipsetInit Binary Size: %x\n", HsioConfig->ChipsetInitBinLen));
return Status;
}
/**
Configure GPIO and SIO
@retval EFI_SUCCESS Operation success.
**/
EFI_STATUS
EFIAPI
CometlakeURvpBoardInitBeforeSiliconInit(
VOID
)
{
EFI_STATUS Status;
UINT8 FwConfig;
BoardConfigInit ();
//
// Configure GPIO and SIO
//
Status = BoardInit ();
ASSERT_EFI_ERROR (Status);
FwConfig = FwConfigProduction;
PeiPolicyInit (FwConfig);
//
// Create USB Boot First hotkey information HOB
//
CreateAttemptUsbFirstHotkeyInfoHob ();
//
// Initializing Platform Specific Programming
//
Status = PlatformSpecificInit ();
ASSERT_EFI_ERROR(Status);
//
// Update ChipsetInitPtr
//
Status = UpdateChipsetInitPtr ();
///
/// Do Late PCH init
///
LateSiliconInit ();
return EFI_SUCCESS;
}