While some of the critical fields remain the same, there is variation in
the definition of the control register across the SoC generations.
Reserved regions are adjusted, while in other cases the mutability or
behaviour of fields change.
Introduce a callback to sanitize the value on writes to ensure model
behaviour reflects the hardware.
Fixes: 854123bf8d
("wdt: Add Aspeed watchdog device model")
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20210709053107.1829304-2-andrew@aj.id.au>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
51 lines
1.2 KiB
C
51 lines
1.2 KiB
C
/*
|
|
* ASPEED Watchdog Controller
|
|
*
|
|
* Copyright (C) 2016-2017 IBM Corp.
|
|
*
|
|
* This code is licensed under the GPL version 2 or later. See the
|
|
* COPYING file in the top-level directory.
|
|
*/
|
|
|
|
#ifndef WDT_ASPEED_H
|
|
#define WDT_ASPEED_H
|
|
|
|
#include "hw/misc/aspeed_scu.h"
|
|
#include "hw/sysbus.h"
|
|
#include "qom/object.h"
|
|
|
|
#define TYPE_ASPEED_WDT "aspeed.wdt"
|
|
OBJECT_DECLARE_TYPE(AspeedWDTState, AspeedWDTClass, ASPEED_WDT)
|
|
#define TYPE_ASPEED_2400_WDT TYPE_ASPEED_WDT "-ast2400"
|
|
#define TYPE_ASPEED_2500_WDT TYPE_ASPEED_WDT "-ast2500"
|
|
#define TYPE_ASPEED_2600_WDT TYPE_ASPEED_WDT "-ast2600"
|
|
|
|
#define ASPEED_WDT_REGS_MAX (0x20 / 4)
|
|
|
|
struct AspeedWDTState {
|
|
/*< private >*/
|
|
SysBusDevice parent_obj;
|
|
QEMUTimer *timer;
|
|
|
|
/*< public >*/
|
|
MemoryRegion iomem;
|
|
uint32_t regs[ASPEED_WDT_REGS_MAX];
|
|
|
|
AspeedSCUState *scu;
|
|
uint32_t pclk_freq;
|
|
};
|
|
|
|
|
|
struct AspeedWDTClass {
|
|
SysBusDeviceClass parent_class;
|
|
|
|
uint32_t offset;
|
|
uint32_t ext_pulse_width_mask;
|
|
uint32_t reset_ctrl_reg;
|
|
void (*reset_pulse)(AspeedWDTState *s, uint32_t property);
|
|
void (*wdt_reload)(AspeedWDTState *s);
|
|
uint64_t (*sanitize_ctrl)(uint64_t data);
|
|
};
|
|
|
|
#endif /* WDT_ASPEED_H */
|