Linux IRQ Sub System III

IRQ number和中断描述符

综述

在这里插入图片描述
在linux kernel中,对于每一个外设的IRQ都用struct irq_desc来描述,我们称之中断描述符(struct irq_desc)。linux kernel中会有一个数据结构保存了关于所有IRQ的中断描述符信息,我们称之中断描述符DB。当发生中断后,首先获取触发中断的hwirq,然后通过irq domain翻译成virq,然后通过virq就可以获取对应的中断描述符(以virq为数组irq_desc[virq]的下标获取对应的irq_desc)。调用中断描述符中的handle_irq函数指针遍历irq_desc中链表action的handler来进行中断处理。

init irq_desc

mt6853_r_tee/kernel-4.14/init$ vim main.c +637
asmlinkage __visible void __init start_kernel(void)
	early_irq_init();
		/* Let arch update nr_irqs and return the nr of preallocated irqs */
		initcnt = arch_probe_nr_irqs();/* 预先分配中断数量 */
		for (i = 0; i < initcnt; i++) {
        	desc = alloc_desc(i, node, 0, NULL, NULL);/*分配中断描述符*/
        	set_bit(i, allocated_irqs);/*设定已经alloc的flag*/
        	irq_insert_desc(i, desc);/* 插入radix tree 中储存*/
    	}

Get irq number

如下流程所示:
在这里插入图片描述
具体流程如下;

irq_domain_translate(domain, fwspec, &hwirq, &type)/* 这里可以通过dt irq描述里面获取hwirq*/
	virq = irq_domain_alloc_descs(-1, 1, hwirq, of_node_to_nid(of_node), NULL);
		hint = hwirq % nr_irqs;
		virq = __irq_alloc_descs(-1, hint, cnt, node, THIS_MODULE,
			from = arch_dynirq_lower_bound(from);
				start=bitmap_find_next_zero_area(allocated_irqs,IRQ_BITMAP_BITS,/*virq*/
				bitmap_set(allocated_irqs, start, cnt);/* 占用位数组该位,表示irq已经使用*/
					/* 以下是通过 radix tree方式以virq为索引key,保存对应irq_desc的方式*/
					desc = alloc_desc(start + i, node, flags, mask, owner);
					irq_insert_desc(start + i, desc);

Get irq_desc

irq_to_desc(irq)
	return radix_tree_lookup(&irq_desc_tree, irq);

可见,这是通过 radix tree 的方式以virq为索引获取的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人在路上……

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值