Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/kernel/irq/internals.h
10818 views
1
/*
2
* IRQ subsystem internal functions and variables:
3
*
4
* Do not ever include this file from anything else than
5
* kernel/irq/. Do not even think about using any information outside
6
* of this file for your non core code.
7
*/
8
#include <linux/irqdesc.h>
9
10
#ifdef CONFIG_SPARSE_IRQ
11
# define IRQ_BITMAP_BITS (NR_IRQS + 8196)
12
#else
13
# define IRQ_BITMAP_BITS NR_IRQS
14
#endif
15
16
#define istate core_internal_state__do_not_mess_with_it
17
18
extern int noirqdebug;
19
20
/*
21
* Bits used by threaded handlers:
22
* IRQTF_RUNTHREAD - signals that the interrupt handler thread should run
23
* IRQTF_DIED - handler thread died
24
* IRQTF_WARNED - warning "IRQ_WAKE_THREAD w/o thread_fn" has been printed
25
* IRQTF_AFFINITY - irq thread is requested to adjust affinity
26
* IRQTF_FORCED_THREAD - irq action is force threaded
27
*/
28
enum {
29
IRQTF_RUNTHREAD,
30
IRQTF_DIED,
31
IRQTF_WARNED,
32
IRQTF_AFFINITY,
33
IRQTF_FORCED_THREAD,
34
};
35
36
/*
37
* Bit masks for desc->state
38
*
39
* IRQS_AUTODETECT - autodetection in progress
40
* IRQS_SPURIOUS_DISABLED - was disabled due to spurious interrupt
41
* detection
42
* IRQS_POLL_INPROGRESS - polling in progress
43
* IRQS_ONESHOT - irq is not unmasked in primary handler
44
* IRQS_REPLAY - irq is replayed
45
* IRQS_WAITING - irq is waiting
46
* IRQS_PENDING - irq is pending and replayed later
47
* IRQS_SUSPENDED - irq is suspended
48
*/
49
enum {
50
IRQS_AUTODETECT = 0x00000001,
51
IRQS_SPURIOUS_DISABLED = 0x00000002,
52
IRQS_POLL_INPROGRESS = 0x00000008,
53
IRQS_ONESHOT = 0x00000020,
54
IRQS_REPLAY = 0x00000040,
55
IRQS_WAITING = 0x00000080,
56
IRQS_PENDING = 0x00000200,
57
IRQS_SUSPENDED = 0x00000800,
58
};
59
60
#include "debug.h"
61
#include "settings.h"
62
63
#define irq_data_to_desc(data) container_of(data, struct irq_desc, irq_data)
64
65
extern int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
66
unsigned long flags);
67
extern void __disable_irq(struct irq_desc *desc, unsigned int irq, bool susp);
68
extern void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume);
69
70
extern int irq_startup(struct irq_desc *desc);
71
extern void irq_shutdown(struct irq_desc *desc);
72
extern void irq_enable(struct irq_desc *desc);
73
extern void irq_disable(struct irq_desc *desc);
74
extern void mask_irq(struct irq_desc *desc);
75
extern void unmask_irq(struct irq_desc *desc);
76
77
extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr);
78
79
irqreturn_t handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action);
80
irqreturn_t handle_irq_event(struct irq_desc *desc);
81
82
/* Resending of interrupts :*/
83
void check_irq_resend(struct irq_desc *desc, unsigned int irq);
84
bool irq_wait_for_poll(struct irq_desc *desc);
85
86
#ifdef CONFIG_PROC_FS
87
extern void register_irq_proc(unsigned int irq, struct irq_desc *desc);
88
extern void unregister_irq_proc(unsigned int irq, struct irq_desc *desc);
89
extern void register_handler_proc(unsigned int irq, struct irqaction *action);
90
extern void unregister_handler_proc(unsigned int irq, struct irqaction *action);
91
#else
92
static inline void register_irq_proc(unsigned int irq, struct irq_desc *desc) { }
93
static inline void unregister_irq_proc(unsigned int irq, struct irq_desc *desc) { }
94
static inline void register_handler_proc(unsigned int irq,
95
struct irqaction *action) { }
96
static inline void unregister_handler_proc(unsigned int irq,
97
struct irqaction *action) { }
98
#endif
99
100
extern int irq_select_affinity_usr(unsigned int irq, struct cpumask *mask);
101
102
extern void irq_set_thread_affinity(struct irq_desc *desc);
103
104
/* Inline functions for support of irq chips on slow busses */
105
static inline void chip_bus_lock(struct irq_desc *desc)
106
{
107
if (unlikely(desc->irq_data.chip->irq_bus_lock))
108
desc->irq_data.chip->irq_bus_lock(&desc->irq_data);
109
}
110
111
static inline void chip_bus_sync_unlock(struct irq_desc *desc)
112
{
113
if (unlikely(desc->irq_data.chip->irq_bus_sync_unlock))
114
desc->irq_data.chip->irq_bus_sync_unlock(&desc->irq_data);
115
}
116
117
struct irq_desc *
118
__irq_get_desc_lock(unsigned int irq, unsigned long *flags, bool bus);
119
void __irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags, bool bus);
120
121
static inline struct irq_desc *
122
irq_get_desc_buslock(unsigned int irq, unsigned long *flags)
123
{
124
return __irq_get_desc_lock(irq, flags, true);
125
}
126
127
static inline void
128
irq_put_desc_busunlock(struct irq_desc *desc, unsigned long flags)
129
{
130
__irq_put_desc_unlock(desc, flags, true);
131
}
132
133
static inline struct irq_desc *
134
irq_get_desc_lock(unsigned int irq, unsigned long *flags)
135
{
136
return __irq_get_desc_lock(irq, flags, false);
137
}
138
139
static inline void
140
irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags)
141
{
142
__irq_put_desc_unlock(desc, flags, false);
143
}
144
145
/*
146
* Manipulation functions for irq_data.state
147
*/
148
static inline void irqd_set_move_pending(struct irq_data *d)
149
{
150
d->state_use_accessors |= IRQD_SETAFFINITY_PENDING;
151
}
152
153
static inline void irqd_clr_move_pending(struct irq_data *d)
154
{
155
d->state_use_accessors &= ~IRQD_SETAFFINITY_PENDING;
156
}
157
158
static inline void irqd_clear(struct irq_data *d, unsigned int mask)
159
{
160
d->state_use_accessors &= ~mask;
161
}
162
163
static inline void irqd_set(struct irq_data *d, unsigned int mask)
164
{
165
d->state_use_accessors |= mask;
166
}
167
168
static inline bool irqd_has_set(struct irq_data *d, unsigned int mask)
169
{
170
return d->state_use_accessors & mask;
171
}
172
173