diff options
Diffstat (limited to 'include/linux/irq.h')
| -rw-r--r-- | include/linux/irq.h | 54 | 
1 files changed, 53 insertions, 1 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index 3dddfa703eb..63b00439d4d 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -129,6 +129,8 @@ struct irq_chip {  	const char	*typename;  }; +struct timer_rand_state; +struct irq_2_iommu;  /**   * struct irq_desc - interrupt descriptor   * @irq:		interrupt number for this descriptor @@ -154,6 +156,13 @@ struct irq_chip {   */  struct irq_desc {  	unsigned int		irq; +#ifdef CONFIG_SPARSE_IRQ +	struct timer_rand_state *timer_rand_state; +	unsigned int            *kstat_irqs; +# ifdef CONFIG_INTR_REMAP +	struct irq_2_iommu      *irq_2_iommu; +# endif +#endif  	irq_flow_handler_t	handle_irq;  	struct irq_chip		*chip;  	struct msi_desc		*msi_desc; @@ -181,14 +190,52 @@ struct irq_desc {  	const char		*name;  } ____cacheline_internodealigned_in_smp; +extern void early_irq_init(void); +extern void arch_early_irq_init(void); +extern void arch_init_chip_data(struct irq_desc *desc, int cpu); +extern void arch_init_copy_chip_data(struct irq_desc *old_desc, +					struct irq_desc *desc, int cpu); +extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc); + +#ifndef CONFIG_SPARSE_IRQ  extern struct irq_desc irq_desc[NR_IRQS];  static inline struct irq_desc *irq_to_desc(unsigned int irq)  { -	return (irq < nr_irqs) ? irq_desc + irq : NULL; +	return (irq < NR_IRQS) ? irq_desc + irq : NULL; +} +static inline struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu) +{ +	return irq_to_desc(irq);  } +#ifdef CONFIG_GENERIC_HARDIRQS +# define for_each_irq_desc(irq, desc)		\ +	for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++) +# define for_each_irq_desc_reverse(irq, desc)                          \ +	for (irq = nr_irqs - 1, desc = irq_desc + (nr_irqs - 1);        \ +	    irq >= 0; irq--, desc--) +#endif + +#else + +extern struct irq_desc *irq_to_desc(unsigned int irq); +extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu); +extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu); + +# define for_each_irq_desc(irq, desc)		\ +	for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; irq++, desc = irq_to_desc(irq)) +# define for_each_irq_desc_reverse(irq, desc)                          \ +	for (irq = nr_irqs - 1, desc = irq_to_desc(irq); irq >= 0; irq--, desc = irq_to_desc(irq)) + +#define kstat_irqs_this_cpu(DESC) \ +	((DESC)->kstat_irqs[smp_processor_id()]) +#define kstat_incr_irqs_this_cpu(irqno, DESC) \ +	((DESC)->kstat_irqs[smp_processor_id()]++) + +#endif +  /*   * Migration helpers for obsolete names, they will go away:   */ @@ -380,6 +427,11 @@ extern int set_irq_msi(unsigned int irq, struct msi_desc *entry);  #define get_irq_data(irq)	(irq_to_desc(irq)->handler_data)  #define get_irq_msi(irq)	(irq_to_desc(irq)->msi_desc) +#define get_irq_desc_chip(desc)		((desc)->chip) +#define get_irq_desc_chip_data(desc)	((desc)->chip_data) +#define get_irq_desc_data(desc)		((desc)->handler_data) +#define get_irq_desc_msi(desc)		((desc)->msi_desc) +  #endif /* CONFIG_GENERIC_HARDIRQS */  #endif /* !CONFIG_S390 */  |