LCOV - code coverage report
Current view: top level - kernel/irq - internals.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 2 11 18.2 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 0 32 0.0 %

           Branch data     Line data    Source code
       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 bool noirqdebug;
      19                 :            : 
      20                 :            : /*
      21                 :            :  * Bits used by threaded handlers:
      22                 :            :  * IRQTF_RUNTHREAD - signals that the interrupt handler thread should run
      23                 :            :  * IRQTF_WARNED    - warning "IRQ_WAKE_THREAD w/o thread_fn" has been printed
      24                 :            :  * IRQTF_AFFINITY  - irq thread is requested to adjust affinity
      25                 :            :  * IRQTF_FORCED_THREAD  - irq action is force threaded
      26                 :            :  */
      27                 :            : enum {
      28                 :            :         IRQTF_RUNTHREAD,
      29                 :            :         IRQTF_WARNED,
      30                 :            :         IRQTF_AFFINITY,
      31                 :            :         IRQTF_FORCED_THREAD,
      32                 :            : };
      33                 :            : 
      34                 :            : /*
      35                 :            :  * Bit masks for desc->state
      36                 :            :  *
      37                 :            :  * IRQS_AUTODETECT              - autodetection in progress
      38                 :            :  * IRQS_SPURIOUS_DISABLED       - was disabled due to spurious interrupt
      39                 :            :  *                                detection
      40                 :            :  * IRQS_POLL_INPROGRESS         - polling in progress
      41                 :            :  * IRQS_ONESHOT                 - irq is not unmasked in primary handler
      42                 :            :  * IRQS_REPLAY                  - irq is replayed
      43                 :            :  * IRQS_WAITING                 - irq is waiting
      44                 :            :  * IRQS_PENDING                 - irq is pending and replayed later
      45                 :            :  * IRQS_SUSPENDED               - irq is suspended
      46                 :            :  */
      47                 :            : enum {
      48                 :            :         IRQS_AUTODETECT         = 0x00000001,
      49                 :            :         IRQS_SPURIOUS_DISABLED  = 0x00000002,
      50                 :            :         IRQS_POLL_INPROGRESS    = 0x00000008,
      51                 :            :         IRQS_ONESHOT            = 0x00000020,
      52                 :            :         IRQS_REPLAY             = 0x00000040,
      53                 :            :         IRQS_WAITING            = 0x00000080,
      54                 :            :         IRQS_PENDING            = 0x00000200,
      55                 :            :         IRQS_SUSPENDED          = 0x00000800,
      56                 :            : };
      57                 :            : 
      58                 :            : #include "debug.h"
      59                 :            : #include "settings.h"
      60                 :            : 
      61                 :            : #define irq_data_to_desc(data)  container_of(data, struct irq_desc, irq_data)
      62                 :            : 
      63                 :            : extern int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
      64                 :            :                 unsigned long flags);
      65                 :            : extern void __disable_irq(struct irq_desc *desc, unsigned int irq, bool susp);
      66                 :            : extern void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume);
      67                 :            : 
      68                 :            : extern int irq_startup(struct irq_desc *desc, bool resend);
      69                 :            : extern void irq_shutdown(struct irq_desc *desc);
      70                 :            : extern void irq_enable(struct irq_desc *desc);
      71                 :            : extern void irq_disable(struct irq_desc *desc);
      72                 :            : extern void irq_percpu_enable(struct irq_desc *desc, unsigned int cpu);
      73                 :            : extern void irq_percpu_disable(struct irq_desc *desc, unsigned int cpu);
      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                 :            : extern int irq_do_set_affinity(struct irq_data *data,
     105                 :            :                                const struct cpumask *dest, bool force);
     106                 :            : 
     107                 :            : /* Inline functions for support of irq chips on slow busses */
     108                 :            : static inline void chip_bus_lock(struct irq_desc *desc)
     109                 :            : {
     110 [ #  # ][ #  # ]:          0 :         if (unlikely(desc->irq_data.chip->irq_bus_lock))
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     111                 :          0 :                 desc->irq_data.chip->irq_bus_lock(&desc->irq_data);
     112                 :            : }
     113                 :            : 
     114                 :            : static inline void chip_bus_sync_unlock(struct irq_desc *desc)
     115                 :            : {
     116   [ #  #  #  #  :          0 :         if (unlikely(desc->irq_data.chip->irq_bus_sync_unlock))
          #  #  #  #  #  
          #  #  #  #  #  
           #  # ][ #  # ]
     117                 :          0 :                 desc->irq_data.chip->irq_bus_sync_unlock(&desc->irq_data);
     118                 :            : }
     119                 :            : 
     120                 :            : #define _IRQ_DESC_CHECK         (1 << 0)
     121                 :            : #define _IRQ_DESC_PERCPU        (1 << 1)
     122                 :            : 
     123                 :            : #define IRQ_GET_DESC_CHECK_GLOBAL       (_IRQ_DESC_CHECK)
     124                 :            : #define IRQ_GET_DESC_CHECK_PERCPU       (_IRQ_DESC_CHECK | _IRQ_DESC_PERCPU)
     125                 :            : 
     126                 :            : struct irq_desc *
     127                 :            : __irq_get_desc_lock(unsigned int irq, unsigned long *flags, bool bus,
     128                 :            :                     unsigned int check);
     129                 :            : void __irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags, bool bus);
     130                 :            : 
     131                 :            : static inline struct irq_desc *
     132                 :            : irq_get_desc_buslock(unsigned int irq, unsigned long *flags, unsigned int check)
     133                 :            : {
     134                 :          0 :         return __irq_get_desc_lock(irq, flags, true, check);
     135                 :            : }
     136                 :            : 
     137                 :            : static inline void
     138                 :            : irq_put_desc_busunlock(struct irq_desc *desc, unsigned long flags)
     139                 :            : {
     140                 :          0 :         __irq_put_desc_unlock(desc, flags, true);
     141                 :            : }
     142                 :            : 
     143                 :            : static inline struct irq_desc *
     144                 :            : irq_get_desc_lock(unsigned int irq, unsigned long *flags, unsigned int check)
     145                 :            : {
     146                 :          0 :         return __irq_get_desc_lock(irq, flags, false, check);
     147                 :            : }
     148                 :            : 
     149                 :            : static inline void
     150                 :            : irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags)
     151                 :            : {
     152                 :          0 :         __irq_put_desc_unlock(desc, flags, false);
     153                 :            : }
     154                 :            : 
     155                 :            : /*
     156                 :            :  * Manipulation functions for irq_data.state
     157                 :            :  */
     158                 :            : static inline void irqd_set_move_pending(struct irq_data *d)
     159                 :            : {
     160                 :            :         d->state_use_accessors |= IRQD_SETAFFINITY_PENDING;
     161                 :            : }
     162                 :            : 
     163                 :            : static inline void irqd_clr_move_pending(struct irq_data *d)
     164                 :            : {
     165                 :            :         d->state_use_accessors &= ~IRQD_SETAFFINITY_PENDING;
     166                 :            : }
     167                 :            : 
     168                 :            : static inline void irqd_clear(struct irq_data *d, unsigned int mask)
     169                 :            : {
     170                 :    3091276 :         d->state_use_accessors &= ~mask;
     171                 :            : }
     172                 :            : 
     173                 :            : static inline void irqd_set(struct irq_data *d, unsigned int mask)
     174                 :            : {
     175                 :    3091268 :         d->state_use_accessors |= mask;
     176                 :            : }
     177                 :            : 
     178                 :            : static inline bool irqd_has_set(struct irq_data *d, unsigned int mask)
     179                 :            : {
     180                 :          0 :         return d->state_use_accessors & mask;
     181                 :            : }

Generated by: LCOV version 1.9