linux/kernel/irq/internals.h
<<
>>
Prefs
   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#include <linux/kernel_stat.h>
  10
  11#ifdef CONFIG_SPARSE_IRQ
  12# define IRQ_BITMAP_BITS        (NR_IRQS + 8196)
  13#else
  14# define IRQ_BITMAP_BITS        NR_IRQS
  15#endif
  16
  17#define istate core_internal_state__do_not_mess_with_it
  18
  19extern bool noirqdebug;
  20
  21extern struct irqaction chained_action;
  22
  23/*
  24 * Bits used by threaded handlers:
  25 * IRQTF_RUNTHREAD - signals that the interrupt handler thread should run
  26 * IRQTF_WARNED    - warning "IRQ_WAKE_THREAD w/o thread_fn" has been printed
  27 * IRQTF_AFFINITY  - irq thread is requested to adjust affinity
  28 * IRQTF_FORCED_THREAD  - irq action is force threaded
  29 */
  30enum {
  31        IRQTF_RUNTHREAD,
  32        IRQTF_WARNED,
  33        IRQTF_AFFINITY,
  34        IRQTF_FORCED_THREAD,
  35};
  36
  37/*
  38 * Bit masks for desc->core_internal_state__do_not_mess_with_it
  39 *
  40 * IRQS_AUTODETECT              - autodetection in progress
  41 * IRQS_SPURIOUS_DISABLED       - was disabled due to spurious interrupt
  42 *                                detection
  43 * IRQS_POLL_INPROGRESS         - polling in progress
  44 * IRQS_ONESHOT                 - irq is not unmasked in primary handler
  45 * IRQS_REPLAY                  - irq is replayed
  46 * IRQS_WAITING                 - irq is waiting
  47 * IRQS_PENDING                 - irq is pending and replayed later
  48 * IRQS_SUSPENDED               - irq is suspended
  49 */
  50enum {
  51        IRQS_AUTODETECT         = 0x00000001,
  52        IRQS_SPURIOUS_DISABLED  = 0x00000002,
  53        IRQS_POLL_INPROGRESS    = 0x00000008,
  54        IRQS_ONESHOT            = 0x00000020,
  55        IRQS_REPLAY             = 0x00000040,
  56        IRQS_WAITING            = 0x00000080,
  57        IRQS_PENDING            = 0x00000200,
  58        IRQS_SUSPENDED          = 0x00000800,
  59};
  60
  61#include "debug.h"
  62#include "settings.h"
  63
  64extern int __irq_set_trigger(struct irq_desc *desc, unsigned long flags);
  65extern void __disable_irq(struct irq_desc *desc);
  66extern void __enable_irq(struct irq_desc *desc);
  67
  68extern int irq_startup(struct irq_desc *desc, bool resend);
  69extern void irq_shutdown(struct irq_desc *desc);
  70extern void irq_enable(struct irq_desc *desc);
  71extern void irq_disable(struct irq_desc *desc);
  72extern void irq_percpu_enable(struct irq_desc *desc, unsigned int cpu);
  73extern void irq_percpu_disable(struct irq_desc *desc, unsigned int cpu);
  74extern void mask_irq(struct irq_desc *desc);
  75extern void unmask_irq(struct irq_desc *desc);
  76extern void unmask_threaded_irq(struct irq_desc *desc);
  77
  78#ifdef CONFIG_SPARSE_IRQ
  79static inline void irq_mark_irq(unsigned int irq) { }
  80#else
  81extern void irq_mark_irq(unsigned int irq);
  82#endif
  83
  84extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr);
  85
  86irqreturn_t handle_irq_event_percpu(struct irq_desc *desc);
  87irqreturn_t handle_irq_event(struct irq_desc *desc);
  88
  89/* Resending of interrupts :*/
  90void check_irq_resend(struct irq_desc *desc);
  91bool irq_wait_for_poll(struct irq_desc *desc);
  92void __irq_wake_thread(struct irq_desc *desc, struct irqaction *action);
  93
  94#ifdef CONFIG_PROC_FS
  95extern void register_irq_proc(unsigned int irq, struct irq_desc *desc);
  96extern void unregister_irq_proc(unsigned int irq, struct irq_desc *desc);
  97extern void register_handler_proc(unsigned int irq, struct irqaction *action);
  98extern void unregister_handler_proc(unsigned int irq, struct irqaction *action);
  99#else
 100static inline void register_irq_proc(unsigned int irq, struct irq_desc *desc) { }
 101static inline void unregister_irq_proc(unsigned int irq, struct irq_desc *desc) { }
 102static inline void register_handler_proc(unsigned int irq,
 103                                         struct irqaction *action) { }
 104static inline void unregister_handler_proc(unsigned int irq,
 105                                           struct irqaction *action) { }
 106#endif
 107
 108extern int irq_select_affinity_usr(unsigned int irq, struct cpumask *mask);
 109
 110extern void irq_set_thread_affinity(struct irq_desc *desc);
 111
 112extern int irq_do_set_affinity(struct irq_data *data,
 113                               const struct cpumask *dest, bool force);
 114
 115/* Inline functions for support of irq chips on slow busses */
 116static inline void chip_bus_lock(struct irq_desc *desc)
 117{
 118        if (unlikely(desc->irq_data.chip->irq_bus_lock))
 119                desc->irq_data.chip->irq_bus_lock(&desc->irq_data);
 120}
 121
 122static inline void chip_bus_sync_unlock(struct irq_desc *desc)
 123{
 124        if (unlikely(desc->irq_data.chip->irq_bus_sync_unlock))
 125                desc->irq_data.chip->irq_bus_sync_unlock(&desc->irq_data);
 126}
 127
 128#define _IRQ_DESC_CHECK         (1 << 0)
 129#define _IRQ_DESC_PERCPU        (1 << 1)
 130
 131#define IRQ_GET_DESC_CHECK_GLOBAL       (_IRQ_DESC_CHECK)
 132#define IRQ_GET_DESC_CHECK_PERCPU       (_IRQ_DESC_CHECK | _IRQ_DESC_PERCPU)
 133
 134#define for_each_action_of_desc(desc, act)                      \
 135        for (act = desc->act; act; act = act->next)
 136
 137struct irq_desc *
 138__irq_get_desc_lock(unsigned int irq, unsigned long *flags, bool bus,
 139                    unsigned int check);
 140void __irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags, bool bus);
 141
 142static inline struct irq_desc *
 143irq_get_desc_buslock(unsigned int irq, unsigned long *flags, unsigned int check)
 144{
 145        return __irq_get_desc_lock(irq, flags, true, check);
 146}
 147
 148static inline void
 149irq_put_desc_busunlock(struct irq_desc *desc, unsigned long flags)
 150{
 151        __irq_put_desc_unlock(desc, flags, true);
 152}
 153
 154static inline struct irq_desc *
 155irq_get_desc_lock(unsigned int irq, unsigned long *flags, unsigned int check)
 156{
 157        return __irq_get_desc_lock(irq, flags, false, check);
 158}
 159
 160static inline void
 161irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags)
 162{
 163        __irq_put_desc_unlock(desc, flags, false);
 164}
 165
 166#define __irqd_to_state(d) ACCESS_PRIVATE((d)->common, state_use_accessors)
 167
 168/*
 169 * Manipulation functions for irq_data.state
 170 */
 171static inline void irqd_set_move_pending(struct irq_data *d)
 172{
 173        __irqd_to_state(d) |= IRQD_SETAFFINITY_PENDING;
 174}
 175
 176static inline void irqd_clr_move_pending(struct irq_data *d)
 177{
 178        __irqd_to_state(d) &= ~IRQD_SETAFFINITY_PENDING;
 179}
 180
 181static inline void irqd_clear(struct irq_data *d, unsigned int mask)
 182{
 183        __irqd_to_state(d) &= ~mask;
 184}
 185
 186static inline void irqd_set(struct irq_data *d, unsigned int mask)
 187{
 188        __irqd_to_state(d) |= mask;
 189}
 190
 191static inline bool irqd_has_set(struct irq_data *d, unsigned int mask)
 192{
 193        return __irqd_to_state(d) & mask;
 194}
 195
 196#undef __irqd_to_state
 197
 198static inline void kstat_incr_irqs_this_cpu(struct irq_desc *desc)
 199{
 200        __this_cpu_inc(*desc->kstat_irqs);
 201        __this_cpu_inc(kstat.irqs_sum);
 202}
 203
 204static inline int irq_desc_get_node(struct irq_desc *desc)
 205{
 206        return irq_common_data_get_node(&desc->irq_common_data);
 207}
 208
 209static inline int irq_desc_is_chained(struct irq_desc *desc)
 210{
 211        return (desc->action && desc->action == &chained_action);
 212}
 213
 214#ifdef CONFIG_PM_SLEEP
 215bool irq_pm_check_wakeup(struct irq_desc *desc);
 216void irq_pm_install_action(struct irq_desc *desc, struct irqaction *action);
 217void irq_pm_remove_action(struct irq_desc *desc, struct irqaction *action);
 218#else
 219static inline bool irq_pm_check_wakeup(struct irq_desc *desc) { return false; }
 220static inline void
 221irq_pm_install_action(struct irq_desc *desc, struct irqaction *action) { }
 222static inline void
 223irq_pm_remove_action(struct irq_desc *desc, struct irqaction *action) { }
 224#endif
 225