irq domain 分析 sifive-plic

设备树描述

plic 是一个简单的中断控制器,且该计算机系统中只有一个,所以 CONFIG_IRQ_DOMAIN_HIERARCHY=n

		interrupt-controller@e4000000 {
			compatible = "riscv,plic0";
			#address-cells = <0x2>;
			#interrupt-cells = <0x2>;
			interrupt-controller;
			reg = <0x0 0xe4000000 0x0 0x2000000>;
			riscv,ndev = <0x47>;
			interrupts-extended = <0x2 0xb 0x2 0x9 0x3 0xb 0x3 0x9 0x4 0xb 0x4 0x9 0x5 0xb 0x5 0x9>;
			phandle = <0x6>;
		};

驱动逻辑

plic_init
	plic_regs = of_iomap(node, 0); // 获取  0xe4000000 对应的虚拟地址
	of_property_read_u32(node, "riscv,ndev", &nr_irqs);  // 填充 0x47 到 nr_irqs
	nr_contexts = of_irq_count(node); // 应该获取到 interrupts-extended  的 数量 , 应该是 16 , 填充到 nr_contexts

	plic_irqdomain = irq_domain_add_linear(node, nr_irqs + 1, &plic_irqdomain_ops, NULL);

	for (i = 0; i < nr_contexts; i++) {} // 处理 核间中断 ?

	set_handle_irq(plic_handle_irq);
		// 将 handle_arch_irq 设置为 handle_irq

irq_domain_ops 的创建时机

	plic_irqdomain = irq_domain_add_linear(node, nr_irqs + 1, &plic_irqdomain_ops, NULL);

irq_domain_ops 的实现

static const struct irq_domain_ops plic_irqdomain_ops = {                           
    .map        = plic_irqdomain_map,                                               
    .xlate      = irq_domain_xlate_onecell,                                         
}; 

irq_chip 的绑定时机 在 map 实现中

下面代码中的 desc->irq_data.chip = chip; 
plic_irqdomain_map
	irq_set_chip_and_handler/irq_set_chip_and_handler_name
		irq_set_chip
			desc->irq_data.chip = chip; // plic_chip
		__irq_set_handler

irq_chip 的实现

static struct irq_chip plic_chip = {                                             
    .name       = "SiFive PLIC",                                                    
    .irq_mask   = plic_irq_mask,                                                    
    .irq_unmask = plic_irq_unmask,                                                  
    .irq_eoi    = plic_irq_eoi,                                                     
    .irq_set_wake = plic_set_wake,                                                  
#ifdef CONFIG_SMP                                                                   
    .irq_set_affinity = plic_set_affinity,                                          
#endif                                                                              
}; 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值