aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/irq.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/irq.h')
-rw-r--r--include/linux/irq.h69
1 files changed, 59 insertions, 10 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h
index d058c57be02d..fde5e6132018 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -63,7 +63,8 @@ typedef void (*irq_flow_handler_t)(unsigned int irq,
63#define IRQ_MOVE_PENDING 0x00200000 /* need to re-target IRQ destination */ 63#define IRQ_MOVE_PENDING 0x00200000 /* need to re-target IRQ destination */
64#define IRQ_NO_BALANCING 0x00400000 /* IRQ is excluded from balancing */ 64#define IRQ_NO_BALANCING 0x00400000 /* IRQ is excluded from balancing */
65#define IRQ_SPURIOUS_DISABLED 0x00800000 /* IRQ was disabled by the spurious trap */ 65#define IRQ_SPURIOUS_DISABLED 0x00800000 /* IRQ was disabled by the spurious trap */
66#define IRQ_MOVE_PCNTXT 0x01000000 /* IRQ migration from process context */ 66#define IRQ_MOVE_PCNTXT 0x01000000 /* IRQ migration from process context */
67#define IRQ_AFFINITY_SET 0x02000000 /* IRQ affinity was set from userspace*/
67 68
68#ifdef CONFIG_IRQ_PER_CPU 69#ifdef CONFIG_IRQ_PER_CPU
69# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU) 70# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
@@ -112,7 +113,8 @@ struct irq_chip {
112 void (*eoi)(unsigned int irq); 113 void (*eoi)(unsigned int irq);
113 114
114 void (*end)(unsigned int irq); 115 void (*end)(unsigned int irq);
115 void (*set_affinity)(unsigned int irq, cpumask_t dest); 116 void (*set_affinity)(unsigned int irq,
117 const struct cpumask *dest);
116 int (*retrigger)(unsigned int irq); 118 int (*retrigger)(unsigned int irq);
117 int (*set_type)(unsigned int irq, unsigned int flow_type); 119 int (*set_type)(unsigned int irq, unsigned int flow_type);
118 int (*set_wake)(unsigned int irq, unsigned int on); 120 int (*set_wake)(unsigned int irq, unsigned int on);
@@ -128,9 +130,11 @@ struct irq_chip {
128 const char *typename; 130 const char *typename;
129}; 131};
130 132
133struct timer_rand_state;
134struct irq_2_iommu;
131/** 135/**
132 * struct irq_desc - interrupt descriptor 136 * struct irq_desc - interrupt descriptor
133 * 137 * @irq: interrupt number for this descriptor
134 * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] 138 * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()]
135 * @chip: low level interrupt hardware access 139 * @chip: low level interrupt hardware access
136 * @msi_desc: MSI descriptor 140 * @msi_desc: MSI descriptor
@@ -149,11 +153,17 @@ struct irq_chip {
149 * @cpu: cpu index useful for balancing 153 * @cpu: cpu index useful for balancing
150 * @pending_mask: pending rebalanced interrupts 154 * @pending_mask: pending rebalanced interrupts
151 * @dir: /proc/irq/ procfs entry 155 * @dir: /proc/irq/ procfs entry
152 * @affinity_entry: /proc/irq/smp_affinity procfs entry on SMP
153 * @name: flow handler name for /proc/interrupts output 156 * @name: flow handler name for /proc/interrupts output
154 */ 157 */
155struct irq_desc { 158struct irq_desc {
156 unsigned int irq; 159 unsigned int irq;
160#ifdef CONFIG_SPARSE_IRQ
161 struct timer_rand_state *timer_rand_state;
162 unsigned int *kstat_irqs;
163# ifdef CONFIG_INTR_REMAP
164 struct irq_2_iommu *irq_2_iommu;
165# endif
166#endif
157 irq_flow_handler_t handle_irq; 167 irq_flow_handler_t handle_irq;
158 struct irq_chip *chip; 168 struct irq_chip *chip;
159 struct msi_desc *msi_desc; 169 struct msi_desc *msi_desc;
@@ -181,12 +191,51 @@ struct irq_desc {
181 const char *name; 191 const char *name;
182} ____cacheline_internodealigned_in_smp; 192} ____cacheline_internodealigned_in_smp;
183 193
194extern void early_irq_init(void);
195extern void arch_early_irq_init(void);
196extern void arch_init_chip_data(struct irq_desc *desc, int cpu);
197extern void arch_init_copy_chip_data(struct irq_desc *old_desc,
198 struct irq_desc *desc, int cpu);
199extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc);
184 200
201#ifndef CONFIG_SPARSE_IRQ
185extern struct irq_desc irq_desc[NR_IRQS]; 202extern struct irq_desc irq_desc[NR_IRQS];
186 203
187static inline struct irq_desc *irq_to_desc(unsigned int irq) 204static inline struct irq_desc *irq_to_desc(unsigned int irq)
188{ 205{
189 return (irq < nr_irqs) ? irq_desc + irq : NULL; 206 return (irq < NR_IRQS) ? irq_desc + irq : NULL;
207}
208static inline struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
209{
210 return irq_to_desc(irq);
211}
212
213#else
214
215extern struct irq_desc *irq_to_desc(unsigned int irq);
216extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu);
217extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu);
218
219# define for_each_irq_desc(irq, desc) \
220 for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; irq++, desc = irq_to_desc(irq))
221# define for_each_irq_desc_reverse(irq, desc) \
222 for (irq = nr_irqs - 1, desc = irq_to_desc(irq); irq >= 0; irq--, desc = irq_to_desc(irq))
223
224#define kstat_irqs_this_cpu(DESC) \
225 ((DESC)->kstat_irqs[smp_processor_id()])
226#define kstat_incr_irqs_this_cpu(irqno, DESC) \
227 ((DESC)->kstat_irqs[smp_processor_id()]++)
228
229#endif
230
231static inline struct irq_desc *
232irq_remap_to_desc(unsigned int irq, struct irq_desc *desc)
233{
234#ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC
235 return irq_to_desc(irq);
236#else
237 return desc;
238#endif
190} 239}
191 240
192/* 241/*
@@ -210,7 +259,6 @@ extern int setup_irq(unsigned int irq, struct irqaction *new);
210 259
211#ifdef CONFIG_GENERIC_PENDING_IRQ 260#ifdef CONFIG_GENERIC_PENDING_IRQ
212 261
213void set_pending_irq(unsigned int irq, cpumask_t mask);
214void move_native_irq(int irq); 262void move_native_irq(int irq);
215void move_masked_irq(int irq); 263void move_masked_irq(int irq);
216 264
@@ -228,10 +276,6 @@ static inline void move_masked_irq(int irq)
228{ 276{
229} 277}
230 278
231static inline void set_pending_irq(unsigned int irq, cpumask_t mask)
232{
233}
234
235#endif /* CONFIG_GENERIC_PENDING_IRQ */ 279#endif /* CONFIG_GENERIC_PENDING_IRQ */
236 280
237#else /* CONFIG_SMP */ 281#else /* CONFIG_SMP */
@@ -385,6 +429,11 @@ extern int set_irq_msi(unsigned int irq, struct msi_desc *entry);
385#define get_irq_data(irq) (irq_to_desc(irq)->handler_data) 429#define get_irq_data(irq) (irq_to_desc(irq)->handler_data)
386#define get_irq_msi(irq) (irq_to_desc(irq)->msi_desc) 430#define get_irq_msi(irq) (irq_to_desc(irq)->msi_desc)
387 431
432#define get_irq_desc_chip(desc) ((desc)->chip)
433#define get_irq_desc_chip_data(desc) ((desc)->chip_data)
434#define get_irq_desc_data(desc) ((desc)->handler_data)
435#define get_irq_desc_msi(desc) ((desc)->msi_desc)
436
388#endif /* CONFIG_GENERIC_HARDIRQS */ 437#endif /* CONFIG_GENERIC_HARDIRQS */
389 438
390#endif /* !CONFIG_S390 */ 439#endif /* !CONFIG_S390 */