Attention is currently required from: Allen-KH Cheng.
Hello Allen-KH Cheng,
I'd like you to do a code review. Please visit
https://review.coreboot.org/c/coreboot/+/71754
to review the following change.
Change subject: soc/mediatek/common: Reset the watchdog timer before triggering reset. ......................................................................
soc/mediatek/common: Reset the watchdog timer before triggering reset.
When the watchdog timer reaches 0, the timer value won't reset to the default value unless there is an external reset or a kick. It will result in the watchdog failing to trigger the reset signal.
We kick the watchdog to reset the timer to the default value. Also, add a 100 us delay before triggering the reset signal.
BUG=b:264003005, b:264017048 BRANCH=corsola TEST= Reboot successfully with the following cmd stop daisydog sleep 60 > /dev/watchdog&
Signed-off-by: Runyang Chen runyang.chen@mediatek.corp-partner.google.com Signed-off-by: Allen-kh Cheng allen-kh.cheng@mediatek.corp-partner.google.com Change-Id: Ic4964103d54910c4a1e675b59c362e93c2213b19 --- M src/soc/mediatek/common/include/soc/wdt_common.h M src/soc/mediatek/common/wdt.c 2 files changed, 32 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/54/71754/1
diff --git a/src/soc/mediatek/common/include/soc/wdt_common.h b/src/soc/mediatek/common/include/soc/wdt_common.h index 5587d50..6d6d2ba 100644 --- a/src/soc/mediatek/common/include/soc/wdt_common.h +++ b/src/soc/mediatek/common/include/soc/wdt_common.h @@ -32,6 +32,11 @@ MTK_WDT_MODE_ENABLE = 1 << 0 };
+/* WDT_RESTART */ +enum { + MTK_WDT_RESTART_KEY = 0x1971 +}; + /* WDT_RESET */ enum { MTK_WDT_SWRST_KEY = 0x1209, diff --git a/src/soc/mediatek/common/wdt.c b/src/soc/mediatek/common/wdt.c index 7ae4661..663fc2f 100644 --- a/src/soc/mediatek/common/wdt.c +++ b/src/soc/mediatek/common/wdt.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */
#include <arch/cache.h> +#include <delay.h> #include <device/mmio.h> #include <console/console.h> #include <halt.h> @@ -23,7 +24,9 @@ printk(BIOS_INFO, "%s() called!\n", __func__);
dcache_clean_all(); + write32(&mtk_wdt->wdt_restart, MTK_WDT_RESTART_KEY); setbits32(&mtk_wdt->wdt_mode, MTK_WDT_MODE_EXTEN | MTK_WDT_MODE_KEY); + udelay(100); write32(&mtk_wdt->wdt_swrst, MTK_WDT_SWRST_KEY);
halt();