diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/interrupt.h | 51 | ||||
| -rw-r--r-- | include/linux/irq.h | 10 | ||||
| -rw-r--r-- | include/linux/irqdesc.h | 7 | ||||
| -rw-r--r-- | include/linux/irqdomain.h | 1 | ||||
| -rw-r--r-- | include/linux/kthread.h | 1 | ||||
| -rw-r--r-- | include/linux/pci.h | 4 |
6 files changed, 61 insertions, 13 deletions
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 4a728dba02e2..690b238a44d5 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
| @@ -156,6 +156,10 @@ __request_percpu_irq(unsigned int irq, irq_handler_t handler, | |||
| 156 | unsigned long flags, const char *devname, | 156 | unsigned long flags, const char *devname, |
| 157 | void __percpu *percpu_dev_id); | 157 | void __percpu *percpu_dev_id); |
| 158 | 158 | ||
| 159 | extern int __must_check | ||
| 160 | request_nmi(unsigned int irq, irq_handler_t handler, unsigned long flags, | ||
| 161 | const char *name, void *dev); | ||
| 162 | |||
| 159 | static inline int __must_check | 163 | static inline int __must_check |
| 160 | request_percpu_irq(unsigned int irq, irq_handler_t handler, | 164 | request_percpu_irq(unsigned int irq, irq_handler_t handler, |
| 161 | const char *devname, void __percpu *percpu_dev_id) | 165 | const char *devname, void __percpu *percpu_dev_id) |
| @@ -164,9 +168,16 @@ request_percpu_irq(unsigned int irq, irq_handler_t handler, | |||
| 164 | devname, percpu_dev_id); | 168 | devname, percpu_dev_id); |
| 165 | } | 169 | } |
| 166 | 170 | ||
| 171 | extern int __must_check | ||
| 172 | request_percpu_nmi(unsigned int irq, irq_handler_t handler, | ||
| 173 | const char *devname, void __percpu *dev); | ||
| 174 | |||
| 167 | extern const void *free_irq(unsigned int, void *); | 175 | extern const void *free_irq(unsigned int, void *); |
| 168 | extern void free_percpu_irq(unsigned int, void __percpu *); | 176 | extern void free_percpu_irq(unsigned int, void __percpu *); |
| 169 | 177 | ||
| 178 | extern const void *free_nmi(unsigned int irq, void *dev_id); | ||
| 179 | extern void free_percpu_nmi(unsigned int irq, void __percpu *percpu_dev_id); | ||
| 180 | |||
| 170 | struct device; | 181 | struct device; |
| 171 | 182 | ||
| 172 | extern int __must_check | 183 | extern int __must_check |
| @@ -217,6 +228,13 @@ extern void enable_percpu_irq(unsigned int irq, unsigned int type); | |||
| 217 | extern bool irq_percpu_is_enabled(unsigned int irq); | 228 | extern bool irq_percpu_is_enabled(unsigned int irq); |
| 218 | extern void irq_wake_thread(unsigned int irq, void *dev_id); | 229 | extern void irq_wake_thread(unsigned int irq, void *dev_id); |
| 219 | 230 | ||
| 231 | extern void disable_nmi_nosync(unsigned int irq); | ||
| 232 | extern void disable_percpu_nmi(unsigned int irq); | ||
| 233 | extern void enable_nmi(unsigned int irq); | ||
| 234 | extern void enable_percpu_nmi(unsigned int irq, unsigned int type); | ||
| 235 | extern int prepare_percpu_nmi(unsigned int irq); | ||
| 236 | extern void teardown_percpu_nmi(unsigned int irq); | ||
| 237 | |||
| 220 | /* The following three functions are for the core kernel use only. */ | 238 | /* The following three functions are for the core kernel use only. */ |
| 221 | extern void suspend_device_irqs(void); | 239 | extern void suspend_device_irqs(void); |
| 222 | extern void resume_device_irqs(void); | 240 | extern void resume_device_irqs(void); |
| @@ -241,20 +259,29 @@ struct irq_affinity_notify { | |||
| 241 | void (*release)(struct kref *ref); | 259 | void (*release)(struct kref *ref); |
| 242 | }; | 260 | }; |
| 243 | 261 | ||
| 262 | #define IRQ_AFFINITY_MAX_SETS 4 | ||
| 263 | |||
| 244 | /** | 264 | /** |
| 245 | * struct irq_affinity - Description for automatic irq affinity assignements | 265 | * struct irq_affinity - Description for automatic irq affinity assignements |
| 246 | * @pre_vectors: Don't apply affinity to @pre_vectors at beginning of | 266 | * @pre_vectors: Don't apply affinity to @pre_vectors at beginning of |
| 247 | * the MSI(-X) vector space | 267 | * the MSI(-X) vector space |
| 248 | * @post_vectors: Don't apply affinity to @post_vectors at end of | 268 | * @post_vectors: Don't apply affinity to @post_vectors at end of |
| 249 | * the MSI(-X) vector space | 269 | * the MSI(-X) vector space |
| 250 | * @nr_sets: Length of passed in *sets array | 270 | * @nr_sets: The number of interrupt sets for which affinity |
| 251 | * @sets: Number of affinitized sets | 271 | * spreading is required |
| 272 | * @set_size: Array holding the size of each interrupt set | ||
| 273 | * @calc_sets: Callback for calculating the number and size | ||
| 274 | * of interrupt sets | ||
| 275 | * @priv: Private data for usage by @calc_sets, usually a | ||
| 276 | * pointer to driver/device specific data. | ||
| 252 | */ | 277 | */ |
| 253 | struct irq_affinity { | 278 | struct irq_affinity { |
| 254 | int pre_vectors; | 279 | unsigned int pre_vectors; |
| 255 | int post_vectors; | 280 | unsigned int post_vectors; |
| 256 | int nr_sets; | 281 | unsigned int nr_sets; |
| 257 | int *sets; | 282 | unsigned int set_size[IRQ_AFFINITY_MAX_SETS]; |
| 283 | void (*calc_sets)(struct irq_affinity *, unsigned int nvecs); | ||
| 284 | void *priv; | ||
| 258 | }; | 285 | }; |
| 259 | 286 | ||
| 260 | /** | 287 | /** |
| @@ -314,9 +341,10 @@ extern int | |||
| 314 | irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify); | 341 | irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify); |
| 315 | 342 | ||
| 316 | struct irq_affinity_desc * | 343 | struct irq_affinity_desc * |
| 317 | irq_create_affinity_masks(int nvec, const struct irq_affinity *affd); | 344 | irq_create_affinity_masks(unsigned int nvec, struct irq_affinity *affd); |
| 318 | 345 | ||
| 319 | int irq_calc_affinity_vectors(int minvec, int maxvec, const struct irq_affinity *affd); | 346 | unsigned int irq_calc_affinity_vectors(unsigned int minvec, unsigned int maxvec, |
| 347 | const struct irq_affinity *affd); | ||
| 320 | 348 | ||
| 321 | #else /* CONFIG_SMP */ | 349 | #else /* CONFIG_SMP */ |
| 322 | 350 | ||
| @@ -350,13 +378,14 @@ irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify) | |||
| 350 | } | 378 | } |
| 351 | 379 | ||
| 352 | static inline struct irq_affinity_desc * | 380 | static inline struct irq_affinity_desc * |
| 353 | irq_create_affinity_masks(int nvec, const struct irq_affinity *affd) | 381 | irq_create_affinity_masks(unsigned int nvec, struct irq_affinity *affd) |
| 354 | { | 382 | { |
| 355 | return NULL; | 383 | return NULL; |
| 356 | } | 384 | } |
| 357 | 385 | ||
| 358 | static inline int | 386 | static inline unsigned int |
| 359 | irq_calc_affinity_vectors(int minvec, int maxvec, const struct irq_affinity *affd) | 387 | irq_calc_affinity_vectors(unsigned int minvec, unsigned int maxvec, |
| 388 | const struct irq_affinity *affd) | ||
| 360 | { | 389 | { |
| 361 | return maxvec; | 390 | return maxvec; |
| 362 | } | 391 | } |
diff --git a/include/linux/irq.h b/include/linux/irq.h index def2b2aac8b1..5e91f6bcaacd 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -442,6 +442,8 @@ static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) | |||
| 442 | * @irq_set_vcpu_affinity: optional to target a vCPU in a virtual machine | 442 | * @irq_set_vcpu_affinity: optional to target a vCPU in a virtual machine |
| 443 | * @ipi_send_single: send a single IPI to destination cpus | 443 | * @ipi_send_single: send a single IPI to destination cpus |
| 444 | * @ipi_send_mask: send an IPI to destination cpus in cpumask | 444 | * @ipi_send_mask: send an IPI to destination cpus in cpumask |
| 445 | * @irq_nmi_setup: function called from core code before enabling an NMI | ||
| 446 | * @irq_nmi_teardown: function called from core code after disabling an NMI | ||
| 445 | * @flags: chip specific flags | 447 | * @flags: chip specific flags |
| 446 | */ | 448 | */ |
| 447 | struct irq_chip { | 449 | struct irq_chip { |
| @@ -490,6 +492,9 @@ struct irq_chip { | |||
| 490 | void (*ipi_send_single)(struct irq_data *data, unsigned int cpu); | 492 | void (*ipi_send_single)(struct irq_data *data, unsigned int cpu); |
| 491 | void (*ipi_send_mask)(struct irq_data *data, const struct cpumask *dest); | 493 | void (*ipi_send_mask)(struct irq_data *data, const struct cpumask *dest); |
| 492 | 494 | ||
| 495 | int (*irq_nmi_setup)(struct irq_data *data); | ||
| 496 | void (*irq_nmi_teardown)(struct irq_data *data); | ||
| 497 | |||
| 493 | unsigned long flags; | 498 | unsigned long flags; |
| 494 | }; | 499 | }; |
| 495 | 500 | ||
| @@ -505,6 +510,7 @@ struct irq_chip { | |||
| 505 | * IRQCHIP_ONESHOT_SAFE: One shot does not require mask/unmask | 510 | * IRQCHIP_ONESHOT_SAFE: One shot does not require mask/unmask |
| 506 | * IRQCHIP_EOI_THREADED: Chip requires eoi() on unmask in threaded mode | 511 | * IRQCHIP_EOI_THREADED: Chip requires eoi() on unmask in threaded mode |
| 507 | * IRQCHIP_SUPPORTS_LEVEL_MSI Chip can provide two doorbells for Level MSIs | 512 | * IRQCHIP_SUPPORTS_LEVEL_MSI Chip can provide two doorbells for Level MSIs |
| 513 | * IRQCHIP_SUPPORTS_NMI: Chip can deliver NMIs, only for root irqchips | ||
| 508 | */ | 514 | */ |
| 509 | enum { | 515 | enum { |
| 510 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), | 516 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), |
| @@ -515,6 +521,7 @@ enum { | |||
| 515 | IRQCHIP_ONESHOT_SAFE = (1 << 5), | 521 | IRQCHIP_ONESHOT_SAFE = (1 << 5), |
| 516 | IRQCHIP_EOI_THREADED = (1 << 6), | 522 | IRQCHIP_EOI_THREADED = (1 << 6), |
| 517 | IRQCHIP_SUPPORTS_LEVEL_MSI = (1 << 7), | 523 | IRQCHIP_SUPPORTS_LEVEL_MSI = (1 << 7), |
| 524 | IRQCHIP_SUPPORTS_NMI = (1 << 8), | ||
| 518 | }; | 525 | }; |
| 519 | 526 | ||
| 520 | #include <linux/irqdesc.h> | 527 | #include <linux/irqdesc.h> |
| @@ -594,6 +601,9 @@ extern void handle_percpu_devid_irq(struct irq_desc *desc); | |||
| 594 | extern void handle_bad_irq(struct irq_desc *desc); | 601 | extern void handle_bad_irq(struct irq_desc *desc); |
| 595 | extern void handle_nested_irq(unsigned int irq); | 602 | extern void handle_nested_irq(unsigned int irq); |
| 596 | 603 | ||
| 604 | extern void handle_fasteoi_nmi(struct irq_desc *desc); | ||
| 605 | extern void handle_percpu_devid_fasteoi_nmi(struct irq_desc *desc); | ||
| 606 | |||
| 597 | extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg); | 607 | extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg); |
| 598 | extern int irq_chip_pm_get(struct irq_data *data); | 608 | extern int irq_chip_pm_get(struct irq_data *data); |
| 599 | extern int irq_chip_pm_put(struct irq_data *data); | 609 | extern int irq_chip_pm_put(struct irq_data *data); |
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h index dd1e40ddac7d..d6e2ab538ef2 100644 --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h | |||
| @@ -28,6 +28,7 @@ struct pt_regs; | |||
| 28 | * @core_internal_state__do_not_mess_with_it: core internal status information | 28 | * @core_internal_state__do_not_mess_with_it: core internal status information |
| 29 | * @depth: disable-depth, for nested irq_disable() calls | 29 | * @depth: disable-depth, for nested irq_disable() calls |
| 30 | * @wake_depth: enable depth, for multiple irq_set_irq_wake() callers | 30 | * @wake_depth: enable depth, for multiple irq_set_irq_wake() callers |
| 31 | * @tot_count: stats field for non-percpu irqs | ||
| 31 | * @irq_count: stats field to detect stalled irqs | 32 | * @irq_count: stats field to detect stalled irqs |
| 32 | * @last_unhandled: aging timer for unhandled count | 33 | * @last_unhandled: aging timer for unhandled count |
| 33 | * @irqs_unhandled: stats field for spurious unhandled interrupts | 34 | * @irqs_unhandled: stats field for spurious unhandled interrupts |
| @@ -65,6 +66,7 @@ struct irq_desc { | |||
| 65 | unsigned int core_internal_state__do_not_mess_with_it; | 66 | unsigned int core_internal_state__do_not_mess_with_it; |
| 66 | unsigned int depth; /* nested irq disables */ | 67 | unsigned int depth; /* nested irq disables */ |
| 67 | unsigned int wake_depth; /* nested wake enables */ | 68 | unsigned int wake_depth; /* nested wake enables */ |
| 69 | unsigned int tot_count; | ||
| 68 | unsigned int irq_count; /* For detecting broken IRQs */ | 70 | unsigned int irq_count; /* For detecting broken IRQs */ |
| 69 | unsigned long last_unhandled; /* Aging timer for unhandled count */ | 71 | unsigned long last_unhandled; /* Aging timer for unhandled count */ |
| 70 | unsigned int irqs_unhandled; | 72 | unsigned int irqs_unhandled; |
| @@ -171,6 +173,11 @@ static inline int handle_domain_irq(struct irq_domain *domain, | |||
| 171 | { | 173 | { |
| 172 | return __handle_domain_irq(domain, hwirq, true, regs); | 174 | return __handle_domain_irq(domain, hwirq, true, regs); |
| 173 | } | 175 | } |
| 176 | |||
| 177 | #ifdef CONFIG_IRQ_DOMAIN | ||
| 178 | int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq, | ||
| 179 | struct pt_regs *regs); | ||
| 180 | #endif | ||
| 174 | #endif | 181 | #endif |
| 175 | 182 | ||
| 176 | /* Test to see if a driver has successfully requested an irq */ | 183 | /* Test to see if a driver has successfully requested an irq */ |
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h index 35965f41d7be..d2130dc7c0e6 100644 --- a/include/linux/irqdomain.h +++ b/include/linux/irqdomain.h | |||
| @@ -265,6 +265,7 @@ extern struct irq_domain *irq_find_matching_fwspec(struct irq_fwspec *fwspec, | |||
| 265 | enum irq_domain_bus_token bus_token); | 265 | enum irq_domain_bus_token bus_token); |
| 266 | extern bool irq_domain_check_msi_remap(void); | 266 | extern bool irq_domain_check_msi_remap(void); |
| 267 | extern void irq_set_default_host(struct irq_domain *host); | 267 | extern void irq_set_default_host(struct irq_domain *host); |
| 268 | extern struct irq_domain *irq_get_default_host(void); | ||
| 268 | extern int irq_domain_alloc_descs(int virq, unsigned int nr_irqs, | 269 | extern int irq_domain_alloc_descs(int virq, unsigned int nr_irqs, |
| 269 | irq_hw_number_t hwirq, int node, | 270 | irq_hw_number_t hwirq, int node, |
| 270 | const struct irq_affinity_desc *affinity); | 271 | const struct irq_affinity_desc *affinity); |
diff --git a/include/linux/kthread.h b/include/linux/kthread.h index c1961761311d..1577a2d56e9d 100644 --- a/include/linux/kthread.h +++ b/include/linux/kthread.h | |||
| @@ -56,6 +56,7 @@ void kthread_bind_mask(struct task_struct *k, const struct cpumask *mask); | |||
| 56 | int kthread_stop(struct task_struct *k); | 56 | int kthread_stop(struct task_struct *k); |
| 57 | bool kthread_should_stop(void); | 57 | bool kthread_should_stop(void); |
| 58 | bool kthread_should_park(void); | 58 | bool kthread_should_park(void); |
| 59 | bool __kthread_should_park(struct task_struct *k); | ||
| 59 | bool kthread_freezable_should_stop(bool *was_frozen); | 60 | bool kthread_freezable_should_stop(bool *was_frozen); |
| 60 | void *kthread_data(struct task_struct *k); | 61 | void *kthread_data(struct task_struct *k); |
| 61 | void *kthread_probe_data(struct task_struct *k); | 62 | void *kthread_probe_data(struct task_struct *k); |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 65f1d8c2f082..e7c51b00cdfe 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
| @@ -1393,7 +1393,7 @@ static inline int pci_enable_msix_exact(struct pci_dev *dev, | |||
| 1393 | } | 1393 | } |
| 1394 | int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, | 1394 | int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, |
| 1395 | unsigned int max_vecs, unsigned int flags, | 1395 | unsigned int max_vecs, unsigned int flags, |
| 1396 | const struct irq_affinity *affd); | 1396 | struct irq_affinity *affd); |
| 1397 | 1397 | ||
| 1398 | void pci_free_irq_vectors(struct pci_dev *dev); | 1398 | void pci_free_irq_vectors(struct pci_dev *dev); |
| 1399 | int pci_irq_vector(struct pci_dev *dev, unsigned int nr); | 1399 | int pci_irq_vector(struct pci_dev *dev, unsigned int nr); |
| @@ -1419,7 +1419,7 @@ static inline int pci_enable_msix_exact(struct pci_dev *dev, | |||
| 1419 | static inline int | 1419 | static inline int |
| 1420 | pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, | 1420 | pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, |
| 1421 | unsigned int max_vecs, unsigned int flags, | 1421 | unsigned int max_vecs, unsigned int flags, |
| 1422 | const struct irq_affinity *aff_desc) | 1422 | struct irq_affinity *aff_desc) |
| 1423 | { | 1423 | { |
| 1424 | if ((flags & PCI_IRQ_LEGACY) && min_vecs == 1 && dev->irq) | 1424 | if ((flags & PCI_IRQ_LEGACY) && min_vecs == 1 && dev->irq) |
| 1425 | return 1; | 1425 | return 1; |
