1 
   2 
   3 
   4 
   5 
   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 
  24 
  25 extern void show_ipi_list(struct seq_file *, int);
  26 
  27 
  28 
  29 
  30 asmlinkage void do_IPI(int ipinr, struct pt_regs *regs);
  31 
  32 
  33 
  34 
  35 void handle_IPI(int ipinr, struct pt_regs *regs);
  36 
  37 
  38 
  39 
  40 extern void smp_init_cpus(void);
  41 
  42 
  43 
  44 
  45 
  46 extern void set_smp_cross_call(void (*)(const struct cpumask *, unsigned int));
  47 
  48 
  49 
  50 
  51 
  52 asmlinkage void secondary_start_kernel(void);
  53 
  54 
  55 
  56 
  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 
  84 
  85         void (*smp_init_cpus)(void);
  86         
  87 
  88 
  89         void (*smp_prepare_cpus)(unsigned int max_cpus);
  90 
  91         
  92 
  93 
  94         void (*smp_secondary_init)(unsigned int cpu);
  95         
  96 
  97 
  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 
 120 
 121 extern void smp_set_ops(const struct smp_operations *);
 122 
 123 #endif