xref: /openbmc/linux/arch/arm64/include/asm/smp.h (revision c4bc34d20273db698c51951a1951dba0a722e162)
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