diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-03 19:50:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-03 19:50:31 -0400 |
commit | 03ffbcdd7898c0b5299efeb9f18de927487ec1cf (patch) | |
tree | 0569222e4dc9db22049d7d8d15920cc085a194f6 /include | |
parent | 1b044f1cfc65a7d90b209dfabd57e16d98b58c5b (diff) | |
parent | f9632de40ee0161e864bea8c1b017d957fd7312c (diff) |
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq updates from Thomas Gleixner:
"The irq department delivers:
- Expand the generic infrastructure handling the irq migration on CPU
hotplug and convert X86 over to it. (Thomas Gleixner)
Aside of consolidating code this is a preparatory change for:
- Finalizing the affinity management for multi-queue devices. The
main change here is to shut down interrupts which are affine to a
outgoing CPU and reenabling them when the CPU comes online again.
That avoids moving interrupts pointlessly around and breaking and
reestablishing affinities for no value. (Christoph Hellwig)
Note: This contains also the BLOCK-MQ and NVME changes which depend
on the rework of the irq core infrastructure. Jens acked them and
agreed that they should go with the irq changes.
- Consolidation of irq domain code (Marc Zyngier)
- State tracking consolidation in the core code (Jeffy Chen)
- Add debug infrastructure for hierarchical irq domains (Thomas
Gleixner)
- Infrastructure enhancement for managing generic interrupt chips via
devmem (Bartosz Golaszewski)
- Constification work all over the place (Tobias Klauser)
- Two new interrupt controller drivers for MVEBU (Thomas Petazzoni)
- The usual set of fixes, updates and enhancements all over the
place"
* 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (112 commits)
irqchip/or1k-pic: Fix interrupt acknowledgement
irqchip/irq-mvebu-gicp: Allocate enough memory for spi_bitmap
irqchip/gic-v3: Fix out-of-bound access in gic_set_affinity
nvme: Allocate queues for all possible CPUs
blk-mq: Create hctx for each present CPU
blk-mq: Include all present CPUs in the default queue mapping
genirq: Avoid unnecessary low level irq function calls
genirq: Set irq masked state when initializing irq_desc
genirq/timings: Add infrastructure for estimating the next interrupt arrival time
genirq/timings: Add infrastructure to track the interrupt timings
genirq/debugfs: Remove pointless NULL pointer check
irqchip/gic-v3-its: Don't assume GICv3 hardware supports 16bit INTID
irqchip/gic-v3-its: Add ACPI NUMA node mapping
irqchip/gic-v3-its-platform-msi: Make of_device_ids const
irqchip/gic-v3-its: Make of_device_ids const
irqchip/irq-mvebu-icu: Add new driver for Marvell ICU
irqchip/irq-mvebu-gicp: Add new driver for Marvell GICP
dt-bindings/interrupt-controller: Add DT binding for the Marvell ICU
genirq/irqdomain: Remove auto-recursive hierarchy support
irqchip/MSI: Use irq_domain_update_bus_token instead of an open coded access
...
Diffstat (limited to 'include')
-rw-r--r-- | include/dt-bindings/interrupt-controller/mvebu-icu.h | 15 | ||||
-rw-r--r-- | include/linux/cpuhotplug.h | 2 | ||||
-rw-r--r-- | include/linux/interrupt.h | 6 | ||||
-rw-r--r-- | include/linux/irq.h | 89 | ||||
-rw-r--r-- | include/linux/irqdesc.h | 4 | ||||
-rw-r--r-- | include/linux/irqdomain.h | 43 |
6 files changed, 154 insertions, 5 deletions
diff --git a/include/dt-bindings/interrupt-controller/mvebu-icu.h b/include/dt-bindings/interrupt-controller/mvebu-icu.h new file mode 100644 index 000000000000..8249558545c7 --- /dev/null +++ b/include/dt-bindings/interrupt-controller/mvebu-icu.h | |||
@@ -0,0 +1,15 @@ | |||
1 | /* | ||
2 | * This header provides constants for the MVEBU ICU driver. | ||
3 | */ | ||
4 | |||
5 | #ifndef _DT_BINDINGS_INTERRUPT_CONTROLLER_MVEBU_ICU_H | ||
6 | #define _DT_BINDINGS_INTERRUPT_CONTROLLER_MVEBU_ICU_H | ||
7 | |||
8 | /* interrupt specifier cell 0 */ | ||
9 | |||
10 | #define ICU_GRP_NSR 0x0 | ||
11 | #define ICU_GRP_SR 0x1 | ||
12 | #define ICU_GRP_SEI 0x4 | ||
13 | #define ICU_GRP_REI 0x5 | ||
14 | |||
15 | #endif | ||
diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index 0f2a80377520..7f815d915977 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h | |||
@@ -58,7 +58,6 @@ enum cpuhp_state { | |||
58 | CPUHP_XEN_EVTCHN_PREPARE, | 58 | CPUHP_XEN_EVTCHN_PREPARE, |
59 | CPUHP_ARM_SHMOBILE_SCU_PREPARE, | 59 | CPUHP_ARM_SHMOBILE_SCU_PREPARE, |
60 | CPUHP_SH_SH3X_PREPARE, | 60 | CPUHP_SH_SH3X_PREPARE, |
61 | CPUHP_BLK_MQ_PREPARE, | ||
62 | CPUHP_NET_FLOW_PREPARE, | 61 | CPUHP_NET_FLOW_PREPARE, |
63 | CPUHP_TOPOLOGY_PREPARE, | 62 | CPUHP_TOPOLOGY_PREPARE, |
64 | CPUHP_NET_IUCV_PREPARE, | 63 | CPUHP_NET_IUCV_PREPARE, |
@@ -124,6 +123,7 @@ enum cpuhp_state { | |||
124 | CPUHP_AP_ONLINE_IDLE, | 123 | CPUHP_AP_ONLINE_IDLE, |
125 | CPUHP_AP_SMPBOOT_THREADS, | 124 | CPUHP_AP_SMPBOOT_THREADS, |
126 | CPUHP_AP_X86_VDSO_VMA_ONLINE, | 125 | CPUHP_AP_X86_VDSO_VMA_ONLINE, |
126 | CPUHP_AP_IRQ_AFFINITY_ONLINE, | ||
127 | CPUHP_AP_PERF_ONLINE, | 127 | CPUHP_AP_PERF_ONLINE, |
128 | CPUHP_AP_PERF_X86_ONLINE, | 128 | CPUHP_AP_PERF_X86_ONLINE, |
129 | CPUHP_AP_PERF_X86_UNCORE_ONLINE, | 129 | CPUHP_AP_PERF_X86_UNCORE_ONLINE, |
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index a6fba4804672..37f8e354f564 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
@@ -703,6 +703,12 @@ static inline void init_irq_proc(void) | |||
703 | } | 703 | } |
704 | #endif | 704 | #endif |
705 | 705 | ||
706 | #ifdef CONFIG_IRQ_TIMINGS | ||
707 | void irq_timings_enable(void); | ||
708 | void irq_timings_disable(void); | ||
709 | u64 irq_timings_next_event(u64 now); | ||
710 | #endif | ||
711 | |||
706 | struct seq_file; | 712 | struct seq_file; |
707 | int show_interrupts(struct seq_file *p, void *v); | 713 | int show_interrupts(struct seq_file *p, void *v); |
708 | int arch_show_interrupts(struct seq_file *p, int prec); | 714 | int arch_show_interrupts(struct seq_file *p, int prec); |
diff --git a/include/linux/irq.h b/include/linux/irq.h index f887351aa80e..00db35b61e9e 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/topology.h> | 22 | #include <linux/topology.h> |
23 | #include <linux/wait.h> | 23 | #include <linux/wait.h> |
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | #include <linux/slab.h> | ||
25 | 26 | ||
26 | #include <asm/irq.h> | 27 | #include <asm/irq.h> |
27 | #include <asm/ptrace.h> | 28 | #include <asm/ptrace.h> |
@@ -136,6 +137,9 @@ struct irq_domain; | |||
136 | * @affinity: IRQ affinity on SMP. If this is an IPI | 137 | * @affinity: IRQ affinity on SMP. If this is an IPI |
137 | * related irq, then this is the mask of the | 138 | * related irq, then this is the mask of the |
138 | * CPUs to which an IPI can be sent. | 139 | * CPUs to which an IPI can be sent. |
140 | * @effective_affinity: The effective IRQ affinity on SMP as some irq | ||
141 | * chips do not allow multi CPU destinations. | ||
142 | * A subset of @affinity. | ||
139 | * @msi_desc: MSI descriptor | 143 | * @msi_desc: MSI descriptor |
140 | * @ipi_offset: Offset of first IPI target cpu in @affinity. Optional. | 144 | * @ipi_offset: Offset of first IPI target cpu in @affinity. Optional. |
141 | */ | 145 | */ |
@@ -147,6 +151,9 @@ struct irq_common_data { | |||
147 | void *handler_data; | 151 | void *handler_data; |
148 | struct msi_desc *msi_desc; | 152 | struct msi_desc *msi_desc; |
149 | cpumask_var_t affinity; | 153 | cpumask_var_t affinity; |
154 | #ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK | ||
155 | cpumask_var_t effective_affinity; | ||
156 | #endif | ||
150 | #ifdef CONFIG_GENERIC_IRQ_IPI | 157 | #ifdef CONFIG_GENERIC_IRQ_IPI |
151 | unsigned int ipi_offset; | 158 | unsigned int ipi_offset; |
152 | #endif | 159 | #endif |
@@ -199,6 +206,10 @@ struct irq_data { | |||
199 | * IRQD_WAKEUP_ARMED - Wakeup mode armed | 206 | * IRQD_WAKEUP_ARMED - Wakeup mode armed |
200 | * IRQD_FORWARDED_TO_VCPU - The interrupt is forwarded to a VCPU | 207 | * IRQD_FORWARDED_TO_VCPU - The interrupt is forwarded to a VCPU |
201 | * IRQD_AFFINITY_MANAGED - Affinity is auto-managed by the kernel | 208 | * IRQD_AFFINITY_MANAGED - Affinity is auto-managed by the kernel |
209 | * IRQD_IRQ_STARTED - Startup state of the interrupt | ||
210 | * IRQD_MANAGED_SHUTDOWN - Interrupt was shutdown due to empty affinity | ||
211 | * mask. Applies only to affinity managed irqs. | ||
212 | * IRQD_SINGLE_TARGET - IRQ allows only a single affinity target | ||
202 | */ | 213 | */ |
203 | enum { | 214 | enum { |
204 | IRQD_TRIGGER_MASK = 0xf, | 215 | IRQD_TRIGGER_MASK = 0xf, |
@@ -216,6 +227,9 @@ enum { | |||
216 | IRQD_WAKEUP_ARMED = (1 << 19), | 227 | IRQD_WAKEUP_ARMED = (1 << 19), |
217 | IRQD_FORWARDED_TO_VCPU = (1 << 20), | 228 | IRQD_FORWARDED_TO_VCPU = (1 << 20), |
218 | IRQD_AFFINITY_MANAGED = (1 << 21), | 229 | IRQD_AFFINITY_MANAGED = (1 << 21), |
230 | IRQD_IRQ_STARTED = (1 << 22), | ||
231 | IRQD_MANAGED_SHUTDOWN = (1 << 23), | ||
232 | IRQD_SINGLE_TARGET = (1 << 24), | ||
219 | }; | 233 | }; |
220 | 234 | ||
221 | #define __irqd_to_state(d) ACCESS_PRIVATE((d)->common, state_use_accessors) | 235 | #define __irqd_to_state(d) ACCESS_PRIVATE((d)->common, state_use_accessors) |
@@ -264,6 +278,20 @@ static inline bool irqd_is_level_type(struct irq_data *d) | |||
264 | return __irqd_to_state(d) & IRQD_LEVEL; | 278 | return __irqd_to_state(d) & IRQD_LEVEL; |
265 | } | 279 | } |
266 | 280 | ||
281 | /* | ||
282 | * Must only be called of irqchip.irq_set_affinity() or low level | ||
283 | * hieararchy domain allocation functions. | ||
284 | */ | ||
285 | static inline void irqd_set_single_target(struct irq_data *d) | ||
286 | { | ||
287 | __irqd_to_state(d) |= IRQD_SINGLE_TARGET; | ||
288 | } | ||
289 | |||
290 | static inline bool irqd_is_single_target(struct irq_data *d) | ||
291 | { | ||
292 | return __irqd_to_state(d) & IRQD_SINGLE_TARGET; | ||
293 | } | ||
294 | |||
267 | static inline bool irqd_is_wakeup_set(struct irq_data *d) | 295 | static inline bool irqd_is_wakeup_set(struct irq_data *d) |
268 | { | 296 | { |
269 | return __irqd_to_state(d) & IRQD_WAKEUP_STATE; | 297 | return __irqd_to_state(d) & IRQD_WAKEUP_STATE; |
@@ -329,6 +357,16 @@ static inline void irqd_clr_activated(struct irq_data *d) | |||
329 | __irqd_to_state(d) &= ~IRQD_ACTIVATED; | 357 | __irqd_to_state(d) &= ~IRQD_ACTIVATED; |
330 | } | 358 | } |
331 | 359 | ||
360 | static inline bool irqd_is_started(struct irq_data *d) | ||
361 | { | ||
362 | return __irqd_to_state(d) & IRQD_IRQ_STARTED; | ||
363 | } | ||
364 | |||
365 | static inline bool irqd_is_managed_and_shutdown(struct irq_data *d) | ||
366 | { | ||
367 | return __irqd_to_state(d) & IRQD_MANAGED_SHUTDOWN; | ||
368 | } | ||
369 | |||
332 | #undef __irqd_to_state | 370 | #undef __irqd_to_state |
333 | 371 | ||
334 | static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) | 372 | static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) |
@@ -478,14 +516,21 @@ extern int irq_set_affinity_locked(struct irq_data *data, | |||
478 | const struct cpumask *cpumask, bool force); | 516 | const struct cpumask *cpumask, bool force); |
479 | extern int irq_set_vcpu_affinity(unsigned int irq, void *vcpu_info); | 517 | extern int irq_set_vcpu_affinity(unsigned int irq, void *vcpu_info); |
480 | 518 | ||
519 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_IRQ_MIGRATION) | ||
481 | extern void irq_migrate_all_off_this_cpu(void); | 520 | extern void irq_migrate_all_off_this_cpu(void); |
521 | extern int irq_affinity_online_cpu(unsigned int cpu); | ||
522 | #else | ||
523 | # define irq_affinity_online_cpu NULL | ||
524 | #endif | ||
482 | 525 | ||
483 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) | 526 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) |
484 | void irq_move_irq(struct irq_data *data); | 527 | void irq_move_irq(struct irq_data *data); |
485 | void irq_move_masked_irq(struct irq_data *data); | 528 | void irq_move_masked_irq(struct irq_data *data); |
529 | void irq_force_complete_move(struct irq_desc *desc); | ||
486 | #else | 530 | #else |
487 | static inline void irq_move_irq(struct irq_data *data) { } | 531 | static inline void irq_move_irq(struct irq_data *data) { } |
488 | static inline void irq_move_masked_irq(struct irq_data *data) { } | 532 | static inline void irq_move_masked_irq(struct irq_data *data) { } |
533 | static inline void irq_force_complete_move(struct irq_desc *desc) { } | ||
489 | #endif | 534 | #endif |
490 | 535 | ||
491 | extern int no_irq_affinity; | 536 | extern int no_irq_affinity; |
@@ -727,6 +772,29 @@ static inline struct cpumask *irq_data_get_affinity_mask(struct irq_data *d) | |||
727 | return d->common->affinity; | 772 | return d->common->affinity; |
728 | } | 773 | } |
729 | 774 | ||
775 | #ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK | ||
776 | static inline | ||
777 | struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d) | ||
778 | { | ||
779 | return d->common->effective_affinity; | ||
780 | } | ||
781 | static inline void irq_data_update_effective_affinity(struct irq_data *d, | ||
782 | const struct cpumask *m) | ||
783 | { | ||
784 | cpumask_copy(d->common->effective_affinity, m); | ||
785 | } | ||
786 | #else | ||
787 | static inline void irq_data_update_effective_affinity(struct irq_data *d, | ||
788 | const struct cpumask *m) | ||
789 | { | ||
790 | } | ||
791 | static inline | ||
792 | struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d) | ||
793 | { | ||
794 | return d->common->affinity; | ||
795 | } | ||
796 | #endif | ||
797 | |||
730 | unsigned int arch_dynirq_lower_bound(unsigned int from); | 798 | unsigned int arch_dynirq_lower_bound(unsigned int from); |
731 | 799 | ||
732 | int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node, | 800 | int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node, |
@@ -951,6 +1019,14 @@ int irq_setup_alt_chip(struct irq_data *d, unsigned int type); | |||
951 | void irq_remove_generic_chip(struct irq_chip_generic *gc, u32 msk, | 1019 | void irq_remove_generic_chip(struct irq_chip_generic *gc, u32 msk, |
952 | unsigned int clr, unsigned int set); | 1020 | unsigned int clr, unsigned int set); |
953 | 1021 | ||
1022 | struct irq_chip_generic * | ||
1023 | devm_irq_alloc_generic_chip(struct device *dev, const char *name, int num_ct, | ||
1024 | unsigned int irq_base, void __iomem *reg_base, | ||
1025 | irq_flow_handler_t handler); | ||
1026 | int devm_irq_setup_generic_chip(struct device *dev, struct irq_chip_generic *gc, | ||
1027 | u32 msk, enum irq_gc_flags flags, | ||
1028 | unsigned int clr, unsigned int set); | ||
1029 | |||
954 | struct irq_chip_generic *irq_get_domain_generic_chip(struct irq_domain *d, unsigned int hw_irq); | 1030 | struct irq_chip_generic *irq_get_domain_generic_chip(struct irq_domain *d, unsigned int hw_irq); |
955 | 1031 | ||
956 | int __irq_alloc_domain_generic_chips(struct irq_domain *d, int irqs_per_chip, | 1032 | int __irq_alloc_domain_generic_chips(struct irq_domain *d, int irqs_per_chip, |
@@ -967,6 +1043,19 @@ int __irq_alloc_domain_generic_chips(struct irq_domain *d, int irqs_per_chip, | |||
967 | handler, clr, set, flags); \ | 1043 | handler, clr, set, flags); \ |
968 | }) | 1044 | }) |
969 | 1045 | ||
1046 | static inline void irq_free_generic_chip(struct irq_chip_generic *gc) | ||
1047 | { | ||
1048 | kfree(gc); | ||
1049 | } | ||
1050 | |||
1051 | static inline void irq_destroy_generic_chip(struct irq_chip_generic *gc, | ||
1052 | u32 msk, unsigned int clr, | ||
1053 | unsigned int set) | ||
1054 | { | ||
1055 | irq_remove_generic_chip(gc, msk, clr, set); | ||
1056 | irq_free_generic_chip(gc); | ||
1057 | } | ||
1058 | |||
970 | static inline struct irq_chip_type *irq_data_get_chip_type(struct irq_data *d) | 1059 | static inline struct irq_chip_type *irq_data_get_chip_type(struct irq_data *d) |
971 | { | 1060 | { |
972 | return container_of(d->chip, struct irq_chip_type, chip); | 1061 | return container_of(d->chip, struct irq_chip_type, chip); |
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h index c9be57931b58..d425a3a09722 100644 --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h | |||
@@ -46,6 +46,7 @@ struct pt_regs; | |||
46 | * @rcu: rcu head for delayed free | 46 | * @rcu: rcu head for delayed free |
47 | * @kobj: kobject used to represent this struct in sysfs | 47 | * @kobj: kobject used to represent this struct in sysfs |
48 | * @dir: /proc/irq/ procfs entry | 48 | * @dir: /proc/irq/ procfs entry |
49 | * @debugfs_file: dentry for the debugfs file | ||
49 | * @name: flow handler name for /proc/interrupts output | 50 | * @name: flow handler name for /proc/interrupts output |
50 | */ | 51 | */ |
51 | struct irq_desc { | 52 | struct irq_desc { |
@@ -88,6 +89,9 @@ struct irq_desc { | |||
88 | #ifdef CONFIG_PROC_FS | 89 | #ifdef CONFIG_PROC_FS |
89 | struct proc_dir_entry *dir; | 90 | struct proc_dir_entry *dir; |
90 | #endif | 91 | #endif |
92 | #ifdef CONFIG_GENERIC_IRQ_DEBUGFS | ||
93 | struct dentry *debugfs_file; | ||
94 | #endif | ||
91 | #ifdef CONFIG_SPARSE_IRQ | 95 | #ifdef CONFIG_SPARSE_IRQ |
92 | struct rcu_head rcu; | 96 | struct rcu_head rcu; |
93 | struct kobject kobj; | 97 | struct kobject kobj; |
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h index 9f3616085423..cac77a5c5555 100644 --- a/include/linux/irqdomain.h +++ b/include/linux/irqdomain.h | |||
@@ -130,6 +130,7 @@ struct irq_domain_chip_generic; | |||
130 | * @host_data: private data pointer for use by owner. Not touched by irq_domain | 130 | * @host_data: private data pointer for use by owner. Not touched by irq_domain |
131 | * core code. | 131 | * core code. |
132 | * @flags: host per irq_domain flags | 132 | * @flags: host per irq_domain flags |
133 | * @mapcount: The number of mapped interrupts | ||
133 | * | 134 | * |
134 | * Optional elements | 135 | * Optional elements |
135 | * @of_node: Pointer to device tree nodes associated with the irq_domain. Used | 136 | * @of_node: Pointer to device tree nodes associated with the irq_domain. Used |
@@ -138,6 +139,7 @@ struct irq_domain_chip_generic; | |||
138 | * setting up one or more generic chips for interrupt controllers | 139 | * setting up one or more generic chips for interrupt controllers |
139 | * drivers using the generic chip library which uses this pointer. | 140 | * drivers using the generic chip library which uses this pointer. |
140 | * @parent: Pointer to parent irq_domain to support hierarchy irq_domains | 141 | * @parent: Pointer to parent irq_domain to support hierarchy irq_domains |
142 | * @debugfs_file: dentry for the domain debugfs file | ||
141 | * | 143 | * |
142 | * Revmap data, used internally by irq_domain | 144 | * Revmap data, used internally by irq_domain |
143 | * @revmap_direct_max_irq: The largest hwirq that can be set for controllers that | 145 | * @revmap_direct_max_irq: The largest hwirq that can be set for controllers that |
@@ -152,6 +154,7 @@ struct irq_domain { | |||
152 | const struct irq_domain_ops *ops; | 154 | const struct irq_domain_ops *ops; |
153 | void *host_data; | 155 | void *host_data; |
154 | unsigned int flags; | 156 | unsigned int flags; |
157 | unsigned int mapcount; | ||
155 | 158 | ||
156 | /* Optional data */ | 159 | /* Optional data */ |
157 | struct fwnode_handle *fwnode; | 160 | struct fwnode_handle *fwnode; |
@@ -160,6 +163,9 @@ struct irq_domain { | |||
160 | #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY | 163 | #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY |
161 | struct irq_domain *parent; | 164 | struct irq_domain *parent; |
162 | #endif | 165 | #endif |
166 | #ifdef CONFIG_GENERIC_IRQ_DEBUGFS | ||
167 | struct dentry *debugfs_file; | ||
168 | #endif | ||
163 | 169 | ||
164 | /* reverse map data. The linear map gets appended to the irq_domain */ | 170 | /* reverse map data. The linear map gets appended to the irq_domain */ |
165 | irq_hw_number_t hwirq_max; | 171 | irq_hw_number_t hwirq_max; |
@@ -174,8 +180,8 @@ enum { | |||
174 | /* Irq domain is hierarchical */ | 180 | /* Irq domain is hierarchical */ |
175 | IRQ_DOMAIN_FLAG_HIERARCHY = (1 << 0), | 181 | IRQ_DOMAIN_FLAG_HIERARCHY = (1 << 0), |
176 | 182 | ||
177 | /* Core calls alloc/free recursive through the domain hierarchy. */ | 183 | /* Irq domain name was allocated in __irq_domain_add() */ |
178 | IRQ_DOMAIN_FLAG_AUTO_RECURSIVE = (1 << 1), | 184 | IRQ_DOMAIN_NAME_ALLOCATED = (1 << 6), |
179 | 185 | ||
180 | /* Irq domain is an IPI domain with virq per cpu */ | 186 | /* Irq domain is an IPI domain with virq per cpu */ |
181 | IRQ_DOMAIN_FLAG_IPI_PER_CPU = (1 << 2), | 187 | IRQ_DOMAIN_FLAG_IPI_PER_CPU = (1 << 2), |
@@ -203,7 +209,33 @@ static inline struct device_node *irq_domain_get_of_node(struct irq_domain *d) | |||
203 | } | 209 | } |
204 | 210 | ||
205 | #ifdef CONFIG_IRQ_DOMAIN | 211 | #ifdef CONFIG_IRQ_DOMAIN |
206 | struct fwnode_handle *irq_domain_alloc_fwnode(void *data); | 212 | struct fwnode_handle *__irq_domain_alloc_fwnode(unsigned int type, int id, |
213 | const char *name, void *data); | ||
214 | |||
215 | enum { | ||
216 | IRQCHIP_FWNODE_REAL, | ||
217 | IRQCHIP_FWNODE_NAMED, | ||
218 | IRQCHIP_FWNODE_NAMED_ID, | ||
219 | }; | ||
220 | |||
221 | static inline | ||
222 | struct fwnode_handle *irq_domain_alloc_named_fwnode(const char *name) | ||
223 | { | ||
224 | return __irq_domain_alloc_fwnode(IRQCHIP_FWNODE_NAMED, 0, name, NULL); | ||
225 | } | ||
226 | |||
227 | static inline | ||
228 | struct fwnode_handle *irq_domain_alloc_named_id_fwnode(const char *name, int id) | ||
229 | { | ||
230 | return __irq_domain_alloc_fwnode(IRQCHIP_FWNODE_NAMED_ID, id, name, | ||
231 | NULL); | ||
232 | } | ||
233 | |||
234 | static inline struct fwnode_handle *irq_domain_alloc_fwnode(void *data) | ||
235 | { | ||
236 | return __irq_domain_alloc_fwnode(IRQCHIP_FWNODE_REAL, 0, NULL, data); | ||
237 | } | ||
238 | |||
207 | void irq_domain_free_fwnode(struct fwnode_handle *fwnode); | 239 | void irq_domain_free_fwnode(struct fwnode_handle *fwnode); |
208 | struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size, | 240 | struct irq_domain *__irq_domain_add(struct fwnode_handle *fwnode, int size, |
209 | irq_hw_number_t hwirq_max, int direct_max, | 241 | irq_hw_number_t hwirq_max, int direct_max, |
@@ -238,6 +270,9 @@ static inline bool is_fwnode_irqchip(struct fwnode_handle *fwnode) | |||
238 | return fwnode && fwnode->type == FWNODE_IRQCHIP; | 270 | return fwnode && fwnode->type == FWNODE_IRQCHIP; |
239 | } | 271 | } |
240 | 272 | ||
273 | extern void irq_domain_update_bus_token(struct irq_domain *domain, | ||
274 | enum irq_domain_bus_token bus_token); | ||
275 | |||
241 | static inline | 276 | static inline |
242 | struct irq_domain *irq_find_matching_fwnode(struct fwnode_handle *fwnode, | 277 | struct irq_domain *irq_find_matching_fwnode(struct fwnode_handle *fwnode, |
243 | enum irq_domain_bus_token bus_token) | 278 | enum irq_domain_bus_token bus_token) |
@@ -410,7 +445,7 @@ static inline int irq_domain_alloc_irqs(struct irq_domain *domain, | |||
410 | NULL); | 445 | NULL); |
411 | } | 446 | } |
412 | 447 | ||
413 | extern int irq_domain_alloc_irqs_recursive(struct irq_domain *domain, | 448 | extern int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain, |
414 | unsigned int irq_base, | 449 | unsigned int irq_base, |
415 | unsigned int nr_irqs, void *arg); | 450 | unsigned int nr_irqs, void *arg); |
416 | extern int irq_domain_set_hwirq_and_chip(struct irq_domain *domain, | 451 | extern int irq_domain_set_hwirq_and_chip(struct irq_domain *domain, |