From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-arm@nongnu.org, qemu-devel@nongnu.org
Cc: Damien Hedde <damien.hedde@greensocs.com>,
Luc Michel <luc@lmichel.fr>,
Alistair Francis <alistair@alistair23.me>,
Subbaraya Sundeep <sundeep.lkml@gmail.com>,
Joel Stanley <joel@jms.id.au>,
Alexandre Iooss <erdnaxe@crans.org>
Subject: [PATCH for-6.2 24/25] hw/timer/stellaris-gptm: Use Clock input instead of system_clock_scale
Date: Thu, 12 Aug 2021 10:33:55 +0100 [thread overview]
Message-ID: <20210812093356.1946-25-peter.maydell@linaro.org> (raw)
In-Reply-To: <20210812093356.1946-1-peter.maydell@linaro.org>
The stellaris-gptm timer currently uses system_clock_scale for one of
its timer modes where the timer runs at the CPU clock rate. Make it
use a Clock input instead.
We don't try to make the timer handle changes in the clock frequency
while the downcounter is running. This is not a change in behaviour
from the previous system_clock_scale implementation -- we will pick
up the new frequency only when the downcounter hits zero. Handling
dynamic clock changes when the counter is running would require state
that the current gptm implementation doesn't have.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
As noted in the comment, ideally we would convert the device to use
ptimer for its downcounter, which supports frequency changes while
the counter is running and would also allow reading the timer value.
But I don't want to make and test that change to a minor timer device
in a board model I wouldn't recommend anybody actually use; this
series is long enough as it is...
---
include/hw/timer/stellaris-gptm.h | 3 +++
hw/arm/stellaris.c | 12 +++++++++---
hw/timer/stellaris-gptm.c | 26 ++++++++++++++++++++++----
3 files changed, 34 insertions(+), 7 deletions(-)
diff --git a/include/hw/timer/stellaris-gptm.h b/include/hw/timer/stellaris-gptm.h
index b8fa43c94bf..fde1fc6f0c7 100644
--- a/include/hw/timer/stellaris-gptm.h
+++ b/include/hw/timer/stellaris-gptm.h
@@ -13,6 +13,7 @@
#include "qom/object.h"
#include "hw/sysbus.h"
#include "hw/irq.h"
+#include "hw/clock.h"
#define TYPE_STELLARIS_GPTM "stellaris-gptm"
OBJECT_DECLARE_SIMPLE_TYPE(gptm_state, STELLARIS_GPTM)
@@ -22,6 +23,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(gptm_state, STELLARIS_GPTM)
* + sysbus MMIO region 0: register bank
* + sysbus IRQ 0: timer interrupt
* + unnamed GPIO output 0: trigger output for the ADC
+ * + Clock input "clk": the 32-bit countdown timer runs at this speed
*/
struct gptm_state {
SysBusDevice parent_obj;
@@ -43,6 +45,7 @@ struct gptm_state {
/* The timers have an alternate output used to trigger the ADC. */
qemu_irq trigger;
qemu_irq irq;
+ Clock *clk;
};
#endif
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index 8c547f146a9..3e7d1dabad1 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1090,9 +1090,15 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
}
for (i = 0; i < 4; i++) {
if (board->dc2 & (0x10000 << i)) {
- dev = sysbus_create_simple(TYPE_STELLARIS_GPTM,
- 0x40030000 + i * 0x1000,
- qdev_get_gpio_in(nvic, timer_irq[i]));
+ SysBusDevice *sbd;
+
+ dev = qdev_new(TYPE_STELLARIS_GPTM);
+ sbd = SYS_BUS_DEVICE(dev);
+ qdev_connect_clock_in(dev, "clk",
+ qdev_get_clock_out(ssys_dev, "SYSCLK"));
+ sysbus_realize_and_unref(sbd, &error_fatal);
+ sysbus_mmio_map(sbd, 0, 0x40030000 + i * 0x1000);
+ sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(nvic, timer_irq[i]));
/* TODO: This is incorrect, but we get away with it because
the ADC output is only ever pulsed. */
qdev_connect_gpio_out(dev, 0, adc);
diff --git a/hw/timer/stellaris-gptm.c b/hw/timer/stellaris-gptm.c
index 7846fe5f84e..fd71c79be48 100644
--- a/hw/timer/stellaris-gptm.c
+++ b/hw/timer/stellaris-gptm.c
@@ -10,9 +10,10 @@
#include "qemu/osdep.h"
#include "qemu/log.h"
#include "qemu/timer.h"
+#include "qapi/error.h"
#include "migration/vmstate.h"
+#include "hw/qdev-clock.h"
#include "hw/timer/stellaris-gptm.h"
-#include "hw/timer/armv7m_systick.h" /* Needed only for system_clock_scale */
static void gptm_update_irq(gptm_state *s)
{
@@ -39,7 +40,7 @@ static void gptm_reload(gptm_state *s, int n, int reset)
/* 32-bit CountDown. */
uint32_t count;
count = s->load[0] | (s->load[1] << 16);
- tick += (int64_t)count * system_clock_scale;
+ tick += clock_ticks_to_ns(s->clk, count);
} else if (s->config == 1) {
/* 32-bit RTC. 1Hz tick. */
tick += NANOSECONDS_PER_SECOND;
@@ -247,8 +248,8 @@ static const MemoryRegionOps gptm_ops = {
static const VMStateDescription vmstate_stellaris_gptm = {
.name = "stellaris_gptm",
- .version_id = 1,
- .minimum_version_id = 1,
+ .version_id = 2,
+ .minimum_version_id = 2,
.fields = (VMStateField[]) {
VMSTATE_UINT32(config, gptm_state),
VMSTATE_UINT32_ARRAY(mode, gptm_state, 2),
@@ -263,6 +264,7 @@ static const VMStateDescription vmstate_stellaris_gptm = {
VMSTATE_UINT32(rtc, gptm_state),
VMSTATE_INT64_ARRAY(tick, gptm_state, 2),
VMSTATE_TIMER_PTR_ARRAY(timer, gptm_state, 2),
+ VMSTATE_CLOCK(clk, gptm_state),
VMSTATE_END_OF_LIST()
}
};
@@ -281,11 +283,27 @@ static void stellaris_gptm_init(Object *obj)
sysbus_init_mmio(sbd, &s->iomem);
s->opaque[0] = s->opaque[1] = s;
+
+ /*
+ * TODO: in an ideal world we would model the effects of changing
+ * the input clock frequency while the countdown timer is active.
+ * The best way to do this would be to convert the device to use
+ * ptimer instead of hand-rolling its own timer. This would also
+ * make it easy to implement reading the current count from the
+ * TAR and TBR registers.
+ */
+ s->clk = qdev_init_clock_in(dev, "clk", NULL, NULL, 0);
}
static void stellaris_gptm_realize(DeviceState *dev, Error **errp)
{
gptm_state *s = STELLARIS_GPTM(dev);
+
+ if (!clock_has_source(s->clk)) {
+ error_setg(errp, "stellaris-gptm: clk must be connected");
+ return;
+ }
+
s->timer[0] = timer_new_ns(QEMU_CLOCK_VIRTUAL, gptm_tick, &s->opaque[0]);
s->timer[1] = timer_new_ns(QEMU_CLOCK_VIRTUAL, gptm_tick, &s->opaque[1]);
}
--
2.20.1
next prev parent reply other threads:[~2021-08-12 9:47 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-12 9:33 [PATCH for-6.2 00/25] arm: Get rid of system_clock_scale global Peter Maydell
2021-08-12 9:33 ` [PATCH for-6.2 01/25] arm: Move M-profile RAS register block into its own device Peter Maydell
2021-08-12 11:08 ` Alexandre IOOSS
2021-08-12 11:09 ` Peter Maydell
2021-08-13 0:59 ` Alistair Francis
2021-08-15 17:30 ` Philippe Mathieu-Daudé
2021-08-16 7:28 ` David Hildenbrand
2021-08-16 9:16 ` Peter Maydell
2021-08-17 8:25 ` Luc Michel
2021-08-17 10:10 ` Damien Hedde
2021-08-12 9:33 ` [PATCH for-6.2 02/25] arm: Move systick device creation from NVIC to ARMv7M object Peter Maydell
2021-08-13 1:23 ` Alistair Francis
2021-08-17 9:24 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 03/25] arm: Move system PPB container handling to armv7m Peter Maydell
2021-08-12 11:56 ` Alexandre IOOSS
2021-08-17 9:25 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 04/25] hw/timer/armv7m_systick: Add usual QEMU interface comment Peter Maydell
2021-08-13 1:26 ` Alistair Francis
2021-08-17 9:29 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 05/25] hw/timer/armv7m_systick: Add input clocks Peter Maydell
2021-08-13 1:27 ` Alistair Francis
2021-08-17 9:32 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 06/25] hw/arm/armv7m: Create " Peter Maydell
2021-08-13 1:28 ` Alistair Francis
2021-08-17 9:34 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 07/25] armsse: Wire up systick cpuclk clock Peter Maydell
2021-08-13 1:29 ` Alistair Francis
2021-08-17 9:36 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 08/25] hw/arm/mps2.c: Connect up armv7m clocks Peter Maydell
2021-08-17 9:39 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 09/25] clock: Provide builtin multiplier/divider Peter Maydell
2021-08-12 12:08 ` Alexandre IOOSS
2021-08-12 12:22 ` Peter Maydell
2021-08-13 1:33 ` Alistair Francis
2021-08-15 16:32 ` Philippe Mathieu-Daudé
2021-08-16 9:05 ` Peter Maydell
2021-08-16 9:32 ` Philippe Mathieu-Daudé
2021-08-16 9:36 ` Peter Maydell
2021-08-16 9:58 ` Philippe Mathieu-Daudé
2021-08-15 21:27 ` Luc Michel
2021-08-17 9:59 ` Damien Hedde
2021-08-17 10:46 ` Peter Maydell
2021-08-17 14:58 ` Damien Hedde
2021-08-12 9:33 ` [PATCH for-6.2 10/25] hw/arm: Don't allocate separate MemoryRegions in stm32 SoC realize Peter Maydell
2021-08-12 12:13 ` Alexandre IOOSS
2021-08-12 12:27 ` Peter Maydell
2021-08-15 16:37 ` Philippe Mathieu-Daudé
2021-08-13 1:34 ` Alistair Francis
2021-08-17 9:41 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 11/25] hw/arm/stm32f100: Wire up sysclk and refclk Peter Maydell
2021-08-13 1:36 ` Alistair Francis
2021-08-14 9:01 ` Alexandre IOOSS
2021-08-17 9:45 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 12/25] hw/arm/stm32f205: " Peter Maydell
2021-08-13 1:38 ` Alistair Francis
2021-08-14 9:02 ` Alexandre IOOSS
2021-08-17 9:47 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 13/25] hw/arm/stm32f405: " Peter Maydell
2021-08-13 1:37 ` Alistair Francis
2021-08-14 9:03 ` Alexandre IOOSS
2021-08-17 9:47 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 14/25] hw/arm/stm32vldiscovery: Delete trailing blank line Peter Maydell
2021-08-12 12:27 ` Alexandre IOOSS
2021-08-13 1:39 ` Alistair Francis
2021-08-17 9:48 ` Luc Michel
2021-08-12 9:33 ` [PATCH for-6.2 15/25] hw/arm/nrf51: Wire up sysclk Peter Maydell
2021-08-14 9:06 ` Alexandre IOOSS
2021-08-12 9:33 ` [PATCH for-6.2 16/25] hw/arm/stellaris: split stellaris_sys_init() Peter Maydell
2021-08-14 9:10 ` Alexandre IOOSS
2021-08-12 9:33 ` [PATCH for-6.2 17/25] hw/arm/stellaris: Wire sysclk up to armv7m Peter Maydell
2021-08-14 9:12 ` Alexandre IOOSS
2021-08-12 9:33 ` [PATCH for-6.2 18/25] hw/arm/msf2_soc: Don't allocate separate MemoryRegions Peter Maydell
2021-08-14 9:13 ` Alexandre IOOSS
2021-08-12 9:33 ` [PATCH for-6.2 19/25] hw/arm/msf2: Use Clock input to MSF2_SOC instead of m3clk property Peter Maydell
2021-08-14 9:20 ` Alexandre IOOSS
2021-08-14 10:11 ` Peter Maydell
2021-08-14 10:47 ` Alexandre IOOSS
2021-08-12 9:33 ` [PATCH for-6.2 20/25] hw/arm/msf2-soc: Wire up refclk Peter Maydell
2021-08-17 15:05 ` Damien Hedde
2021-08-12 9:33 ` [PATCH for-6.2 21/25] hw/timer/armv7m_systick: Use clock inputs instead of system_clock_scale Peter Maydell
2021-08-17 15:55 ` Damien Hedde
2021-08-17 15:59 ` Peter Maydell
2021-08-17 16:14 ` Damien Hedde
2021-08-12 9:33 ` [PATCH for-6.2 22/25] hw/arm/stellaris: Fix code style issues in GPTM code Peter Maydell
2021-08-14 9:26 ` Alexandre IOOSS
2021-08-12 9:33 ` [PATCH for-6.2 23/25] hw/arm/stellaris: Split stellaris-gptm into its own file Peter Maydell
2021-08-17 15:59 ` Damien Hedde
2021-08-12 9:33 ` Peter Maydell [this message]
2021-08-18 12:03 ` [PATCH for-6.2 24/25] hw/timer/stellaris-gptm: Use Clock input instead of system_clock_scale Damien Hedde
2021-08-12 9:33 ` [PATCH for-6.2 25/25] arm: Remove system_clock_scale global Peter Maydell
2021-08-13 5:08 ` Alistair Francis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210812093356.1946-25-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=alistair@alistair23.me \
--cc=damien.hedde@greensocs.com \
--cc=erdnaxe@crans.org \
--cc=joel@jms.id.au \
--cc=luc@lmichel.fr \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=sundeep.lkml@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).