feat: kernel/plat: initial irq support

This commit is contained in:
Paul Pan 2024-08-23 10:19:09 +08:00
parent 871a028ecf
commit 55c27e371d
2 changed files with 20 additions and 14 deletions

View File

@ -102,7 +102,7 @@ impl Driver for IrqPlic {
}
impl IrqController for IrqPlic {
fn enable(&self, irq: usize) {
fn enable(&mut self, irq: usize) {
if irq == 0 || irq >= self.nr_irqs {
return;
}
@ -121,7 +121,7 @@ impl IrqController for IrqPlic {
}
}
fn disable(&self, irq: usize) {
fn disable(&mut self, irq: usize) {
if irq == 0 || irq >= self.nr_irqs {
return;
}
@ -140,7 +140,7 @@ impl IrqController for IrqPlic {
}
}
fn is_pending(&self, irq: usize) -> bool {
fn is_pending(&mut self, irq: usize) -> bool {
if irq == 0 || irq >= self.nr_irqs {
return false;
}
@ -152,7 +152,7 @@ impl IrqController for IrqPlic {
val & (1 << bit) != 0
}
fn claim(&self) -> Option<usize> {
fn claim(&mut self) -> Option<usize> {
let val = unsafe { self.control.as_ref().unwrap().claim.read_volatile() };
if val > 0 {
@ -162,7 +162,7 @@ impl IrqController for IrqPlic {
}
}
fn complete(&self, irq: usize) {
fn complete(&mut self, irq: usize) {
if irq == 0 || irq >= self.nr_irqs {
return;
}

View File

@ -1,3 +1,5 @@
use super::utils::generate_driver;
use crate::drivers::irq::IrqPlic;
use crate::objects::*;
const IRQ_NUM: usize = 32;
@ -10,13 +12,18 @@ pub enum IrqState {
Reserved,
}
pub trait IrqController {
fn enable(&self, irq: usize);
fn disable(&self, irq: usize);
fn is_pending(&self, irq: usize) -> bool;
fn claim(&self) -> Option<usize>;
fn complete(&self, irq: usize);
}
generate_driver!(
IrqDriver {
(IrqPlic),
()
} : IrqController {
fn enable(&mut self, irq: usize) -> ();
fn disable(&mut self, irq: usize) -> ();
fn is_pending(&mut self, irq: usize) -> bool;
fn claim(&mut self) -> Option<usize>;
fn complete(&mut self, irq: usize) -> ();
}
);
pub struct IrqManager {
handler: [CapEntry; IRQ_NUM],
@ -30,5 +37,4 @@ impl IrqManager {
state: [IrqState::Inactive; IRQ_NUM],
}
}
}
}