IRQ 解析与注册
IRQ 路径使用 domain 化的 IrqId 作为 运行时注册 key。FDT、ACPI、PCI、manual/static 注册都会先得到一个 BindingInfo,再经 register_*_with_info 注册到 rdrive。rdrive 只把 ACPI/FDT probe metadata 交给 resolver,不把平台 IRQ route/source 记录混进自己的设备 registry。
核心源码:
| 源码 | 职责 |
|---|---|
drivers/ax-driver/src/binding_info.rs | BindingInfo、BindingIrq、BindingIrqSource、PciIrqRequirement |
drivers/ax-driver/src/binding_resolver.rs | FDT/ACPI/PCI IRQ binding 解析入口 |
drivers/interface/rdif-base/src/irq.rs | IrqId、IrqSource 类型 |
components/irq-framework/ | AcpiGsiRoute、IRQ domain 框架 |
BindingInfo 模型
BindingInfo 是 probe 阶段携带的 IRQ 元数据,可以携带已经解析好的 IrqId,也可以携带待平台解析的 firmware source:
pub struct BindingInfo {
irq: Option<BindingIrq>,
}
pub enum BindingIrq {
Id(IrqId), // 已解析的 domain IRQ ID
Source(BindingIrqSource), // 待平台解析的 firmware source
}
pub enum BindingIrqSource {
AcpiGsi(u32), // ACPI 裸 GSI
AcpiGsiRoute(AcpiGsiRoute), // ACPI GSI route(含 trigger/polarity/controller)
FdtInterrupt(FdtIrqSpec), // FDT interrupt specifier
}
pub struct FdtIrqSpec {
pub controller: DeviceId, // interrupt-parent 对应的 intc 设备
pub cells: Vec<u32>, // interrupt specifier cells
}
关键边界:generic driver probe 不调用 rdif_intc::setup_irq_by_fdt() 取得裸数字,避免把 GIC/PLIC/PCH 等控制器本地线号混进 legacy IRQ namespace。
解析时序
这个边界让平台 IRQ namespace 解析留在平台 resolver 侧: