[TGL] Enabling WDT for TCC DSO

When some settings from DSO caused system hang, the WDT
would cause the system reboot. And in the next boot,
SBL would use the default setting by not apply the DSO
values.

Signed-off-by: Guo Dong <guo.dong@intel.com>
This commit is contained in:
Guo Dong 2021-10-25 16:55:48 -07:00
parent 93d4460686
commit 2064c1f003
5 changed files with 49 additions and 25 deletions

View File

@ -287,6 +287,7 @@ class Board(BaseBoard):
'BasePchPciBdfLib|Silicon/$(PCH_PKG_NAME)/Library/BasePchPciBdfLib/BasePchPciBdfLib.inf',
'GpioLib|Silicon/CommonSocPkg/Library/GpioLib/GpioLib.inf',
'GpioSiLib|Silicon/$(PCH_PKG_NAME)/Library/GpioSiLib/GpioSiLib.inf',
'WatchDogTimerLib|Silicon/CommonSocPkg/Library/WatchDogTimerLib/WatchDogTimerLib.inf',
]
if self.BUILD_CSME_UPDATE_DRIVER:

View File

@ -37,6 +37,7 @@
#include <PlatformBoardId.h>
#include <TccConfigSubRegions.h>
#include <Library/ResetSystemLib.h>
#include <Library/WatchDogTimerLib.h>
CONST PLT_DEVICE mPlatformDevices[]= {
{{0x00001700}, OsBootDeviceSata , 0 },
@ -103,19 +104,26 @@ TccModePreMemConfig (
DEBUG ((DEBUG_INFO, "S0ix is turned off when TCC is enabled\n"));
}
// Load TCC stream config from container
TccStreamBase = NULL;
TccStreamSize = 0;
Status = LoadComponent (SIGNATURE_32 ('I', 'P', 'F', 'W'), SIGNATURE_32 ('T', 'C', 'C', 'T'),
(VOID **)&TccStreamBase, &TccStreamSize);
if (EFI_ERROR (Status) || (TccStreamSize < sizeof(TCC_STREAM_CONFIGURATION))) {
DEBUG ((DEBUG_INFO, "Load TCC Stream %r, size = 0x%x\n", Status, TccStreamSize));
} else {
FspmUpd->FspmConfig.TccStreamCfgBasePreMem = (UINT32)(UINTN)TccStreamBase;
FspmUpd->FspmConfig.TccStreamCfgSizePreMem = TccStreamSize;
DEBUG ((DEBUG_INFO, "Load TCC stream @0x%p, size = 0x%x\n", TccStreamBase, TccStreamSize));
if (IsWdtFlagsSet(WDT_FLAG_TCC_DSO) && IsWdtTimeout()) {
DEBUG ((DEBUG_INFO, "Incorrect TCC tuning parameters. Platform rebooted with default values.\n"));
WdtClearFlags (WDT_FLAG_TCC_DSO);
FspmUpd->FspmConfig.TccStreamCfgStatusPreMem = 1;
} else if (TccCfgData->TccTuning != 0) {
// Setup Watch dog timer
WdtReloadAndStart (WDT_TIMEOUT_TCC_DSO, WDT_FLAG_TCC_DSO);
// Load TCC stream config from container
TccStreamBase = NULL;
TccStreamSize = 0;
Status = LoadComponent (SIGNATURE_32 ('I', 'P', 'F', 'W'), SIGNATURE_32 ('T', 'C', 'C', 'T'),
(VOID **)&TccStreamBase, &TccStreamSize);
if (EFI_ERROR (Status) || (TccStreamSize < sizeof(TCC_STREAM_CONFIGURATION))) {
DEBUG ((DEBUG_INFO, "Load TCC Stream %r, size = 0x%x\n", Status, TccStreamSize));
} else {
FspmUpd->FspmConfig.TccStreamCfgBasePreMem = (UINT32)(UINTN)TccStreamBase;
FspmUpd->FspmConfig.TccStreamCfgSizePreMem = TccStreamSize;
DEBUG ((DEBUG_INFO, "Load TCC stream @0x%p, size = 0x%x\n", TccStreamBase, TccStreamSize));
if (TccCfgData->TccTuning != 0) {
StreamConfig = (TCC_STREAM_CONFIGURATION *) TccStreamBase;
PolicyConfig = (BIOS_SETTINGS *) &StreamConfig->BiosSettings;

View File

@ -47,6 +47,7 @@
TpmLib
BootGuardLib
BoardSupportLib
WatchDogTimerLib
[Guids]

View File

@ -80,6 +80,7 @@
#include <TccConfigSubRegions.h>
#include <Library/LocalApicLib.h>
#include <Library/TccLib.h>
#include <Library/WatchDogTimerLib.h>
#include "Dts.h"
#include <Library/PlatformHookLib.h>
@ -953,6 +954,9 @@ BoardInit (
Status = PcdSet32S (PcdAcpiTableTemplatePtr, (UINT32)(UINTN)mPlatformAcpiTables);
break;
case PostSiliconInit:
if (IsWdtFlagsSet(WDT_FLAG_TCC_DSO)) {
WdtDisable (WDT_FLAG_TCC_DSO);
}
// Set TSEG base/size PCD
TsegBase = MmioRead32 (TO_MM_PCI_ADDRESS (0x00000000) + R_SA_TSEGMB) & ~0xF;
TsegSize = MmioRead32 (TO_MM_PCI_ADDRESS (0x00000000) + R_SA_BGSM) & ~0xF;
@ -1234,20 +1238,29 @@ TccModePostMemConfig (
FspsUpd->FspsConfig.TccErrorLogEn = TccCfgData->TccErrorLog;
FspsUpd->FspsConfig.IfuEnable = 0;
// Load TCC stream config from container
TccStreamBase = NULL;
TccStreamSize = 0;
Status = LoadComponent (SIGNATURE_32 ('I', 'P', 'F', 'W'), SIGNATURE_32 ('T', 'C', 'C', 'T'),
(VOID **)&TccStreamBase, &TccStreamSize);
if (EFI_ERROR (Status) || (TccStreamSize < sizeof (TCC_STREAM_CONFIGURATION))) {
DEBUG ((DEBUG_INFO, "Load TCC Stream %r, size = 0x%x\n", Status, TccStreamSize));
} else {
FspsUpd->FspsConfig.TccStreamCfgBase = (UINT32)(UINTN)TccStreamBase;
FspsUpd->FspsConfig.TccStreamCfgSize = TccStreamSize;
DEBUG ((DEBUG_INFO, "Load tcc stream @0x%p, size = 0x%x\n", TccStreamBase, TccStreamSize));
if (!IsWdtFlagsSet(WDT_FLAG_TCC_DSO)) {
//
// If FSPM doesn't enable TCC DSO timer, FSPS should also skip TCC DSO.
//
DEBUG ((DEBUG_INFO, "DSO Tuning skipped.\n"));
FspsUpd->FspsConfig.TccStreamCfgStatus = 1;
} else if (TccCfgData->TccTuning != 0) {
// Reload Watch dog timer
WdtReloadAndStart (WDT_TIMEOUT_TCC_DSO, WDT_FLAG_TCC_DSO);
// Update UPD from stream
if (TccCfgData->TccTuning != 0) {
// Load TCC stream config from container
TccStreamBase = NULL;
TccStreamSize = 0;
Status = LoadComponent (SIGNATURE_32 ('I', 'P', 'F', 'W'), SIGNATURE_32 ('T', 'C', 'C', 'T'),
(VOID **)&TccStreamBase, &TccStreamSize);
if (EFI_ERROR (Status) || (TccStreamSize < sizeof (TCC_STREAM_CONFIGURATION))) {
DEBUG ((DEBUG_INFO, "Load TCC Stream %r, size = 0x%x\n", Status, TccStreamSize));
} else {
FspsUpd->FspsConfig.TccStreamCfgBase = (UINT32)(UINTN)TccStreamBase;
FspsUpd->FspsConfig.TccStreamCfgSize = TccStreamSize;
DEBUG ((DEBUG_INFO, "Load tcc stream @0x%p, size = 0x%x\n", TccStreamBase, TccStreamSize));
// Update UPD from stream
StreamConfig = (TCC_STREAM_CONFIGURATION *) TccStreamBase;
PolicyConfig = (BIOS_SETTINGS *) &StreamConfig->BiosSettings;
FspsUpd->FspsConfig.Eist = PolicyConfig->Pstates;

View File

@ -67,6 +67,7 @@
BasePchPciBdfLib
TccLib
SmbiosInitLib
WatchDogTimerLib
[Guids]
gOsConfigDataGuid