162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __ASM_SH_SMP_H 362306a36Sopenharmony_ci#define __ASM_SH_SMP_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/bitops.h> 662306a36Sopenharmony_ci#include <linux/cpumask.h> 762306a36Sopenharmony_ci#include <asm/smp-ops.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifdef CONFIG_SMP 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/atomic.h> 1262306a36Sopenharmony_ci#include <asm/current.h> 1362306a36Sopenharmony_ci#include <asm/percpu.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define raw_smp_processor_id() (current_thread_info()->cpu) 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* Map from cpu id to sequential logical cpu number. */ 1862306a36Sopenharmony_ciextern int __cpu_number_map[NR_CPUS]; 1962306a36Sopenharmony_ci#define cpu_number_map(cpu) __cpu_number_map[cpu] 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/* The reverse map from sequential logical cpu number to cpu id. */ 2262306a36Sopenharmony_ciextern int __cpu_logical_map[NR_CPUS]; 2362306a36Sopenharmony_ci#define cpu_logical_map(cpu) __cpu_logical_map[cpu] 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cienum { 2662306a36Sopenharmony_ci SMP_MSG_FUNCTION, 2762306a36Sopenharmony_ci SMP_MSG_RESCHEDULE, 2862306a36Sopenharmony_ci SMP_MSG_FUNCTION_SINGLE, 2962306a36Sopenharmony_ci SMP_MSG_TIMER, 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci SMP_MSG_NR, /* must be last */ 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ciDECLARE_PER_CPU(int, cpu_state); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_civoid smp_message_recv(unsigned int msg); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_civoid arch_send_call_function_single_ipi(int cpu); 3962306a36Sopenharmony_civoid arch_send_call_function_ipi_mask(const struct cpumask *mask); 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_civoid native_play_dead(void); 4262306a36Sopenharmony_civoid native_cpu_die(unsigned int cpu); 4362306a36Sopenharmony_ciint native_cpu_disable(unsigned int cpu); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#ifdef CONFIG_HOTPLUG_CPU 4662306a36Sopenharmony_civoid play_dead_common(void); 4762306a36Sopenharmony_ciextern int __cpu_disable(void); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistatic inline void __cpu_die(unsigned int cpu) 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci extern struct plat_smp_ops *mp_ops; /* private */ 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci mp_ops->cpu_die(cpu); 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci#endif 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic inline int hard_smp_processor_id(void) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci extern struct plat_smp_ops *mp_ops; /* private */ 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci if (!mp_ops) 6262306a36Sopenharmony_ci return 0; /* boot CPU */ 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci return mp_ops->smp_processor_id(); 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistruct of_cpu_method { 6862306a36Sopenharmony_ci const char *method; 6962306a36Sopenharmony_ci struct plat_smp_ops *ops; 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define CPU_METHOD_OF_DECLARE(name, _method, _ops) \ 7362306a36Sopenharmony_ci static const struct of_cpu_method __cpu_method_of_table_##name \ 7462306a36Sopenharmony_ci __used __section("__cpu_method_of_table") \ 7562306a36Sopenharmony_ci = { .method = _method, .ops = _ops } 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#else 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#define hard_smp_processor_id() (0) 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#endif /* CONFIG_SMP */ 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#endif /* __ASM_SH_SMP_H */ 84