File Index
Files and directories
Sign in
FILE

cpu.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/cpu.h C
  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/cpuhotplug.h>
 20#include <linux/cpuhplock.h>
 21#include <linux/cpu_smt.h>
 22
 23struct device;
 24struct device_node;
 25struct attribute_group;
 26
 27struct cpu {
 28	int node_id;		/* The node which contains the CPU */
 29	int hotpluggable;	/* creates sysfs control file if hotpluggable */
 30	struct device dev;
 31};
 32
 33extern void boot_cpu_init(void);
 34extern void boot_cpu_hotplug_init(void);
 35extern void cpu_init(void);
 36extern void trap_init(void);
 37
 38extern int register_cpu(struct cpu *cpu, int num);
 39extern struct device *get_cpu_device(unsigned cpu);
 40extern bool cpu_is_hotpluggable(unsigned cpu);
 41extern bool arch_match_cpu_phys_id(int cpu, u64 phys_id);
 42extern bool arch_find_n_match_cpu_physical_id(struct device_node *cpun,
 43					      int cpu, unsigned int *thread);
 44
 45extern int cpu_add_dev_attr(struct device_attribute *attr);
 46extern void cpu_remove_dev_attr(struct device_attribute *attr);
 47
 48extern int cpu_add_dev_attr_group(struct attribute_group *attrs);
 49extern void cpu_remove_dev_attr_group(struct attribute_group *attrs);
 50
 51extern ssize_t cpu_show_meltdown(struct device *dev,
 52				 struct device_attribute *attr, char *buf);
 53extern ssize_t cpu_show_spectre_v1(struct device *dev,
 54				   struct device_attribute *attr, char *buf);
 55extern ssize_t cpu_show_spectre_v2(struct device *dev,
 56				   struct device_attribute *attr, char *buf);
 57extern ssize_t cpu_show_spec_store_bypass(struct device *dev,
 58					  struct device_attribute *attr, char *buf);
 59extern ssize_t cpu_show_l1tf(struct device *dev,
 60			     struct device_attribute *attr, char *buf);
 61extern ssize_t cpu_show_mds(struct device *dev,
 62			    struct device_attribute *attr, char *buf);
 63extern ssize_t cpu_show_tsx_async_abort(struct device *dev,
 64					struct device_attribute *attr,
 65					char *buf);
 66extern ssize_t cpu_show_itlb_multihit(struct device *dev,
 67				      struct device_attribute *attr, char *buf);
 68extern ssize_t cpu_show_srbds(struct device *dev, struct device_attribute *attr, char *buf);
 69extern ssize_t cpu_show_mmio_stale_data(struct device *dev,
 70					struct device_attribute *attr,
 71					char *buf);
 72extern ssize_t cpu_show_retbleed(struct device *dev,
 73				 struct device_attribute *attr, char *buf);
 74extern ssize_t cpu_show_spec_rstack_overflow(struct device *dev,
 75					     struct device_attribute *attr, char *buf);
 76extern ssize_t cpu_show_gds(struct device *dev,
 77			    struct device_attribute *attr, char *buf);
 78extern ssize_t cpu_show_reg_file_data_sampling(struct device *dev,
 79					       struct device_attribute *attr, char *buf);
 80extern ssize_t cpu_show_ghostwrite(struct device *dev, struct device_attribute *attr, char *buf);
 81extern ssize_t cpu_show_old_microcode(struct device *dev,
 82				      struct device_attribute *attr, char *buf);
 83extern ssize_t cpu_show_indirect_target_selection(struct device *dev,
 84						  struct device_attribute *attr, char *buf);
 85extern ssize_t cpu_show_tsa(struct device *dev, struct device_attribute *attr, char *buf);
 86extern ssize_t cpu_show_vmscape(struct device *dev, struct device_attribute *attr, char *buf);
 87
 88extern __printf(4, 5)
 89struct device *cpu_device_create(struct device *parent, void *drvdata,
 90				 const struct attribute_group **groups,
 91				 const char *fmt, ...);
 92extern bool arch_cpu_is_hotpluggable(int cpu);
 93extern int arch_register_cpu(int cpu);
 94extern void arch_unregister_cpu(int cpu);
 95#ifdef CONFIG_HOTPLUG_CPU
 96extern void unregister_cpu(struct cpu *cpu);
 97extern ssize_t arch_cpu_probe(const char *, size_t);
 98extern ssize_t arch_cpu_release(const char *, size_t);
 99#endif
