Amend WatchDogTimerLib for SBL resiliency
Signed-off-by: Sean McGinn <sean.mcginn@intel.com>
This commit is contained in:
parent
1da1768bc1
commit
092ce7fcf8
|
@ -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
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
MdePkg/MdePkg.dec
|
||||
BootloaderCommonPkg/BootloaderCommonPkg.dec
|
||||
Silicon/CommonSocPkg/CommonSocPkg.dec
|
||||
BootloaderCorePkg/BootloaderCorePkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
IoLib
|
||||
|
|
Loading…
Reference in New Issue