Basic implementation of NVMe IRQ handler

This commit is contained in:
Jeremy Soller
2019-09-05 20:37:20 -06:00
parent 8da1c13b73
commit a38a20984e
2 changed files with 15 additions and 4 deletions
+2 -2
View File
@@ -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
}
+13 -2
View File
@@ -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
}
}