mirror of https://gitee.com/openkylin/qemu.git
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:
parent
efe62d6fa0
commit
98a44c1603
|
@ -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 = {
|
||||||
|
|
Loading…
Reference in New Issue