From b3de8eb1967673d858fee96531698d8aab436a78 Mon Sep 17 00:00:00 2001 From: roly Date: Wed, 27 Nov 2024 17:45:08 +0800 Subject: [PATCH] Enable FMC WDT2 --- board/aspeed/evb_ast2600/evb_ast2600.c | 42 ++++++++++++++++++++++++++ common/autoboot.c | 5 +++ 2 files changed, 47 insertions(+) diff --git a/board/aspeed/evb_ast2600/evb_ast2600.c b/board/aspeed/evb_ast2600/evb_ast2600.c index 668ae5c855..dfb4c7c7ef 100644 --- a/board/aspeed/evb_ast2600/evb_ast2600.c +++ b/board/aspeed/evb_ast2600/evb_ast2600.c @@ -13,6 +13,11 @@ #define LPC_SNPWADR (LPC_BASE + 0x90) #define LPC_HICRB (LPC_BASE + 0x100) #define GPIO_BASE 0x1e780000 +#define FMC_BASE 0x1e620000 +#define FMC_WDT2_CTRL (FMC_BASE + 0x64) +#define FMC_WDT2_TIMER_RELOAD_VALUE (FMC_BASE + 0x68) +#define FMC_WDT2_TIMER_RESTART (FMC_BASE + 0x6c) +#define WDT2_CTRL_ENABLE_WDT (1 << 0) /* HICR5 Bits */ #define HICR5_EN_SIOGIO (1 << 31) /* Enable SIOGIO */ @@ -124,8 +129,37 @@ static void __maybe_unused espi_init(void) writel(reg, ESPI_BASE + 0x000); } +static void __maybe_unused enable_fmc_wdt2(uint16_t expire_time) +{ + const u16 max_expire_time = 0x1fff; + const u16 timer_restart_cmd = 0x4755; + u32 reg; + + if (expire_time > max_expire_time) { + expire_time = max_expire_time; + } + + // The time unit is 0.1 second. The range is 0 to 0x1fff. + writel(expire_time, FMC_WDT2_TIMER_RELOAD_VALUE); + // Write 0x4755 value to load the reload value into watchdog counter + writel(timer_restart_cmd, FMC_WDT2_TIMER_RESTART); + // Enable FMC WDT2 + reg = readl(FMC_WDT2_CTRL) | (WDT2_CTRL_ENABLE_WDT); + writel(reg, FMC_WDT2_CTRL); +} + +void __maybe_unused disable_fmc_wdt2(void) +{ + u32 reg; + + reg = readl(FMC_WDT2_CTRL) & ~(WDT2_CTRL_ENABLE_WDT); + writel(reg, FMC_WDT2_CTRL); +} + int board_early_init_f(void) { + disable_fmc_wdt2(); + enable_fmc_wdt2(7800); // expire time: 13 minutes #if 0 port80h_snoop_init(); sgpio_init(); @@ -220,4 +254,12 @@ int update_system_reset_event(void) env_set("system_reset_event", str_value); env_save(); return 0; +} + +void board_preboot_os(void) +{ + const u16 expire_time = 780; // 13 minutes + + enable_fmc_wdt2(expire_time * 10); + printf("Enable FMC WDT2: expire time is %d seconds.", expire_time); } \ No newline at end of file diff --git a/common/autoboot.c b/common/autoboot.c index 94133eaeda..d54f1c431f 100644 --- a/common/autoboot.c +++ b/common/autoboot.c @@ -267,6 +267,11 @@ static int abortboot(int bootdelay) gd->flags &= ~GD_FLG_SILENT; #endif +#ifdef CONFIG_ASPEED_AST2600 + if (abort) + disable_fmc_wdt2(); +#endif + return abort; } -- 2.25.1