1/* 2 * This file is subject to the terms and conditions of the GNU General 3 * Public License. See the file "COPYING" in the main directory of this 4 * archive for more details. 5 * 6 * Copyright (C) 2000 - 2001 by Kanoj Sarcar (kanoj@sgi.com) 7 * Copyright (C) 2000 - 2001 by Silicon Graphics, Inc. 8 * Copyright (C) 2000, 2001, 2002 Ralf Baechle 9 * Copyright (C) 2000, 2001 Broadcom Corporation 10 */ 11#ifndef __ASM_SMP_OPS_H 12#define __ASM_SMP_OPS_H 13 14#include <linux/errno.h> 15 16#ifdef CONFIG_SMP 17 18#include <linux/cpumask.h> 19 20struct task_struct; 21 22struct plat_smp_ops { 23 void (*send_ipi_single)(int cpu, unsigned int action); 24 void (*send_ipi_mask)(const struct cpumask *mask, unsigned int action); 25 void (*init_secondary)(void); 26 void (*smp_finish)(void); 27 void (*cpus_done)(void); 28 void (*boot_secondary)(int cpu, struct task_struct *idle); 29 void (*smp_setup)(void); 30 void (*prepare_cpus)(unsigned int max_cpus); 31#ifdef CONFIG_HOTPLUG_CPU 32 int (*cpu_disable)(void); 33 void (*cpu_die)(unsigned int cpu); 34#endif 35}; 36 37extern void register_smp_ops(struct plat_smp_ops *ops); 38 39static inline void plat_smp_setup(void) 40{ 41 extern struct plat_smp_ops *mp_ops; /* private */ 42 43 mp_ops->smp_setup(); 44} 45 46#else /* !CONFIG_SMP */ 47 48struct plat_smp_ops; 49 50static inline void plat_smp_setup(void) 51{ 52 /* UP, nothing to do ... */ 53} 54 55static inline void register_smp_ops(struct plat_smp_ops *ops) 56{ 57} 58 59#endif /* !CONFIG_SMP */ 60 61static inline int register_up_smp_ops(void) 62{ 63#ifdef CONFIG_SMP_UP 64 extern struct plat_smp_ops up_smp_ops; 65 66 register_smp_ops(&up_smp_ops); 67 68 return 0; 69#else 70 return -ENODEV; 71#endif 72} 73 74static inline int register_cmp_smp_ops(void) 75{ 76#ifdef CONFIG_MIPS_CMP 77 extern struct plat_smp_ops cmp_smp_ops; 78 79 register_smp_ops(&cmp_smp_ops); 80 81 return 0; 82#else 83 return -ENODEV; 84#endif 85} 86 87static inline int register_vsmp_smp_ops(void) 88{ 89#ifdef CONFIG_MIPS_MT_SMP 90 extern struct plat_smp_ops vsmp_smp_ops; 91 92 register_smp_ops(&vsmp_smp_ops); 93 94 return 0; 95#else 96 return -ENODEV; 97#endif 98} 99 100#endif /* __ASM_SMP_OPS_H */ 101