intirq_domain_alloc_descs(intvirq,unsignedintcnt,irq_hw_number_thwirq,intnode,conststructirq_affinity_desc *affinity){unsignedinthint;if(virq >=0) {virq = __irq_alloc_descs(virq, virq, cnt, node, THIS_MODULE,affinity);}else{hint = hwirq % nr_irqs;if(hint ==0)hint++;virq =...
virq= __irq_alloc_descs(-1,1, cnt, node, THIS_MODULE,affinity); } }returnvirq; } 通过上述的函数分配virq,也就是softirq,分配一个Irq_data结构,然后将virq设置到irq_data结构中 staticstructirq_data *irq_domain_insert_irq_data(structirq_domain *domain,structirq_data *child) {structirq_dat...
intirq_domain_alloc_descs(int virq,unsigned int cnt,irq_hw_number_t hwirq,int node,conststruct cpumask*affinity){unsigned int hint;if(virq>=0){virq=__irq_alloc_descs(virq,virq,cnt,node,THIS_MODULE,affinity);}else{hint=hwirq%nr_irqs;if(hint==0)hint++;virq=__irq_alloc_descs(...
首先从PCI-MSI这个角度来分析,查阅Linux的相关文档,MSI需要分配vector,而这个vector相当于GICv3里面的SPI INTID,而这个分配工作应该是由MSI的irq_domain来负责,那么在目前的ARM平台当中,已知的MSI相关的IRQ domain如下, static const struct irq_domain_ops gicv2m_domain_ops = { .alloc = gicv2m_irq_domain_a...
irq_domain_alloc_descs 分配一个虚拟的中断号 virq,分配和初始化中断描述符irq_desc gic_irq_domain_alloc 为 hwirq 和 virq 创建映射关系。内部会通过 irq_domain_set_info 调用 irq_domain_set_hwirq_and_chip,然后通过 virq 获取irq_data结构体,并将 hwirq 设置到 irq_data->hwirq 中, 最终完成 ...
层次结构:具体是irq_domain_alloc_irq_data函数建立: 系统创建的irq_domain:总共4个。通过parent成员组成 层次结构。根为ffff8020c0030400。 [ 0.000000] ===__irq_domain_add domain ffff8020c0030400 name irqchip@(___ptrval___) === irq-gic-v3.c [ 0.000000] ===__irq_domain_add domain ffff8020...
当发生中断后,首先获取触发中断的HW interupt ID,然后通过irq domain翻译成IRQ nuber,然后通过IRQ number就可以获取对应的中断描述符。调用中断描述符中的highlevel irq-events handler来进行中断处理就OK了。而highlevel irq-events handler主要进行下面两个操作:...
irq_base = irq_alloc_descs(irq_start, 16, gic_irqs, numa_node_id()); if (IS_ERR_VALUE(irq_base)) { WARN(1, "Cannot allocate irq_descs @ IRQ%d, assuming pre-allocated\n", irq_start); irq_base = irq_start; } gic->domain = irq_domain_add_legacy(node, gic_irqs, irq_base...
chip->irq_base=irq_alloc_descs(-1,irq_base,chip->gpio_chip.ngpio,-1); 556- if(chip->irq_base<0) 557- gotoout_failed; 558- 559- chip->domain=irq_domain_add_legacy(client->dev.of_node, 574+ chip->domain=irq_domain_add_simple(client->dev.of_node, ...
struct irq_chip_generic *irq_get_domain_generic_chip(struct irq_domain *d, unsigned int hw_irq); int __irq_alloc_domain_generic_chips(struct irq_domain *d, int irqs_per_chip, int num_ct, const char *name, irq_flow_handler_t handler, ...