All of lore.kernel.org
 help / color / mirror / Atom feed
From: Olivier Danet <odanet@caramail.com>
To: qemu-devel <qemu-devel@nongnu.org>,
	Blue Swirl <blauwirbel@gmail.com>,
	Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>,
	Artyom Tarasenko <atar4qemu@gmail.com>
Subject: [Qemu-devel] [PATCH] Sun4m : Timer RUN/STOP bit.
Date: Mon, 17 Feb 2014 00:14:25 +0100	[thread overview]
Message-ID: <53014651.5080605@caramail.com> (raw)

The Sun4m architecture has one 'system' timer and one timer per CPU.
The CPU timers can be configured in two modes :
* 22bits Counter/Timer. Periodic interrupts.
* 54bits User timer. For profiling. In this mode, the Run/Stop bit
   controls the timer.

The run/stop bit controls the timer only when it is in "User" mode, but
its state shall be persistent.

Signed-off-by: Olivier Danet <odanet@caramail.com>
---
  hw/timer/slavio_timer.c | 25 ++++++++++---------------
  1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/hw/timer/slavio_timer.c b/hw/timer/slavio_timer.c
index f75b914..e4dccea 100644
--- a/hw/timer/slavio_timer.c
+++ b/hw/timer/slavio_timer.c
@@ -51,7 +51,7 @@ typedef struct CPUTimerState {
      ptimer_state *timer;
      uint32_t count, counthigh, reached;
      /* processor only */
-    uint32_t running;
+    uint32_t run;
      uint64_t limit;
  } CPUTimerState;

@@ -177,7 +177,7 @@ static uint64_t slavio_timer_mem_readl(void *opaque, 
hwaddr addr,
          // only available in processor counter/timer
          // read start/stop status
          if (timer_index > 0) {
-            ret = t->running;
+            ret = t->run;
          } else {
              ret = 0;
          }
@@ -260,16 +260,15 @@ static void slavio_timer_mem_writel(void *opaque, 
hwaddr addr,
      case TIMER_STATUS:
          if (slavio_timer_is_user(tc)) {
              // start/stop user counter
-            if ((val & 1) && !t->running) {
+            if (val & 1) {
trace_slavio_timer_mem_writel_status_start(timer_index);
                  ptimer_run(t->timer, 0);
-                t->running = 1;
-            } else if (!(val & 1) && t->running) {
+            } else {
trace_slavio_timer_mem_writel_status_stop(timer_index);
                  ptimer_stop(t->timer);
-                t->running = 0;
              }
          }
+        t->run = val & 1;
          break;
      case TIMER_MODE:
          if (timer_index == 0) {
@@ -284,8 +283,9 @@ static void slavio_timer_mem_writel(void *opaque, 
hwaddr addr,
                      if (val & processor) { // counter -> user timer
                          qemu_irq_lower(curr_timer->irq);
                          // counters are always running
-                        ptimer_stop(curr_timer->timer);
-                        curr_timer->running = 0;
+                        if (!curr_timer->run) {
+                            ptimer_stop(curr_timer->timer);
+                        }
                          // user timer limit is always the same
                          curr_timer->limit = TIMER_MAX_COUNT64;
                          ptimer_set_limit(curr_timer->timer,
@@ -296,13 +296,8 @@ static void slavio_timer_mem_writel(void *opaque, 
hwaddr addr,
                          s->cputimer_mode |= processor;
trace_slavio_timer_mem_writel_mode_user(timer_index);
                      } else { // user timer -> counter
-                        // stop the user timer if it is running
-                        if (curr_timer->running) {
-                            ptimer_stop(curr_timer->timer);
-                        }
                          // start the counter
                          ptimer_run(curr_timer->timer, 0);
-                        curr_timer->running = 1;
                          // clear this processors user timer bit in config
                          // register
                          s->cputimer_mode &= ~processor;
@@ -340,7 +335,7 @@ static const VMStateDescription vmstate_timer = {
          VMSTATE_UINT32(count, CPUTimerState),
          VMSTATE_UINT32(counthigh, CPUTimerState),
          VMSTATE_UINT32(reached, CPUTimerState),
-        VMSTATE_UINT32(running, CPUTimerState),
+        VMSTATE_UINT32(run    , CPUTimerState),
          VMSTATE_PTIMER(timer, CPUTimerState),
          VMSTATE_END_OF_LIST()
      }
@@ -373,7 +368,7 @@ static void slavio_timer_reset(DeviceState *d)
              ptimer_set_limit(curr_timer->timer,
                               LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 1);
              ptimer_run(curr_timer->timer, 0);
-            curr_timer->running = 1;
+            curr_timer->run = 1;
          }
      }
      s->cputimer_mode = 0;
-- 
1.8.1.5

             reply	other threads:[~2014-02-16 23:13 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-16 23:14 Olivier Danet [this message]
2014-02-23 17:34 ` [Qemu-devel] [PATCH] Sun4m : Timer RUN/STOP bit Mark Cave-Ayland

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=53014651.5080605@caramail.com \
    --to=odanet@caramail.com \
    --cc=atar4qemu@gmail.com \
    --cc=blauwirbel@gmail.com \
    --cc=mark.cave-ayland@ilande.co.uk \
    --cc=qemu-devel@nongnu.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.