18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __ASM_SH_SMP_H
38c2ecf20Sopenharmony_ci#define __ASM_SH_SMP_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/bitops.h>
68c2ecf20Sopenharmony_ci#include <linux/cpumask.h>
78c2ecf20Sopenharmony_ci#include <asm/smp-ops.h>
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/atomic.h>
128c2ecf20Sopenharmony_ci#include <asm/current.h>
138c2ecf20Sopenharmony_ci#include <asm/percpu.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define raw_smp_processor_id()	(current_thread_info()->cpu)
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci/* Map from cpu id to sequential logical cpu number. */
188c2ecf20Sopenharmony_ciextern int __cpu_number_map[NR_CPUS];
198c2ecf20Sopenharmony_ci#define cpu_number_map(cpu)  __cpu_number_map[cpu]
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci/* The reverse map from sequential logical cpu number to cpu id.  */
228c2ecf20Sopenharmony_ciextern int __cpu_logical_map[NR_CPUS];
238c2ecf20Sopenharmony_ci#define cpu_logical_map(cpu)  __cpu_logical_map[cpu]
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_cienum {
268c2ecf20Sopenharmony_ci	SMP_MSG_FUNCTION,
278c2ecf20Sopenharmony_ci	SMP_MSG_RESCHEDULE,
288c2ecf20Sopenharmony_ci	SMP_MSG_FUNCTION_SINGLE,
298c2ecf20Sopenharmony_ci	SMP_MSG_TIMER,
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci	SMP_MSG_NR,	/* must be last */
328c2ecf20Sopenharmony_ci};
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ciDECLARE_PER_CPU(int, cpu_state);
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_civoid smp_message_recv(unsigned int msg);
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_civoid arch_send_call_function_single_ipi(int cpu);
398c2ecf20Sopenharmony_civoid arch_send_call_function_ipi_mask(const struct cpumask *mask);
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_civoid native_play_dead(void);
428c2ecf20Sopenharmony_civoid native_cpu_die(unsigned int cpu);
438c2ecf20Sopenharmony_ciint native_cpu_disable(unsigned int cpu);
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci#ifdef CONFIG_HOTPLUG_CPU
468c2ecf20Sopenharmony_civoid play_dead_common(void);
478c2ecf20Sopenharmony_ciextern int __cpu_disable(void);
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_cistatic inline void __cpu_die(unsigned int cpu)
508c2ecf20Sopenharmony_ci{
518c2ecf20Sopenharmony_ci	extern struct plat_smp_ops *mp_ops;     /* private */
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	mp_ops->cpu_die(cpu);
548c2ecf20Sopenharmony_ci}
558c2ecf20Sopenharmony_ci#endif
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cistatic inline int hard_smp_processor_id(void)
588c2ecf20Sopenharmony_ci{
598c2ecf20Sopenharmony_ci	extern struct plat_smp_ops *mp_ops;	/* private */
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	if (!mp_ops)
628c2ecf20Sopenharmony_ci		return 0;	/* boot CPU */
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	return mp_ops->smp_processor_id();
658c2ecf20Sopenharmony_ci}
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_cistruct of_cpu_method {
688c2ecf20Sopenharmony_ci	const char *method;
698c2ecf20Sopenharmony_ci	struct plat_smp_ops *ops;
708c2ecf20Sopenharmony_ci};
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci#define CPU_METHOD_OF_DECLARE(name, _method, _ops)			\
738c2ecf20Sopenharmony_ci	static const struct of_cpu_method __cpu_method_of_table_##name	\
748c2ecf20Sopenharmony_ci		__used __section("__cpu_method_of_table")		\
758c2ecf20Sopenharmony_ci		= { .method = _method, .ops = _ops }
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci#else
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci#define hard_smp_processor_id()	(0)
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci#endif /* CONFIG_SMP */
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci#endif /* __ASM_SH_SMP_H */
84