use ax_plat::irq::{HandlerTable, IrqHandler, IrqIf};
use somehal::irq_handler;
const MAX_IRQ_COUNT: usize = 1024;
static IRQ_HANDLER_TABLE: HandlerTable<MAX_IRQ_COUNT> = HandlerTable::new();
struct IrqIfImpl;
#[impl_plat_interface]
impl IrqIf for IrqIfImpl {
fn set_enable(irq_raw: usize, enabled: bool) {
somehal::irq::irq_set_enable(irq_raw.into(), enabled);
}
fn register(irq_num: usize, handler: IrqHandler) -> bool {
debug!("register handler IRQ {}", irq_num);
if IRQ_HANDLER_TABLE.register_handler(irq_num, handler) {
Self::set_enable(irq_num, true);
return true;
}
warn!("register handler for IRQ {} failed", irq_num);
false
}
fn unregister(irq_num: usize) -> Option<IrqHandler> {
trace!("unregister handler IRQ {}", irq_num);
Self::set_enable(irq_num, false);
IRQ_HANDLER_TABLE.unregister_handler(irq_num)
}
fn handle(_irq_num: usize) -> Option<usize> {
let irq = somehal::irq::irq_handler_raw();
Some(irq.raw())
}
fn send_ipi(_id: usize, _target: ax_plat::irq::IpiTarget) {
todo!()
}
}
#[irq_handler]
fn somehal_handle_irq(irq: somehal::irq::IrqId) {
if !IRQ_HANDLER_TABLE.handle(irq.raw()) {
warn!("Unhandled IRQ {irq:?}");
}
}