|
@@ -40,12 +40,14 @@
|
|
|
#define WDT_DRIVE_TYPE_MASK (0xFF << 24)
|
|
|
#define WDT_PUSH_PULL_MAGIC (0xA8 << 24)
|
|
|
#define WDT_OPEN_DRAIN_MAGIC (0x8A << 24)
|
|
|
+#define WDT_RESET_MASK1 (0x1c / 4)
|
|
|
|
|
|
#define WDT_TIMEOUT_STATUS (0x10 / 4)
|
|
|
#define WDT_TIMEOUT_CLEAR (0x14 / 4)
|
|
|
|
|
|
#define WDT_RESTART_MAGIC 0x4755
|
|
|
|
|
|
+#define AST2600_SCU_RESET_CONTROL1 (0x40 / 4)
|
|
|
#define SCU_RESET_CONTROL1 (0x04 / 4)
|
|
|
#define SCU_RESET_SDRAM BIT(0)
|
|
|
|
|
@@ -74,6 +76,8 @@ static uint64_t aspeed_wdt_read(void *opaque, hwaddr offset, unsigned size)
|
|
|
return s->regs[WDT_CTRL];
|
|
|
case WDT_RESET_WIDTH:
|
|
|
return s->regs[WDT_RESET_WIDTH];
|
|
|
+ case WDT_RESET_MASK1:
|
|
|
+ return s->regs[WDT_RESET_MASK1];
|
|
|
case WDT_TIMEOUT_STATUS:
|
|
|
case WDT_TIMEOUT_CLEAR:
|
|
|
qemu_log_mask(LOG_UNIMP,
|
|
@@ -146,6 +150,11 @@ static void aspeed_wdt_write(void *opaque, hwaddr offset, uint64_t data,
|
|
|
s->regs[WDT_RESET_WIDTH] |= data & awc->ext_pulse_width_mask;
|
|
|
break;
|
|
|
|
|
|
+ case WDT_RESET_MASK1:
|
|
|
+ /* TODO: implement */
|
|
|
+ s->regs[WDT_RESET_MASK1] = data;
|
|
|
+ break;
|
|
|
+
|
|
|
case WDT_TIMEOUT_STATUS:
|
|
|
case WDT_TIMEOUT_CLEAR:
|
|
|
qemu_log_mask(LOG_UNIMP,
|
|
@@ -316,12 +325,32 @@ static const TypeInfo aspeed_2500_wdt_info = {
|
|
|
.class_init = aspeed_2500_wdt_class_init,
|
|
|
};
|
|
|
|
|
|
+static void aspeed_2600_wdt_class_init(ObjectClass *klass, void *data)
|
|
|
+{
|
|
|
+ DeviceClass *dc = DEVICE_CLASS(klass);
|
|
|
+ AspeedWDTClass *awc = ASPEED_WDT_CLASS(klass);
|
|
|
+
|
|
|
+ dc->desc = "ASPEED 2600 Watchdog Controller";
|
|
|
+ awc->offset = 0x40;
|
|
|
+ awc->ext_pulse_width_mask = 0xfffff; /* TODO */
|
|
|
+ awc->reset_ctrl_reg = AST2600_SCU_RESET_CONTROL1;
|
|
|
+ awc->reset_pulse = aspeed_2500_wdt_reset_pulse;
|
|
|
+}
|
|
|
+
|
|
|
+static const TypeInfo aspeed_2600_wdt_info = {
|
|
|
+ .name = TYPE_ASPEED_2600_WDT,
|
|
|
+ .parent = TYPE_ASPEED_WDT,
|
|
|
+ .instance_size = sizeof(AspeedWDTState),
|
|
|
+ .class_init = aspeed_2600_wdt_class_init,
|
|
|
+};
|
|
|
+
|
|
|
static void wdt_aspeed_register_types(void)
|
|
|
{
|
|
|
watchdog_add_model(&model);
|
|
|
type_register_static(&aspeed_wdt_info);
|
|
|
type_register_static(&aspeed_2400_wdt_info);
|
|
|
type_register_static(&aspeed_2500_wdt_info);
|
|
|
+ type_register_static(&aspeed_2600_wdt_info);
|
|
|
}
|
|
|
|
|
|
type_init(wdt_aspeed_register_types)
|