|
@@ -51,11 +51,20 @@
|
|
#define WDT_TIMEOUT_CLEAR (0x14 / 4)
|
|
#define WDT_TIMEOUT_CLEAR (0x14 / 4)
|
|
|
|
|
|
#define WDT_RESTART_MAGIC 0x4755
|
|
#define WDT_RESTART_MAGIC 0x4755
|
|
|
|
+#define WDT_SW_RESET_ENABLE 0xAEEDF123
|
|
|
|
|
|
#define AST2600_SCU_RESET_CONTROL1 (0x40 / 4)
|
|
#define AST2600_SCU_RESET_CONTROL1 (0x40 / 4)
|
|
#define SCU_RESET_CONTROL1 (0x04 / 4)
|
|
#define SCU_RESET_CONTROL1 (0x04 / 4)
|
|
#define SCU_RESET_SDRAM BIT(0)
|
|
#define SCU_RESET_SDRAM BIT(0)
|
|
|
|
|
|
|
|
+static bool aspeed_wdt_is_soc_reset_mode(const AspeedWDTState *s)
|
|
|
|
+{
|
|
|
|
+ uint32_t mode;
|
|
|
|
+
|
|
|
|
+ mode = extract32(s->regs[WDT_CTRL], 5, 2);
|
|
|
|
+ return (mode == WDT_CTRL_RESET_MODE_SOC);
|
|
|
|
+}
|
|
|
|
+
|
|
static bool aspeed_wdt_is_enabled(const AspeedWDTState *s)
|
|
static bool aspeed_wdt_is_enabled(const AspeedWDTState *s)
|
|
{
|
|
{
|
|
return s->regs[WDT_CTRL] & WDT_CTRL_ENABLE;
|
|
return s->regs[WDT_CTRL] & WDT_CTRL_ENABLE;
|
|
@@ -199,13 +208,18 @@ static void aspeed_wdt_write(void *opaque, hwaddr offset, uint64_t data,
|
|
case WDT_TIMEOUT_STATUS:
|
|
case WDT_TIMEOUT_STATUS:
|
|
case WDT_TIMEOUT_CLEAR:
|
|
case WDT_TIMEOUT_CLEAR:
|
|
case WDT_RESET_MASK2:
|
|
case WDT_RESET_MASK2:
|
|
- case WDT_SW_RESET_CTRL:
|
|
|
|
case WDT_SW_RESET_MASK1:
|
|
case WDT_SW_RESET_MASK1:
|
|
case WDT_SW_RESET_MASK2:
|
|
case WDT_SW_RESET_MASK2:
|
|
qemu_log_mask(LOG_UNIMP,
|
|
qemu_log_mask(LOG_UNIMP,
|
|
"%s: uninmplemented write at offset 0x%" HWADDR_PRIx "\n",
|
|
"%s: uninmplemented write at offset 0x%" HWADDR_PRIx "\n",
|
|
__func__, offset);
|
|
__func__, offset);
|
|
break;
|
|
break;
|
|
|
|
+ case WDT_SW_RESET_CTRL:
|
|
|
|
+ if (aspeed_wdt_is_soc_reset_mode(s) &&
|
|
|
|
+ (data == WDT_SW_RESET_ENABLE)) {
|
|
|
|
+ watchdog_perform_action();
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
qemu_log_mask(LOG_GUEST_ERROR,
|
|
qemu_log_mask(LOG_GUEST_ERROR,
|
|
"%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
|
|
"%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
|