xref: /kvm-unit-tests/lib/arm/asm/smp.h (revision 68ea0e0be63d341362dca92d3bacac85b465fb3c)
1*68ea0e0bSAndrew Jones #ifndef _ASMARM_SMP_H_
2*68ea0e0bSAndrew Jones #define _ASMARM_SMP_H_
3*68ea0e0bSAndrew Jones /*
4*68ea0e0bSAndrew Jones  * Copyright (C) 2015, Red Hat Inc, Andrew Jones <drjones@redhat.com>
5*68ea0e0bSAndrew Jones  *
6*68ea0e0bSAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
7*68ea0e0bSAndrew Jones  */
8*68ea0e0bSAndrew Jones #include <asm/thread_info.h>
9*68ea0e0bSAndrew Jones #include <asm/cpumask.h>
10*68ea0e0bSAndrew Jones 
11*68ea0e0bSAndrew Jones #define smp_processor_id()		(current_thread_info()->cpu)
12*68ea0e0bSAndrew Jones 
13*68ea0e0bSAndrew Jones extern void halt(void);
14*68ea0e0bSAndrew Jones 
15*68ea0e0bSAndrew Jones extern cpumask_t cpu_present_mask;
16*68ea0e0bSAndrew Jones extern cpumask_t cpu_online_mask;
17*68ea0e0bSAndrew Jones #define cpu_present(cpu)		cpumask_test_cpu(cpu, &cpu_present_mask)
18*68ea0e0bSAndrew Jones #define cpu_online(cpu)			cpumask_test_cpu(cpu, &cpu_online_mask)
19*68ea0e0bSAndrew Jones #define for_each_present_cpu(cpu)	for_each_cpu(cpu, &cpu_present_mask)
20*68ea0e0bSAndrew Jones #define for_each_online_cpu(cpu)	for_each_cpu(cpu, &cpu_online_mask)
21*68ea0e0bSAndrew Jones 
22*68ea0e0bSAndrew Jones static inline void set_cpu_present(int cpu, bool present)
23*68ea0e0bSAndrew Jones {
24*68ea0e0bSAndrew Jones 	if (present)
25*68ea0e0bSAndrew Jones 		cpumask_set_cpu(cpu, &cpu_present_mask);
26*68ea0e0bSAndrew Jones 	else
27*68ea0e0bSAndrew Jones 		cpumask_clear_cpu(cpu, &cpu_present_mask);
28*68ea0e0bSAndrew Jones }
29*68ea0e0bSAndrew Jones 
30*68ea0e0bSAndrew Jones static inline void set_cpu_online(int cpu, bool online)
31*68ea0e0bSAndrew Jones {
32*68ea0e0bSAndrew Jones 	if (online)
33*68ea0e0bSAndrew Jones 		cpumask_set_cpu(cpu, &cpu_online_mask);
34*68ea0e0bSAndrew Jones 	else
35*68ea0e0bSAndrew Jones 		cpumask_clear_cpu(cpu, &cpu_online_mask);
36*68ea0e0bSAndrew Jones }
37*68ea0e0bSAndrew Jones 
38*68ea0e0bSAndrew Jones typedef void (*secondary_entry_fn)(void);
39*68ea0e0bSAndrew Jones 
40*68ea0e0bSAndrew Jones /* secondary_data is reused for each cpu, so only boot one at a time */
41*68ea0e0bSAndrew Jones struct secondary_data {
42*68ea0e0bSAndrew Jones 	void *stack;		/* must be first member of struct */
43*68ea0e0bSAndrew Jones 	secondary_entry_fn entry;
44*68ea0e0bSAndrew Jones };
45*68ea0e0bSAndrew Jones extern struct secondary_data secondary_data;
46*68ea0e0bSAndrew Jones 
47*68ea0e0bSAndrew Jones extern void smp_boot_secondary(int cpu, secondary_entry_fn entry);
48*68ea0e0bSAndrew Jones 
49*68ea0e0bSAndrew Jones #endif /* _ASMARM_SMP_H_ */
50