cuda: set timer 1 frequency property to CUDA_TIMER_FREQ
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> [dwg: Correct a conflict due to a bug in an earlier patch] Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
eb0788cb73
commit
a797ec500a
@ -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->frequency) - ti->load_time;
|
||||
d = (tb_diff * 0xBF401675E5DULL) / (ti->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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user