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
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