summary refs log tree commit diff
path: root/devices/src/virtio/gpu
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2018-10-24 17:06:07 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-10-29 21:18:14 -0700
commit120d95e03123ede9cc3aa05a8ce976fd4678a890 (patch)
tree011d7e856f3085de6f024a08674b7ef499cfcf69 /devices/src/virtio/gpu
parent510c783c847b6d0c18516f31fbe3dbdc782f1252 (diff)
downloadcrosvm-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.rs13
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,