1
2#ifndef _LINUX_INTERRUPT_H
3#define _LINUX_INTERRUPT_H
4
5#include <linux/kernel.h>
6#include <linux/linkage.h>
7#include <linux/bitops.h>
8#include <linux/preempt.h>
9#include <linux/cpumask.h>
10#include <linux/irqreturn.h>
11#include <linux/irqnr.h>
12#include <linux/hardirq.h>
13#include <linux/irqflags.h>
14#include <linux/hrtimer.h>
15#include <linux/kref.h>
16#include <linux/workqueue.h>
17
18#include <linux/atomic.h>
19#include <asm/ptrace.h>
20#include <asm/irq.h>
21
22
23
24
25
26
27
28
29#define IRQF_TRIGGER_NONE 0x00000000
30#define IRQF_TRIGGER_RISING 0x00000001
31#define IRQF_TRIGGER_FALLING 0x00000002
32#define IRQF_TRIGGER_HIGH 0x00000004
33#define IRQF_TRIGGER_LOW 0x00000008
34#define IRQF_TRIGGER_MASK (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
35 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
36#define IRQF_TRIGGER_PROBE 0x00000010
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#define IRQF_SHARED 0x00000080
66#define IRQF_PROBE_SHARED 0x00000100
67#define __IRQF_TIMER 0x00000200
68#define IRQF_PERCPU 0x00000400
69#define IRQF_NOBALANCING 0x00000800
70#define IRQF_IRQPOLL 0x00001000
71#define IRQF_ONESHOT 0x00002000
72#define IRQF_NO_SUSPEND 0x00004000
73#define IRQF_FORCE_RESUME 0x00008000
74#define IRQF_NO_THREAD 0x00010000
75#define IRQF_EARLY_RESUME 0x00020000
76#define IRQF_COND_SUSPEND 0x00040000
77
78#define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD)
79
80
81
82
83
84
85
86
87enum {
88 IRQC_IS_HARDIRQ = 0,
89 IRQC_IS_NESTED,
90};
91
92typedef irqreturn_t (*irq_handler_t)(int, void *);
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110struct irqaction {
111 irq_handler_t handler;
112 void *dev_id;
113 void __percpu *percpu_dev_id;
114 struct irqaction *next;
115 irq_handler_t thread_fn;
116 struct task_struct *thread;
117 struct irqaction *secondary;
118 unsigned int irq;
119 unsigned int flags;
120 unsigned long thread_flags;
121 unsigned long thread_mask;
122 const char *name;
123 struct proc_dir_entry *dir;
124} ____cacheline_internodealigned_in_smp;
125
126extern irqreturn_t no_action(int cpl, void *dev_id);
127
128
129
130
131
132
133
134
135
136#define IRQ_NOTCONNECTED (1U << 31)
137
138extern int __must_check
139request_threaded_irq(unsigned int irq, irq_handler_t handler,
140 irq_handler_t thread_fn,
141 unsigned long flags, const char *name, void *dev);
142
143static inline int __must_check
144request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
145 const char *name, void *dev)
146{
147 return request_threaded_irq(irq, handler, NULL, flags, name, dev);
148}
149
150extern int __must_check
151request_any_context_irq(unsigned int irq, irq_handler_t handler,
152 unsigned long flags, const char *name, void *dev_id);
153
154extern int __must_check
155request_percpu_irq(unsigned int irq, irq_handler_t handler,
156 const char *devname, void __percpu *percpu_dev_id);
157
158extern void free_irq(unsigned int, void *);
159extern void free_percpu_irq(unsigned int, void __percpu *);
160
161struct device;
162
163extern int __must_check
164devm_request_threaded_irq(struct device *dev, unsigned int irq,
165 irq_handler_t handler, irq_handler_t thread_fn,
166 unsigned long irqflags, const char *devname,
167 void *dev_id);
168
169static inline int __must_check
170devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler,
171 unsigned long irqflags, const char *devname, void *dev_id)
172{
173 return devm_request_threaded_irq(dev, irq, handler, NULL, irqflags,
174 devname, dev_id);
175}
176
177extern int __must_check
178devm_request_any_context_irq(struct device *dev, unsigned int irq,
179 irq_handler_t handler, unsigned long irqflags,
180 const char *devname, void *dev_id);
181
182extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id);
183
184
185
186
187
188
189
190
191
192
193
194
195
196#ifdef CONFIG_LOCKDEP
197# define local_irq_enable_in_hardirq() do { } while (0)
198#else
199# define local_irq_enable_in_hardirq() local_irq_enable()
200#endif
201
202extern void disable_irq_nosync(unsigned int irq);
203extern bool disable_hardirq(unsigned int irq);
204extern void disable_irq(unsigned int irq);
205extern void disable_percpu_irq(unsigned int irq);
206extern void enable_irq(unsigned int irq);
207extern void enable_percpu_irq(unsigned int irq, unsigned int type);
208extern bool irq_percpu_is_enabled(unsigned int irq);
209extern void irq_wake_thread(unsigned int irq, void *dev_id);
210
211
212extern void suspend_device_irqs(void);
213extern void resume_device_irqs(void);
214
215
216
217
218
219
220
221
222
223
224
225
226
227struct irq_affinity_notify {
228 unsigned int irq;
229 struct kref kref;
230 struct work_struct work;
231 void (*notify)(struct irq_affinity_notify *, const cpumask_t *mask);
232 void (*release)(struct kref *ref);
233};
234
235#if defined(CONFIG_SMP)
236
237extern cpumask_var_t irq_default_affinity;
238
239
240extern int __irq_set_affinity(unsigned int irq, const struct cpumask *cpumask,
241 bool force);
242
243
244
245
246
247
248
249
250static inline int
251irq_set_affinity(unsigned int irq, const struct cpumask *cpumask)
252{
253 return __irq_set_affinity(irq, cpumask, false);
254}
255
256
257
258
259
260
261
262
263
264
265
266
267static inline int
268irq_force_affinity(unsigned int irq, const struct cpumask *cpumask)
269{
270 return __irq_set_affinity(irq, cpumask, true);
271}
272
273extern int irq_can_set_affinity(unsigned int irq);
274extern int irq_select_affinity(unsigned int irq);
275
276extern int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m);
277
278extern int
279irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify);
280
281struct cpumask *irq_create_affinity_masks(const struct cpumask *affinity, int nvec);
282int irq_calc_affinity_vectors(const struct cpumask *affinity, int maxvec);
283
284#else
285
286static inline int irq_set_affinity(unsigned int irq, const struct cpumask *m)
287{
288 return -EINVAL;
289}
290
291static inline int irq_force_affinity(unsigned int irq, const struct cpumask *cpumask)
292{
293 return 0;
294}
295
296static inline int irq_can_set_affinity(unsigned int irq)
297{
298 return 0;
299}
300
301static inline int irq_select_affinity(unsigned int irq) { return 0; }
302
303static inline int irq_set_affinity_hint(unsigned int irq,
304 const struct cpumask *m)
305{
306 return -EINVAL;
307}
308
309static inline int
310irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify)
311{
312 return 0;
313}
314
315static inline struct cpumask *
316irq_create_affinity_masks(const struct cpumask *affinity, int nvec)
317{
318 return NULL;
319}
320
321static inline int
322irq_calc_affinity_vectors(const struct cpumask *affinity, int maxvec)
323{
324 return maxvec;
325}
326
327#endif
328
329
330
331
332
333
334
335
336
337
338
339
340static inline void disable_irq_nosync_lockdep(unsigned int irq)
341{
342 disable_irq_nosync(irq);
343#ifdef CONFIG_LOCKDEP
344 local_irq_disable();
345#endif
346}
347
348static inline void disable_irq_nosync_lockdep_irqsave(unsigned int irq, unsigned long *flags)
349{
350 disable_irq_nosync(irq);
351#ifdef CONFIG_LOCKDEP
352 local_irq_save(*flags);
353#endif
354}
355
356static inline void disable_irq_lockdep(unsigned int irq)
357{
358 disable_irq(irq);
359#ifdef CONFIG_LOCKDEP
360 local_irq_disable();
361#endif
362}
363
364static inline void enable_irq_lockdep(unsigned int irq)
365{
366#ifdef CONFIG_LOCKDEP
367 local_irq_enable();
368#endif
369 enable_irq(irq);
370}
371
372static inline void enable_irq_lockdep_irqrestore(unsigned int irq, unsigned long *flags)
373{
374#ifdef CONFIG_LOCKDEP
375 local_irq_restore(*flags);
376#endif
377 enable_irq(irq);
378}
379
380
381extern int irq_set_irq_wake(unsigned int irq, unsigned int on);
382
383static inline int enable_irq_wake(unsigned int irq)
384{
385 return irq_set_irq_wake(irq, 1);
386}
387
388static inline int disable_irq_wake(unsigned int irq)
389{
390 return irq_set_irq_wake(irq, 0);
391}
392
393
394
395
396enum irqchip_irq_state {
397 IRQCHIP_STATE_PENDING,
398 IRQCHIP_STATE_ACTIVE,
399 IRQCHIP_STATE_MASKED,
400 IRQCHIP_STATE_LINE_LEVEL,
401};
402
403extern int irq_get_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
404 bool *state);
405extern int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,
406 bool state);
407
408#ifdef CONFIG_IRQ_FORCED_THREADING
409extern bool force_irqthreads;
410#else
411#define force_irqthreads (0)
412#endif
413
414#ifndef __ARCH_SET_SOFTIRQ_PENDING
415#define set_softirq_pending(x) (local_softirq_pending() = (x))
416#define or_softirq_pending(x) (local_softirq_pending() |= (x))
417#endif
418
419
420
421
422
423
424
425#ifndef hard_irq_disable
426#define hard_irq_disable() do { } while(0)
427#endif
428
429
430
431
432
433
434
435enum
436{
437 HI_SOFTIRQ=0,
438 TIMER_SOFTIRQ,
439 NET_TX_SOFTIRQ,
440 NET_RX_SOFTIRQ,
441 BLOCK_SOFTIRQ,
442 IRQ_POLL_SOFTIRQ,
443 TASKLET_SOFTIRQ,
444 SCHED_SOFTIRQ,
445 HRTIMER_SOFTIRQ,
446
447 RCU_SOFTIRQ,
448
449 NR_SOFTIRQS
450};
451
452#define SOFTIRQ_STOP_IDLE_MASK (~(1 << RCU_SOFTIRQ))
453
454
455
456
457extern const char * const softirq_to_name[NR_SOFTIRQS];
458
459
460
461
462
463struct softirq_action
464{
465 void (*action)(struct softirq_action *);
466};
467
468asmlinkage void do_softirq(void);
469asmlinkage void __do_softirq(void);
470
471#ifdef __ARCH_HAS_DO_SOFTIRQ
472void do_softirq_own_stack(void);
473#else
474static inline void do_softirq_own_stack(void)
475{
476 __do_softirq();
477}
478#endif
479
480extern void open_softirq(int nr, void (*action)(struct softirq_action *));
481extern void softirq_init(void);
482extern void __raise_softirq_irqoff(unsigned int nr);
483
484extern void raise_softirq_irqoff(unsigned int nr);
485extern void raise_softirq(unsigned int nr);
486
487DECLARE_PER_CPU(struct task_struct *, ksoftirqd);
488
489static inline struct task_struct *this_cpu_ksoftirqd(void)
490{
491 return this_cpu_read(ksoftirqd);
492}
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514struct tasklet_struct
515{
516 struct tasklet_struct *next;
517 unsigned long state;
518 atomic_t count;
519 void (*func)(unsigned long);
520 unsigned long data;
521};
522
523#define DECLARE_TASKLET(name, func, data) \
524struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
525
526#define DECLARE_TASKLET_DISABLED(name, func, data) \
527struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }
528
529
530enum
531{
532 TASKLET_STATE_SCHED,
533 TASKLET_STATE_RUN
534};
535
536#ifdef CONFIG_SMP
537static inline int tasklet_trylock(struct tasklet_struct *t)
538{
539 return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state);
540}
541
542static inline void tasklet_unlock(struct tasklet_struct *t)
543{
544 smp_mb__before_atomic();
545 clear_bit(TASKLET_STATE_RUN, &(t)->state);
546}
547
548static inline void tasklet_unlock_wait(struct tasklet_struct *t)
549{
550 while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); }
551}
552#else
553#define tasklet_trylock(t) 1
554#define tasklet_unlock_wait(t) do { } while (0)
555#define tasklet_unlock(t) do { } while (0)
556#endif
557
558extern void __tasklet_schedule(struct tasklet_struct *t);
559
560static inline void tasklet_schedule(struct tasklet_struct *t)
561{
562 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
563 __tasklet_schedule(t);
564}
565
566extern void __tasklet_hi_schedule(struct tasklet_struct *t);
567
568static inline void tasklet_hi_schedule(struct tasklet_struct *t)
569{
570 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
571 __tasklet_hi_schedule(t);
572}
573
574extern void __tasklet_hi_schedule_first(struct tasklet_struct *t);
575
576
577
578
579
580
581
582static inline void tasklet_hi_schedule_first(struct tasklet_struct *t)
583{
584 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
585 __tasklet_hi_schedule_first(t);
586}
587
588
589static inline void tasklet_disable_nosync(struct tasklet_struct *t)
590{
591 atomic_inc(&t->count);
592 smp_mb__after_atomic();
593}
594
595static inline void tasklet_disable(struct tasklet_struct *t)
596{
597 tasklet_disable_nosync(t);
598 tasklet_unlock_wait(t);
599 smp_mb();
600}
601
602static inline void tasklet_enable(struct tasklet_struct *t)
603{
604 smp_mb__before_atomic();
605 atomic_dec(&t->count);
606}
607
608extern void tasklet_kill(struct tasklet_struct *t);
609extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu);
610extern void tasklet_init(struct tasklet_struct *t,
611 void (*func)(unsigned long), unsigned long data);
612
613struct tasklet_hrtimer {
614 struct hrtimer timer;
615 struct tasklet_struct tasklet;
616 enum hrtimer_restart (*function)(struct hrtimer *);
617};
618
619extern void
620tasklet_hrtimer_init(struct tasklet_hrtimer *ttimer,
621 enum hrtimer_restart (*function)(struct hrtimer *),
622 clockid_t which_clock, enum hrtimer_mode mode);
623
624static inline
625void tasklet_hrtimer_start(struct tasklet_hrtimer *ttimer, ktime_t time,
626 const enum hrtimer_mode mode)
627{
628 hrtimer_start(&ttimer->timer, time, mode);
629}
630
631static inline
632void tasklet_hrtimer_cancel(struct tasklet_hrtimer *ttimer)
633{
634 hrtimer_cancel(&ttimer->timer);
635 tasklet_kill(&ttimer->tasklet);
636}
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666#if !defined(CONFIG_GENERIC_IRQ_PROBE)
667static inline unsigned long probe_irq_on(void)
668{
669 return 0;
670}
671static inline int probe_irq_off(unsigned long val)
672{
673 return 0;
674}
675static inline unsigned int probe_irq_mask(unsigned long val)
676{
677 return 0;
678}
679#else
680extern unsigned long probe_irq_on(void);
681extern int probe_irq_off(unsigned long);
682extern unsigned int probe_irq_mask(unsigned long);
683#endif
684
685#ifdef CONFIG_PROC_FS
686
687extern void init_irq_proc(void);
688#else
689static inline void init_irq_proc(void)
690{
691}
692#endif
693
694struct seq_file;
695int show_interrupts(struct seq_file *p, void *v);
696int arch_show_interrupts(struct seq_file *p, int prec);
697
698extern int early_irq_init(void);
699extern int arch_probe_nr_irqs(void);
700extern int arch_early_irq_init(void);
701
702#if defined(CONFIG_FUNCTION_GRAPH_TRACER) || defined(CONFIG_KASAN)
703
704
705
706#define __irq_entry __attribute__((__section__(".irqentry.text")))
707#define __softirq_entry \
708 __attribute__((__section__(".softirqentry.text")))
709
710
711extern char __irqentry_text_start[];
712extern char __irqentry_text_end[];
713
714extern char __softirqentry_text_start[];
715extern char __softirqentry_text_end[];
716
717#else
718#define __irq_entry
719#define __softirq_entry
720#endif
721
722#endif
723