18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *    Copyright IBM Corp. 1999, 2012
48c2ecf20Sopenharmony_ci *    Author(s): Denis Joseph Barrow,
58c2ecf20Sopenharmony_ci *		 Martin Schwidefsky <schwidefsky@de.ibm.com>,
68c2ecf20Sopenharmony_ci *		 Heiko Carstens <heiko.carstens@de.ibm.com>,
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci#ifndef __ASM_SMP_H
98c2ecf20Sopenharmony_ci#define __ASM_SMP_H
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <asm/sigp.h>
128c2ecf20Sopenharmony_ci#include <asm/lowcore.h>
138c2ecf20Sopenharmony_ci#include <asm/processor.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define raw_smp_processor_id()	(S390_lowcore.cpu_nr)
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ciextern struct mutex smp_cpu_state_mutex;
188c2ecf20Sopenharmony_ciextern unsigned int smp_cpu_mt_shift;
198c2ecf20Sopenharmony_ciextern unsigned int smp_cpu_mtid;
208c2ecf20Sopenharmony_ciextern __vector128 __initdata boot_cpu_vector_save_area[__NUM_VXRS];
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ciextern int __cpu_up(unsigned int cpu, struct task_struct *tidle);
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ciextern void arch_send_call_function_single_ipi(int cpu);
258c2ecf20Sopenharmony_ciextern void arch_send_call_function_ipi_mask(const struct cpumask *mask);
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ciextern void smp_call_online_cpu(void (*func)(void *), void *);
288c2ecf20Sopenharmony_ciextern void smp_call_ipl_cpu(void (*func)(void *), void *);
298c2ecf20Sopenharmony_ciextern void smp_emergency_stop(void);
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ciextern int smp_find_processor_id(u16 address);
328c2ecf20Sopenharmony_ciextern int smp_store_status(int cpu);
338c2ecf20Sopenharmony_ciextern void smp_save_dump_cpus(void);
348c2ecf20Sopenharmony_ciextern void smp_yield_cpu(int cpu);
358c2ecf20Sopenharmony_ciextern void smp_cpu_set_polarization(int cpu, int val);
368c2ecf20Sopenharmony_ciextern int smp_cpu_get_polarization(int cpu);
378c2ecf20Sopenharmony_ciextern int smp_cpu_get_cpu_address(int cpu);
388c2ecf20Sopenharmony_ciextern void smp_fill_possible_mask(void);
398c2ecf20Sopenharmony_ciextern void smp_detect_cpus(void);
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_cistatic inline void smp_stop_cpu(void)
428c2ecf20Sopenharmony_ci{
438c2ecf20Sopenharmony_ci	u16 pcpu = stap();
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	for (;;) {
468c2ecf20Sopenharmony_ci		__pcpu_sigp(pcpu, SIGP_STOP, 0, NULL);
478c2ecf20Sopenharmony_ci		cpu_relax();
488c2ecf20Sopenharmony_ci	}
498c2ecf20Sopenharmony_ci}
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci/* Return thread 0 CPU number as base CPU */
528c2ecf20Sopenharmony_cistatic inline int smp_get_base_cpu(int cpu)
538c2ecf20Sopenharmony_ci{
548c2ecf20Sopenharmony_ci	return cpu - (cpu % (smp_cpu_mtid + 1));
558c2ecf20Sopenharmony_ci}
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cistatic inline void smp_cpus_done(unsigned int max_cpus)
588c2ecf20Sopenharmony_ci{
598c2ecf20Sopenharmony_ci}
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ciextern int smp_rescan_cpus(void);
628c2ecf20Sopenharmony_ciextern void __noreturn cpu_die(void);
638c2ecf20Sopenharmony_ciextern void __cpu_die(unsigned int cpu);
648c2ecf20Sopenharmony_ciextern int __cpu_disable(void);
658c2ecf20Sopenharmony_ciextern void schedule_mcck_handler(void);
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci#endif /* __ASM_SMP_H */
68