xref: /kvm-unit-tests/lib/arm/asm/smp.h (revision dfc1fec2fbde04ad607e1aed560cf7059350c70f)
168ea0e0bSAndrew Jones #ifndef _ASMARM_SMP_H_
268ea0e0bSAndrew Jones #define _ASMARM_SMP_H_
368ea0e0bSAndrew Jones /*
468ea0e0bSAndrew Jones  * Copyright (C) 2015, Red Hat Inc, Andrew Jones <drjones@redhat.com>
568ea0e0bSAndrew Jones  *
668ea0e0bSAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
768ea0e0bSAndrew Jones  */
8*dfc1fec2SAndrew Jones #include <cpumask.h>
968ea0e0bSAndrew Jones #include <asm/thread_info.h>
1068ea0e0bSAndrew Jones 
1168ea0e0bSAndrew Jones #define smp_processor_id()		(current_thread_info()->cpu)
1268ea0e0bSAndrew Jones 
136afb9481SAlexandru Elisei typedef void (*secondary_entry_fn)(void);
146afb9481SAlexandru Elisei 
156afb9481SAlexandru Elisei struct secondary_data {
166afb9481SAlexandru Elisei 	void *stack;            /* must be first member of struct */
176afb9481SAlexandru Elisei 	secondary_entry_fn entry;
186afb9481SAlexandru Elisei };
196afb9481SAlexandru Elisei extern struct secondary_data secondary_data;
206afb9481SAlexandru Elisei 
21ce024192SAndrew Jones extern bool cpu0_calls_idle;
22ce024192SAndrew Jones 
2368ea0e0bSAndrew Jones extern void halt(void);
249246de4cSAndrew Jones extern void do_idle(void);
2568ea0e0bSAndrew Jones 
2668ea0e0bSAndrew Jones extern cpumask_t cpu_present_mask;
2768ea0e0bSAndrew Jones extern cpumask_t cpu_online_mask;
289246de4cSAndrew Jones extern cpumask_t cpu_idle_mask;
2968ea0e0bSAndrew Jones #define cpu_present(cpu)		cpumask_test_cpu(cpu, &cpu_present_mask)
3068ea0e0bSAndrew Jones #define cpu_online(cpu)			cpumask_test_cpu(cpu, &cpu_online_mask)
319246de4cSAndrew Jones #define cpu_idle(cpu)			cpumask_test_cpu(cpu, &cpu_idle_mask)
3268ea0e0bSAndrew Jones #define for_each_present_cpu(cpu)	for_each_cpu(cpu, &cpu_present_mask)
3368ea0e0bSAndrew Jones #define for_each_online_cpu(cpu)	for_each_cpu(cpu, &cpu_online_mask)
3468ea0e0bSAndrew Jones 
3568ea0e0bSAndrew Jones static inline void set_cpu_present(int cpu, bool present)
3668ea0e0bSAndrew Jones {
3768ea0e0bSAndrew Jones 	if (present)
3868ea0e0bSAndrew Jones 		cpumask_set_cpu(cpu, &cpu_present_mask);
3968ea0e0bSAndrew Jones 	else
4068ea0e0bSAndrew Jones 		cpumask_clear_cpu(cpu, &cpu_present_mask);
4168ea0e0bSAndrew Jones }
4268ea0e0bSAndrew Jones 
4368ea0e0bSAndrew Jones static inline void set_cpu_online(int cpu, bool online)
4468ea0e0bSAndrew Jones {
4568ea0e0bSAndrew Jones 	if (online)
4668ea0e0bSAndrew Jones 		cpumask_set_cpu(cpu, &cpu_online_mask);
4768ea0e0bSAndrew Jones 	else
4868ea0e0bSAndrew Jones 		cpumask_clear_cpu(cpu, &cpu_online_mask);
4968ea0e0bSAndrew Jones }
5068ea0e0bSAndrew Jones 
519246de4cSAndrew Jones static inline void set_cpu_idle(int cpu, bool idle)
529246de4cSAndrew Jones {
539246de4cSAndrew Jones 	if (idle)
549246de4cSAndrew Jones 		cpumask_set_cpu(cpu, &cpu_idle_mask);
559246de4cSAndrew Jones 	else
569246de4cSAndrew Jones 		cpumask_clear_cpu(cpu, &cpu_idle_mask);
579246de4cSAndrew Jones }
589246de4cSAndrew Jones 
5968ea0e0bSAndrew Jones extern void smp_boot_secondary(int cpu, secondary_entry_fn entry);
60e713fd55SAndrew Jones extern void on_cpu_async(int cpu, void (*func)(void *data), void *data);
61e713fd55SAndrew Jones extern void on_cpu(int cpu, void (*func)(void *data), void *data);
6200b34f56SAndrew Jones extern void on_cpus(void (*func)(void *data), void *data);
6368ea0e0bSAndrew Jones 
6468ea0e0bSAndrew Jones #endif /* _ASMARM_SMP_H_ */
65