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