From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-arm@nongnu.org, qemu-devel@nongnu.org
Cc: "Philippe Mathieu-Daudé" <philmd@redhat.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Paolo Bonzini" <pbonzini@redhat.com>
Subject: [PATCH v2 11/21] hw/timer/exynos4210_mct.c: Switch GFRC to transaction-based ptimer API
Date: Tue, 8 Oct 2019 18:17:30 +0100 [thread overview]
Message-ID: <20191008171740.9679-12-peter.maydell@linaro.org> (raw)
In-Reply-To: <20191008171740.9679-1-peter.maydell@linaro.org>
We want to switch the exynos MCT code away from bottom-half based ptimers to
the new transaction-based ptimer API. The MCT is complicated
and uses multiple different ptimers, so it's clearer to switch
it a piece at a time. Here we change over only the GFRC.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
hw/timer/exynos4210_mct.c | 48 ++++++++++++++++++++++++++++++++++++---
1 file changed, 45 insertions(+), 3 deletions(-)
diff --git a/hw/timer/exynos4210_mct.c b/hw/timer/exynos4210_mct.c
index 9f2e8dd0a42..fcf91c75cc5 100644
--- a/hw/timer/exynos4210_mct.c
+++ b/hw/timer/exynos4210_mct.c
@@ -364,6 +364,7 @@ static void exynos4210_mct_update_freq(Exynos4210MCTState *s);
/*
* Set counter of FRC global timer.
+ * Must be called within exynos4210_gfrc_tx_begin/commit block.
*/
static void exynos4210_gfrc_set_count(Exynos4210MCTGT *s, uint64_t count)
{
@@ -385,6 +386,7 @@ static uint64_t exynos4210_gfrc_get_count(Exynos4210MCTGT *s)
/*
* Stop global FRC timer
+ * Must be called within exynos4210_gfrc_tx_begin/commit block.
*/
static void exynos4210_gfrc_stop(Exynos4210MCTGT *s)
{
@@ -395,6 +397,7 @@ static void exynos4210_gfrc_stop(Exynos4210MCTGT *s)
/*
* Start global FRC timer
+ * Must be called within exynos4210_gfrc_tx_begin/commit block.
*/
static void exynos4210_gfrc_start(Exynos4210MCTGT *s)
{
@@ -403,6 +406,21 @@ static void exynos4210_gfrc_start(Exynos4210MCTGT *s)
ptimer_run(s->ptimer_frc, 1);
}
+/*
+ * Start ptimer transaction for global FRC timer; this is just for
+ * consistency with the way we wrap operations like stop and run.
+ */
+static void exynos4210_gfrc_tx_begin(Exynos4210MCTGT *s)
+{
+ ptimer_transaction_begin(s->ptimer_frc);
+}
+
+/* Commit ptimer transaction for global FRC timer. */
+static void exynos4210_gfrc_tx_commit(Exynos4210MCTGT *s)
+{
+ ptimer_transaction_commit(s->ptimer_frc);
+}
+
/*
* Find next nearest Comparator. If current Comparator value equals to other
* Comparator value, skip them both
@@ -492,6 +510,7 @@ static uint64_t exynos4210_gcomp_get_distance(Exynos4210MCTState *s, int32_t id)
/*
* Restart global FRC timer
+ * Must be called within exynos4210_gfrc_tx_begin/commit block.
*/
static void exynos4210_gfrc_restart(Exynos4210MCTState *s)
{
@@ -933,6 +952,19 @@ static void exynos4210_ltick_event(void *opaque)
exynos4210_ltick_int_start(&s->tick_timer);
}
+static void tx_ptimer_set_freq(ptimer_state *s, uint32_t freq)
+{
+ /*
+ * callers of exynos4210_mct_update_freq() never do anything
+ * else that needs to be in the same ptimer transaction, so
+ * to avoid a lot of repetition we have a convenience function
+ * for begin/set_freq/commit.
+ */
+ ptimer_transaction_begin(s);
+ ptimer_set_freq(s, freq);
+ ptimer_transaction_commit(s);
+}
+
/* update timer frequency */
static void exynos4210_mct_update_freq(Exynos4210MCTState *s)
{
@@ -945,7 +977,7 @@ static void exynos4210_mct_update_freq(Exynos4210MCTState *s)
DPRINTF("freq=%dHz\n", s->freq);
/* global timer */
- ptimer_set_freq(s->g_timer.ptimer_frc, s->freq);
+ tx_ptimer_set_freq(s->g_timer.ptimer_frc, s->freq);
/* local timer */
ptimer_set_freq(s->l_timer[0].tick_timer.ptimer_tick, s->freq);
@@ -965,7 +997,9 @@ static void exynos4210_mct_reset(DeviceState *d)
/* global timer */
memset(&s->g_timer.reg, 0, sizeof(s->g_timer.reg));
+ exynos4210_gfrc_tx_begin(&s->g_timer);
exynos4210_gfrc_stop(&s->g_timer);
+ exynos4210_gfrc_tx_commit(&s->g_timer);
/* local timer */
memset(s->l_timer[0].reg.cnt, 0, sizeof(s->l_timer[0].reg.cnt));
@@ -1144,7 +1178,9 @@ static void exynos4210_mct_write(void *opaque, hwaddr offset,
}
s->g_timer.reg.cnt = new_frc;
+ exynos4210_gfrc_tx_begin(&s->g_timer);
exynos4210_gfrc_restart(s);
+ exynos4210_gfrc_tx_commit(&s->g_timer);
break;
case G_CNT_WSTAT:
@@ -1168,7 +1204,9 @@ static void exynos4210_mct_write(void *opaque, hwaddr offset,
s->g_timer.reg.wstat |= G_WSTAT_COMP_L(index);
}
+ exynos4210_gfrc_tx_begin(&s->g_timer);
exynos4210_gfrc_restart(s);
+ exynos4210_gfrc_tx_commit(&s->g_timer);
break;
case G_TCON:
@@ -1178,6 +1216,8 @@ static void exynos4210_mct_write(void *opaque, hwaddr offset,
DPRINTF("global timer write to reg.g_tcon %llx\n", value);
+ exynos4210_gfrc_tx_begin(&s->g_timer);
+
/* Start FRC if transition from disabled to enabled */
if ((value & G_TCON_TIMER_ENABLE) > (old_val &
G_TCON_TIMER_ENABLE)) {
@@ -1195,6 +1235,8 @@ static void exynos4210_mct_write(void *opaque, hwaddr offset,
exynos4210_gfrc_restart(s);
}
}
+
+ exynos4210_gfrc_tx_commit(&s->g_timer);
break;
case G_INT_CSTAT:
@@ -1428,8 +1470,8 @@ static void exynos4210_mct_init(Object *obj)
QEMUBH *bh[2];
/* Global timer */
- bh[0] = qemu_bh_new(exynos4210_gfrc_event, s);
- s->g_timer.ptimer_frc = ptimer_init_with_bh(bh[0], PTIMER_POLICY_DEFAULT);
+ s->g_timer.ptimer_frc = ptimer_init(exynos4210_gfrc_event, s,
+ PTIMER_POLICY_DEFAULT);
memset(&s->g_timer.reg, 0, sizeof(struct gregs));
/* Local timers */
--
2.20.1
next prev parent reply other threads:[~2019-10-08 17:33 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-08 17:17 [PATCH v2 00/21] transaction-based ptimer API Peter Maydell
2019-10-08 17:17 ` [PATCH v2 01/21] ptimer: Rename ptimer_init() to ptimer_init_with_bh() Peter Maydell
2019-10-08 17:17 ` [PATCH v2 02/21] ptimer: Provide new transaction-based API Peter Maydell
2019-10-09 1:44 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 03/21] tests/ptimer-test: Switch to transaction-based ptimer API Peter Maydell
2019-10-09 1:46 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 04/21] hw/timer/arm_timer.c: " Peter Maydell
2019-10-09 1:47 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 05/21] hw/arm/musicpal.c: " Peter Maydell
2019-10-09 1:48 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 06/21] hw/timer/allwinner-a10-pit.c: " Peter Maydell
2019-10-09 1:49 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 07/21] hw/timer/arm_mptimer.c: " Peter Maydell
2019-10-09 1:50 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 08/21] hw/timer/cmsdk-apb-dualtimer.c: " Peter Maydell
2019-10-09 1:51 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 09/21] hw/timer/cmsdk-apb-timer.c: " Peter Maydell
2019-10-09 1:52 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 10/21] hw/timer/digic-timer.c: " Peter Maydell
2019-10-09 1:53 ` Richard Henderson
2019-10-08 17:17 ` Peter Maydell [this message]
2019-10-09 1:56 ` [PATCH v2 11/21] hw/timer/exynos4210_mct.c: Switch GFRC " Richard Henderson
2019-10-09 1:58 ` Richard Henderson
2019-10-09 13:49 ` Peter Maydell
2019-10-09 1:58 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 12/21] hw/timer/exynos4210_mct.c: Switch LFRC " Peter Maydell
2019-10-09 1:58 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 13/21] hw/timer/exynos4210_mct.c: Switch ltick " Peter Maydell
2019-10-09 1:59 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 14/21] hw/timer/exynos4210_pwm.c: Switch " Peter Maydell
2019-10-09 2:00 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 15/21] hw/timer/exynos4210_rtc.c: Switch 1Hz ptimer to transaction-based API Peter Maydell
2019-10-09 2:01 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 16/21] hw/timer/exynos4210_rtc.c: Switch main " Peter Maydell
2019-10-09 2:02 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 17/21] hw/timer/imx_epit.c: Switch to transaction-based ptimer API Peter Maydell
2019-10-09 2:03 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 18/21] hw/timer/imx_gpt.c: " Peter Maydell
2019-10-09 2:04 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 19/21] hw/timer/mss-timerc: " Peter Maydell
2019-10-09 2:05 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 20/21] hw/watchdog/cmsdk-apb-watchdog.c: " Peter Maydell
2019-10-09 2:06 ` Richard Henderson
2019-10-08 17:17 ` [PATCH v2 21/21] hw/net/lan9118.c: " Peter Maydell
2019-10-09 2:07 ` Richard Henderson
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=20191008171740.9679-12-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=pbonzini@redhat.com \
--cc=philmd@redhat.com \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/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).