/** @file
Silicon Init APIs for MinPlatform BoardInitLib implementations.
Copyright (c) 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/**
Early Silicon initialization
**/
VOID
EarlySiliconInit (
VOID
)
{
UINT16 Data16;
UINT8 Data8;
UINT8 TcoRebootHappened;
TCO_WDT_HOB *TcoWdtHobPtr;
EFI_STATUS Status;
///
/// LPC I/O Configuration
///
PchLpcIoDecodeRangesSet (
(V_LPC_CFG_IOD_LPT_378 << N_LPC_CFG_IOD_LPT) |
(V_LPC_CFG_IOD_COMB_3E8 << N_LPC_CFG_IOD_COMB) |
(V_LPC_CFG_IOD_COMA_3F8 << N_LPC_CFG_IOD_COMA)
);
PchLpcIoEnableDecodingSet (
B_LPC_CFG_IOE_ME2 |
B_LPC_CFG_IOE_SE |
B_LPC_CFG_IOE_ME1 |
B_LPC_CFG_IOE_KE |
B_LPC_CFG_IOE_HGE |
B_LPC_CFG_IOE_LGE |
B_LPC_CFG_IOE_FDE |
B_LPC_CFG_IOE_PPE |
B_LPC_CFG_IOE_CBE |
B_LPC_CFG_IOE_CAE
);
///
/// Halt the TCO timer
///
Data16 = IoRead16 (PcdGet16 (PcdTcoBaseAddress) + R_TCO_IO_TCO1_CNT);
Data16 |= B_TCO_IO_TCO1_CNT_TMR_HLT;
IoWrite16 (PcdGet16 (PcdTcoBaseAddress) + R_TCO_IO_TCO1_CNT, Data16);
///
/// Read the Second TO status bit
///
Data8 = IoRead8 (PcdGet16 (PcdTcoBaseAddress) + R_TCO_IO_TCO2_STS);
if ((Data8 & B_TCO_IO_TCO2_STS_SECOND_TO) == B_TCO_IO_TCO2_STS_SECOND_TO) {
TcoRebootHappened = 1;
DEBUG ((DEBUG_INFO, "PlatformInitPreMem - TCO Second TO status bit is set. This might be a TCO reboot\n"));
}
else {
TcoRebootHappened = 0;
}
///
/// Create HOB
///
Status = PeiServicesCreateHob (EFI_HOB_TYPE_GUID_EXTENSION, sizeof(TCO_WDT_HOB), (VOID **)&TcoWdtHobPtr);
if (!EFI_ERROR (Status)) {
TcoWdtHobPtr->Header.Name = gTcoWdtHobGuid;
TcoWdtHobPtr->TcoRebootHappened = TcoRebootHappened;
}
///
/// Clear the Second TO status bit
///
IoWrite8 (PcdGet16 (PcdTcoBaseAddress) + R_TCO_IO_TCO2_STS, B_TCO_IO_TCO2_STS_SECOND_TO);
}
/**
Initialize the GPIO IO selection, GPIO USE selection, and GPIO signal inversion registers
**/
VOID
SiliconInit (
VOID
)
{
UINT16 ABase;
ABase = PmcGetAcpiBase ();
///
/// Clear all pending SMI. On S3 clear power button enable so it will not generate an SMI.
///
IoWrite16 (ABase + R_ACPI_IO_PM1_EN, 0);
IoWrite32 (ABase + R_ACPI_IO_GPE0_EN_127_96, 0);
}