#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
};