GIC驱动中,使用struct gic_chip_data结构体来描述GIC控制器的信息,整个驱动都是围绕着该结构体的初始化,驱动中将函数指针都初始化好,实际的工作是由中断信号触发,也就是在中断来临的时候去进行回调; struct irq_chip结构,描述的是中断控制器的底层操作函数集,这些函数集最终完成对控制器硬件的操作; struct irq_doma...
处理中断时,要屏蔽中断、清除中断等:这些函数保存在irq_chip里,由GIC驱动提供 从硬件上看,GIC的功能是什么? 可以使能、屏蔽中断 发生中断时,可以从GIC里判断是哪个中断 在内核里,使用gic_chip_data结构体表示GIC,gic_chip_data里有什么? irq_chip:中断使能、屏蔽、清除,放在irq_chip中的各个函数里实现 irq_doma...
GIC驱动中,使用struct gic_chip_data结构体来描述GIC控制器的信息,整个驱动都是围绕着该结构体的初始化,驱动中将函数指针都初始化好,实际的工作是由中断信号触发,也就是在中断来临的时候去进行回调struct irq_chip结构,描述的是中断控制器的底层操作函数集,这些函数集最终完成对控制器硬件的操作struct irq_domain结构...
staticstructgic_chip_datagic_data[ARM_GIC_MAX_NR]; /* IRQs start ID */ #define HW_IRQ_START 16 staticunsignedlonggic_get_dist_base(void) { structgic_chip_data*gic=&gic_data[0]; returngic_dist_base(gic); } staticunsignedlonggic_get_cpu_base(void) { structgic_chip_data*gic=&gic_...
irq_data : 从名称不难看出,这是 irq_desc 相关的数据成员,其中包含该中断的逻辑 irq,hwirq,以及该终端所属的 chip 和 domain,这个数据结构并不是指针而是实例结构,如果你经常阅读内核代码,就知道可以通过 irq_data 的指针反向获取到对应的 irq_desc 结构的地址。 因此,在实际的内核处理中,在外面抛头露面的是...
本文主要分析了linux kernel中GIC中断控制器的驱动代码(位于drivers/irqchip/irq-gic.c和irq-gic-common.c)。irq-gic-common.c中是GIC V2和V3的通用代码,而irq-gic.c是V2 specific的代码,irq-gic-v3.c是V3 specific的代码,不在本文的描述范围。本文主要分成三个部分:第二章描述了GIC V2的硬件;第三章描述...
struct gic_chip_data { //gic控制器。Distributor信息 struct fwnode_handle *fwnode; void __iomem *dist_base; struct redist_region *redist_regions; struct rdists rdists; struct irq_domain *domain; u64 redist_stride; u32 nr_redist_regions; ...
struct gic_chip_data *gic = &gic_data[0]; void __iomem *cpu_base = gic_data_cpu_base(gic); do { irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK); irqnr = irqstat & GICC_IAR_INT_ID_MASK; if (likely(irqnr > 15 && irqnr < 1021)) { ...
所谓分布式,GIC-600由几种组件构成,每个组件可以跟其它相关模块在物理设计上摆放在一起,并与其拥有共同的电源域;组件之间通过片上网络(network on chip,简称NoC)通信,从而达到更好的时序。 GIC-600的重要组件包括以下几种: • Distributor:GIC-600的核心部件,负责与其它组件通信,主要处理SPI和LPI ...
在linux-3.14\drivers\irqchip目录下的irqchip.h文件中定义了IRQCHIP_DECLARE宏如下: #define IRQCHIP_DECLARE(name,compstr,fn) \ static const struct of_device_id irqchip_of_match_##name \ __used __section(__irqchip_of_table) \ = { .compatible = compstr, .data = fn } ...