diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2015-06-20 13:14:31 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2015-06-20 13:14:31 -0400 |
| commit | f05218651be1ac6a6088e226bd7350fb6c154414 (patch) | |
| tree | 204ee38c859f08e7e76ea4b6913cdea52cb25d56 /include/linux | |
| parent | 62a993df31f795d87bcb4c6cb005d36f32f6ad55 (diff) | |
| parent | a614a610ac9b28f195d790d25be72d26f345c53a (diff) | |
Merge branch 'irq/for-x86' into irq/core
Get the infrastructure patches which are required for x86/apic into core
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/irq.h | 71 | ||||
| -rw-r--r-- | include/linux/irqdesc.h | 12 |
2 files changed, 60 insertions, 23 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index 42861d28fc2a..812149160d3b 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -126,13 +126,21 @@ struct msi_desc; | |||
| 126 | struct irq_domain; | 126 | struct irq_domain; |
| 127 | 127 | ||
| 128 | /** | 128 | /** |
| 129 | * struct irq_data - per irq and irq chip data passed down to chip functions | 129 | * struct irq_common_data - per irq data shared by all irqchips |
| 130 | * @state_use_accessors: status information for irq chip functions. | ||
| 131 | * Use accessor functions to deal with it | ||
| 132 | */ | ||
| 133 | struct irq_common_data { | ||
| 134 | unsigned int state_use_accessors; | ||
| 135 | }; | ||
| 136 | |||
| 137 | /** | ||
| 138 | * struct irq_data - per irq chip data passed down to chip functions | ||
| 130 | * @mask: precomputed bitmask for accessing the chip registers | 139 | * @mask: precomputed bitmask for accessing the chip registers |
| 131 | * @irq: interrupt number | 140 | * @irq: interrupt number |
| 132 | * @hwirq: hardware interrupt number, local to the interrupt domain | 141 | * @hwirq: hardware interrupt number, local to the interrupt domain |
| 133 | * @node: node index useful for balancing | 142 | * @node: node index useful for balancing |
| 134 | * @state_use_accessors: status information for irq chip functions. | 143 | * @common: point to data shared by all irqchips |
| 135 | * Use accessor functions to deal with it | ||
| 136 | * @chip: low level interrupt hardware access | 144 | * @chip: low level interrupt hardware access |
| 137 | * @domain: Interrupt translation domain; responsible for mapping | 145 | * @domain: Interrupt translation domain; responsible for mapping |
| 138 | * between hwirq number and linux irq number. | 146 | * between hwirq number and linux irq number. |
| @@ -153,7 +161,7 @@ struct irq_data { | |||
| 153 | unsigned int irq; | 161 | unsigned int irq; |
| 154 | unsigned long hwirq; | 162 | unsigned long hwirq; |
| 155 | unsigned int node; | 163 | unsigned int node; |
| 156 | unsigned int state_use_accessors; | 164 | struct irq_common_data *common; |
| 157 | struct irq_chip *chip; | 165 | struct irq_chip *chip; |
| 158 | struct irq_domain *domain; | 166 | struct irq_domain *domain; |
| 159 | #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY | 167 | #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY |
| @@ -166,7 +174,7 @@ struct irq_data { | |||
| 166 | }; | 174 | }; |
| 167 | 175 | ||
| 168 | /* | 176 | /* |
| 169 | * Bit masks for irq_data.state | 177 | * Bit masks for irq_common_data.state_use_accessors |
| 170 | * | 178 | * |
| 171 | * IRQD_TRIGGER_MASK - Mask for the trigger type bits | 179 | * IRQD_TRIGGER_MASK - Mask for the trigger type bits |
| 172 | * IRQD_SETAFFINITY_PENDING - Affinity setting is pending | 180 | * IRQD_SETAFFINITY_PENDING - Affinity setting is pending |
| @@ -198,34 +206,36 @@ enum { | |||
| 198 | IRQD_WAKEUP_ARMED = (1 << 19), | 206 | IRQD_WAKEUP_ARMED = (1 << 19), |
| 199 | }; | 207 | }; |
| 200 | 208 | ||
| 209 | #define __irqd_to_state(d) ((d)->common->state_use_accessors) | ||
| 210 | |||
| 201 | static inline bool irqd_is_setaffinity_pending(struct irq_data *d) | 211 | static inline bool irqd_is_setaffinity_pending(struct irq_data *d) |
| 202 | { | 212 | { |
| 203 | return d->state_use_accessors & IRQD_SETAFFINITY_PENDING; | 213 | return __irqd_to_state(d) & IRQD_SETAFFINITY_PENDING; |
| 204 | } | 214 | } |
| 205 | 215 | ||
| 206 | static inline bool irqd_is_per_cpu(struct irq_data *d) | 216 | static inline bool irqd_is_per_cpu(struct irq_data *d) |
| 207 | { | 217 | { |
| 208 | return d->state_use_accessors & IRQD_PER_CPU; | 218 | return __irqd_to_state(d) & IRQD_PER_CPU; |
| 209 | } | 219 | } |
| 210 | 220 | ||
| 211 | static inline bool irqd_can_balance(struct irq_data *d) | 221 | static inline bool irqd_can_balance(struct irq_data *d) |
| 212 | { | 222 | { |
| 213 | return !(d->state_use_accessors & (IRQD_PER_CPU | IRQD_NO_BALANCING)); | 223 | return !(__irqd_to_state(d) & (IRQD_PER_CPU | IRQD_NO_BALANCING)); |
| 214 | } | 224 | } |
| 215 | 225 | ||
| 216 | static inline bool irqd_affinity_was_set(struct irq_data *d) | 226 | static inline bool irqd_affinity_was_set(struct irq_data *d) |
| 217 | { | 227 | { |
| 218 | return d->state_use_accessors & IRQD_AFFINITY_SET; | 228 | return __irqd_to_state(d) & IRQD_AFFINITY_SET; |
| 219 | } | 229 | } |
| 220 | 230 | ||
| 221 | static inline void irqd_mark_affinity_was_set(struct irq_data *d) | 231 | static inline void irqd_mark_affinity_was_set(struct irq_data *d) |
| 222 | { | 232 | { |
| 223 | d->state_use_accessors |= IRQD_AFFINITY_SET; | 233 | __irqd_to_state(d) |= IRQD_AFFINITY_SET; |
| 224 | } | 234 | } |
| 225 | 235 | ||
| 226 | static inline u32 irqd_get_trigger_type(struct irq_data *d) | 236 | static inline u32 irqd_get_trigger_type(struct irq_data *d) |
| 227 | { | 237 | { |
| 228 | return d->state_use_accessors & IRQD_TRIGGER_MASK; | 238 | return __irqd_to_state(d) & IRQD_TRIGGER_MASK; |
| 229 | } | 239 | } |
| 230 | 240 | ||
| 231 | /* | 241 | /* |
| @@ -233,43 +243,43 @@ static inline u32 irqd_get_trigger_type(struct irq_data *d) | |||
| 233 | */ | 243 | */ |
| 234 | static inline void irqd_set_trigger_type(struct irq_data *d, u32 type) | 244 | static inline void irqd_set_trigger_type(struct irq_data *d, u32 type) |
| 235 | { | 245 | { |
| 236 | d->state_use_accessors &= ~IRQD_TRIGGER_MASK; | 246 | __irqd_to_state(d) &= ~IRQD_TRIGGER_MASK; |
| 237 | d->state_use_accessors |= type & IRQD_TRIGGER_MASK; | 247 | __irqd_to_state(d) |= type & IRQD_TRIGGER_MASK; |
| 238 | } | 248 | } |
| 239 | 249 | ||
| 240 | static inline bool irqd_is_level_type(struct irq_data *d) | 250 | static inline bool irqd_is_level_type(struct irq_data *d) |
| 241 | { | 251 | { |
| 242 | return d->state_use_accessors & IRQD_LEVEL; | 252 | return __irqd_to_state(d) & IRQD_LEVEL; |
| 243 | } | 253 | } |
| 244 | 254 | ||
| 245 | static inline bool irqd_is_wakeup_set(struct irq_data *d) | 255 | static inline bool irqd_is_wakeup_set(struct irq_data *d) |
| 246 | { | 256 | { |
| 247 | return d->state_use_accessors & IRQD_WAKEUP_STATE; | 257 | return __irqd_to_state(d) & IRQD_WAKEUP_STATE; |
| 248 | } | 258 | } |
| 249 | 259 | ||
| 250 | static inline bool irqd_can_move_in_process_context(struct irq_data *d) | 260 | static inline bool irqd_can_move_in_process_context(struct irq_data *d) |
| 251 | { | 261 | { |
| 252 | return d->state_use_accessors & IRQD_MOVE_PCNTXT; | 262 | return __irqd_to_state(d) & IRQD_MOVE_PCNTXT; |
| 253 | } | 263 | } |
| 254 | 264 | ||
| 255 | static inline bool irqd_irq_disabled(struct irq_data *d) | 265 | static inline bool irqd_irq_disabled(struct irq_data *d) |
| 256 | { | 266 | { |
| 257 | return d->state_use_accessors & IRQD_IRQ_DISABLED; | 267 | return __irqd_to_state(d) & IRQD_IRQ_DISABLED; |
| 258 | } | 268 | } |
| 259 | 269 | ||
| 260 | static inline bool irqd_irq_masked(struct irq_data *d) | 270 | static inline bool irqd_irq_masked(struct irq_data *d) |
| 261 | { | 271 | { |
| 262 | return d->state_use_accessors & IRQD_IRQ_MASKED; | 272 | return __irqd_to_state(d) & IRQD_IRQ_MASKED; |
| 263 | } | 273 | } |
| 264 | 274 | ||
| 265 | static inline bool irqd_irq_inprogress(struct irq_data *d) | 275 | static inline bool irqd_irq_inprogress(struct irq_data *d) |
| 266 | { | 276 | { |
| 267 | return d->state_use_accessors & IRQD_IRQ_INPROGRESS; | 277 | return __irqd_to_state(d) & IRQD_IRQ_INPROGRESS; |
| 268 | } | 278 | } |
| 269 | 279 | ||
| 270 | static inline bool irqd_is_wakeup_armed(struct irq_data *d) | 280 | static inline bool irqd_is_wakeup_armed(struct irq_data *d) |
| 271 | { | 281 | { |
| 272 | return d->state_use_accessors & IRQD_WAKEUP_ARMED; | 282 | return __irqd_to_state(d) & IRQD_WAKEUP_ARMED; |
| 273 | } | 283 | } |
| 274 | 284 | ||
| 275 | 285 | ||
| @@ -280,12 +290,12 @@ static inline bool irqd_is_wakeup_armed(struct irq_data *d) | |||
| 280 | */ | 290 | */ |
| 281 | static inline void irqd_set_chained_irq_inprogress(struct irq_data *d) | 291 | static inline void irqd_set_chained_irq_inprogress(struct irq_data *d) |
| 282 | { | 292 | { |
| 283 | d->state_use_accessors |= IRQD_IRQ_INPROGRESS; | 293 | __irqd_to_state(d) |= IRQD_IRQ_INPROGRESS; |
| 284 | } | 294 | } |
| 285 | 295 | ||
| 286 | static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d) | 296 | static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d) |
| 287 | { | 297 | { |
| 288 | d->state_use_accessors &= ~IRQD_IRQ_INPROGRESS; | 298 | __irqd_to_state(d) &= ~IRQD_IRQ_INPROGRESS; |
| 289 | } | 299 | } |
| 290 | 300 | ||
| 291 | static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) | 301 | static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) |
| @@ -641,6 +651,23 @@ static inline u32 irq_get_trigger_type(unsigned int irq) | |||
| 641 | return d ? irqd_get_trigger_type(d) : 0; | 651 | return d ? irqd_get_trigger_type(d) : 0; |
| 642 | } | 652 | } |
| 643 | 653 | ||
| 654 | static inline int irq_data_get_node(struct irq_data *d) | ||
| 655 | { | ||
| 656 | return d->node; | ||
| 657 | } | ||
| 658 | |||
| 659 | static inline struct cpumask *irq_get_affinity_mask(int irq) | ||
| 660 | { | ||
| 661 | struct irq_data *d = irq_get_irq_data(irq); | ||
| 662 | |||
| 663 | return d ? d->affinity : NULL; | ||
| 664 | } | ||
| 665 | |||
| 666 | static inline struct cpumask *irq_data_get_affinity_mask(struct irq_data *d) | ||
| 667 | { | ||
| 668 | return d->affinity; | ||
| 669 | } | ||
| 670 | |||
| 644 | unsigned int arch_dynirq_lower_bound(unsigned int from); | 671 | unsigned int arch_dynirq_lower_bound(unsigned int from); |
| 645 | 672 | ||
| 646 | int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node, | 673 | int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node, |
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h index dd1109fb241e..c52d1480f272 100644 --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h | |||
| @@ -17,7 +17,7 @@ struct pt_regs; | |||
| 17 | 17 | ||
| 18 | /** | 18 | /** |
| 19 | * struct irq_desc - interrupt descriptor | 19 | * struct irq_desc - interrupt descriptor |
| 20 | * @irq_data: per irq and chip data passed down to chip functions | 20 | * @irq_common_data: per irq and chip data passed down to chip functions |
| 21 | * @kstat_irqs: irq stats per cpu | 21 | * @kstat_irqs: irq stats per cpu |
| 22 | * @handle_irq: highlevel irq-events handler | 22 | * @handle_irq: highlevel irq-events handler |
| 23 | * @preflow_handler: handler called before the flow handler (currently used by sparc) | 23 | * @preflow_handler: handler called before the flow handler (currently used by sparc) |
| @@ -47,6 +47,7 @@ struct pt_regs; | |||
| 47 | * @name: flow handler name for /proc/interrupts output | 47 | * @name: flow handler name for /proc/interrupts output |
| 48 | */ | 48 | */ |
| 49 | struct irq_desc { | 49 | struct irq_desc { |
| 50 | struct irq_common_data irq_common_data; | ||
| 50 | struct irq_data irq_data; | 51 | struct irq_data irq_data; |
| 51 | unsigned int __percpu *kstat_irqs; | 52 | unsigned int __percpu *kstat_irqs; |
| 52 | irq_flow_handler_t handle_irq; | 53 | irq_flow_handler_t handle_irq; |
| @@ -93,6 +94,15 @@ struct irq_desc { | |||
| 93 | extern struct irq_desc irq_desc[NR_IRQS]; | 94 | extern struct irq_desc irq_desc[NR_IRQS]; |
| 94 | #endif | 95 | #endif |
| 95 | 96 | ||
| 97 | static inline struct irq_desc *irq_data_to_desc(struct irq_data *data) | ||
| 98 | { | ||
| 99 | #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY | ||
| 100 | return irq_to_desc(data->irq); | ||
| 101 | #else | ||
| 102 | return container_of(data, struct irq_desc, irq_data); | ||
| 103 | #endif | ||
| 104 | } | ||
| 105 | |||
| 96 | static inline struct irq_data *irq_desc_get_irq_data(struct irq_desc *desc) | 106 | static inline struct irq_data *irq_desc_get_irq_data(struct irq_desc *desc) |
| 97 | { | 107 | { |
| 98 | return &desc->irq_data; | 108 | return &desc->irq_data; |
