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