diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2021-02-09 13:39:14 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2021-02-15 13:16:13 +0000 |
commit | 1ccc5b92d15c025baa1e469531db8c2608dd748b (patch) | |
tree | 6e12c08903ae6537fc2694f60868cfe62be8ba0e /include/hw/timer | |
parent | cddfbdc53fdd434db2c189a5ddca6a8dbb3529c3 (diff) |
hw/timer/sse-timer.c: Model the SSE subsystem System Timer
The SSE-300 includes some timers which are a different kind to
those in the SSE-200. Model them.
These timers are documented in the SSE-123 Example Subsystem
Technical Reference Manual:
https://developer.arm.com/documentation/101370/latest/
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'include/hw/timer')
-rw-r--r-- | include/hw/timer/sse-timer.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/include/hw/timer/sse-timer.h b/include/hw/timer/sse-timer.h new file mode 100644 index 0000000000..373a944dcd --- /dev/null +++ b/include/hw/timer/sse-timer.h @@ -0,0 +1,59 @@ +/* + * Arm SSE Subsystem System Timer + * + * Copyright (c) 2020 Linaro Limited + * Written by Peter Maydell + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 or + * (at your option) any later version. + */ + +/* + * This is a model of the "System timer" which is documented in + * the Arm SSE-123 Example Subsystem Technical Reference Manual: + * https://developer.arm.com/documentation/101370/latest/ + * + * QEMU interface: + * + Clock input "CLK": clock + * + sysbus MMIO region 0: the register bank + * + sysbus IRQ 0: timer interrupt + */ + +#ifndef SSE_TIMER_H +#define SSE_TIMER_H + +#include "hw/sysbus.h" +#include "qom/object.h" + +#define TYPE_SSE_TIMER "sse-timer" +OBJECT_DECLARE_SIMPLE_TYPE(SSETimer, SSE_TIMER) + +struct SSETimer { + /*< private >*/ + SysBusDevice parent_obj; + + /*< public >*/ + MemoryRegion iomem; + qemu_irq irq; + Clock *clk; + QEMUTimer timer; + + uint32_t cntfrq; + uint32_t cntp_ctl; + uint64_t cntp_cval; + uint64_t cntp_aival; + uint32_t cntp_aival_ctl; + uint32_t cntp_aival_reload; + + /* + * These are used for handling clock frequency changes: they are a + * tuple of (QEMU_CLOCK_VIRTUAL timestamp, CNTPCT at that time), + * taken when the clock frequency changes. sse_cntpct() needs them + * to calculate the current CNTPCT. + */ + uint64_t ns_then; + uint64_t ticks_then; +}; + +#endif |