hw/watchdog/milkymist-sysctl.c: Switch to transaction-based ptimer API

Switch the milkymist-sysctl code away from bottom-half based
ptimers to the new transaction-based ptimer API.  This just requires
adding begin/commit calls around the various places that modify the
ptimer state, and using the new ptimer_init() function to create the
timer.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-id: 20191021141040.11007-1-peter.maydell@linaro.org
This commit is contained in:
Peter Maydell 2019-10-21 15:10:40 +01:00
parent efe62d6fa0
commit 98a44c1603
1 changed files with 18 additions and 7 deletions

View File

@ -31,7 +31,6 @@
#include "hw/ptimer.h" #include "hw/ptimer.h"
#include "hw/qdev-properties.h" #include "hw/qdev-properties.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "qemu/main-loop.h"
#include "qemu/module.h" #include "qemu/module.h"
enum { enum {
@ -71,8 +70,6 @@ struct MilkymistSysctlState {
MemoryRegion regs_region; MemoryRegion regs_region;
QEMUBH *bh0;
QEMUBH *bh1;
ptimer_state *ptimer0; ptimer_state *ptimer0;
ptimer_state *ptimer1; ptimer_state *ptimer1;
@ -161,14 +158,19 @@ static void sysctl_write(void *opaque, hwaddr addr, uint64_t value,
s->regs[addr] = value; s->regs[addr] = value;
break; break;
case R_TIMER0_COMPARE: case R_TIMER0_COMPARE:
ptimer_transaction_begin(s->ptimer0);
ptimer_set_limit(s->ptimer0, value, 0); ptimer_set_limit(s->ptimer0, value, 0);
s->regs[addr] = value; s->regs[addr] = value;
ptimer_transaction_commit(s->ptimer0);
break; break;
case R_TIMER1_COMPARE: case R_TIMER1_COMPARE:
ptimer_transaction_begin(s->ptimer1);
ptimer_set_limit(s->ptimer1, value, 0); ptimer_set_limit(s->ptimer1, value, 0);
s->regs[addr] = value; s->regs[addr] = value;
ptimer_transaction_commit(s->ptimer1);
break; break;
case R_TIMER0_CONTROL: case R_TIMER0_CONTROL:
ptimer_transaction_begin(s->ptimer0);
s->regs[addr] = value; s->regs[addr] = value;
if (s->regs[R_TIMER0_CONTROL] & CTRL_ENABLE) { if (s->regs[R_TIMER0_CONTROL] & CTRL_ENABLE) {
trace_milkymist_sysctl_start_timer0(); trace_milkymist_sysctl_start_timer0();
@ -179,8 +181,10 @@ static void sysctl_write(void *opaque, hwaddr addr, uint64_t value,
trace_milkymist_sysctl_stop_timer0(); trace_milkymist_sysctl_stop_timer0();
ptimer_stop(s->ptimer0); ptimer_stop(s->ptimer0);
} }
ptimer_transaction_commit(s->ptimer0);
break; break;
case R_TIMER1_CONTROL: case R_TIMER1_CONTROL:
ptimer_transaction_begin(s->ptimer1);
s->regs[addr] = value; s->regs[addr] = value;
if (s->regs[R_TIMER1_CONTROL] & CTRL_ENABLE) { if (s->regs[R_TIMER1_CONTROL] & CTRL_ENABLE) {
trace_milkymist_sysctl_start_timer1(); trace_milkymist_sysctl_start_timer1();
@ -191,6 +195,7 @@ static void sysctl_write(void *opaque, hwaddr addr, uint64_t value,
trace_milkymist_sysctl_stop_timer1(); trace_milkymist_sysctl_stop_timer1();
ptimer_stop(s->ptimer1); ptimer_stop(s->ptimer1);
} }
ptimer_transaction_commit(s->ptimer1);
break; break;
case R_ICAP: case R_ICAP:
sysctl_icap_write(s, value); sysctl_icap_write(s, value);
@ -263,8 +268,12 @@ static void milkymist_sysctl_reset(DeviceState *d)
s->regs[i] = 0; s->regs[i] = 0;
} }
ptimer_transaction_begin(s->ptimer0);
ptimer_stop(s->ptimer0); ptimer_stop(s->ptimer0);
ptimer_transaction_commit(s->ptimer0);
ptimer_transaction_begin(s->ptimer1);
ptimer_stop(s->ptimer1); ptimer_stop(s->ptimer1);
ptimer_transaction_commit(s->ptimer1);
/* defaults */ /* defaults */
s->regs[R_ICAP] = ICAP_READY; s->regs[R_ICAP] = ICAP_READY;
@ -292,13 +301,15 @@ static void milkymist_sysctl_realize(DeviceState *dev, Error **errp)
{ {
MilkymistSysctlState *s = MILKYMIST_SYSCTL(dev); MilkymistSysctlState *s = MILKYMIST_SYSCTL(dev);
s->bh0 = qemu_bh_new(timer0_hit, s); s->ptimer0 = ptimer_init(timer0_hit, s, PTIMER_POLICY_DEFAULT);
s->bh1 = qemu_bh_new(timer1_hit, s); s->ptimer1 = ptimer_init(timer1_hit, s, PTIMER_POLICY_DEFAULT);
s->ptimer0 = ptimer_init_with_bh(s->bh0, PTIMER_POLICY_DEFAULT);
s->ptimer1 = ptimer_init_with_bh(s->bh1, PTIMER_POLICY_DEFAULT);
ptimer_transaction_begin(s->ptimer0);
ptimer_set_freq(s->ptimer0, s->freq_hz); ptimer_set_freq(s->ptimer0, s->freq_hz);
ptimer_transaction_commit(s->ptimer0);
ptimer_transaction_begin(s->ptimer1);
ptimer_set_freq(s->ptimer1, s->freq_hz); ptimer_set_freq(s->ptimer1, s->freq_hz);
ptimer_transaction_commit(s->ptimer1);
} }
static const VMStateDescription vmstate_milkymist_sysctl = { static const VMStateDescription vmstate_milkymist_sysctl = {