cuda: decrease time delay before raising VIA SR interrupt and remove fast path
In order to handle a race condition in the MacOS 9 CUDA driver, a delay was introduced when raising the VIA SR interrupt inspired by similar code in MacOnLinux. During original testing of the MacOS 9 patches it was found that the 30us delay used in MacOnLinux did not work reliably within QEMU, and a value of 300us was required to function correctly. Recent experiments have shown two things: firstly when booting Linux, MacOS 9 and MacOS X the fast path which bypasses the delay is never triggered once the OS kernel is loaded making it effectively useless. Rather than leave this code in place where a guest could potentially enable it by accident and break itself, we might as well just remove it. Secondly the previous reliability issues are no longer present, and this value can be reduced down to 20us with no apparent ill effects. This has the benefit of considerably improving the responsiveness of the ADB keyboard and mouse within the guest. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
925969c3e2
commit
d6c666ad81
@ -97,17 +97,8 @@ static void cuda_set_sr_int(void *opaque)
|
||||
|
||||
static void cuda_delay_set_sr_int(CUDAState *s)
|
||||
{
|
||||
MOS6522CUDAState *mcs = &s->mos6522_cuda;
|
||||
MOS6522State *ms = MOS6522(mcs);
|
||||
MOS6522DeviceClass *mdc = MOS6522_DEVICE_GET_CLASS(ms);
|
||||
int64_t expire;
|
||||
|
||||
if (ms->dirb == 0xff || s->sr_delay_ns == 0) {
|
||||
/* Disabled or not in Mac OS, fire the IRQ directly */
|
||||
mdc->set_sr_int(ms);
|
||||
return;
|
||||
}
|
||||
|
||||
trace_cuda_delay_set_sr_int();
|
||||
|
||||
expire = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + s->sr_delay_ns;
|
||||
@ -542,7 +533,7 @@ static void cuda_realize(DeviceState *dev, Error **errp)
|
||||
s->tick_offset = (uint32_t)mktimegm(&tm) + RTC_OFFSET;
|
||||
|
||||
s->sr_delay_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_set_sr_int, s);
|
||||
s->sr_delay_ns = 300 * SCALE_US;
|
||||
s->sr_delay_ns = 20 * SCALE_US;
|
||||
|
||||
s->adb_poll_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_adb_poll, s);
|
||||
s->adb_poll_mask = 0xffff;
|
||||
|
Loading…
x
Reference in New Issue
Block a user