GIC是ARM体系中重要的组件,在认识到GIC的组成和功能之后,了解到IRQ的大致流程,从硬件IRQ到来,到IRQ结束。我们实际在KERNEL里面,或者在设备驱动里面处理的IRQ其实是软件意义上的,那么硬件的中断和软件的中断如何联系起来的呢,大概的处理流程是如何呢?
这章我们介绍这部分内容。
GIC 中断处理流程
我们希望理解概念和流程,总结认识和思路,所以代码细节上的解释需要忽略掉。可以看代码细节,但是总结时候要去掉。毕竟,即使是自己看过了,过了一段时间再重新读代码,也是有些陌生的。我们还是以图开始。
我们在之前介绍“arm GIC介绍之一/二/三”:
http://blog.csdn.net/sunsissy/article/details/73791470
http://blog.csdn.net/sunsissy/article/details/73842533
http://blog.csdn.net/sunsissy/article/details/73842533
一直在强调,GIC上对物理的IRQ的处理,比如上图,一个DEVICE_1上触发一个IRQ,到GIC,HWIRQ为111,如果软件侧管理中断不冲突的话,可以直接映射desc_irq 111,以此为结构并处理。但是实际中并不这么完美。
比如图中另外一个DEVICE,同时来了3个信号,或者说,而这个设备和GIC只有一个IRQ的物理连接通路,只能传递一个IRQ信号,那么这又如何表示和区分3个信号呢,如何和CPU的软件意义上的IRQ联系起来呢?
这就新增加了IRQ_DOMAIN的概念。
struct irq_domain {
struct list_head link;
const char *name;
const struct irq_domain_ops *ops; //callback函数
void *host_data;//this will point to irq_data, and contains gicd_base, info and so on.
/* Optional data */
struct device_node *of_node;//该interrupt domain对应的interrupt controller的device node
struct irq_domain_chip_generic *gc; //generic irq chip concept , we ignore this.
/* reverse map data. The linear map gets appended to the irq_domain */
irq_hw_number_t hwirq_max; //该domain中最大的那个HW inter