150acfb2bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 276d2a049SPalmer Dabbelt /* 376d2a049SPalmer Dabbelt * Copyright (C) 2012 Regents of the University of California 476d2a049SPalmer Dabbelt */ 576d2a049SPalmer Dabbelt 676d2a049SPalmer Dabbelt #ifndef _ASM_RISCV_SMP_H 776d2a049SPalmer Dabbelt #define _ASM_RISCV_SMP_H 876d2a049SPalmer Dabbelt 976d2a049SPalmer Dabbelt #include <linux/cpumask.h> 1076d2a049SPalmer Dabbelt #include <linux/irqreturn.h> 119639a443SPalmer Dabbelt #include <linux/thread_info.h> 1276d2a049SPalmer Dabbelt 136825c7a8SAtish Patra #define INVALID_HARTID ULONG_MAX 1478d1daa3SAtish Patra 1578d1daa3SAtish Patra struct seq_file; 1678d1daa3SAtish Patra extern unsigned long boot_cpu_hartid; 1778d1daa3SAtish Patra 1878d1daa3SAtish Patra #ifdef CONFIG_SMP 19fb0f3d28SAnup Patel 20fb0f3d28SAnup Patel #include <linux/jump_label.h> 21fb0f3d28SAnup Patel 226825c7a8SAtish Patra /* 236825c7a8SAtish Patra * Mapping between linux logical cpu index and hartid. 246825c7a8SAtish Patra */ 256825c7a8SAtish Patra extern unsigned long __cpuid_to_hartid_map[NR_CPUS]; 266825c7a8SAtish Patra #define cpuid_to_hartid_map(cpu) __cpuid_to_hartid_map[cpu] 276825c7a8SAtish Patra 288b20d2dbSAnup Patel /* print IPI stats */ 298b20d2dbSAnup Patel void show_ipi_stats(struct seq_file *p, int prec); 308b20d2dbSAnup Patel 3176d2a049SPalmer Dabbelt /* SMP initialization hook for setup_arch */ 3276d2a049SPalmer Dabbelt void __init setup_smp(void); 3376d2a049SPalmer Dabbelt 3476d2a049SPalmer Dabbelt /* Hook for the generic smp_call_function_many() routine. */ 3576d2a049SPalmer Dabbelt void arch_send_call_function_ipi_mask(struct cpumask *mask); 3676d2a049SPalmer Dabbelt 3776d2a049SPalmer Dabbelt /* Hook for the generic smp_call_function_single() routine. */ 3876d2a049SPalmer Dabbelt void arch_send_call_function_single_ipi(int cpu); 3976d2a049SPalmer Dabbelt 4062750eaeSSunil V L int riscv_hartid_to_cpuid(unsigned long hartid); 416825c7a8SAtish Patra 42832f15f4SAnup Patel /* Enable IPI for CPU hotplug */ 43832f15f4SAnup Patel void riscv_ipi_enable(void); 44cc7f3f72SAnup Patel 45832f15f4SAnup Patel /* Disable IPI for CPU hotplug */ 46832f15f4SAnup Patel void riscv_ipi_disable(void); 47832f15f4SAnup Patel 48832f15f4SAnup Patel /* Check if IPI interrupt numbers are available */ 49832f15f4SAnup Patel bool riscv_ipi_have_virq_range(void); 50832f15f4SAnup Patel 51832f15f4SAnup Patel /* Set the IPI interrupt numbers for arch (called by irqchip drivers) */ 52dc892fb4SSamuel Holland void riscv_ipi_set_virq_range(int virq, int nr); 53cc7f3f72SAnup Patel 549b932aadSGuo Ren /* Check other CPUs stop or not */ 559b932aadSGuo Ren bool smp_crash_stop_failed(void); 569b932aadSGuo Ren 57635093e3SAtish Patra /* Secondary hart entry */ 58635093e3SAtish Patra asmlinkage void smp_callin(void); 59635093e3SAtish Patra 6076d2a049SPalmer Dabbelt /* 619639a443SPalmer Dabbelt * Obtains the hart ID of the currently executing task. This relies on 629639a443SPalmer Dabbelt * THREAD_INFO_IN_TASK, but we define that unconditionally. 6376d2a049SPalmer Dabbelt */ 649639a443SPalmer Dabbelt #define raw_smp_processor_id() (current_thread_info()->cpu) 6576d2a049SPalmer Dabbelt 66f1e58583SAtish Patra #if defined CONFIG_HOTPLUG_CPU 67f1e58583SAtish Patra int __cpu_disable(void); __cpu_die(unsigned int cpu)6872b11aa7SThomas Gleixnerstatic inline void __cpu_die(unsigned int cpu) { } 69f1e58583SAtish Patra #endif /* CONFIG_HOTPLUG_CPU */ 70f1e58583SAtish Patra 716825c7a8SAtish Patra #else 7276d2a049SPalmer Dabbelt show_ipi_stats(struct seq_file * p,int prec)738b20d2dbSAnup Patelstatic inline void show_ipi_stats(struct seq_file *p, int prec) 748b20d2dbSAnup Patel { 758b20d2dbSAnup Patel } 768b20d2dbSAnup Patel riscv_hartid_to_cpuid(unsigned long hartid)7762750eaeSSunil V Lstatic inline int riscv_hartid_to_cpuid(unsigned long hartid) 786825c7a8SAtish Patra { 7978d1daa3SAtish Patra if (hartid == boot_cpu_hartid) 806825c7a8SAtish Patra return 0; 8178d1daa3SAtish Patra 8278d1daa3SAtish Patra return -1; 8378d1daa3SAtish Patra } cpuid_to_hartid_map(int cpu)8478d1daa3SAtish Patrastatic inline unsigned long cpuid_to_hartid_map(int cpu) 8578d1daa3SAtish Patra { 8678d1daa3SAtish Patra return boot_cpu_hartid; 876825c7a8SAtish Patra } 886825c7a8SAtish Patra riscv_ipi_enable(void)89832f15f4SAnup Patelstatic inline void riscv_ipi_enable(void) 90cc7f3f72SAnup Patel { 91cc7f3f72SAnup Patel } 92cc7f3f72SAnup Patel riscv_ipi_disable(void)93832f15f4SAnup Patelstatic inline void riscv_ipi_disable(void) 94832f15f4SAnup Patel { 95832f15f4SAnup Patel } 96832f15f4SAnup Patel riscv_ipi_have_virq_range(void)97832f15f4SAnup Patelstatic inline bool riscv_ipi_have_virq_range(void) 98832f15f4SAnup Patel { 99832f15f4SAnup Patel return false; 100832f15f4SAnup Patel } 101832f15f4SAnup Patel riscv_ipi_set_virq_range(int virq,int nr)102dc892fb4SSamuel Hollandstatic inline void riscv_ipi_set_virq_range(int virq, int nr) 103cc7f3f72SAnup Patel { 104cc7f3f72SAnup Patel } 105cc7f3f72SAnup Patel 1066825c7a8SAtish Patra #endif /* CONFIG_SMP */ 107f1e58583SAtish Patra 108f1e58583SAtish Patra #if defined(CONFIG_HOTPLUG_CPU) && (CONFIG_SMP) 109f1e58583SAtish Patra bool cpu_has_hotplug(unsigned int cpu); 110f1e58583SAtish Patra #else cpu_has_hotplug(unsigned int cpu)111f1e58583SAtish Patrastatic inline bool cpu_has_hotplug(unsigned int cpu) 112f1e58583SAtish Patra { 113f1e58583SAtish Patra return false; 114f1e58583SAtish Patra } 115f1e58583SAtish Patra #endif 116f1e58583SAtish Patra 11776d2a049SPalmer Dabbelt #endif /* _ASM_RISCV_SMP_H */ 118