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