108e875c1SCatalin Marinas /* 208e875c1SCatalin Marinas * Copyright (C) 2012 ARM Ltd. 308e875c1SCatalin Marinas * 408e875c1SCatalin Marinas * This program is free software; you can redistribute it and/or modify 508e875c1SCatalin Marinas * it under the terms of the GNU General Public License version 2 as 608e875c1SCatalin Marinas * published by the Free Software Foundation. 708e875c1SCatalin Marinas * 808e875c1SCatalin Marinas * This program is distributed in the hope that it will be useful, 908e875c1SCatalin Marinas * but WITHOUT ANY WARRANTY; without even the implied warranty of 1008e875c1SCatalin Marinas * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1108e875c1SCatalin Marinas * GNU General Public License for more details. 1208e875c1SCatalin Marinas * 1308e875c1SCatalin Marinas * You should have received a copy of the GNU General Public License 1408e875c1SCatalin Marinas * along with this program. If not, see <http://www.gnu.org/licenses/>. 1508e875c1SCatalin Marinas */ 1608e875c1SCatalin Marinas #ifndef __ASM_SMP_H 1708e875c1SCatalin Marinas #define __ASM_SMP_H 1808e875c1SCatalin Marinas 1908e875c1SCatalin Marinas #include <linux/threads.h> 2008e875c1SCatalin Marinas #include <linux/cpumask.h> 2108e875c1SCatalin Marinas #include <linux/thread_info.h> 2208e875c1SCatalin Marinas 2308e875c1SCatalin Marinas #define raw_smp_processor_id() (current_thread_info()->cpu) 2408e875c1SCatalin Marinas 2508e875c1SCatalin Marinas struct seq_file; 2608e875c1SCatalin Marinas 2708e875c1SCatalin Marinas /* 2808e875c1SCatalin Marinas * generate IPI list text 2908e875c1SCatalin Marinas */ 3008e875c1SCatalin Marinas extern void show_ipi_list(struct seq_file *p, int prec); 3108e875c1SCatalin Marinas 3208e875c1SCatalin Marinas /* 3308e875c1SCatalin Marinas * Called from C code, this handles an IPI. 3408e875c1SCatalin Marinas */ 3508e875c1SCatalin Marinas extern void handle_IPI(int ipinr, struct pt_regs *regs); 3608e875c1SCatalin Marinas 3708e875c1SCatalin Marinas /* 38fccb9a81SHanjun Guo * Discover the set of possible CPUs and determine their 39fccb9a81SHanjun Guo * SMP operations. 4008e875c1SCatalin Marinas */ 410f078336SLorenzo Pieralisi extern void smp_init_cpus(void); 4208e875c1SCatalin Marinas 4308e875c1SCatalin Marinas /* 4408e875c1SCatalin Marinas * Provide a function to raise an IPI cross call on CPUs in callmap. 4508e875c1SCatalin Marinas */ 4608e875c1SCatalin Marinas extern void set_smp_cross_call(void (*)(const struct cpumask *, unsigned int)); 4708e875c1SCatalin Marinas 4836310736SFrederic Weisbecker extern void (*__smp_cross_call)(const struct cpumask *, unsigned int); 4936310736SFrederic Weisbecker 5008e875c1SCatalin Marinas /* 5108e875c1SCatalin Marinas * Called from the secondary holding pen, this is the secondary CPU entry point. 5208e875c1SCatalin Marinas */ 5308e875c1SCatalin Marinas asmlinkage void secondary_start_kernel(void); 5408e875c1SCatalin Marinas 5508e875c1SCatalin Marinas /* 5608e875c1SCatalin Marinas * Initial data for bringing up a secondary CPU. 5708e875c1SCatalin Marinas */ 5808e875c1SCatalin Marinas struct secondary_data { 5908e875c1SCatalin Marinas void *stack; 6008e875c1SCatalin Marinas }; 6108e875c1SCatalin Marinas extern struct secondary_data secondary_data; 62652af899SMark Rutland extern void secondary_entry(void); 6308e875c1SCatalin Marinas 6408e875c1SCatalin Marinas extern void arch_send_call_function_single_ipi(int cpu); 6508e875c1SCatalin Marinas extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); 6608e875c1SCatalin Marinas 675e89c55eSLorenzo Pieralisi #ifdef CONFIG_ARM64_ACPI_PARKING_PROTOCOL 685e89c55eSLorenzo Pieralisi extern void arch_send_wakeup_ipi_mask(const struct cpumask *mask); 695e89c55eSLorenzo Pieralisi #else 705e89c55eSLorenzo Pieralisi static inline void arch_send_wakeup_ipi_mask(const struct cpumask *mask) 715e89c55eSLorenzo Pieralisi { 725e89c55eSLorenzo Pieralisi BUILD_BUG(); 735e89c55eSLorenzo Pieralisi } 745e89c55eSLorenzo Pieralisi #endif 755e89c55eSLorenzo Pieralisi 769327e2c6SMark Rutland extern int __cpu_disable(void); 779327e2c6SMark Rutland 789327e2c6SMark Rutland extern void __cpu_die(unsigned int cpu); 799327e2c6SMark Rutland extern void cpu_die(void); 809327e2c6SMark Rutland 81*c4bc34d2SSuzuki K Poulose static inline void cpu_park_loop(void) 82*c4bc34d2SSuzuki K Poulose { 83*c4bc34d2SSuzuki K Poulose for (;;) { 84*c4bc34d2SSuzuki K Poulose wfe(); 85*c4bc34d2SSuzuki K Poulose wfi(); 86*c4bc34d2SSuzuki K Poulose } 87*c4bc34d2SSuzuki K Poulose } 88*c4bc34d2SSuzuki K Poulose 8908e875c1SCatalin Marinas #endif /* ifndef __ASM_SMP_H */ 90