Amend WatchDogTimerLib for SBL resiliency

Signed-off-by: Sean McGinn <sean.mcginn@intel.com>
This commit is contained in:
Sean McGinn 2022-08-01 12:12:55 -07:00 committed by Guo Dong
parent 1da1768bc1
commit 092ce7fcf8
3 changed files with 126 additions and 11 deletions

View File

@ -11,7 +11,6 @@
#define WDT_TIMEOUT_TCC_DSO 200 // 200 seconds
#define WDT_FLAG_TCC_DSO_IN_PROGRESS BIT17
/**
Reloads WDT with new timeout value and starts it.
@ -66,6 +65,18 @@ WdtSetScratchpad (
IN UINT32 Flags
);
/**
Get WDT flags in scratchpad
@param[in] Flags The scratchpad flags to get.
@retval UINT32 The flags specified.
**/
UINT32
EFIAPI
WdtGetScratchpad (
IN UINT32 Flags
);
/**
Returns if the previous reset is triggered by timer expiration.
@ -118,4 +129,34 @@ IsWdtLocked (
VOID
);
/**
Get the number of failed boots.
@retval UINT32 the number of boots
**/
UINT32
EFIAPI
GetFailedBootCount (
VOID
);
/**
Increment the number of failed boots.
**/
VOID
EFIAPI
IncrementFailedBootCount (
VOID
);
/**
Set the number of failed boots to 0.
**/
VOID
EFIAPI
ClearFailedBootCount (
VOID
);
#endif

View File

@ -13,16 +13,18 @@
#include <Library/DebugLib.h>
#include <Library/IoLib.h>
#define R_ACPI_IO_OC_WDT_CTL 0x54
#define B_ACPI_IO_OC_WDT_CTL_RLD BIT31
#define B_ACPI_IO_OC_WDT_CTL_ICCSURV_STS BIT25
#define B_ACPI_IO_OC_WDT_CTL_NO_ICCSURV_STS BIT24
#define B_ACPI_IO_OC_WDT_CTL_FORCE_ALL BIT15
#define B_ACPI_IO_OC_WDT_CTL_EN BIT14
#define B_ACPI_IO_OC_WDT_CTL_ICCSURV BIT13
#define B_ACPI_IO_OC_WDT_CTL_LCK BIT12
#define B_ACPI_IO_OC_WDT_CTL_TOV_MASK 0x3FF
#define B_ACPI_IO_OC_WDT_CTL_SCRATCHPAD_MASK 0xFF0000
#define R_ACPI_IO_OC_WDT_CTL 0x54
#define B_ACPI_IO_OC_WDT_CTL_RLD BIT31
#define B_ACPI_IO_OC_WDT_CTL_ICCSURV_STS BIT25
#define B_ACPI_IO_OC_WDT_CTL_NO_ICCSURV_STS BIT24
#define B_ACPI_IO_OC_WDT_CTL_FORCE_ALL BIT15
#define B_ACPI_IO_OC_WDT_CTL_EN BIT14
#define B_ACPI_IO_OC_WDT_CTL_ICCSURV BIT13
#define B_ACPI_IO_OC_WDT_CTL_LCK BIT12
#define B_ACPI_IO_OC_WDT_CTL_TOV_MASK 0x3FF
#define B_ACPI_IO_OC_WDT_CTL_SCRATCHPAD_MASK 0xFF0000
#define B_ACPI_IO_OC_WDT_CTL_SCRATCHPAD_BOOT_CNT_MASK 0xC0000
#define B_ACPI_IO_OC_WDT_CTL_SCRATCHPAD_BOOT_CNT_SHIFT 0x12
/**
@ -143,6 +145,25 @@ WdtSetScratchpad (
IoWrite32 (WdtGetAddress (), Readback);
}
/**
Get WDT flags in scratchpad
@param[in] Flags The scratchpad flags to get.
@retval UINT32 The flags specified.
**/
UINT32
EFIAPI
WdtGetScratchpad (
IN UINT32 Flags
)
{
UINT32 Readback;
Readback = IoRead32 (WdtGetAddress ());
/* only get flagged bits from scratchpad */
Readback &= Flags & B_ACPI_IO_OC_WDT_CTL_SCRATCHPAD_MASK;
return Readback;
}
/**
Returns if the previous reset is triggered by timer expiration.
@ -238,3 +259,55 @@ IsWdtLocked (
}
}
/**
Get the number of failed boots.
@retval UINT32 the number of boots
**/
UINT32
EFIAPI
GetFailedBootCount (
VOID
)
{
return WdtGetScratchpad (B_ACPI_IO_OC_WDT_CTL_SCRATCHPAD_BOOT_CNT_MASK) >>
B_ACPI_IO_OC_WDT_CTL_SCRATCHPAD_BOOT_CNT_SHIFT;
}
/**
Increment the number of failed boots.
**/
VOID
EFIAPI
IncrementFailedBootCount (
VOID
)
{
UINT32 FailedBootCnt;
// Get current failed boot count
FailedBootCnt = GetFailedBootCount ();
// Clear current failed boot count
ClearFailedBootCount ();
// Calculate new failed boot count
FailedBootCnt += 1;
// Set bits in WDT scratchpad per new count
WdtSetScratchpad ((FailedBootCnt << B_ACPI_IO_OC_WDT_CTL_SCRATCHPAD_BOOT_CNT_SHIFT)
& B_ACPI_IO_OC_WDT_CTL_SCRATCHPAD_BOOT_CNT_MASK);
}
/**
Set the number of failed boots to 0.
**/
VOID
EFIAPI
ClearFailedBootCount (
VOID
)
{
WdtClearScratchpad (B_ACPI_IO_OC_WDT_CTL_SCRATCHPAD_BOOT_CNT_MASK);
}

View File

@ -21,6 +21,7 @@
MdePkg/MdePkg.dec
BootloaderCommonPkg/BootloaderCommonPkg.dec
Silicon/CommonSocPkg/CommonSocPkg.dec
BootloaderCorePkg/BootloaderCorePkg.dec
[LibraryClasses]
IoLib