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