legacy 和 hierarchy 的 irq_domain irq_chip 的消费者使用流程

irq_chip 负责的事情,具体,消费者怎么用的?
	分别在2个阶段,有不同的消费者
		1.map阶段  : is_chained 情况下,irq在这里使能.否则在 request_irq  阶段使能
		2.用户驱动request_irq : 一般 irq 是在这里使能的 , 是不是可以通过 flag 来控制irq不使能 ?
		3.用户驱动显示调用其他api : 例如 disable_irq & enable_irq
		4.中断发生阶段: 被 高层次中断函数 调用

里面某些函数指针,是特定情况下用的,在这里我们只考虑一般需要实现的函数指针
例如 特殊情况 : MSI 相关的 : irq_compose_msi_msg/irq_write_msi_msg
hierarchy  和 legacy 是样的
irq_domain_ops 的不同主要是在 map 时 , 但是 irq_chip 在map时没有被调用
static struct irq_chip gic_chip = {  
    .name                   = "GICv3",   
    .irq_mask               = gic_mask_irq,  
    .irq_unmask             = gic_unmask_irq,
    .irq_eoi                = gic_eoi_irq,   
    .irq_set_type           = gic_set_type,  
    .irq_set_affinity       = gic_set_affinity,  
    .irq_retrigger          = gic_retrigger, 
    .irq_get_irqchip_state  = gic_irq_get_irqchip_state, 
    .irq_set_irqchip_state  = gic_irq_set_irqchip_state, 
    .irq_nmi_setup          = gic_irq_nmi_setup, 
    .irq_nmi_teardown       = gic_irq_nmi_teardown,  
    .ipi_send_mask          = gic_ipi_send_mask, 
    .flags                  = IRQCHIP_SET_TYPE_MASKED |  
                              IRQCHIP_SKIP_SET_WAKE   |
                              IRQCHIP_MASK_ON_SUSPEND,   
};
static struct irq_chip vic_chip = {
     .name          = "VIC",
     .irq_ack     	= vic_ack_irq,
     .irq_mask     	= vic_mask_irq,
     .irq_unmask    = vic_unmask_irq,
     .irq_set_wake  = vic_set_wake,
};

map时

alloc in domain_ops-> 
	irq_domain_set_info->
		__irq_set_handler->
			__irq_do_set_handler->
				if(is_chained)irq_activate_and_startup->irq_startup

request_irq时

request_threaded_irq
     __setup_irq
          __irq_set_trigger
               chip->irq_set_type(&desc->irq_data, flags);
          irq_startup
              irq_enable
                   unmask_irq
                        desc->irq_data.chip->irq_unmask
               irq_setup_affinity
                    irq_do_set_affinity
                         data->chip->irq_set_affinity
               check_irq_resend
                    try_retrigger
                         irq_chip_retrigger_hierarchy
                              data->chip->irq_retrigger
free_irq
	__free_irq
            

request_nmi
     irq_nmi_setup
          c->irq_nmi_setup
free_nmi
     irq_nmi_teardown
          c->irq_nmi_teardown

中断发生时

SPI handle_fasteoi_irq
    
handle_fasteoi_irq
    mask_irq->desc->irq_data.chip->irq_mask
        
    cond_unmask_eoi_irq
         chip->irq_eoi
         unmask_irq->desc->irq_data.chip->irq_unmask

handle_level_irq   // legacy
    mask_ack_irq
          desc->irq_data.chip->irq_mask
         desc->irq_data.chip->irq_ack
    cond_unmask_irq
         desc->irq_data.chip->irq_unmask

驱动场景

disable_irq
     __disable_irq_nosync
          __disable_irq
               irq_disable
                    __irq_disable
                         mask_irq
                              desc->irq_data.chip->irq_mask
enable_irq
     __enable_irq
         irq_startup
              irq_enable
                   unmask_irq
                        desc->irq_data.chip->irq_unmask
dev_pm_arm_wake_irq
     enable_irq_wake
          irq_set_irq_wake
               set_irq_wake_real
                    desc->irq_data.chip->irq_set_wake

TODO

irq_chip_set_type_parent
     data->chip->irq_set_type
disable_hardirq/disable_irq/free_irq
     synchronize_hardirq/synchronize_irq/__free_irq/
          __synchronize_hardirq
               __irq_get_irqchip_state
                    chip->irq_get_irqchip_state

irq_get_irqchip_state
     __irq_get_irqchip_state
          chip->irq_get_irqchip_state

irq_chip_get_parent_state
     chip->irq_get_irqchip_state
die
     crash_kexec
          __crash_kexec
               machine_crash_shutdown
                    machine_kexec_mask_interrupts
                         irq_set_irqchip_state
                              chip->irq_set_irqchip_state

ipi_send_single/ipi_send_mask
     __ipi_send_single/__ipi_send_mask
          chip->ipi_send_mask
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值