aspeed: Link SCU to the watchdog
The ast2500 uses the watchdog to reset the SDRAM controller. This operation is usually performed by u-boot's memory training procedure, and it is enabled by setting a bit in the SCU and then causing the watchdog to expire. Therefore, we need the watchdog to be able to access the SCU's register space. This causes the watchdog to not perform a system reset when the bit is set. In the future it could perform a reset of the SDMC model. Signed-off-by: Joel Stanley <joel@jms.id.au> Signed-off-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-id: 20190621065242.32535-1-joel@jms.id.au Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
ebd205c080
commit
3059c2f5a8
@ -235,6 +235,8 @@ static void aspeed_soc_init(Object *obj)
|
||||
sizeof(s->wdt[i]), TYPE_ASPEED_WDT);
|
||||
qdev_prop_set_uint32(DEVICE(&s->wdt[i]), "silicon-rev",
|
||||
sc->info->silicon_rev);
|
||||
object_property_add_const_link(OBJECT(&s->wdt[i]), "scu",
|
||||
OBJECT(&s->scu), &error_abort);
|
||||
}
|
||||
|
||||
for (i = 0; i < ASPEED_MACS_NUM; i++) {
|
||||
|
@ -44,6 +44,9 @@
|
||||
|
||||
#define WDT_RESTART_MAGIC 0x4755
|
||||
|
||||
#define SCU_RESET_CONTROL1 (0x04 / 4)
|
||||
#define SCU_RESET_SDRAM BIT(0)
|
||||
|
||||
static bool aspeed_wdt_is_enabled(const AspeedWDTState *s)
|
||||
{
|
||||
return s->regs[WDT_CTRL] & WDT_CTRL_ENABLE;
|
||||
@ -222,6 +225,13 @@ static void aspeed_wdt_timer_expired(void *dev)
|
||||
{
|
||||
AspeedWDTState *s = ASPEED_WDT(dev);
|
||||
|
||||
/* Do not reset on SDRAM controller reset */
|
||||
if (s->scu->regs[SCU_RESET_CONTROL1] & SCU_RESET_SDRAM) {
|
||||
timer_del(s->timer);
|
||||
s->regs[WDT_CTRL] = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
qemu_log_mask(CPU_LOG_RESET, "Watchdog timer expired.\n");
|
||||
watchdog_perform_action();
|
||||
timer_del(s->timer);
|
||||
@ -233,6 +243,16 @@ static void aspeed_wdt_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
||||
AspeedWDTState *s = ASPEED_WDT(dev);
|
||||
Error *err = NULL;
|
||||
Object *obj;
|
||||
|
||||
obj = object_property_get_link(OBJECT(dev), "scu", &err);
|
||||
if (!obj) {
|
||||
error_propagate(errp, err);
|
||||
error_prepend(errp, "required link 'scu' not found: ");
|
||||
return;
|
||||
}
|
||||
s->scu = ASPEED_SCU(obj);
|
||||
|
||||
if (!is_supported_silicon_rev(s->silicon_rev)) {
|
||||
error_setg(errp, "Unknown silicon revision: 0x%" PRIx32,
|
||||
|
@ -27,6 +27,7 @@ typedef struct AspeedWDTState {
|
||||
MemoryRegion iomem;
|
||||
uint32_t regs[ASPEED_WDT_REGS_MAX];
|
||||
|
||||
AspeedSCUState *scu;
|
||||
uint32_t pclk_freq;
|
||||
uint32_t silicon_rev;
|
||||
uint32_t ext_pulse_width_mask;
|
||||
|
Loading…
Reference in New Issue
Block a user