通过上述的函数分配virq,也就是softirq,分配一个Irq_data结构,然后将virq设置到irq_data结构中 staticstructirq_data *irq_domain_insert_irq_data(structirq_domain *domain,structirq_data *child) {structirq_data *irq_data; irq_data= kzalloc_node(sizeof(*irq_data), GFP_KERNEL, irq_data_get_node(...
系统初始化时会查找DTS中定义的中断控制器,计算GIC最多支持的中断源的个数,GIC-V2规定最多支持1020个中断源,在SoC设计阶段就确定ARM SoC可以支持多少个中断源了,然后,调用irq_domain_create_linear()->__irq_domain_add()函数注册一个irq_domain数据结构: struct irq_domain *__irq_domain_add(struct fwnode_...
int (*map)(struct irq_domain *d, unsigned int virq, irq_hw_number_t hw); // 线性映射 void (*unmap)(struct irq_domain *d, unsigned int virq); int (*xlate)(struct irq_domain *d, struct device_node *node, // 通过参数,线性hirq获取 const u32 *intspec, unsigned int intsize, u...
staticstruct irq_data*irq_domain_insert_irq_data(struct irq_domain*domain,struct irq_data*child){struct irq_data*irq_data;irq_data=kzalloc_node(sizeof(*irq_data),GFP_KERNEL,irq_data_get_node(child));if(irq_data){child->parent_data=irq_data;irq_data->irq=child->irq;irq_data->common=...
const struct irq_domain_ops *ops, void *host_data) { return __irq_domain_add(of_node, 0, max_irq, max_irq, ops, host_data); } 这类接口的逻辑很简单,根据自己的映射类型,初始化struct irq_domain中的各个成员,调用__irq_domain_add将该irq domain挂入irq_domain_list的全局列表。
程序从GIC中读取寄存器知道发生了102号中断,通过GIC irq_domain可以知道virq为236 处理virq 236号中断:调用irq_desc[236].handle_irq,即handleA mask/ack中断: 调用irq_desc[236].irq_data->irq_chip的函数,即irq_dataB 它会调用父级irq_dataA->irq_chip的函数 ...
这类接口的逻辑很简单,根据自己的映射类型,初始化struct irq_domain中的各个成员,调用__irq_domain_add将该irq domain挂入irq_domain_list的全局列表。 2、为irq domain创建映射 上节的内容主要是向系统注册一个irq domain,具体HW interrupt ID和IRQ number的映射关系都是空的,因此,具体各个irq domain如何管理映射...
VMLINUX_SYMBOL(__irqchip_begin) = .; *(__irqchip_of_table) *(__irqchip_of_end) #endif 在内核启动初始化中断的函数中,of_irq_init 函数会去查找设备节点信息,该函数的传入参数就是 __irqchip_of_table 段,由于 IRQCHIP_DECLARE 已经将信息填充好了,of_irq_init 函数会根据 “arm,gic-v3” 去...
程序从GIC中读取寄存器知道发生了102号中断,通过GIC irq_domain可以知道virq为236 处理virq 236号中断:调用irq_desc[236].handle_irq,即handleA mask/ack中断: 调用irq_desc[236].irq_data->irq_chip的函数,即irq_dataB 它会调用父级irq_dataA->irq_chip的函数 ...
extern unsigned int irq_create_mapping(struct irq_domain *host, irq_hw_number_t hwirq); 驱动调用该函数的时候必须提供HW interrupt ID,也就是意味着driver知道自己使用的HW interrupt ID,而一般情况下,HW interrupt ID其实对具体的driver应该是不可见的,不过有些场景比较特殊,例如GPIO类型的中断,它的HW inte...