diff mbox series

[PATCHv2,07/12] cuda: set timer 1 frequency property to CUDA_TIMER_FREQ

Message ID 20180209185142.17151-8-mark.cave-ayland@ilande.co.uk
State New
Headers show
Series cuda: various fixes, tidy-ups, and move 6522 to separate device | expand

Commit Message

Mark Cave-Ayland Feb. 9, 2018, 6:51 p.m. UTC
Now that we have successfully decoupled the timebase frequency and the hardware
timer frequency, set the timer 1 frequency property to CUDA_TIMER_FREQ and alter
get_next_irq_time() to use it rather than the hard-coded constant.

In addition to this we must now switch the tb_diff calculation over to use the
timebase frequency now that the hardware clock frequency and the timebase
frequency are different.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
 hw/misc/macio/cuda.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

Comments

David Gibson Feb. 10, 2018, 11:15 p.m. UTC | #1
On Fri, Feb 09, 2018 at 06:51:37PM +0000, Mark Cave-Ayland wrote:
> Now that we have successfully decoupled the timebase frequency and the hardware
> timer frequency, set the timer 1 frequency property to CUDA_TIMER_FREQ and alter
> get_next_irq_time() to use it rather than the hard-coded constant.
> 
> In addition to this we must now switch the tb_diff calculation over to use the
> timebase frequency now that the hardware clock frequency and the timebase
> frequency are different.
> 
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> ---
>  hw/misc/macio/cuda.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
> index 408858e688..e00df4a21a 100644
> --- a/hw/misc/macio/cuda.c
> +++ b/hw/misc/macio/cuda.c
> @@ -158,8 +158,8 @@ static unsigned int get_counter(CUDAState *s, CUDATimer *ti)
>      uint64_t current_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
>  
>      /* Reverse of the tb calculation algorithm that Mac OS X uses on bootup. */
> -    tb_diff = get_tb(current_time, ti->tb_frequency) - ti->load_time;
> -    d = (tb_diff * 0xBF401675E5DULL) / (ti->tb_frequency << 24);
> +    tb_diff = get_tb(current_time, s->tb_frequency) - ti->load_time;
> +    d = (tb_diff * 0xBF401675E5DULL) / (s->tb_frequency << 24);

This requires an update due to the bug in the earlier patch which
touched this.  I've fixed this up in my tree.

>      if (ti->index == 0) {
>          /* the timer goes down from latch to -1 (period of latch + 2) */
> @@ -191,7 +191,7 @@ static int64_t get_next_irq_time(CUDATimer *ti, int64_t current_time)
>  
>      /* current counter value */
>      d = muldiv64(current_time - ti->load_time,
> -                 CUDA_TIMER_FREQ, NANOSECONDS_PER_SECOND);
> +                 ti->frequency, NANOSECONDS_PER_SECOND);
>      /* the timer goes down from latch to -1 (period of latch + 2) */
>      if (d <= (ti->counter_value + 1)) {
>          counter = (ti->counter_value - d) & 0xffff;
> @@ -210,7 +210,7 @@ static int64_t get_next_irq_time(CUDATimer *ti, int64_t current_time)
>      }
>      CUDA_DPRINTF("latch=%d counter=%" PRId64 " delta_next=%" PRId64 "\n",
>                   ti->latch, d, next_time - d);
> -    next_time = muldiv64(next_time, NANOSECONDS_PER_SECOND, CUDA_TIMER_FREQ) +
> +    next_time = muldiv64(next_time, NANOSECONDS_PER_SECOND, ti->frequency) +
>                           ti->load_time;
>      if (next_time <= current_time) {
>          next_time = current_time + 1;
> @@ -879,7 +879,7 @@ static void cuda_realizefn(DeviceState *dev, Error **errp)
>      struct tm tm;
>  
>      s->timers[0].timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_timer1, s);
> -    s->timers[0].frequency = s->tb_frequency;
> +    s->timers[0].frequency = CUDA_TIMER_FREQ;
>      s->timers[1].timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_timer2, s);
>      s->timers[1].frequency = (SCALE_US * 6000) / 4700;
>
diff mbox series

Patch

diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
index 408858e688..e00df4a21a 100644
--- a/hw/misc/macio/cuda.c
+++ b/hw/misc/macio/cuda.c
@@ -158,8 +158,8 @@  static unsigned int get_counter(CUDAState *s, CUDATimer *ti)
     uint64_t current_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
 
     /* Reverse of the tb calculation algorithm that Mac OS X uses on bootup. */
-    tb_diff = get_tb(current_time, ti->tb_frequency) - ti->load_time;
-    d = (tb_diff * 0xBF401675E5DULL) / (ti->tb_frequency << 24);
+    tb_diff = get_tb(current_time, s->tb_frequency) - ti->load_time;
+    d = (tb_diff * 0xBF401675E5DULL) / (s->tb_frequency << 24);
 
     if (ti->index == 0) {
         /* the timer goes down from latch to -1 (period of latch + 2) */
@@ -191,7 +191,7 @@  static int64_t get_next_irq_time(CUDATimer *ti, int64_t current_time)
 
     /* current counter value */
     d = muldiv64(current_time - ti->load_time,
-                 CUDA_TIMER_FREQ, NANOSECONDS_PER_SECOND);
+                 ti->frequency, NANOSECONDS_PER_SECOND);
     /* the timer goes down from latch to -1 (period of latch + 2) */
     if (d <= (ti->counter_value + 1)) {
         counter = (ti->counter_value - d) & 0xffff;
@@ -210,7 +210,7 @@  static int64_t get_next_irq_time(CUDATimer *ti, int64_t current_time)
     }
     CUDA_DPRINTF("latch=%d counter=%" PRId64 " delta_next=%" PRId64 "\n",
                  ti->latch, d, next_time - d);
-    next_time = muldiv64(next_time, NANOSECONDS_PER_SECOND, CUDA_TIMER_FREQ) +
+    next_time = muldiv64(next_time, NANOSECONDS_PER_SECOND, ti->frequency) +
                          ti->load_time;
     if (next_time <= current_time) {
         next_time = current_time + 1;
@@ -879,7 +879,7 @@  static void cuda_realizefn(DeviceState *dev, Error **errp)
     struct tm tm;
 
     s->timers[0].timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_timer1, s);
-    s->timers[0].frequency = s->tb_frequency;
+    s->timers[0].frequency = CUDA_TIMER_FREQ;
     s->timers[1].timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_timer2, s);
     s->timers[1].frequency = (SCALE_US * 6000) / 4700;