From a38a20984e25d95b0ed0ee3bcc8b70c4ba6c3f7d Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Sep 2019 20:37:20 -0600 Subject: [PATCH] Basic implementation of NVMe IRQ handler --- nvmed/src/nvme.rs | 4 ++-- nvmed/src/scheme.rs | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/nvmed/src/nvme.rs b/nvmed/src/nvme.rs index f32a2601a5..9169dce064 100644 --- a/nvmed/src/nvme.rs +++ b/nvmed/src/nvme.rs @@ -238,7 +238,7 @@ impl NvmeCompQueue { }) } - fn complete(&mut self) -> Option<(usize, NvmeComp)> { + pub (crate) fn complete(&mut self) -> Option<(usize, NvmeComp)> { let entry = unsafe { ptr::read_volatile(self.data.as_ptr().add(self.i)) }; @@ -274,7 +274,7 @@ pub struct NvmeNamespace { pub struct Nvme { regs: &'static mut NvmeRegs, submission_queues: [NvmeCmdQueue; 2], - completion_queues: [NvmeCompQueue; 2], + pub (crate) completion_queues: [NvmeCompQueue; 2], buffer: Dma<[u8; 512 * 4096]>, // 2MB of buffer buffer_prp: Dma<[u64; 512]>, // 4KB of PRP for the buffer } diff --git a/nvmed/src/scheme.rs b/nvmed/src/scheme.rs index 58edb0dae2..15edcbdb45 100644 --- a/nvmed/src/scheme.rs +++ b/nvmed/src/scheme.rs @@ -37,8 +37,19 @@ impl DiskScheme { impl DiskScheme { pub fn irq(&mut self) -> bool { - // TODO: implement - false + let mut found_completion = false; + + let nvme = &mut self.nvme; + for qid in 0..nvme.completion_queues.len() { + while let Some((head, entry)) = nvme.completion_queues[qid].complete() { + found_completion = true; + println!("nvmed: Unhandled completion {:?}", entry); + //TODO: Handle errors + unsafe { nvme.completion_queue_head(qid as u16, head as u16); } + } + } + + found_completion } }