mips linux异常中断代码分析,Linux mips64r2 PCI中断路由机制分析(示例代码)

#define NR_IRQS 64

struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp ={

[0 ... NR_IRQS-1] ={

.status=IRQ_DISABLED,

.chip= &no_irq_chip,

.handle_irq=handle_bad_irq,

.depth= 1,

.lock = __SPIN_LOCK_UNLOCKED(irq_desc->lock),

}

};/**

* struct irq_desc - interrupt descriptor

* @irq: interrupt number for this descriptor

* @timer_rand_state: pointer to timer rand state struct

* @kstat_irqs: irq stats per cpu

* @irq_2_iommu: iommu with this irq

* @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()]

* @chip: low level interrupt hardware access

* @msi_desc: MSI descriptor

* @handler_data: per-IRQ data for the irq_chip methods

* @chip_data: platform-specific per-chip private data for the chip

* methods, to allow shared chip implementations

* @action: the irq action chain

* @status: status information

* @depth: disable-depth, for nested irq_disable() calls

* @wake_depth: enable depth, for multiple set_irq_wake() callers

* @irq_count: stats field to detect stalled irqs

* @last_unhandled: aging timer for unhandled count

* @irqs_unhandled: stats field for spurious unhandled interrupts

* @lock: locking for SMP

* @affinity: IRQ affinity on SMP

* @node: node index useful for balancing

* @pending_mask: pending rebalanced interrupts

* @threads_active: number of irqaction threads currently running

* @wait_for_threads: wait queue for sync_irq to wait for threaded handlers

* @dir: /proc/irq/ procfs entry

* @name: flow handler name for /proc/interrupts output*/

structirq_desc {

unsignedintirq;struct timer_rand_state *timer_rand_state;

unsignedint *kstat_irqs;

#ifdef CONFIG_INTR_REMAPstruct irq_2_iommu *irq_2_iommu;#endifirq_flow_handler_t handle_irq;struct irq_chip *chip;struct msi_desc *msi_desc;void *handler_data;void *chip_data;struct irqaction *action; /*IRQ action list*/unsignedint status; /*IRQ status*/unsignedint depth; /*nested irq disables*/unsignedint wake_depth; /*nested wake enables*/unsignedint irq_count; /*For detecting broken IRQs*/unsignedlong last_unhandled; /*Aging timer for unhandled count*/unsignedintirqs_unhandled;

spinlock_tlock;

#ifdef CONFIG_SMP

cpumask_var_t affinity;

unsignedintnode;

#ifdef CONFIG_GENERIC_PENDING_IRQ

cpumask_var_t pending_mask;#endif

#endifatomic_t threads_active;

#ifdef CONFIG_PREEMPT_HARDIRQS

unsignedlongforced_threads_active;#endifwait_queue_head_t wait_for_threads;

#ifdef CONFIG_PROC_FSstruct proc_dir_entry *dir;#endif

const char *name;

} ____cacheline_internodealigned_in_smp;structirq_chip {const char *name;

unsignedint (*startup)(unsigned intirq);void (*shutdown)(unsigned intirq);void (*enable)(unsigned intirq);void (*disable)(unsigned intirq);void (*ack)(unsigned intirq);void (*mask)(unsigned intirq);void (*mask_ack)(unsigned intirq);void (*unmask)(unsigned intirq);void (*eoi)(unsigned intirq);void (*end)(unsigned intirq);int (*set_affinity)(unsigned intirq,const struct cpumask *dest);int (*retrigger)(unsigned intirq);int (*set_type)(unsigned int irq, unsigned intflow_type);int (*set_wake)(unsigned int irq, unsigned inton);void (*bus_lock)(unsigned intirq);void (*bus_sync_unlock)(unsigned intirq);/*Currently used only by UML, might disappear one day.*/#ifdef CONFIG_IRQ_RELEASE_METHODvoid (*release)(unsigned int irq, void *dev_id);#endif

/** For compatibility, ->typename is copied into ->name.

* Will disappear.*/

const char *typename;

};static struct irq_chip nlm_common_pic ={.unmask=pic_unmask,

.mask=pic_shutdown,

.ack=pic_ack,

.end=pic_end,

.set_affinity=pic_set_affinity

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值