use core::{fmt::Display, result};
use crate::smp::Cpumask;
#[derive(Debug)]
pub enum IrqError {
Invalid,
}
pub type Result<T> = result::Result<T, IrqError>;
impl Display for IrqError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
let error = match self {
Self::Invalid => "Invalid args",
};
write!(f, "{error}")
}
}
bitflags::bitflags! {
#[derive(Clone, Copy, Default)]
pub struct IrqType: u32 {
const IRQ_TYPE_NONE = 0;
const IRQ_TYPE_EDGE_RISING = 0x1;
const IRQ_TYPE_EDGE_FALLING = 0x2;
const IRQ_TYPE_EDGE_BOTH = IrqType::IRQ_TYPE_EDGE_RISING.bits() | IrqType::IRQ_TYPE_EDGE_FALLING.bits() ;
const IRQ_TYPE_LEVEL_HIGH = 0x4;
const IRQ_TYPE_LEVEL_LOW = 0x8;
const IRQ_TYPE_LEVEL_MASK = IrqType::IRQ_TYPE_LEVEL_HIGH.bits() | IrqType::IRQ_TYPE_LEVEL_LOW.bits() ;
const IRQ_TYPE_MASK = IrqType::IRQ_TYPE_EDGE_BOTH.bits() | IrqType::IRQ_TYPE_LEVEL_MASK.bits();
}
}
bitflags::bitflags! {
#[derive(Clone, Copy, Default, PartialEq, PartialOrd)]
pub struct IrqState: u32 {
const IRQ_PER_CPU = 1 << 0;
const IRQ_NOREQUEST = 1 << 1;
const IRQ_PENDING = 1 << 2;
const IRQ_INPROGRESS = 1 << 3;
const IRQ_MASKED = 1 << 4;
}
}
#[derive(Clone, Copy)]
#[allow(non_camel_case_types)]
pub enum IrqchipIrqState {
IRQCHIP_STATE_PENDING,
IRQCHIP_STATE_ACTIVE,
IRQCHIP_STATE_MASKED,
IRQCHIP_STATE_LINE_LEVEL,
}
#[allow(unused_variables)]
pub trait IrqchipImpl {
fn name(&self) -> &'static str;
fn irqs_max(&self) -> usize;
fn irq_ack(&self, hwirq: u32) {}
fn irq_eoi(&self, hwirq: u32);
fn irq_disable(&self, hwirq: u32);
fn irq_enable(&self, hwirq: u32);
fn irq_set_affinity(&self, hwirq: u32, cpumask: Cpumask) -> Result<()>;
fn irq_set_type(&self, hwirq: u32, irq_type: IrqType) -> Result<()>;
fn irq_get_irqchip_state(&self, hwirq: u32, which: IrqchipIrqState) -> Result<bool>;
fn irq_set_irqchip_state(&self, hwirq: u32, which: IrqchipIrqState, state: bool) -> Result<()>;
fn ipi_send_single(&self, hwirq: u32, cpu: usize) {
let cpumask = Cpumask::new();
cpumask.set(cpu);
self.ipi_send_mask(hwirq, &cpumask);
}
fn ipi_send_mask(&self, hwirq: u32, cpumask: &Cpumask);
fn irq_handler(&self);
fn irq_init(&self);
fn irq_init_cpu(&self);
}