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 |
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 --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;
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(-)