diff --git a/src/mainboard/google/oak/mainboard.c b/src/mainboard/google/oak/mainboard.c index 4208730d67..e99a5c02de 100644 --- a/src/mainboard/google/oak/mainboard.c +++ b/src/mainboard/google/oak/mainboard.c @@ -164,6 +164,7 @@ static void mainboard_init(device_t dev) configure_ext_buck(); elog_init(); + elog_add_watchdog_reset(); elog_add_boot_reason(); } diff --git a/src/soc/mediatek/mt8173/include/soc/memlayout.ld b/src/soc/mediatek/mt8173/include/soc/memlayout.ld index 771f32652e..5b92153142 100644 --- a/src/soc/mediatek/mt8173/include/soc/memlayout.ld +++ b/src/soc/mediatek/mt8173/include/soc/memlayout.ld @@ -40,7 +40,8 @@ SECTIONS SRAM_START(0x00100000) VBOOT2_WORK(0x00100000, 12K) PRERAM_CBMEM_CONSOLE(0x00103000, 16K) - PRERAM_CBFS_CACHE(0x00107000, 16K) + WATCHDOG_TOMBSTONE(0x00107000, 4) + PRERAM_CBFS_CACHE(0x00107004, 16K - 4) TIMESTAMP(0x0010B000, 4K) ROMSTAGE(0x0010C000, 92K) STACK(0x00124000, 16K) diff --git a/src/soc/mediatek/mt8173/wdt.c b/src/soc/mediatek/mt8173/wdt.c index ba63c13b6d..93ffe09209 100644 --- a/src/soc/mediatek/mt8173/wdt.c +++ b/src/soc/mediatek/mt8173/wdt.c @@ -18,6 +18,7 @@ #include #include #include +#include static struct mt8173_wdt_regs * const mt8173_wdt = (void *)RGU_BASE; @@ -29,9 +30,10 @@ int mtk_wdt_init(void) wdt_sta = read32(&mt8173_wdt->wdt_status); printk(BIOS_INFO, "WDT: Last reset was "); - if (wdt_sta & MTK_WDT_STA_HW_RST) + if (wdt_sta & MTK_WDT_STA_HW_RST) { printk(BIOS_INFO, "hardware watchdog\n"); - else if (wdt_sta & MTK_WDT_STA_SW_RST) + mark_watchdog_tombstone(); + } else if (wdt_sta & MTK_WDT_STA_SW_RST) printk(BIOS_INFO, "normal software reboot\n"); else if (wdt_sta & MTK_WDT_STA_SPM_RST) printk(BIOS_INFO, "SPM reboot\n"); diff --git a/src/vendorcode/google/chromeos/chromeos.h b/src/vendorcode/google/chromeos/chromeos.h index 03f1516ee0..57a2f71b29 100644 --- a/src/vendorcode/google/chromeos/chromeos.h +++ b/src/vendorcode/google/chromeos/chromeos.h @@ -34,10 +34,12 @@ void elog_add_boot_reason(void); /* functions implemented in watchdog.c */ void elog_add_watchdog_reset(void); +void mark_watchdog_tombstone(void); void reboot_from_watchdog(void); #else static inline void elog_add_boot_reason(void) { return; } static inline void elog_add_watchdog_reset(void) { return; } +static inline void mark_watchdog_tombstone(void) { return; } static inline void reboot_from_watchdog(void) { return; } #endif /* CONFIG_CHROMEOS */ diff --git a/src/vendorcode/google/chromeos/watchdog.c b/src/vendorcode/google/chromeos/watchdog.c index 79f7dde711..a2b18b75e5 100644 --- a/src/vendorcode/google/chromeos/watchdog.c +++ b/src/vendorcode/google/chromeos/watchdog.c @@ -30,9 +30,14 @@ void elog_add_watchdog_reset(void) write32(_watchdog_tombstone, 0); } +void mark_watchdog_tombstone(void) +{ + write32(_watchdog_tombstone, WATCHDOG_TOMBSTONE_MAGIC); +} + void reboot_from_watchdog(void) { printk(BIOS_INFO, "Last reset was watchdog, reboot again to reset TPM!\n"); - write32(_watchdog_tombstone, WATCHDOG_TOMBSTONE_MAGIC); + mark_watchdog_tombstone(); hard_reset(); }