diff options
author | Daniel Verkamp <dverkamp@chromium.org> | 2018-10-24 17:06:07 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-10-29 21:18:14 -0700 |
commit | 120d95e03123ede9cc3aa05a8ce976fd4678a890 (patch) | |
tree | 011d7e856f3085de6f024a08674b7ef499cfcf69 /devices/src/virtio/gpu | |
parent | 510c783c847b6d0c18516f31fbe3dbdc782f1252 (diff) | |
download | crosvm-120d95e03123ede9cc3aa05a8ce976fd4678a890.tar crosvm-120d95e03123ede9cc3aa05a8ce976fd4678a890.tar.gz crosvm-120d95e03123ede9cc3aa05a8ce976fd4678a890.tar.bz2 crosvm-120d95e03123ede9cc3aa05a8ce976fd4678a890.tar.lz crosvm-120d95e03123ede9cc3aa05a8ce976fd4678a890.tar.xz crosvm-120d95e03123ede9cc3aa05a8ce976fd4678a890.tar.zst crosvm-120d95e03123ede9cc3aa05a8ce976fd4678a890.zip |
devices: pci: support level-triggered interrupts
Register the irqfd with resample support so that we can correctly emulate level-triggered interrupts. This requires each PciDevice to listen for interrupt_resample events and re-assert the IRQ eventfd if it should still be active. BUG=None TEST=Boot crosvm on x86-64 and arm devices Change-Id: I5cf8d1d1705cf675b453962c00d2d606801fee91 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1298654 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'devices/src/virtio/gpu')
-rw-r--r-- | devices/src/virtio/gpu/mod.rs | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/devices/src/virtio/gpu/mod.rs b/devices/src/virtio/gpu/mod.rs index ec60634..5ef90c9 100644 --- a/devices/src/virtio/gpu/mod.rs +++ b/devices/src/virtio/gpu/mod.rs @@ -456,6 +456,7 @@ struct Worker { exit_evt: EventFd, mem: GuestMemory, interrupt_evt: EventFd, + interrupt_resample_evt: EventFd, interrupt_status: Arc<AtomicUsize>, ctrl_queue: Queue, ctrl_evt: EventFd, @@ -478,6 +479,7 @@ impl Worker { CtrlQueue, CursorQueue, Display, + InterruptResample, Kill, } @@ -487,6 +489,9 @@ impl Worker { .and_then(|pc| { pc.add(&*self.state.display().borrow(), Token::Display) .and(Ok(pc)) + }).and_then(|pc| { + pc.add(&self.interrupt_resample_evt, Token::InterruptResample) + .and(Ok(pc)) }).and_then(|pc| pc.add(&self.kill_evt, Token::Kill).and(Ok(pc))) { Ok(pc) => pc, @@ -530,6 +535,12 @@ impl Worker { let _ = self.exit_evt.write(1); } } + Token::InterruptResample => { + let _ = self.interrupt_resample_evt.read(); + if self.interrupt_status.load(Ordering::SeqCst) != 0 { + self.interrupt_evt.write(1).unwrap(); + } + } Token::Kill => { break 'poll; } @@ -664,6 +675,7 @@ impl VirtioDevice for Gpu { &mut self, mem: GuestMemory, interrupt_evt: EventFd, + interrupt_resample_evt: EventFd, interrupt_status: Arc<AtomicUsize>, mut queues: Vec<Queue>, mut queue_evts: Vec<EventFd>, @@ -732,6 +744,7 @@ impl VirtioDevice for Gpu { exit_evt, mem, interrupt_evt, + interrupt_resample_evt, interrupt_status, ctrl_queue, ctrl_evt, |