1
2#ifndef _LINUX_IRQ_H
3#define _LINUX_IRQ_H
4
5
6
7
8
9
10
11
12
13#include <linux/cache.h>
14#include <linux/spinlock.h>
15#include <linux/cpumask.h>
16#include <linux/irqhandler.h>
17#include <linux/irqreturn.h>
18#include <linux/irqnr.h>
19#include <linux/topology.h>
20#include <linux/io.h>
21#include <linux/slab.h>
22
23#include <asm/irq.h>
24#include <asm/ptrace.h>
25#include <asm/irq_regs.h>
26
27struct seq_file;
28struct module;
29struct msi_msg;
30struct irq_affinity_desc;
31enum irqchip_irq_state;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75enum {
76 IRQ_TYPE_NONE = 0x00000000,
77 IRQ_TYPE_EDGE_RISING = 0x00000001,
78 IRQ_TYPE_EDGE_FALLING = 0x00000002,
79 IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING),
80 IRQ_TYPE_LEVEL_HIGH = 0x00000004,
81 IRQ_TYPE_LEVEL_LOW = 0x00000008,
82 IRQ_TYPE_LEVEL_MASK = (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),
83 IRQ_TYPE_SENSE_MASK = 0x0000000f,
84 IRQ_TYPE_DEFAULT = IRQ_TYPE_SENSE_MASK,
85
86 IRQ_TYPE_PROBE = 0x00000010,
87
88 IRQ_LEVEL = (1 << 8),
89 IRQ_PER_CPU = (1 << 9),
90 IRQ_NOPROBE = (1 << 10),
91 IRQ_NOREQUEST = (1 << 11),
92 IRQ_NOAUTOEN = (1 << 12),
93 IRQ_NO_BALANCING = (1 << 13),
94 IRQ_MOVE_PCNTXT = (1 << 14),
95 IRQ_NESTED_THREAD = (1 << 15),
96 IRQ_NOTHREAD = (1 << 16),
97 IRQ_PER_CPU_DEVID = (1 << 17),
98 IRQ_IS_POLLED = (1 << 18),
99 IRQ_DISABLE_UNLAZY = (1 << 19),
100};
101
102#define IRQF_MODIFY_MASK \
103 (IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \
104 IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \
105 IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID | \
106 IRQ_IS_POLLED | IRQ_DISABLE_UNLAZY)
107
108#define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING)
109
110
111
112
113
114
115
116
117
118
119enum {
120 IRQ_SET_MASK_OK = 0,
121 IRQ_SET_MASK_OK_NOCOPY,
122 IRQ_SET_MASK_OK_DONE,
123};
124
125struct msi_desc;
126struct irq_domain;
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143struct irq_common_data {
144 unsigned int __private state_use_accessors;
145#ifdef CONFIG_NUMA
146 unsigned int node;
147#endif
148 void *handler_data;
149 struct msi_desc *msi_desc;
150 cpumask_var_t affinity;
151#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
152 cpumask_var_t effective_affinity;
153#endif
154#ifdef CONFIG_GENERIC_IRQ_IPI
155 unsigned int ipi_offset;
156#endif
157};
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173struct irq_data {
174 u32 mask;
175 unsigned int irq;
176 unsigned long hwirq;
177 struct irq_common_data *common;
178 struct irq_chip *chip;
179 struct irq_domain *domain;
180#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
181 struct irq_data *parent_data;
182#endif
183 void *chip_data;
184};
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217enum {
218 IRQD_TRIGGER_MASK = 0xf,
219 IRQD_SETAFFINITY_PENDING = (1 << 8),
220 IRQD_ACTIVATED = (1 << 9),
221 IRQD_NO_BALANCING = (1 << 10),
222 IRQD_PER_CPU = (1 << 11),
223 IRQD_AFFINITY_SET = (1 << 12),
224 IRQD_LEVEL = (1 << 13),
225 IRQD_WAKEUP_STATE = (1 << 14),
226 IRQD_MOVE_PCNTXT = (1 << 15),
227 IRQD_IRQ_DISABLED = (1 << 16),
228 IRQD_IRQ_MASKED = (1 << 17),
229 IRQD_IRQ_INPROGRESS = (1 << 18),
230 IRQD_WAKEUP_ARMED = (1 << 19),
231 IRQD_FORWARDED_TO_VCPU = (1 << 20),
232 IRQD_AFFINITY_MANAGED = (1 << 21),
233 IRQD_IRQ_STARTED = (1 << 22),
234 IRQD_MANAGED_SHUTDOWN = (1 << 23),
235 IRQD_SINGLE_TARGET = (1 << 24),
236 IRQD_DEFAULT_TRIGGER_SET = (1 << 25),
237 IRQD_CAN_RESERVE = (1 << 26),
238 IRQD_MSI_NOMASK_QUIRK = (1 << 27),
239 IRQD_HANDLE_ENFORCE_IRQCTX = (1 << 28),
240};
241
242#define __irqd_to_state(d) ACCESS_PRIVATE((d)->common, state_use_accessors)
243
244static inline bool irqd_is_setaffinity_pending(struct irq_data *d)
245{
246 return __irqd_to_state(d) & IRQD_SETAFFINITY_PENDING;
247}
248
249static inline bool irqd_is_per_cpu(struct irq_data *d)
250{
251 return __irqd_to_state(d) & IRQD_PER_CPU;
252}
253
254static inline bool irqd_can_balance(struct irq_data *d)
255{
256 return !(__irqd_to_state(d) & (IRQD_PER_CPU | IRQD_NO_BALANCING));
257}
258
259static inline bool irqd_affinity_was_set(struct irq_data *d)
260{
261 return __irqd_to_state(d) & IRQD_AFFINITY_SET;
262}
263
264static inline void irqd_mark_affinity_was_set(struct irq_data *d)
265{
266 __irqd_to_state(d) |= IRQD_AFFINITY_SET;
267}
268
269static inline bool irqd_trigger_type_was_set(struct irq_data *d)
270{
271 return __irqd_to_state(d) & IRQD_DEFAULT_TRIGGER_SET;
272}
273
274static inline u32 irqd_get_trigger_type(struct irq_data *d)
275{
276 return __irqd_to_state(d) & IRQD_TRIGGER_MASK;
277}
278
279
280
281
282
283static inline void irqd_set_trigger_type(struct irq_data *d, u32 type)
284{
285 __irqd_to_state(d) &= ~IRQD_TRIGGER_MASK;
286 __irqd_to_state(d) |= type & IRQD_TRIGGER_MASK;
287 __irqd_to_state(d) |= IRQD_DEFAULT_TRIGGER_SET;
288}
289
290static inline bool irqd_is_level_type(struct irq_data *d)
291{
292 return __irqd_to_state(d) & IRQD_LEVEL;
293}
294
295
296
297
298
299static inline void irqd_set_single_target(struct irq_data *d)
300{
301 __irqd_to_state(d) |= IRQD_SINGLE_TARGET;
302}
303
304static inline bool irqd_is_single_target(struct irq_data *d)
305{
306 return __irqd_to_state(d) & IRQD_SINGLE_TARGET;
307}
308
309static inline void irqd_set_handle_enforce_irqctx(struct irq_data *d)
310{
311 __irqd_to_state(d) |= IRQD_HANDLE_ENFORCE_IRQCTX;
312}
313
314static inline bool irqd_is_handle_enforce_irqctx(struct irq_data *d)
315{
316 return __irqd_to_state(d) & IRQD_HANDLE_ENFORCE_IRQCTX;
317}
318
319static inline bool irqd_is_wakeup_set(struct irq_data *d)
320{
321 return __irqd_to_state(d) & IRQD_WAKEUP_STATE;
322}
323
324static inline bool irqd_can_move_in_process_context(struct irq_data *d)
325{
326 return __irqd_to_state(d) & IRQD_MOVE_PCNTXT;
327}
328
329static inline bool irqd_irq_disabled(struct irq_data *d)
330{
331 return __irqd_to_state(d) & IRQD_IRQ_DISABLED;
332}
333
334static inline bool irqd_irq_masked(struct irq_data *d)
335{
336 return __irqd_to_state(d) & IRQD_IRQ_MASKED;
337}
338
339static inline bool irqd_irq_inprogress(struct irq_data *d)
340{
341 return __irqd_to_state(d) & IRQD_IRQ_INPROGRESS;
342}
343
344static inline bool irqd_is_wakeup_armed(struct irq_data *d)
345{
346 return __irqd_to_state(d) & IRQD_WAKEUP_ARMED;
347}
348
349static inline bool irqd_is_forwarded_to_vcpu(struct irq_data *d)
350{
351 return __irqd_to_state(d) & IRQD_FORWARDED_TO_VCPU;
352}
353
354static inline void irqd_set_forwarded_to_vcpu(struct irq_data *d)
355{
356 __irqd_to_state(d) |= IRQD_FORWARDED_TO_VCPU;
357}
358
359static inline void irqd_clr_forwarded_to_vcpu(struct irq_data *d)
360{
361 __irqd_to_state(d) &= ~IRQD_FORWARDED_TO_VCPU;
362}
363
364static inline bool irqd_affinity_is_managed(struct irq_data *d)
365{
366 return __irqd_to_state(d) & IRQD_AFFINITY_MANAGED;
367}
368
369static inline bool irqd_is_activated(struct irq_data *d)
370{
371 return __irqd_to_state(d) & IRQD_ACTIVATED;
372}
373
374static inline void irqd_set_activated(struct irq_data *d)
375{
376 __irqd_to_state(d) |= IRQD_ACTIVATED;
377}
378
379static inline void irqd_clr_activated(struct irq_data *d)
380{
381 __irqd_to_state(d) &= ~IRQD_ACTIVATED;
382}
383
384static inline bool irqd_is_started(struct irq_data *d)
385{
386 return __irqd_to_state(d) & IRQD_IRQ_STARTED;
387}
388
389static inline bool irqd_is_managed_and_shutdown(struct irq_data *d)
390{
391 return __irqd_to_state(d) & IRQD_MANAGED_SHUTDOWN;
392}
393
394static inline void irqd_set_can_reserve(struct irq_data *d)
395{
396 __irqd_to_state(d) |= IRQD_CAN_RESERVE;
397}
398
399static inline void irqd_clr_can_reserve(struct irq_data *d)
400{
401 __irqd_to_state(d) &= ~IRQD_CAN_RESERVE;
402}
403
404static inline bool irqd_can_reserve(struct irq_data *d)
405{
406 return __irqd_to_state(d) & IRQD_CAN_RESERVE;
407}
408
409static inline void irqd_set_msi_nomask_quirk(struct irq_data *d)
410{
411 __irqd_to_state(d) |= IRQD_MSI_NOMASK_QUIRK;
412}
413
414static inline void irqd_clr_msi_nomask_quirk(struct irq_data *d)
415{
416 __irqd_to_state(d) &= ~IRQD_MSI_NOMASK_QUIRK;
417}
418
419static inline bool irqd_msi_nomask_quirk(struct irq_data *d)
420{
421 return __irqd_to_state(d) & IRQD_MSI_NOMASK_QUIRK;
422}
423
424#undef __irqd_to_state
425
426static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d)
427{
428 return d->hwirq;
429}
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480struct irq_chip {
481 struct device *parent_device;
482 const char *name;
483 unsigned int (*irq_startup)(struct irq_data *data);
484 void (*irq_shutdown)(struct irq_data *data);
485 void (*irq_enable)(struct irq_data *data);
486 void (*irq_disable)(struct irq_data *data);
487
488 void (*irq_ack)(struct irq_data *data);
489 void (*irq_mask)(struct irq_data *data);
490 void (*irq_mask_ack)(struct irq_data *data);
491 void (*irq_unmask)(struct irq_data *data);
492 void (*irq_eoi)(struct irq_data *data);
493
494 int (*irq_set_affinity)(struct irq_data *data, const struct cpumask *dest, bool force);
495 int (*irq_retrigger)(struct irq_data *data);
496 int (*irq_set_type)(struct irq_data *data, unsigned int flow_type);
497 int (*irq_set_wake)(struct irq_data *data, unsigned int on);
498
499 void (*irq_bus_lock)(struct irq_data *data);
500 void (*irq_bus_sync_unlock)(struct irq_data *data);
501
502 void (*irq_cpu_online)(struct irq_data *data);
503 void (*irq_cpu_offline)(struct irq_data *data);
504
505 void (*irq_suspend)(struct irq_data *data);
506 void (*irq_resume)(struct irq_data *data);
507 void (*irq_pm_shutdown)(struct irq_data *data);
508
509 void (*irq_calc_mask)(struct irq_data *data);
510
511 void (*irq_print_chip)(struct irq_data *data, struct seq_file *p);
512 int (*irq_request_resources)(struct irq_data *data);
513 void (*irq_release_resources)(struct irq_data *data);
514
515 void (*irq_compose_msi_msg)(struct irq_data *data, struct msi_msg *msg);
516 void (*irq_write_msi_msg)(struct irq_data *data, struct msi_msg *msg);
517
518 int (*irq_get_irqchip_state)(struct irq_data *data, enum irqchip_irq_state which, bool *state);
519 int (*irq_set_irqchip_state)(struct irq_data *data, enum irqchip_irq_state which, bool state);
520
521 int (*irq_set_vcpu_affinity)(struct irq_data *data, void *vcpu_info);
522
523 void (*ipi_send_single)(struct irq_data *data, unsigned int cpu);
524 void (*ipi_send_mask)(struct irq_data *data, const struct cpumask *dest);
525
526 int (*irq_nmi_setup)(struct irq_data *data);
527 void (*irq_nmi_teardown)(struct irq_data *data);
528
529 unsigned long flags;
530};
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546enum {
547 IRQCHIP_SET_TYPE_MASKED = (1 << 0),
548 IRQCHIP_EOI_IF_HANDLED = (1 << 1),
549 IRQCHIP_MASK_ON_SUSPEND = (1 << 2),
550 IRQCHIP_ONOFFLINE_ENABLED = (1 << 3),
551 IRQCHIP_SKIP_SET_WAKE = (1 << 4),
552 IRQCHIP_ONESHOT_SAFE = (1 << 5),
553 IRQCHIP_EOI_THREADED = (1 << 6),
554 IRQCHIP_SUPPORTS_LEVEL_MSI = (1 << 7),
555 IRQCHIP_SUPPORTS_NMI = (1 << 8),
556};
557
558#include <linux/irqdesc.h>
559
560
561
562
563#include <asm/hw_irq.h>
564
565#ifndef NR_IRQS_LEGACY
566# define NR_IRQS_LEGACY 0
567#endif
568
569#ifndef ARCH_IRQ_INIT_FLAGS
570# define ARCH_IRQ_INIT_FLAGS 0
571#endif
572
573#define IRQ_DEFAULT_INIT_FLAGS ARCH_IRQ_INIT_FLAGS
574
575struct irqaction;
576extern int setup_percpu_irq(unsigned int irq, struct irqaction *new);
577extern void remove_percpu_irq(unsigned int irq, struct irqaction *act);
578
579extern void irq_cpu_online(void);
580extern void irq_cpu_offline(void);
581extern int irq_set_affinity_locked(struct irq_data *data,
582 const struct cpumask *cpumask, bool force);
583extern int irq_set_vcpu_affinity(unsigned int irq, void *vcpu_info);
584
585#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_IRQ_MIGRATION)
586extern void irq_migrate_all_off_this_cpu(void);
587extern int irq_affinity_online_cpu(unsigned int cpu);
588#else
589# define irq_affinity_online_cpu NULL
590#endif
591
592#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ)
593void __irq_move_irq(struct irq_data *data);
594static inline void irq_move_irq(struct irq_data *data)
595{
596 if (unlikely(irqd_is_setaffinity_pending(data)))
597 __irq_move_irq(data);
598}
599void irq_move_masked_irq(struct irq_data *data);
600void irq_force_complete_move(struct irq_desc *desc);
601#else
602static inline void irq_move_irq(struct irq_data *data) { }
603static inline void irq_move_masked_irq(struct irq_data *data) { }
604static inline void irq_force_complete_move(struct irq_desc *desc) { }
605#endif
606
607extern int no_irq_affinity;
608
609#ifdef CONFIG_HARDIRQS_SW_RESEND
610int irq_set_parent(int irq, int parent_irq);
611#else
612static inline int irq_set_parent(int irq, int parent_irq)
613{
614 return 0;
615}
616#endif
617
618
619
620
621
622extern void handle_level_irq(struct irq_desc *desc);
623extern void handle_fasteoi_irq(struct irq_desc *desc);
624extern void handle_edge_irq(struct irq_desc *desc);
625extern void handle_edge_eoi_irq(struct irq_desc *desc);
626extern void handle_simple_irq(struct irq_desc *desc);
627extern void handle_untracked_irq(struct irq_desc *desc);
628extern void handle_percpu_irq(struct irq_desc *desc);
629extern void handle_percpu_devid_irq(struct irq_desc *desc);
630extern void handle_bad_irq(struct irq_desc *desc);
631extern void handle_nested_irq(unsigned int irq);
632
633extern void handle_fasteoi_nmi(struct irq_desc *desc);
634extern void handle_percpu_devid_fasteoi_nmi(struct irq_desc *desc);
635
636extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg);
637extern int irq_chip_pm_get(struct irq_data *data);
638extern int irq_chip_pm_put(struct irq_data *data);
639#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
640extern void handle_fasteoi_ack_irq(struct irq_desc *desc);
641extern void handle_fasteoi_mask_irq(struct irq_desc *desc);
642extern int irq_chip_set_parent_state(struct irq_data *data,
643 enum irqchip_irq_state which,
644 bool val);
645extern int irq_chip_get_parent_state(struct irq_data *data,
646 enum irqchip_irq_state which,
647 bool *state);
648extern void irq_chip_enable_parent(struct irq_data *data);
649extern void irq_chip_disable_parent(struct irq_data *data);
650extern void irq_chip_ack_parent(struct irq_data *data);
651extern int irq_chip_retrigger_hierarchy(struct irq_data *data);
652extern void irq_chip_mask_parent(struct irq_data *data);
653extern void irq_chip_mask_ack_parent(struct irq_data *data);
654extern void irq_chip_unmask_parent(struct irq_data *data);
655extern void irq_chip_eoi_parent(struct irq_data *data);
656extern int irq_chip_set_affinity_parent(struct irq_data *data,
657 const struct cpumask *dest,
658 bool force);
659extern int irq_chip_set_wake_parent(struct irq_data *data, unsigned int on);
660extern int irq_chip_set_vcpu_affinity_parent(struct irq_data *data,
661 void *vcpu_info);
662extern int irq_chip_set_type_parent(struct irq_data *data, unsigned int type);
663extern int irq_chip_request_resources_parent(struct irq_data *data);
664extern void irq_chip_release_resources_parent(struct irq_data *data);
665#endif
666
667
668extern void note_interrupt(struct irq_desc *desc, irqreturn_t action_ret);
669
670
671
672extern int noirqdebug_setup(char *str);
673
674
675extern int can_request_irq(unsigned int irq, unsigned long irqflags);
676
677
678extern struct irq_chip no_irq_chip;
679extern struct irq_chip dummy_irq_chip;
680
681extern void
682irq_set_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
683 irq_flow_handler_t handle, const char *name);
684
685static inline void irq_set_chip_and_handler(unsigned int irq, struct irq_chip *chip,
686 irq_flow_handler_t handle)
687{
688 irq_set_chip_and_handler_name(irq, chip, handle, NULL);
689}
690
691extern int irq_set_percpu_devid(unsigned int irq);
692extern int irq_set_percpu_devid_partition(unsigned int irq,
693 const struct cpumask *affinity);
694extern int irq_get_percpu_devid_partition(unsigned int irq,
695 struct cpumask *affinity);
696
697extern void
698__irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
699 const char *name);
700
701static inline void
702irq_set_handler(unsigned int irq, irq_flow_handler_t handle)
703{
704 __irq_set_handler(irq, handle, 0, NULL);
705}
706
707
708
709
710
711
712static inline void
713irq_set_chained_handler(unsigned int irq, irq_flow_handler_t handle)
714{
715 __irq_set_handler(irq, handle, 1, NULL);
716}
717
718
719
720
721
722
723void
724irq_set_chained_handler_and_data(unsigned int irq, irq_flow_handler_t handle,
725 void *data);
726
727void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set);
728
729static inline void irq_set_status_flags(unsigned int irq, unsigned long set)
730{
731 irq_modify_status(irq, 0, set);
732}
733
734static inline void irq_clear_status_flags(unsigned int irq, unsigned long clr)
735{
736 irq_modify_status(irq, clr, 0);
737}
738
739static inline void irq_set_noprobe(unsigned int irq)
740{
741 irq_modify_status(irq, 0, IRQ_NOPROBE);
742}
743
744static inline void irq_set_probe(unsigned int irq)
745{
746 irq_modify_status(irq, IRQ_NOPROBE, 0);
747}
748
749static inline void irq_set_nothread(unsigned int irq)
750{
751 irq_modify_status(irq, 0, IRQ_NOTHREAD);
752}
753
754static inline void irq_set_thread(unsigned int irq)
755{
756 irq_modify_status(irq, IRQ_NOTHREAD, 0);
757}
758
759static inline void irq_set_nested_thread(unsigned int irq, bool nest)
760{
761 if (nest)
762 irq_set_status_flags(irq, IRQ_NESTED_THREAD);
763 else
764 irq_clear_status_flags(irq, IRQ_NESTED_THREAD);
765}
766
767static inline void irq_set_percpu_devid_flags(unsigned int irq)
768{
769 irq_set_status_flags(irq,
770 IRQ_NOAUTOEN | IRQ_PER_CPU | IRQ_NOTHREAD |
771 IRQ_NOPROBE | IRQ_PER_CPU_DEVID);
772}
773
774
775extern int irq_set_chip(unsigned int irq, struct irq_chip *chip);
776extern int irq_set_handler_data(unsigned int irq, void *data);
777extern int irq_set_chip_data(unsigned int irq, void *data);
778extern int irq_set_irq_type(unsigned int irq, unsigned int type);
779extern int irq_set_msi_desc(unsigned int irq, struct msi_desc *entry);
780extern int irq_set_msi_desc_off(unsigned int irq_base, unsigned int irq_offset,
781 struct msi_desc *entry);
782extern struct irq_data *irq_get_irq_data(unsigned int irq);
783
784static inline struct irq_chip *irq_get_chip(unsigned int irq)
785{
786 struct irq_data *d = irq_get_irq_data(irq);
787 return d ? d->chip : NULL;
788}
789
790static inline struct irq_chip *irq_data_get_irq_chip(struct irq_data *d)
791{
792 return d->chip;
793}
794
795static inline void *irq_get_chip_data(unsigned int irq)
796{
797 struct irq_data *d = irq_get_irq_data(irq);
798 return d ? d->chip_data : NULL;
799}
800
801static inline void *irq_data_get_irq_chip_data(struct irq_data *d)
802{
803 return d->chip_data;
804}
805
806static inline void *irq_get_handler_data(unsigned int irq)
807{
808 struct irq_data *d = irq_get_irq_data(irq);
809 return d ? d->common->handler_data : NULL;
810}
811
812static inline void *irq_data_get_irq_handler_data(struct irq_data *d)
813{
814 return d->common->handler_data;
815}
816
817static inline struct msi_desc *irq_get_msi_desc(unsigned int irq)
818{
819 struct irq_data *d = irq_get_irq_data(irq);
820 return d ? d->common->msi_desc : NULL;
821}
822
823static inline struct msi_desc *irq_data_get_msi_desc(struct irq_data *d)
824{
825 return d->common->msi_desc;
826}
827
828static inline u32 irq_get_trigger_type(unsigned int irq)
829{
830 struct irq_data *d = irq_get_irq_data(irq);
831 return d ? irqd_get_trigger_type(d) : 0;
832}
833
834static inline int irq_common_data_get_node(struct irq_common_data *d)
835{
836#ifdef CONFIG_NUMA
837 return d->node;
838#else
839 return 0;
840#endif
841}
842
843static inline int irq_data_get_node(struct irq_data *d)
844{
845 return irq_common_data_get_node(d->common);
846}
847
848static inline struct cpumask *irq_get_affinity_mask(int irq)
849{
850 struct irq_data *d = irq_get_irq_data(irq);
851
852 return d ? d->common->affinity : NULL;
853}
854
855static inline struct cpumask *irq_data_get_affinity_mask(struct irq_data *d)
856{
857 return d->common->affinity;
858}
859
860#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
861static inline
862struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d)
863{
864 return d->common->effective_affinity;
865}
866static inline void irq_data_update_effective_affinity(struct irq_data *d,
867 const struct cpumask *m)
868{
869 cpumask_copy(d->common->effective_affinity, m);
870}
871#else
872static inline void irq_data_update_effective_affinity(struct irq_data *d,
873 const struct cpumask *m)
874{
875}
876static inline
877struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d)
878{
879 return d->common->affinity;
880}
881#endif
882
883unsigned int arch_dynirq_lower_bound(unsigned int from);
884
885int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
886 struct module *owner,
887 const struct irq_affinity_desc *affinity);
888
889int __devm_irq_alloc_descs(struct device *dev, int irq, unsigned int from,
890 unsigned int cnt, int node, struct module *owner,
891 const struct irq_affinity_desc *affinity);
892
893
894#define irq_alloc_descs(irq, from, cnt, node) \
895 __irq_alloc_descs(irq, from, cnt, node, THIS_MODULE, NULL)
896
897#define irq_alloc_desc(node) \
898 irq_alloc_descs(-1, 0, 1, node)
899
900#define irq_alloc_desc_at(at, node) \
901 irq_alloc_descs(at, at, 1, node)
902
903#define irq_alloc_desc_from(from, node) \
904 irq_alloc_descs(-1, from, 1, node)
905
906#define irq_alloc_descs_from(from, cnt, node) \
907 irq_alloc_descs(-1, from, cnt, node)
908
909#define devm_irq_alloc_descs(dev, irq, from, cnt, node) \
910 __devm_irq_alloc_descs(dev, irq, from, cnt, node, THIS_MODULE, NULL)
911
912#define devm_irq_alloc_desc(dev, node) \
913 devm_irq_alloc_descs(dev, -1, 0, 1, node)
914
915#define devm_irq_alloc_desc_at(dev, at, node) \
916 devm_irq_alloc_descs(dev, at, at, 1, node)
917
918#define devm_irq_alloc_desc_from(dev, from, node) \
919 devm_irq_alloc_descs(dev, -1, from, 1, node)
920
921#define devm_irq_alloc_descs_from(dev, from, cnt, node) \
922 devm_irq_alloc_descs(dev, -1, from, cnt, node)
923
924void irq_free_descs(unsigned int irq, unsigned int cnt);
925static inline void irq_free_desc(unsigned int irq)
926{
927 irq_free_descs(irq, 1);
928}
929
930#ifdef CONFIG_GENERIC_IRQ_LEGACY_ALLOC_HWIRQ
931unsigned int irq_alloc_hwirqs(int cnt, int node);
932static inline unsigned int irq_alloc_hwirq(int node)
933{
934 return irq_alloc_hwirqs(1, node);
935}
936void irq_free_hwirqs(unsigned int from, int cnt);
937static inline void irq_free_hwirq(unsigned int irq)
938{
939 return irq_free_hwirqs(irq, 1);
940}
941int arch_setup_hwirq(unsigned int irq, int node);
942void arch_teardown_hwirq(unsigned int irq);
943#endif
944
945#ifdef CONFIG_GENERIC_IRQ_LEGACY
946void irq_init_desc(unsigned int irq);
947#endif
948
949
950
951
952
953
954
955
956
957
958
959struct irq_chip_regs {
960 unsigned long enable;
961 unsigned long disable;
962 unsigned long mask;
963 unsigned long ack;
964 unsigned long eoi;
965 unsigned long type;
966 unsigned long polarity;
967};
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982struct irq_chip_type {
983 struct irq_chip chip;
984 struct irq_chip_regs regs;
985 irq_flow_handler_t handler;
986 u32 type;
987 u32 mask_cache_priv;
988 u32 *mask_cache;
989};
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024struct irq_chip_generic {
1025 raw_spinlock_t lock;
1026 void __iomem *reg_base;
1027 u32 (*reg_readl)(void __iomem *addr);
1028 void (*reg_writel)(u32 val, void __iomem *addr);
1029 void (*suspend)(struct irq_chip_generic *gc);
1030 void (*resume)(struct irq_chip_generic *gc);
1031 unsigned int irq_base;
1032 unsigned int irq_cnt;
1033 u32 mask_cache;
1034 u32 type_cache;
1035 u32 polarity_cache;
1036 u32 wake_enabled;
1037 u32 wake_active;
1038 unsigned int num_ct;
1039 void *private;
1040 unsigned long installed;
1041 unsigned long unused;
1042 struct irq_domain *domain;
1043 struct list_head list;
1044 struct irq_chip_type chip_types[];
1045};
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057enum irq_gc_flags {
1058 IRQ_GC_INIT_MASK_CACHE = 1 << 0,
1059 IRQ_GC_INIT_NESTED_LOCK = 1 << 1,
1060 IRQ_GC_MASK_CACHE_PER_TYPE = 1 << 2,
1061 IRQ_GC_NO_MASK = 1 << 3,
1062 IRQ_GC_BE_IO = 1 << 4,
1063};
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074struct irq_domain_chip_generic {
1075 unsigned int irqs_per_chip;
1076 unsigned int num_chips;
1077 unsigned int irq_flags_to_clear;
1078 unsigned int irq_flags_to_set;
1079 enum irq_gc_flags gc_flags;
1080 struct irq_chip_generic *gc[];
1081};
1082
1083
1084void irq_gc_noop(struct irq_data *d);
1085void irq_gc_mask_disable_reg(struct irq_data *d);
1086void irq_gc_mask_set_bit(struct irq_data *d);
1087void irq_gc_mask_clr_bit(struct irq_data *d);
1088void irq_gc_unmask_enable_reg(struct irq_data *d);
1089void irq_gc_ack_set_bit(struct irq_data *d);
1090void irq_gc_ack_clr_bit(struct irq_data *d);
1091void irq_gc_mask_disable_and_ack_set(struct irq_data *d);
1092void irq_gc_eoi(struct irq_data *d);
1093int irq_gc_set_wake(struct irq_data *d, unsigned int on);
1094
1095
1096int irq_map_generic_chip(struct irq_domain *d, unsigned int virq,
1097 irq_hw_number_t hw_irq);
1098struct irq_chip_generic *
1099irq_alloc_generic_chip(const char *name, int nr_ct, unsigned int irq_base,
1100 void __iomem *reg_base, irq_flow_handler_t handler);
1101void irq_setup_generic_chip(struct irq_chip_generic *gc, u32 msk,
1102 enum irq_gc_flags flags, unsigned int clr,
1103 unsigned int set);
1104int irq_setup_alt_chip(struct irq_data *d, unsigned int type);
1105void irq_remove_generic_chip(struct irq_chip_generic *gc, u32 msk,
1106 unsigned int clr, unsigned int set);
1107
1108struct irq_chip_generic *
1109devm_irq_alloc_generic_chip(struct device *dev, const char *name, int num_ct,
1110 unsigned int irq_base, void __iomem *reg_base,
1111 irq_flow_handler_t handler);
1112int devm_irq_setup_generic_chip(struct device *dev, struct irq_chip_generic *gc,
1113 u32 msk, enum irq_gc_flags flags,
1114 unsigned int clr, unsigned int set);
1115
1116struct irq_chip_generic *irq_get_domain_generic_chip(struct irq_domain *d, unsigned int hw_irq);
1117
1118int __irq_alloc_domain_generic_chips(struct irq_domain *d, int irqs_per_chip,
1119 int num_ct, const char *name,
1120 irq_flow_handler_t handler,
1121 unsigned int clr, unsigned int set,
1122 enum irq_gc_flags flags);
1123
1124#define irq_alloc_domain_generic_chips(d, irqs_per_chip, num_ct, name, \
1125 handler, clr, set, flags) \
1126({ \
1127 MAYBE_BUILD_BUG_ON(irqs_per_chip > 32); \
1128 __irq_alloc_domain_generic_chips(d, irqs_per_chip, num_ct, name,\
1129 handler, clr, set, flags); \
1130})
1131
1132static inline void irq_free_generic_chip(struct irq_chip_generic *gc)
1133{
1134 kfree(gc);
1135}
1136
1137static inline void irq_destroy_generic_chip(struct irq_chip_generic *gc,
1138 u32 msk, unsigned int clr,
1139 unsigned int set)
1140{
1141 irq_remove_generic_chip(gc, msk, clr, set);
1142 irq_free_generic_chip(gc);
1143}
1144
1145static inline struct irq_chip_type *irq_data_get_chip_type(struct irq_data *d)
1146{
1147 return container_of(d->chip, struct irq_chip_type, chip);
1148}
1149
1150#define IRQ_MSK(n) (u32)((n) < 32 ? ((1 << (n)) - 1) : UINT_MAX)
1151
1152#ifdef CONFIG_SMP
1153static inline void irq_gc_lock(struct irq_chip_generic *gc)
1154{
1155 raw_spin_lock(&gc->lock);
1156}
1157
1158static inline void irq_gc_unlock(struct irq_chip_generic *gc)
1159{
1160 raw_spin_unlock(&gc->lock);
1161}
1162#else
1163static inline void irq_gc_lock(struct irq_chip_generic *gc) { }
1164static inline void irq_gc_unlock(struct irq_chip_generic *gc) { }
1165#endif
1166
1167
1168
1169
1170
1171#define irq_gc_lock_irqsave(gc, flags) \
1172 raw_spin_lock_irqsave(&(gc)->lock, flags)
1173
1174#define irq_gc_unlock_irqrestore(gc, flags) \
1175 raw_spin_unlock_irqrestore(&(gc)->lock, flags)
1176
1177static inline void irq_reg_writel(struct irq_chip_generic *gc,
1178 u32 val, int reg_offset)
1179{
1180 if (gc->reg_writel)
1181 gc->reg_writel(val, gc->reg_base + reg_offset);
1182 else
1183 writel(val, gc->reg_base + reg_offset);
1184}
1185
1186static inline u32 irq_reg_readl(struct irq_chip_generic *gc,
1187 int reg_offset)
1188{
1189 if (gc->reg_readl)
1190 return gc->reg_readl(gc->reg_base + reg_offset);
1191 else
1192 return readl(gc->reg_base + reg_offset);
1193}
1194
1195struct irq_matrix;
1196struct irq_matrix *irq_alloc_matrix(unsigned int matrix_bits,
1197 unsigned int alloc_start,
1198 unsigned int alloc_end);
1199void irq_matrix_online(struct irq_matrix *m);
1200void irq_matrix_offline(struct irq_matrix *m);
1201void irq_matrix_assign_system(struct irq_matrix *m, unsigned int bit, bool replace);
1202int irq_matrix_reserve_managed(struct irq_matrix *m, const struct cpumask *msk);
1203void irq_matrix_remove_managed(struct irq_matrix *m, const struct cpumask *msk);
1204int irq_matrix_alloc_managed(struct irq_matrix *m, const struct cpumask *msk,
1205 unsigned int *mapped_cpu);
1206void irq_matrix_reserve(struct irq_matrix *m);
1207void irq_matrix_remove_reserved(struct irq_matrix *m);
1208int irq_matrix_alloc(struct irq_matrix *m, const struct cpumask *msk,
1209 bool reserved, unsigned int *mapped_cpu);
1210void irq_matrix_free(struct irq_matrix *m, unsigned int cpu,
1211 unsigned int bit, bool managed);
1212void irq_matrix_assign(struct irq_matrix *m, unsigned int bit);
1213unsigned int irq_matrix_available(struct irq_matrix *m, bool cpudown);
1214unsigned int irq_matrix_allocated(struct irq_matrix *m);
1215unsigned int irq_matrix_reserved(struct irq_matrix *m);
1216void irq_matrix_debug_show(struct seq_file *sf, struct irq_matrix *m, int ind);
1217
1218
1219#define INVALID_HWIRQ (~0UL)
1220irq_hw_number_t ipi_get_hwirq(unsigned int irq, unsigned int cpu);
1221int __ipi_send_single(struct irq_desc *desc, unsigned int cpu);
1222int __ipi_send_mask(struct irq_desc *desc, const struct cpumask *dest);
1223int ipi_send_single(unsigned int virq, unsigned int cpu);
1224int ipi_send_mask(unsigned int virq, const struct cpumask *dest);
1225
1226#ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER
1227
1228
1229
1230
1231
1232
1233
1234
1235int __init set_handle_irq(void (*handle_irq)(struct pt_regs *));
1236
1237
1238
1239
1240
1241extern void (*handle_arch_irq)(struct pt_regs *) __ro_after_init;
1242#endif
1243
1244#endif
1245