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

Generated by: LCOV version 1.14