qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 4/8] hw/watchdog/milkymist-sysctl.c: Switch to transaction-ba


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH 4/8] hw/watchdog/milkymist-sysctl.c: Switch to transaction-based ptimer API
Date: Thu, 17 Oct 2019 17:42:12 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.1

On 10/17/19 3:29 PM, Peter Maydell wrote:
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 <address@hidden>
---
  hw/timer/milkymist-sysctl.c | 25 ++++++++++++++++++-------
  1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/hw/timer/milkymist-sysctl.c b/hw/timer/milkymist-sysctl.c
index 5193c038501..66f86541114 100644
--- a/hw/timer/milkymist-sysctl.c
+++ b/hw/timer/milkymist-sysctl.c
@@ -31,7 +31,6 @@
  #include "hw/ptimer.h"
  #include "hw/qdev-properties.h"
  #include "qemu/error-report.h"
-#include "qemu/main-loop.h"
  #include "qemu/module.h"
enum {
@@ -71,8 +70,6 @@ struct MilkymistSysctlState {
MemoryRegion regs_region; - QEMUBH *bh0;
-    QEMUBH *bh1;
      ptimer_state *ptimer0;
      ptimer_state *ptimer1;
@@ -161,14 +158,19 @@ static void sysctl_write(void *opaque, hwaddr addr, uint64_t value,
          s->regs[addr] = value;
          break;
      case R_TIMER0_COMPARE:
+        ptimer_transaction_begin(s->ptimer0);
          ptimer_set_limit(s->ptimer0, value, 0);
          s->regs[addr] = value;
+        ptimer_transaction_commit(s->ptimer0);
          break;
      case R_TIMER1_COMPARE:
+        ptimer_transaction_begin(s->ptimer1);
          ptimer_set_limit(s->ptimer1, value, 0);
          s->regs[addr] = value;
+        ptimer_transaction_commit(s->ptimer1);
          break;
      case R_TIMER0_CONTROL:
+        ptimer_transaction_begin(s->ptimer0);
          s->regs[addr] = value;
          if (s->regs[R_TIMER0_CONTROL] & CTRL_ENABLE) {
              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();
              ptimer_stop(s->ptimer0);
          }
+        ptimer_transaction_commit(s->ptimer0);
          break;
      case R_TIMER1_CONTROL:
+        ptimer_transaction_begin(s->ptimer0);

Copy/paste error I suppose, ptimer1 :)

          s->regs[addr] = value;
          if (s->regs[R_TIMER1_CONTROL] & CTRL_ENABLE) {
              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();
              ptimer_stop(s->ptimer1);
          }
+        ptimer_transaction_commit(s->ptimer0);

Ditto.

With it fixed:
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>

          break;
      case R_ICAP:
          sysctl_icap_write(s, value);
@@ -263,8 +268,12 @@ static void milkymist_sysctl_reset(DeviceState *d)
          s->regs[i] = 0;
      }
+ ptimer_transaction_begin(s->ptimer0);
      ptimer_stop(s->ptimer0);
+    ptimer_transaction_commit(s->ptimer0);
+    ptimer_transaction_begin(s->ptimer1);
      ptimer_stop(s->ptimer1);
+    ptimer_transaction_commit(s->ptimer1);
/* defaults */
      s->regs[R_ICAP] = ICAP_READY;
@@ -292,13 +301,15 @@ static void milkymist_sysctl_realize(DeviceState *dev, 
Error **errp)
  {
      MilkymistSysctlState *s = MILKYMIST_SYSCTL(dev);
- s->bh0 = qemu_bh_new(timer0_hit, s);
-    s->bh1 = qemu_bh_new(timer1_hit, s);
-    s->ptimer0 = ptimer_init_with_bh(s->bh0, PTIMER_POLICY_DEFAULT);
-    s->ptimer1 = ptimer_init_with_bh(s->bh1, PTIMER_POLICY_DEFAULT);
+    s->ptimer0 = ptimer_init(timer0_hit, s, PTIMER_POLICY_DEFAULT);
+    s->ptimer1 = ptimer_init(timer1_hit, s, PTIMER_POLICY_DEFAULT);
+ ptimer_transaction_begin(s->ptimer0);
      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_transaction_commit(s->ptimer1);
  }
static const VMStateDescription vmstate_milkymist_sysctl = {





reply via email to

[Prev in Thread] Current Thread [Next in Thread]