root/arch/arm/include/asm/smp.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  *  arch/arm/include/asm/smp.h
   4  *
   5  *  Copyright (C) 2004-2005 ARM Ltd.
   6  */
   7 #ifndef __ASM_ARM_SMP_H
   8 #define __ASM_ARM_SMP_H
   9 
  10 #include <linux/threads.h>
  11 #include <linux/cpumask.h>
  12 #include <linux/thread_info.h>
  13 
  14 #ifndef CONFIG_SMP
  15 # error "<asm/smp.h> included in non-SMP build"
  16 #endif
  17 
  18 #define raw_smp_processor_id() (current_thread_info()->cpu)
  19 
  20 struct seq_file;
  21 
  22 /*
  23  * generate IPI list text
  24  */
  25 extern void show_ipi_list(struct seq_file *, int);
  26 
  27 /*
  28  * Called from assembly code, this handles an IPI.
  29  */
  30 asmlinkage void do_IPI(int ipinr, struct pt_regs *regs);
  31 
  32 /*
  33  * Called from C code, this handles an IPI.
  34  */
  35 void handle_IPI(int ipinr, struct pt_regs *regs);
  36 
  37 /*
  38  * Setup the set of possible CPUs (via set_cpu_possible)
  39  */
  40 extern void smp_init_cpus(void);
  41 
  42 
  43 /*
  44  * Provide a function to raise an IPI cross call on CPUs in callmap.
  45  */
  46 extern void set_smp_cross_call(void (*)(const struct cpumask *, unsigned int));
  47 
  48 /*
  49  * Called from platform specific assembly code, this is the
  50  * secondary CPU entry point.
  51  */
  52 asmlinkage void secondary_start_kernel(void);
  53 
  54 
  55 /*
  56  * Initial data for bringing up a secondary CPU.
  57  */
  58 struct secondary_data {
  59         union {
  60                 struct mpu_rgn_info *mpu_rgn_info;
  61                 u64 pgdir;
  62         };
  63         unsigned long swapper_pg_dir;
  64         void *stack;
  65 };
  66 extern struct secondary_data secondary_data;
  67 extern void secondary_startup(void);
  68 extern void secondary_startup_arm(void);
  69 
  70 extern int __cpu_disable(void);
  71 
  72 extern void __cpu_die(unsigned int cpu);
  73 
  74 extern void arch_send_call_function_single_ipi(int cpu);
  75 extern void arch_send_call_function_ipi_mask(const struct cpumask *mask);
  76 extern void arch_send_wakeup_ipi_mask(const struct cpumask *mask);
  77 
  78 extern int register_ipi_completion(struct completion *completion, int cpu);
  79 
  80 struct smp_operations {
  81 #ifdef CONFIG_SMP
  82         /*
  83          * Setup the set of possible CPUs (via set_cpu_possible)
  84          */
  85         void (*smp_init_cpus)(void);
  86         /*
  87          * Initialize cpu_possible map, and enable coherency
  88          */
  89         void (*smp_prepare_cpus)(unsigned int max_cpus);
  90 
  91         /*
  92          * Perform platform specific initialisation of the specified CPU.
  93          */
  94         void (*smp_secondary_init)(unsigned int cpu);
  95         /*
  96          * Boot a secondary CPU, and assign it the specified idle task.
  97          * This also gives us the initial stack to use for this CPU.
  98          */
  99         int  (*smp_boot_secondary)(unsigned int cpu, struct task_struct *idle);
 100 #ifdef CONFIG_HOTPLUG_CPU
 101         int  (*cpu_kill)(unsigned int cpu);
 102         void (*cpu_die)(unsigned int cpu);
 103         bool  (*cpu_can_disable)(unsigned int cpu);
 104         int  (*cpu_disable)(unsigned int cpu);
 105 #endif
 106 #endif
 107 };
 108 
 109 struct of_cpu_method {
 110         const char *method;
 111         const struct smp_operations *ops;
 112 };
 113 
 114 #define CPU_METHOD_OF_DECLARE(name, _method, _ops)                      \
 115         static const struct of_cpu_method __cpu_method_of_table_##name  \
 116                 __used __section(__cpu_method_of_table)                 \
 117                 = { .method = _method, .ops = _ops }
 118 /*
 119  * set platform specific SMP operations
 120  */
 121 extern void smp_set_ops(const struct smp_operations *);
 122 
 123 #endif /* ifndef __ASM_ARM_SMP_H */

/* [<][>][^][v][top][bottom][index][help] */