From 161e578f295fc43a878c4cacea96b1994b86ea21 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 29 Oct 2024 08:01:38 -0600 Subject: [PATCH] Use null driver for unknown IRQ controllers on aarch64 --- src/arch/aarch64/device/irqchip/mod.rs | 4 ++- src/arch/aarch64/device/irqchip/null.rs | 41 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/arch/aarch64/device/irqchip/null.rs diff --git a/src/arch/aarch64/device/irqchip/mod.rs b/src/arch/aarch64/device/irqchip/mod.rs index 489781aaa8..da60c3a1d8 100644 --- a/src/arch/aarch64/device/irqchip/mod.rs +++ b/src/arch/aarch64/device/irqchip/mod.rs @@ -6,6 +6,7 @@ mod gic; mod gicv3; mod irq_bcm2835; mod irq_bcm2836; +mod null; pub(crate) fn new_irqchip(ic_str: &str) -> Option> { if ic_str.contains("arm,gic-v3") { @@ -18,7 +19,8 @@ pub(crate) fn new_irqchip(ic_str: &str) -> Option> Some(Box::new(irq_bcm2835::Bcm2835ArmInterruptController::new())) } else { log::warn!("no driver for interrupt controller {:?}", ic_str); - None + //TODO: return None and handle it properly + Some(Box::new(null::Null)) } } diff --git a/src/arch/aarch64/device/irqchip/null.rs b/src/arch/aarch64/device/irqchip/null.rs new file mode 100644 index 0000000000..c8f60274d5 --- /dev/null +++ b/src/arch/aarch64/device/irqchip/null.rs @@ -0,0 +1,41 @@ +use fdt::Fdt; +use syscall::{ + error::{Error, EINVAL}, + Result, +}; + +use super::InterruptController; +use crate::dtb::irqchip::{InterruptHandler, IrqDesc}; + +pub struct Null; + +impl InterruptHandler for Null { + fn irq_handler(&mut self, _irq: u32) {} +} + +impl InterruptController for Null { + fn irq_init( + &mut self, + fdt: &Fdt, + irq_desc: &mut [IrqDesc; 1024], + ic_idx: usize, + irq_idx: &mut usize, + ) -> Result<()> { + Ok(()) + } + fn irq_ack(&mut self) -> u32 { + unimplemented!() + } + fn irq_eoi(&mut self, irq_num: u32) { + } + fn irq_enable(&mut self, irq_num: u32) { + } + fn irq_disable(&mut self, irq_num: u32) { + } + fn irq_xlate(&self, irq_data: &[u32; 3]) -> Result { + Err(Error::new(EINVAL)) + } + fn irq_to_virq(&self, hwirq: u32) -> Option { + None + } +} \ No newline at end of file