linux/arch/riscv/include/asm/smp.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2012 Regents of the University of California
   4 */
   5
   6#ifndef _ASM_RISCV_SMP_H
   7#define _ASM_RISCV_SMP_H
   8
   9#include <linux/cpumask.h>
  10#include <linux/irqreturn.h>
  11#include <linux/thread_info.h>
  12
  13#define INVALID_HARTID ULONG_MAX
  14
  15struct seq_file;
  16extern unsigned long boot_cpu_hartid;
  17
  18struct riscv_ipi_ops {
  19        void (*ipi_inject)(const struct cpumask *target);
  20        void (*ipi_clear)(void);
  21};
  22
  23#ifdef CONFIG_SMP
  24/*
  25 * Mapping between linux logical cpu index and hartid.
  26 */
  27extern unsigned long __cpuid_to_hartid_map[NR_CPUS];
  28#define cpuid_to_hartid_map(cpu)    __cpuid_to_hartid_map[cpu]
  29
  30/* print IPI stats */
  31void show_ipi_stats(struct seq_file *p, int prec);
  32
  33/* SMP initialization hook for setup_arch */
  34void __init setup_smp(void);
  35
  36/* Called from C code, this handles an IPI. */
  37void handle_IPI(struct pt_regs *regs);
  38
  39/* Hook for the generic smp_call_function_many() routine. */
  40void arch_send_call_function_ipi_mask(struct cpumask *mask);
  41
  42/* Hook for the generic smp_call_function_single() routine. */
  43void arch_send_call_function_single_ipi(int cpu);
  44
  45int riscv_hartid_to_cpuid(int hartid);
  46void riscv_cpuid_to_hartid_mask(const struct cpumask *in, struct cpumask *out);
  47
  48/* Set custom IPI operations */
  49void riscv_set_ipi_ops(const struct riscv_ipi_ops *ops);
  50
  51/* Clear IPI for current CPU */
  52void riscv_clear_ipi(void);
  53
  54/* Secondary hart entry */
  55asmlinkage void smp_callin(void);
  56
  57/*
  58 * Obtains the hart ID of the currently executing task.  This relies on
  59 * THREAD_INFO_IN_TASK, but we define that unconditionally.
  60 */
  61#define raw_smp_processor_id() (current_thread_info()->cpu)
  62
  63#if defined CONFIG_HOTPLUG_CPU
  64int __cpu_disable(void);
  65void __cpu_die(unsigned int cpu);
  66void cpu_stop(void);
  67#else
  68#endif /* CONFIG_HOTPLUG_CPU */
  69
  70#else
  71
  72static inline void show_ipi_stats(struct seq_file *p, int prec)
  73{
  74}
  75
  76static inline int riscv_hartid_to_cpuid(int hartid)
  77{
  78        if (hartid == boot_cpu_hartid)
  79                return 0;
  80
  81        return -1;
  82}
  83static inline unsigned long cpuid_to_hartid_map(int cpu)
  84{
  85        return boot_cpu_hartid;
  86}
  87
  88static inline void riscv_cpuid_to_hartid_mask(const struct cpumask *in,
  89                                              struct cpumask *out)
  90{
  91        cpumask_clear(out);
  92        cpumask_set_cpu(boot_cpu_hartid, out);
  93}
  94
  95static inline void riscv_set_ipi_ops(const struct riscv_ipi_ops *ops)
  96{
  97}
  98
  99static inline void riscv_clear_ipi(void)
 100{
 101}
 102
 103#endif /* CONFIG_SMP */
 104
 105#if defined(CONFIG_HOTPLUG_CPU) && (CONFIG_SMP)
 106bool cpu_has_hotplug(unsigned int cpu);
 107#else
 108static inline bool cpu_has_hotplug(unsigned int cpu)
 109{
 110        return false;
 111}
 112#endif
 113
 114#endif /* _ASM_RISCV_SMP_H */
 115