| .. | .. |
|---|
| 68 | 68 | unsigned int irqs_unhandled; |
|---|
| 69 | 69 | atomic_t threads_handled; |
|---|
| 70 | 70 | int threads_handled_last; |
|---|
| 71 | | - raw_spinlock_t lock; |
|---|
| 71 | + hybrid_spinlock_t lock; |
|---|
| 72 | 72 | struct cpumask *percpu_enabled; |
|---|
| 73 | 73 | const struct cpumask *percpu_affinity; |
|---|
| 74 | 74 | #ifdef CONFIG_SMP |
|---|
| .. | .. |
|---|
| 154 | 154 | |
|---|
| 155 | 155 | int generic_handle_irq(unsigned int irq); |
|---|
| 156 | 156 | |
|---|
| 157 | +void generic_pipeline_irq(unsigned int irq, struct pt_regs *regs); |
|---|
| 158 | + |
|---|
| 157 | 159 | #ifdef CONFIG_HANDLE_DOMAIN_IRQ |
|---|
| 158 | 160 | /* |
|---|
| 159 | 161 | * Convert a HW interrupt number to a logical one using a IRQ domain, |
|---|
| .. | .. |
|---|
| 164 | 166 | int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq, |
|---|
| 165 | 167 | bool lookup, struct pt_regs *regs); |
|---|
| 166 | 168 | |
|---|
| 169 | +#ifdef CONFIG_IRQ_PIPELINE |
|---|
| 170 | +unsigned int irq_find_mapping(struct irq_domain *host, |
|---|
| 171 | + irq_hw_number_t hwirq); |
|---|
| 172 | + |
|---|
| 173 | +static inline int handle_domain_irq(struct irq_domain *domain, |
|---|
| 174 | + unsigned int hwirq, struct pt_regs *regs) |
|---|
| 175 | +{ |
|---|
| 176 | + unsigned int irq = irq_find_mapping(domain, hwirq); |
|---|
| 177 | + |
|---|
| 178 | + generic_pipeline_irq(irq, regs); |
|---|
| 179 | + |
|---|
| 180 | + return 0; |
|---|
| 181 | +} |
|---|
| 182 | +#else |
|---|
| 167 | 183 | static inline int handle_domain_irq(struct irq_domain *domain, |
|---|
| 168 | 184 | unsigned int hwirq, struct pt_regs *regs) |
|---|
| 169 | 185 | { |
|---|
| 170 | 186 | return __handle_domain_irq(domain, hwirq, true, regs); |
|---|
| 171 | 187 | } |
|---|
| 188 | +#endif /* !CONFIG_IRQ_PIPELINE */ |
|---|
| 172 | 189 | |
|---|
| 173 | 190 | #ifdef CONFIG_IRQ_DOMAIN |
|---|
| 174 | 191 | int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq, |
|---|
| .. | .. |
|---|
| 252 | 269 | return desc->status_use_accessors & IRQ_PER_CPU_DEVID; |
|---|
| 253 | 270 | } |
|---|
| 254 | 271 | |
|---|
| 272 | +static inline int irq_is_oob(unsigned int irq) |
|---|
| 273 | +{ |
|---|
| 274 | + struct irq_desc *desc; |
|---|
| 275 | + |
|---|
| 276 | + desc = irq_to_desc(irq); |
|---|
| 277 | + return desc->status_use_accessors & IRQ_OOB; |
|---|
| 278 | +} |
|---|
| 279 | + |
|---|
| 255 | 280 | static inline void |
|---|
| 256 | 281 | irq_set_lockdep_class(unsigned int irq, struct lock_class_key *lock_class, |
|---|
| 257 | 282 | struct lock_class_key *request_class) |
|---|