LCOV - code coverage report
Current view: top level - include/linux - cpu.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 2 12 16.7 %
Date: 2022-03-28 15:32:58 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0 */
       2                 :            : /*
       3                 :            :  * include/linux/cpu.h - generic cpu definition
       4                 :            :  *
       5                 :            :  * This is mainly for topological representation. We define the 
       6                 :            :  * basic 'struct cpu' here, which can be embedded in per-arch 
       7                 :            :  * definitions of processors.
       8                 :            :  *
       9                 :            :  * Basic handling of the devices is done in drivers/base/cpu.c
      10                 :            :  *
      11                 :            :  * CPUs are exported via sysfs in the devices/system/cpu
      12                 :            :  * directory. 
      13                 :            :  */
      14                 :            : #ifndef _LINUX_CPU_H_
      15                 :            : #define _LINUX_CPU_H_
      16                 :            : 
      17                 :            : #include <linux/node.h>
      18                 :            : #include <linux/compiler.h>
      19                 :            : #include <linux/cpumask.h>
      20                 :            : #include <linux/cpuhotplug.h>
      21                 :            : 
      22                 :            : struct device;
      23                 :            : struct device_node;
      24                 :            : struct attribute_group;
      25                 :            : 
      26                 :            : struct cpu {
      27                 :            :         int node_id;            /* The node which contains the CPU */
      28                 :            :         int hotpluggable;       /* creates sysfs control file if hotpluggable */
      29                 :            :         struct device dev;
      30                 :            : };
      31                 :            : 
      32                 :            : extern void boot_cpu_init(void);
      33                 :            : extern void boot_cpu_hotplug_init(void);
      34                 :            : extern void cpu_init(void);
      35                 :            : extern void trap_init(void);
      36                 :            : 
      37                 :            : extern int register_cpu(struct cpu *cpu, int num);
      38                 :            : extern struct device *get_cpu_device(unsigned cpu);
      39                 :            : extern bool cpu_is_hotpluggable(unsigned cpu);
      40                 :            : extern bool arch_match_cpu_phys_id(int cpu, u64 phys_id);
      41                 :            : extern bool arch_find_n_match_cpu_physical_id(struct device_node *cpun,
      42                 :            :                                               int cpu, unsigned int *thread);
      43                 :            : 
      44                 :            : extern int cpu_add_dev_attr(struct device_attribute *attr);
      45                 :            : extern void cpu_remove_dev_attr(struct device_attribute *attr);
      46                 :            : 
      47                 :            : extern int cpu_add_dev_attr_group(struct attribute_group *attrs);
      48                 :            : extern void cpu_remove_dev_attr_group(struct attribute_group *attrs);
      49                 :            : 
      50                 :            : extern ssize_t cpu_show_meltdown(struct device *dev,
      51                 :            :                                  struct device_attribute *attr, char *buf);
      52                 :            : extern ssize_t cpu_show_spectre_v1(struct device *dev,
      53                 :            :                                    struct device_attribute *attr, char *buf);
      54                 :            : extern ssize_t cpu_show_spectre_v2(struct device *dev,
      55                 :            :                                    struct device_attribute *attr, char *buf);
      56                 :            : extern ssize_t cpu_show_spec_store_bypass(struct device *dev,
      57                 :            :                                           struct device_attribute *attr, char *buf);
      58                 :            : extern ssize_t cpu_show_l1tf(struct device *dev,
      59                 :            :                              struct device_attribute *attr, char *buf);
      60                 :            : extern ssize_t cpu_show_mds(struct device *dev,
      61                 :            :                             struct device_attribute *attr, char *buf);
      62                 :            : extern ssize_t cpu_show_tsx_async_abort(struct device *dev,
      63                 :            :                                         struct device_attribute *attr,
      64                 :            :                                         char *buf);
      65                 :            : extern ssize_t cpu_show_itlb_multihit(struct device *dev,
      66                 :            :                                       struct device_attribute *attr, char *buf);
      67                 :            : 
      68                 :            : extern __printf(4, 5)
      69                 :            : struct device *cpu_device_create(struct device *parent, void *drvdata,
      70                 :            :                                  const struct attribute_group **groups,
      71                 :            :                                  const char *fmt, ...);
      72                 :            : #ifdef CONFIG_HOTPLUG_CPU
      73                 :            : extern void unregister_cpu(struct cpu *cpu);
      74                 :            : extern ssize_t arch_cpu_probe(const char *, size_t);
      75                 :            : extern ssize_t arch_cpu_release(const char *, size_t);
      76                 :            : #endif
      77                 :            : 
      78                 :            : /*
      79                 :            :  * These states are not related to the core CPU hotplug mechanism. They are
      80                 :            :  * used by various (sub)architectures to track internal state
      81                 :            :  */
      82                 :            : #define CPU_ONLINE              0x0002 /* CPU is up */
      83                 :            : #define CPU_UP_PREPARE          0x0003 /* CPU coming up */
      84                 :            : #define CPU_DEAD                0x0007 /* CPU dead */
      85                 :            : #define CPU_DEAD_FROZEN         0x0008 /* CPU timed out on unplug */
      86                 :            : #define CPU_POST_DEAD           0x0009 /* CPU successfully unplugged */
      87                 :            : #define CPU_BROKEN              0x000B /* CPU did not die properly */
      88                 :            : 
      89                 :            : #ifdef CONFIG_SMP
      90                 :            : extern bool cpuhp_tasks_frozen;
      91                 :            : int cpu_up(unsigned int cpu);
      92                 :            : void notify_cpu_starting(unsigned int cpu);
      93                 :            : extern void cpu_maps_update_begin(void);
      94                 :            : extern void cpu_maps_update_done(void);
      95                 :            : 
      96                 :            : #else   /* CONFIG_SMP */
      97                 :            : #define cpuhp_tasks_frozen      0
      98                 :            : 
      99                 :            : static inline void cpu_maps_update_begin(void)
     100                 :            : {
     101                 :            : }
     102                 :            : 
     103                 :            : static inline void cpu_maps_update_done(void)
     104                 :            : {
     105                 :            : }
     106                 :            : 
     107                 :            : #endif /* CONFIG_SMP */
     108                 :            : extern struct bus_type cpu_subsys;
     109                 :            : 
     110                 :            : #ifdef CONFIG_HOTPLUG_CPU
     111                 :            : extern void cpus_write_lock(void);
     112                 :            : extern void cpus_write_unlock(void);
     113                 :            : extern void cpus_read_lock(void);
     114                 :            : extern void cpus_read_unlock(void);
     115                 :            : extern int  cpus_read_trylock(void);
     116                 :            : extern void lockdep_assert_cpus_held(void);
     117                 :            : extern void cpu_hotplug_disable(void);
     118                 :            : extern void cpu_hotplug_enable(void);
     119                 :            : void clear_tasks_mm_cpumask(int cpu);
     120                 :            : int cpu_down(unsigned int cpu);
     121                 :            : 
     122                 :            : #else /* CONFIG_HOTPLUG_CPU */
     123                 :            : 
     124                 :            : static inline void cpus_write_lock(void) { }
     125                 :            : static inline void cpus_write_unlock(void) { }
     126                 :            : static inline void cpus_read_lock(void) { }
     127                 :            : static inline void cpus_read_unlock(void) { }
     128                 :            : static inline int  cpus_read_trylock(void) { return true; }
     129                 :            : static inline void lockdep_assert_cpus_held(void) { }
     130                 :            : static inline void cpu_hotplug_disable(void) { }
     131                 :            : static inline void cpu_hotplug_enable(void) { }
     132                 :            : #endif  /* !CONFIG_HOTPLUG_CPU */
     133                 :            : 
     134                 :            : /* Wrappers which go away once all code is converted */
     135                 :          0 : static inline void cpu_hotplug_begin(void) { cpus_write_lock(); }
     136                 :          0 : static inline void cpu_hotplug_done(void) { cpus_write_unlock(); }
     137                 :       5872 : static inline void get_online_cpus(void) { cpus_read_lock(); }
     138                 :       5872 : static inline void put_online_cpus(void) { cpus_read_unlock(); }
     139                 :            : 
     140                 :            : #ifdef CONFIG_PM_SLEEP_SMP
     141                 :            : extern int freeze_secondary_cpus(int primary);
     142                 :          0 : static inline int disable_nonboot_cpus(void)
     143                 :            : {
     144                 :          0 :         return freeze_secondary_cpus(0);
     145                 :            : }
     146                 :            : extern void enable_nonboot_cpus(void);
     147                 :            : 
     148                 :          0 : static inline int suspend_disable_secondary_cpus(void)
     149                 :            : {
     150                 :          0 :         int cpu = 0;
     151                 :            : 
     152                 :          0 :         if (IS_ENABLED(CONFIG_PM_SLEEP_SMP_NONZERO_CPU))
     153                 :            :                 cpu = -1;
     154                 :            : 
     155                 :          0 :         return freeze_secondary_cpus(cpu);
     156                 :            : }
     157                 :          0 : static inline void suspend_enable_secondary_cpus(void)
     158                 :            : {
     159                 :          0 :         return enable_nonboot_cpus();
     160                 :            : }
     161                 :            : 
     162                 :            : #else /* !CONFIG_PM_SLEEP_SMP */
     163                 :            : static inline int disable_nonboot_cpus(void) { return 0; }
     164                 :            : static inline void enable_nonboot_cpus(void) {}
     165                 :            : static inline int suspend_disable_secondary_cpus(void) { return 0; }
     166                 :            : static inline void suspend_enable_secondary_cpus(void) { }
     167                 :            : #endif /* !CONFIG_PM_SLEEP_SMP */
     168                 :            : 
     169                 :            : void cpu_startup_entry(enum cpuhp_state state);
     170                 :            : 
     171                 :            : void cpu_idle_poll_ctrl(bool enable);
     172                 :            : 
     173                 :            : /* Attach to any functions which should be considered cpuidle. */
     174                 :            : #define __cpuidle       __attribute__((__section__(".cpuidle.text")))
     175                 :            : 
     176                 :            : bool cpu_in_idle(unsigned long pc);
     177                 :            : 
     178                 :            : void arch_cpu_idle(void);
     179                 :            : void arch_cpu_idle_prepare(void);
     180                 :            : void arch_cpu_idle_enter(void);
     181                 :            : void arch_cpu_idle_exit(void);
     182                 :            : void arch_cpu_idle_dead(void);
     183                 :            : 
     184                 :            : int cpu_report_state(int cpu);
     185                 :            : int cpu_check_up_prepare(int cpu);
     186                 :            : void cpu_set_state_online(int cpu);
     187                 :            : void play_idle_precise(u64 duration_ns, u64 latency_ns);
     188                 :            : 
     189                 :            : static inline void play_idle(unsigned long duration_us)
     190                 :            : {
     191                 :            :         play_idle_precise(duration_us * NSEC_PER_USEC, U64_MAX);
     192                 :            : }
     193                 :            : 
     194                 :            : #ifdef CONFIG_HOTPLUG_CPU
     195                 :            : bool cpu_wait_death(unsigned int cpu, int seconds);
     196                 :            : bool cpu_report_death(void);
     197                 :            : void cpuhp_report_idle_dead(void);
     198                 :            : #else
     199                 :            : static inline void cpuhp_report_idle_dead(void) { }
     200                 :            : #endif /* #ifdef CONFIG_HOTPLUG_CPU */
     201                 :            : 
     202                 :            : enum cpuhp_smt_control {
     203                 :            :         CPU_SMT_ENABLED,
     204                 :            :         CPU_SMT_DISABLED,
     205                 :            :         CPU_SMT_FORCE_DISABLED,
     206                 :            :         CPU_SMT_NOT_SUPPORTED,
     207                 :            :         CPU_SMT_NOT_IMPLEMENTED,
     208                 :            : };
     209                 :            : 
     210                 :            : #if defined(CONFIG_SMP) && defined(CONFIG_HOTPLUG_SMT)
     211                 :            : extern enum cpuhp_smt_control cpu_smt_control;
     212                 :            : extern void cpu_smt_disable(bool force);
     213                 :            : extern void cpu_smt_check_topology(void);
     214                 :            : extern bool cpu_smt_possible(void);
     215                 :            : extern int cpuhp_smt_enable(void);
     216                 :            : extern int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval);
     217                 :            : #else
     218                 :            : # define cpu_smt_control                (CPU_SMT_NOT_IMPLEMENTED)
     219                 :            : static inline void cpu_smt_disable(bool force) { }
     220                 :            : static inline void cpu_smt_check_topology(void) { }
     221                 :            : static inline bool cpu_smt_possible(void) { return false; }
     222                 :            : static inline int cpuhp_smt_enable(void) { return 0; }
     223                 :            : static inline int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval) { return 0; }
     224                 :            : #endif
     225                 :            : 
     226                 :            : extern bool cpu_mitigations_off(void);
     227                 :            : extern bool cpu_mitigations_auto_nosmt(void);
     228                 :            : 
     229                 :            : #endif /* _LINUX_CPU_H_ */

Generated by: LCOV version 1.14