diff options
Diffstat (limited to 'include/linux/irq.h')
| -rw-r--r-- | include/linux/irq.h | 69 |
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 | ||
| 133 | struct timer_rand_state; | ||
| 134 | struct 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 | */ |
| 155 | struct irq_desc { | 158 | struct 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 | ||
| 194 | extern void early_irq_init(void); | ||
| 195 | extern void arch_early_irq_init(void); | ||
| 196 | extern void arch_init_chip_data(struct irq_desc *desc, int cpu); | ||
| 197 | extern void arch_init_copy_chip_data(struct irq_desc *old_desc, | ||
| 198 | struct irq_desc *desc, int cpu); | ||
| 199 | extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc); | ||
| 184 | 200 | ||
| 201 | #ifndef CONFIG_SPARSE_IRQ | ||
| 185 | extern struct irq_desc irq_desc[NR_IRQS]; | 202 | extern struct irq_desc irq_desc[NR_IRQS]; |
| 186 | 203 | ||
| 187 | static inline struct irq_desc *irq_to_desc(unsigned int irq) | 204 | static 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 | } | ||
| 208 | static 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 | |||
| 215 | extern struct irq_desc *irq_to_desc(unsigned int irq); | ||
| 216 | extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu); | ||
| 217 | extern 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 | |||
| 231 | static inline struct irq_desc * | ||
| 232 | irq_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 | ||
| 213 | void set_pending_irq(unsigned int irq, cpumask_t mask); | ||
| 214 | void move_native_irq(int irq); | 262 | void move_native_irq(int irq); |
| 215 | void move_masked_irq(int irq); | 263 | void 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 | ||
| 231 | static 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 */ |