100
101#ifdef CONFIG_GENERIC_CPU_DEVICES
102DECLARE_PER_CPU(struct cpu, cpu_devices);
103#endif
104
105/*
106 * These states are not related to the core CPU hotplug mechanism. They are
107 * used by various (sub)architectures to track internal state
108 */
109#define CPU_ONLINE		0x0002 /* CPU is up */
110#define CPU_UP_PREPARE		0x0003 /* CPU coming up */
111#define CPU_DEAD		0x0007 /* CPU dead */
112#define CPU_DEAD_FROZEN		0x0008 /* CPU timed out on unplug */
113#define CPU_POST_DEAD		0x0009 /* CPU successfully unplugged */
114#define CPU_BROKEN		0x000B /* CPU did not die properly */
115
116#ifdef CONFIG_SMP
117extern bool cpuhp_tasks_frozen;
118int add_cpu(unsigned int cpu);
119int cpu_device_up(struct device *dev);
120void notify_cpu_starting(unsigned int cpu);
121extern void cpu_maps_update_begin(void);
122extern void cpu_maps_update_done(void);
123int bringup_hibernate_cpu(unsigned int sleep_cpu);
124void bringup_nonboot_cpus(unsigned int max_cpus);
125int arch_cpu_rescan_dead_smt_siblings(void);
126
127#else	/* CONFIG_SMP */
128#define cpuhp_tasks_frozen	0
129
130static inline void cpu_maps_update_begin(void)
131{
132}
133
134static inline void cpu_maps_update_done(void)
135{
136}
137
138static inline int add_cpu(unsigned int cpu) { return 0;}
139
140static inline int arch_cpu_rescan_dead_smt_siblings(void) { return 0; }
141
142#endif /* CONFIG_SMP */
143extern const struct bus_type cpu_subsys;
144
145#ifdef CONFIG_PM_SLEEP_SMP
146extern int freeze_secondary_cpus(int primary);
147extern void thaw_secondary_cpus(void);
148
149static inline int suspend_disable_secondary_cpus(void)
150{
151	int cpu = 0;
152
153	if (IS_ENABLED(CONFIG_PM_SLEEP_SMP_NONZERO_CPU))
154		cpu = -1;
155
156	return freeze_secondary_cpus(cpu);
157}
158static inline void suspend_enable_secondary_cpus(void)
159{
160	thaw_secondary_cpus();
161}
162
163#else /* !CONFIG_PM_SLEEP_SMP */
164static inline void thaw_secondary_cpus(void) {}
165static inline int suspend_disable_secondary_cpus(void) { return 0; }
166static inline void suspend_enable_secondary_cpus(void) { }
167#endif /* !CONFIG_PM_SLEEP_SMP */
168
169void __noreturn cpu_startup_entry(enum cpuhp_state state);
170
171void cpu_idle_poll_ctrl(bool enable);
172
173bool cpu_in_idle(unsigned long pc);
174
175void arch_cpu_idle(void);
176void arch_cpu_idle_prepare(void);
177void arch_cpu_idle_enter(void);
178void arch_cpu_idle_exit(void);
179void arch_tick_broadcast_enter(void);
180void arch_tick_broadcast_exit(void);
181void __noreturn arch_cpu_idle_dead(void);
182
183#ifdef CONFIG_ARCH_HAS_CPU_FINALIZE_INIT
184void arch_cpu_finalize_init(void);
185#else
186static inline void arch_cpu_finalize_init(void) { }
187#endif
188
189void play_idle_precise(u64 duration_ns, u64 latency_ns);
190
191#ifdef CONFIG_HOTPLUG_CPU
192void cpuhp_report_idle_dead(void);
193#else
194static inline void cpuhp_report_idle_dead(void) { }
195#endif /* #ifdef CONFIG_HOTPLUG_CPU */
196
197enum cpu_attack_vectors {
198	CPU_MITIGATE_USER_KERNEL,
199	CPU_MITIGATE_USER_USER,
200	CPU_MITIGATE_GUEST_HOST,
201	CPU_MITIGATE_GUEST_GUEST,
202	NR_CPU_ATTACK_VECTORS,
203};
204
205enum smt_mitigations {
206	SMT_MITIGATIONS_OFF,
207	SMT_MITIGATIONS_AUTO,
208	SMT_MITIGATIONS_ON,
209};
210
211#ifdef CONFIG_CPU_MITIGATIONS
212extern bool cpu_mitigations_off(void);
213extern bool cpu_mitigations_auto_nosmt(void);
214extern bool cpu_attack_vector_mitigated(enum cpu_attack_vectors v);
215extern enum smt_mitigations smt_mitigations;
216#else
217static inline bool cpu_mitigations_off(void)
218{
219	return true;
220}
221static inline bool cpu_mitigations_auto_nosmt(void)
222{
223	return false;
224}
225static inline bool cpu_attack_vector_mitigated(enum cpu_attack_vectors v)
226{
227	return false;
228}
229#define smt_mitigations SMT_MITIGATIONS_OFF
230#endif
231
232#endif /* _LINUX_CPU_H_ */
~/ Read-only file preview.