.. | .. |
---|
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) |
---|