LCOV - code coverage report
Current view: top level - kernel/irq - internals.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 13 20 65.0 %
Date: 2023-04-06 08:38:28 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : /*
       3             :  * IRQ subsystem internal functions and variables:
       4             :  *
       5             :  * Do not ever include this file from anything else than
       6             :  * kernel/irq/. Do not even think about using any information outside
       7             :  * of this file for your non core code.
       8             :  */
       9             : #include <linux/irqdesc.h>
      10             : #include <linux/kernel_stat.h>
      11             : #include <linux/pm_runtime.h>
      12             : #include <linux/sched/clock.h>
      13             : 
      14             : #ifdef CONFIG_SPARSE_IRQ
      15             : # define IRQ_BITMAP_BITS        (NR_IRQS + 8196)
      16             : #else
      17             : # define IRQ_BITMAP_BITS        NR_IRQS
      18             : #endif
      19             : 
      20             : #define istate core_internal_state__do_not_mess_with_it
      21             : 
      22             : extern bool noirqdebug;
      23             : 
      24             : extern struct irqaction chained_action;
      25             : 
      26             : /*
      27             :  * Bits used by threaded handlers:
      28             :  * IRQTF_RUNTHREAD - signals that the interrupt handler thread should run
      29             :  * IRQTF_WARNED    - warning "IRQ_WAKE_THREAD w/o thread_fn" has been printed
      30             :  * IRQTF_AFFINITY  - irq thread is requested to adjust affinity
      31             :  * IRQTF_FORCED_THREAD  - irq action is force threaded
      32             :  * IRQTF_READY     - signals that irq thread is ready
      33             :  */
      34             : enum {
      35             :         IRQTF_RUNTHREAD,
      36             :         IRQTF_WARNED,
      37             :         IRQTF_AFFINITY,
      38             :         IRQTF_FORCED_THREAD,
      39             :         IRQTF_READY,
      40             : };
      41             : 
      42             : /*
      43             :  * Bit masks for desc->core_internal_state__do_not_mess_with_it
      44             :  *
      45             :  * IRQS_AUTODETECT              - autodetection in progress
      46             :  * IRQS_SPURIOUS_DISABLED       - was disabled due to spurious interrupt
      47             :  *                                detection
      48             :  * IRQS_POLL_INPROGRESS         - polling in progress
      49             :  * IRQS_ONESHOT                 - irq is not unmasked in primary handler
      50             :  * IRQS_REPLAY                  - irq is replayed
      51             :  * IRQS_WAITING                 - irq is waiting
      52             :  * IRQS_PENDING                 - irq is pending and replayed later
      53             :  * IRQS_SUSPENDED               - irq is suspended
      54             :  * IRQS_NMI                     - irq line is used to deliver NMIs
      55             :  * IRQS_SYSFS                   - descriptor has been added to sysfs
      56             :  */
      57             : enum {
      58             :         IRQS_AUTODETECT         = 0x00000001,
      59             :         IRQS_SPURIOUS_DISABLED  = 0x00000002,
      60             :         IRQS_POLL_INPROGRESS    = 0x00000008,
      61             :         IRQS_ONESHOT            = 0x00000020,
      62             :         IRQS_REPLAY             = 0x00000040,
      63             :         IRQS_WAITING            = 0x00000080,
      64             :         IRQS_PENDING            = 0x00000200,
      65             :         IRQS_SUSPENDED          = 0x00000800,
      66             :         IRQS_TIMINGS            = 0x00001000,
      67             :         IRQS_NMI                = 0x00002000,
      68             :         IRQS_SYSFS              = 0x00004000,
      69             : };
      70             : 
      71             : #include "debug.h"
      72             : #include "settings.h"
      73             : 
      74             : extern int __irq_set_trigger(struct irq_desc *desc, unsigned long flags);
      75             : extern void __disable_irq(struct irq_desc *desc);
      76             : extern void __enable_irq(struct irq_desc *desc);
      77             : 
      78             : #define IRQ_RESEND      true
      79             : #define IRQ_NORESEND    false
      80             : 
      81             : #define IRQ_START_FORCE true
      82             : #define IRQ_START_COND  false
      83             : 
      84             : extern int irq_activate(struct irq_desc *desc);
      85             : extern int irq_activate_and_startup(struct irq_desc *desc, bool resend);
      86             : extern int irq_startup(struct irq_desc *desc, bool resend, bool force);
      87             : 
      88             : extern void irq_shutdown(struct irq_desc *desc);
      89             : extern void irq_shutdown_and_deactivate(struct irq_desc *desc);
      90             : extern void irq_enable(struct irq_desc *desc);
      91             : extern void irq_disable(struct irq_desc *desc);
      92             : extern void irq_percpu_enable(struct irq_desc *desc, unsigned int cpu);
      93             : extern void irq_percpu_disable(struct irq_desc *desc, unsigned int cpu);
      94             : extern void mask_irq(struct irq_desc *desc);
      95             : extern void unmask_irq(struct irq_desc *desc);
      96             : extern void unmask_threaded_irq(struct irq_desc *desc);
      97             : 
      98             : #ifdef CONFIG_SPARSE_IRQ
      99             : static inline void irq_mark_irq(unsigned int irq) { }
     100             : #else
     101             : extern void irq_mark_irq(unsigned int irq);
     102             : #endif
     103             : 
     104             : extern int __irq_get_irqchip_state(struct irq_data *data,
     105             :                                    enum irqchip_irq_state which,
     106             :                                    bool *state);
     107             : 
     108             : extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr);
     109             : 
     110             : irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc);
     111             : irqreturn_t handle_irq_event_percpu(struct irq_desc *desc);
     112             : irqreturn_t handle_irq_event(struct irq_desc *desc);
     113             : 
     114             : /* Resending of interrupts :*/
     115             : int check_irq_resend(struct irq_desc *desc, bool inject);
     116             : bool irq_wait_for_poll(struct irq_desc *desc);
     117             : void __irq_wake_thread(struct irq_desc *desc, struct irqaction *action);
     118             : 
     119             : #ifdef CONFIG_PROC_FS
     120             : extern void register_irq_proc(unsigned int irq, struct irq_desc *desc);
     121             : extern void unregister_irq_proc(unsigned int irq, struct irq_desc *desc);
     122             : extern void register_handler_proc(unsigned int irq, struct irqaction *action);
     123             : extern void unregister_handler_proc(unsigned int irq, struct irqaction *action);
     124             : #else
     125             : static inline void register_irq_proc(unsigned int irq, struct irq_desc *desc) { }
     126             : static inline void unregister_irq_proc(unsigned int irq, struct irq_desc *desc) { }
     127             : static inline void register_handler_proc(unsigned int irq,
     128             :                                          struct irqaction *action) { }
     129             : static inline void unregister_handler_proc(unsigned int irq,
     130             :                                            struct irqaction *action) { }
     131             : #endif
     132             : 
     133             : extern bool irq_can_set_affinity_usr(unsigned int irq);
     134             : 
     135             : extern void irq_set_thread_affinity(struct irq_desc *desc);
     136             : 
     137             : extern int irq_do_set_affinity(struct irq_data *data,
     138             :                                const struct cpumask *dest, bool force);
     139             : 
     140             : #ifdef CONFIG_SMP
     141             : extern int irq_setup_affinity(struct irq_desc *desc);
     142             : #else
     143             : static inline int irq_setup_affinity(struct irq_desc *desc) { return 0; }
     144             : #endif
     145             : 
     146             : /* Inline functions for support of irq chips on slow busses */
     147             : static inline void chip_bus_lock(struct irq_desc *desc)
     148             : {
     149          66 :         if (unlikely(desc->irq_data.chip->irq_bus_lock))
     150           0 :                 desc->irq_data.chip->irq_bus_lock(&desc->irq_data);
     151             : }
     152             : 
     153             : static inline void chip_bus_sync_unlock(struct irq_desc *desc)
     154             : {
     155          66 :         if (unlikely(desc->irq_data.chip->irq_bus_sync_unlock))
     156           0 :                 desc->irq_data.chip->irq_bus_sync_unlock(&desc->irq_data);
     157             : }
     158             : 
     159             : #define _IRQ_DESC_CHECK         (1 << 0)
     160             : #define _IRQ_DESC_PERCPU        (1 << 1)
     161             : 
     162             : #define IRQ_GET_DESC_CHECK_GLOBAL       (_IRQ_DESC_CHECK)
     163             : #define IRQ_GET_DESC_CHECK_PERCPU       (_IRQ_DESC_CHECK | _IRQ_DESC_PERCPU)
     164             : 
     165             : #define for_each_action_of_desc(desc, act)                      \
     166             :         for (act = desc->action; act; act = act->next)
     167             : 
     168             : struct irq_desc *
     169             : __irq_get_desc_lock(unsigned int irq, unsigned long *flags, bool bus,
     170             :                     unsigned int check);
     171             : void __irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags, bool bus);
     172             : 
     173             : static inline struct irq_desc *
     174             : irq_get_desc_buslock(unsigned int irq, unsigned long *flags, unsigned int check)
     175             : {
     176          64 :         return __irq_get_desc_lock(irq, flags, true, check);
     177             : }
     178             : 
     179             : static inline void
     180             : irq_put_desc_busunlock(struct irq_desc *desc, unsigned long flags)
     181             : {
     182          64 :         __irq_put_desc_unlock(desc, flags, true);
     183             : }
     184             : 
     185             : static inline struct irq_desc *
     186             : irq_get_desc_lock(unsigned int irq, unsigned long *flags, unsigned int check)
     187             : {
     188          64 :         return __irq_get_desc_lock(irq, flags, false, check);
     189             : }
     190             : 
     191             : static inline void
     192             : irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags)
     193             : {
     194          64 :         __irq_put_desc_unlock(desc, flags, false);
     195             : }
     196             : 
     197             : #define __irqd_to_state(d) ACCESS_PRIVATE((d)->common, state_use_accessors)
     198             : 
     199             : static inline unsigned int irqd_get(struct irq_data *d)
     200             : {
     201             :         return __irqd_to_state(d);
     202             : }
     203             : 
     204             : /*
     205             :  * Manipulation functions for irq_data.state
     206             :  */
     207             : static inline void irqd_set_move_pending(struct irq_data *d)
     208             : {
     209             :         __irqd_to_state(d) |= IRQD_SETAFFINITY_PENDING;
     210             : }
     211             : 
     212             : static inline void irqd_clr_move_pending(struct irq_data *d)
     213             : {
     214             :         __irqd_to_state(d) &= ~IRQD_SETAFFINITY_PENDING;
     215             : }
     216             : 
     217             : static inline void irqd_set_managed_shutdown(struct irq_data *d)
     218             : {
     219           0 :         __irqd_to_state(d) |= IRQD_MANAGED_SHUTDOWN;
     220             : }
     221             : 
     222             : static inline void irqd_clr_managed_shutdown(struct irq_data *d)
     223             : {
     224             :         __irqd_to_state(d) &= ~IRQD_MANAGED_SHUTDOWN;
     225             : }
     226             : 
     227             : static inline void irqd_clear(struct irq_data *d, unsigned int mask)
     228             : {
     229        2757 :         __irqd_to_state(d) &= ~mask;
     230             : }
     231             : 
     232             : static inline void irqd_set(struct irq_data *d, unsigned int mask)
     233             : {
     234        3009 :         __irqd_to_state(d) |= mask;
     235             : }
     236             : 
     237             : static inline bool irqd_has_set(struct irq_data *d, unsigned int mask)
     238             : {
     239        2751 :         return __irqd_to_state(d) & mask;
     240             : }
     241             : 
     242             : static inline void irq_state_set_disabled(struct irq_desc *desc)
     243             : {
     244           0 :         irqd_set(&desc->irq_data, IRQD_IRQ_DISABLED);
     245             : }
     246             : 
     247             : static inline void irq_state_set_masked(struct irq_desc *desc)
     248             : {
     249           0 :         irqd_set(&desc->irq_data, IRQD_IRQ_MASKED);
     250             : }
     251             : 
     252             : #undef __irqd_to_state
     253             : 
     254             : static inline void __kstat_incr_irqs_this_cpu(struct irq_desc *desc)
     255             : {
     256        2751 :         __this_cpu_inc(*desc->kstat_irqs);
     257        2751 :         __this_cpu_inc(kstat.irqs_sum);
     258             : }
     259             : 
     260             : static inline void kstat_incr_irqs_this_cpu(struct irq_desc *desc)
     261             : {
     262        2751 :         __kstat_incr_irqs_this_cpu(desc);
     263        2751 :         desc->tot_count++;
     264             : }
     265             : 
     266             : static inline int irq_desc_get_node(struct irq_desc *desc)
     267             : {
     268           0 :         return irq_common_data_get_node(&desc->irq_common_data);
     269             : }
     270             : 
     271             : static inline int irq_desc_is_chained(struct irq_desc *desc)
     272             : {
     273           0 :         return (desc->action && desc->action == &chained_action);
     274             : }
     275             : 
     276             : #ifdef CONFIG_PM_SLEEP
     277             : bool irq_pm_check_wakeup(struct irq_desc *desc);
     278             : void irq_pm_install_action(struct irq_desc *desc, struct irqaction *action);
     279             : void irq_pm_remove_action(struct irq_desc *desc, struct irqaction *action);
     280             : #else
     281             : static inline bool irq_pm_check_wakeup(struct irq_desc *desc) { return false; }
     282             : static inline void
     283             : irq_pm_install_action(struct irq_desc *desc, struct irqaction *action) { }
     284             : static inline void
     285             : irq_pm_remove_action(struct irq_desc *desc, struct irqaction *action) { }
     286             : #endif
     287             : 
     288             : #ifdef CONFIG_IRQ_TIMINGS
     289             : 
     290             : #define IRQ_TIMINGS_SHIFT       5
     291             : #define IRQ_TIMINGS_SIZE        (1 << IRQ_TIMINGS_SHIFT)
     292             : #define IRQ_TIMINGS_MASK        (IRQ_TIMINGS_SIZE - 1)
     293             : 
     294             : /**
     295             :  * struct irq_timings - irq timings storing structure
     296             :  * @values: a circular buffer of u64 encoded <timestamp,irq> values
     297             :  * @count: the number of elements in the array
     298             :  */
     299             : struct irq_timings {
     300             :         u64     values[IRQ_TIMINGS_SIZE];
     301             :         int     count;
     302             : };
     303             : 
     304             : DECLARE_PER_CPU(struct irq_timings, irq_timings);
     305             : 
     306             : extern void irq_timings_free(int irq);
     307             : extern int irq_timings_alloc(int irq);
     308             : 
     309             : static inline void irq_remove_timings(struct irq_desc *desc)
     310             : {
     311             :         desc->istate &= ~IRQS_TIMINGS;
     312             : 
     313             :         irq_timings_free(irq_desc_get_irq(desc));
     314             : }
     315             : 
     316             : static inline void irq_setup_timings(struct irq_desc *desc, struct irqaction *act)
     317             : {
     318             :         int irq = irq_desc_get_irq(desc);
     319             :         int ret;
     320             : 
     321             :         /*
     322             :          * We don't need the measurement because the idle code already
     323             :          * knows the next expiry event.
     324             :          */
     325             :         if (act->flags & __IRQF_TIMER)
     326             :                 return;
     327             : 
     328             :         /*
     329             :          * In case the timing allocation fails, we just want to warn,
     330             :          * not fail, so letting the system boot anyway.
     331             :          */
     332             :         ret = irq_timings_alloc(irq);
     333             :         if (ret) {
     334             :                 pr_warn("Failed to allocate irq timing stats for irq%d (%d)",
     335             :                         irq, ret);
     336             :                 return;
     337             :         }
     338             : 
     339             :         desc->istate |= IRQS_TIMINGS;
     340             : }
     341             : 
     342             : extern void irq_timings_enable(void);
     343             : extern void irq_timings_disable(void);
     344             : 
     345             : DECLARE_STATIC_KEY_FALSE(irq_timing_enabled);
     346             : 
     347             : /*
     348             :  * The interrupt number and the timestamp are encoded into a single
     349             :  * u64 variable to optimize the size.
     350             :  * 48 bit time stamp and 16 bit IRQ number is way sufficient.
     351             :  *  Who cares an IRQ after 78 hours of idle time?
     352             :  */
     353             : static inline u64 irq_timing_encode(u64 timestamp, int irq)
     354             : {
     355             :         return (timestamp << 16) | irq;
     356             : }
     357             : 
     358             : static inline int irq_timing_decode(u64 value, u64 *timestamp)
     359             : {
     360             :         *timestamp = value >> 16;
     361             :         return value & U16_MAX;
     362             : }
     363             : 
     364             : static __always_inline void irq_timings_push(u64 ts, int irq)
     365             : {
     366             :         struct irq_timings *timings = this_cpu_ptr(&irq_timings);
     367             : 
     368             :         timings->values[timings->count & IRQ_TIMINGS_MASK] =
     369             :                 irq_timing_encode(ts, irq);
     370             : 
     371             :         timings->count++;
     372             : }
     373             : 
     374             : /*
     375             :  * The function record_irq_time is only called in one place in the
     376             :  * interrupts handler. We want this function always inline so the code
     377             :  * inside is embedded in the function and the static key branching
     378             :  * code can act at the higher level. Without the explicit
     379             :  * __always_inline we can end up with a function call and a small
     380             :  * overhead in the hotpath for nothing.
     381             :  */
     382             : static __always_inline void record_irq_time(struct irq_desc *desc)
     383             : {
     384             :         if (!static_branch_likely(&irq_timing_enabled))
     385             :                 return;
     386             : 
     387             :         if (desc->istate & IRQS_TIMINGS)
     388             :                 irq_timings_push(local_clock(), irq_desc_get_irq(desc));
     389             : }
     390             : #else
     391             : static inline void irq_remove_timings(struct irq_desc *desc) {}
     392             : static inline void irq_setup_timings(struct irq_desc *desc,
     393             :                                      struct irqaction *act) {};
     394             : static inline void record_irq_time(struct irq_desc *desc) {}
     395             : #endif /* CONFIG_IRQ_TIMINGS */
     396             : 
     397             : 
     398             : #ifdef CONFIG_GENERIC_IRQ_CHIP
     399             : void irq_init_generic_chip(struct irq_chip_generic *gc, const char *name,
     400             :                            int num_ct, unsigned int irq_base,
     401             :                            void __iomem *reg_base, irq_flow_handler_t handler);
     402             : #else
     403             : static inline void
     404             : irq_init_generic_chip(struct irq_chip_generic *gc, const char *name,
     405             :                       int num_ct, unsigned int irq_base,
     406             :                       void __iomem *reg_base, irq_flow_handler_t handler) { }
     407             : #endif /* CONFIG_GENERIC_IRQ_CHIP */
     408             : 
     409             : #ifdef CONFIG_GENERIC_PENDING_IRQ
     410             : static inline bool irq_can_move_pcntxt(struct irq_data *data)
     411             : {
     412             :         return irqd_can_move_in_process_context(data);
     413             : }
     414             : static inline bool irq_move_pending(struct irq_data *data)
     415             : {
     416             :         return irqd_is_setaffinity_pending(data);
     417             : }
     418             : static inline void
     419             : irq_copy_pending(struct irq_desc *desc, const struct cpumask *mask)
     420             : {
     421             :         cpumask_copy(desc->pending_mask, mask);
     422             : }
     423             : static inline void
     424             : irq_get_pending(struct cpumask *mask, struct irq_desc *desc)
     425             : {
     426             :         cpumask_copy(mask, desc->pending_mask);
     427             : }
     428             : static inline struct cpumask *irq_desc_get_pending_mask(struct irq_desc *desc)
     429             : {
     430             :         return desc->pending_mask;
     431             : }
     432             : static inline bool handle_enforce_irqctx(struct irq_data *data)
     433             : {
     434             :         return irqd_is_handle_enforce_irqctx(data);
     435             : }
     436             : bool irq_fixup_move_pending(struct irq_desc *desc, bool force_clear);
     437             : #else /* CONFIG_GENERIC_PENDING_IRQ */
     438             : static inline bool irq_can_move_pcntxt(struct irq_data *data)
     439             : {
     440             :         return true;
     441             : }
     442             : static inline bool irq_move_pending(struct irq_data *data)
     443             : {
     444             :         return false;
     445             : }
     446             : static inline void
     447             : irq_copy_pending(struct irq_desc *desc, const struct cpumask *mask)
     448             : {
     449             : }
     450             : static inline void
     451             : irq_get_pending(struct cpumask *mask, struct irq_desc *desc)
     452             : {
     453             : }
     454             : static inline struct cpumask *irq_desc_get_pending_mask(struct irq_desc *desc)
     455             : {
     456             :         return NULL;
     457             : }
     458             : static inline bool irq_fixup_move_pending(struct irq_desc *desc, bool fclear)
     459             : {
     460             :         return false;
     461             : }
     462             : static inline bool handle_enforce_irqctx(struct irq_data *data)
     463             : {
     464             :         return false;
     465             : }
     466             : #endif /* !CONFIG_GENERIC_PENDING_IRQ */
     467             : 
     468             : #if !defined(CONFIG_IRQ_DOMAIN) || !defined(CONFIG_IRQ_DOMAIN_HIERARCHY)
     469             : static inline int irq_domain_activate_irq(struct irq_data *data, bool reserve)
     470             : {
     471             :         irqd_set_activated(data);
     472             :         return 0;
     473             : }
     474             : static inline void irq_domain_deactivate_irq(struct irq_data *data)
     475             : {
     476             :         irqd_clr_activated(data);
     477             : }
     478             : #endif
     479             : 
     480             : static inline struct irq_data *irqd_get_parent_data(struct irq_data *irqd)
     481             : {
     482             : #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
     483             :         return irqd->parent_data;
     484             : #else
     485             :         return NULL;
     486             : #endif
     487             : }
     488             : 
     489             : #ifdef CONFIG_GENERIC_IRQ_DEBUGFS
     490             : #include <linux/debugfs.h>
     491             : 
     492             : void irq_add_debugfs_entry(unsigned int irq, struct irq_desc *desc);
     493             : static inline void irq_remove_debugfs_entry(struct irq_desc *desc)
     494             : {
     495             :         debugfs_remove(desc->debugfs_file);
     496             :         kfree(desc->dev_name);
     497             : }
     498             : void irq_debugfs_copy_devname(int irq, struct device *dev);
     499             : # ifdef CONFIG_IRQ_DOMAIN
     500             : void irq_domain_debugfs_init(struct dentry *root);
     501             : # else
     502             : static inline void irq_domain_debugfs_init(struct dentry *root)
     503             : {
     504             : }
     505             : # endif
     506             : #else /* CONFIG_GENERIC_IRQ_DEBUGFS */
     507             : static inline void irq_add_debugfs_entry(unsigned int irq, struct irq_desc *d)
     508             : {
     509             : }
     510             : static inline void irq_remove_debugfs_entry(struct irq_desc *d)
     511             : {
     512             : }
     513             : static inline void irq_debugfs_copy_devname(int irq, struct device *dev)
     514             : {
     515             : }
     516             : #endif /* CONFIG_GENERIC_IRQ_DEBUGFS */

Generated by: LCOV version 1.14