点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-优快云博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!
4.7 chained中断如何流动
4.7.1 Linux chained中断处理流程
什么是chained中断?
如下图所示,假设有三个中断控制器,名字分别为INTC_A、INTC_B、INTC_C,各自有自己的物理中断号。
INTC_B的两个物理中断INTC_B_hwirq32和INTC_B_hwirq33,任意一个触发后,都会触发INTC_A的物理中断INTC_A_hwirq32,最终触发ARM64的IRQ。INTC_A_hwirq32称为INTC_B_hwirq32和INTC_B_hwirq33的父中断。INTC_A称为INTC_B的父中断控制器,反之,INTC_B是INTC_A的子中断控制器。这种中断级联的方式称为chained中断。
同理,INTC_B是INTC_C的父中断控制器,INTC_C是INTC_B的子中断控制器,这样三个中断控制器形成了多级级联的chained中断。
为啥要举多级chained中断的例子?后面分析__ipipe_dispatch_irq会用到。
如《4.2.3 根据DTS完成中断控制器初始化》所述,Linux启动过程中,会完成中断控制器的初始化。
在子中断控制器INTC_B初始化的过程中,如果发现自己存在父,则注册父中断INTC_A_hwirq32,得到virq 10,并把virq 10的handler_irq设置为子中断控制器INTC_B的处理程序INTC_B_handle_chained_irq。同理,中断控制器INTC_C会完成上述步骤。
举一个实际的例子,在GIC中断控制器(irq-gic.c)初始化过程中,如果存在父,则把父中断的irq_desc.handle_irq设置为gic_handle_cascade_irq。
int __init
gic_of_init(struct device_node *node, struct device_node *parent)
{
……
if (parent) {
irq = irq_of_parse_and_map(node, 0);
gic_cascade_irq(gic_cnt, irq);
}
……
}
void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq)
{
BUG_ON(gic_nr >= CONFIG_ARM_GIC_MAX_NR);
irq_set_chained_handler_and_data(irq, gic_handle_cascade_irq,
&gic_data[gic_nr]);
}
除了中断控制器之外,隶属于各个中断控制器的设备会正常初始化,并申请各自的virq和irq_desc。
接下来描述Linux处理chained中断流程。调用关系比较复杂,图中只标出关键的函数。想要完成chained中断的处理,需要多次嵌套调用generic_handle_irq,每次都传入正确的virq。
第一步,当中断INTC_C_hwirq32发生时,依次触发INTC_B_hwirq32、INTC_A_hwirq32,最终触发ARM64 IRQ。
第二步,参考《4.3 Linux的中断处理流程》,Linux中断子系统会根据INTC_A_hwirq32找到对应的virq 10,会第一次调用generic_handle_irq(irq=10)。generic_handle_irq(irq=10)调用的中断流控函数handle_irq实际指向了INTC_B_handle_chained_irq。
第三步,INTC_B_handle_chained_irq要找出在INTC_B中,具体是哪个物理中断触发了?结果发现是INTC_B_hwirq32,其对应的virq是12,第二次调用generic_handle_irq(irq=12)。generic_handle_irq(irq=12)调用的中断流控函数handle_irq实际指向了INTC_C_handle_chained_irq。
第四步,INTC_C_handle_chained_irq要找出在INTC_C中,具体是哪个物理中断触发了?结果发现是INTC_C_hwirq32,其对应的virq是14,第三次调用generic_handle_irq(irq=14)。generic_handle_irq(irq=14)调用的中断流控函数handle_irq是handle_fasteoi_irq,会最终调用irq_desc->action->handler/thread_fn真正完成INTC_C_hwirq32的处理。
点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-优快云博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!