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#include <asm/mips-cm.h> 17 18#ifdef CONFIG_SMP 19 20#include <linux/cpumask.h> 21 22struct task_struct; 23 24struct plat_smp_ops { 25 void (*send_ipi_single)(int cpu, unsigned int action); 26 void (*send_ipi_mask)(const struct cpumask *mask, unsigned int action); 27 void (*init_secondary)(void); 28 void (*smp_finish)(void); 29 void (*boot_secondary)(int cpu, struct task_struct *idle); 30 void (*smp_setup)(void); 31 void (*prepare_cpus)(unsigned int max_cpus); 32#ifdef CONFIG_HOTPLUG_CPU 33 int (*cpu_disable)(void); 34 void (*cpu_die)(unsigned int cpu); 35#endif 36}; 37 38extern void register_smp_ops(struct plat_smp_ops *ops); 39 40static inline void plat_smp_setup(void) 41{ 42 extern struct plat_smp_ops *mp_ops; /* private */ 43 44 mp_ops->smp_setup(); 45} 46 47extern void mips_smp_send_ipi_single(int cpu, unsigned int action); 48extern void mips_smp_send_ipi_mask(const struct cpumask *mask, 49 unsigned int action); 50 51#else /* !CONFIG_SMP */ 52 53struct plat_smp_ops; 54 55static inline void plat_smp_setup(void) 56{ 57 /* UP, nothing to do ... */ 58} 59 60static inline void register_smp_ops(struct plat_smp_ops *ops) 61{ 62} 63 64#endif /* !CONFIG_SMP */ 65 66static inline int register_up_smp_ops(void) 67{ 68#ifdef CONFIG_SMP_UP 69 extern struct plat_smp_ops up_smp_ops; 70 71 register_smp_ops(&up_smp_ops); 72 73 return 0; 74#else 75 return -ENODEV; 76#endif 77} 78 79static inline int register_cmp_smp_ops(void) 80{ 81#ifdef CONFIG_MIPS_CMP 82 extern struct plat_smp_ops cmp_smp_ops; 83 84 if (!mips_cm_present()) 85 return -ENODEV; 86 87 register_smp_ops(&cmp_smp_ops); 88 89 return 0; 90#else 91 return -ENODEV; 92#endif 93} 94 95static inline int register_vsmp_smp_ops(void) 96{ 97#ifdef CONFIG_MIPS_MT_SMP 98 extern struct plat_smp_ops vsmp_smp_ops; 99 100 register_smp_ops(&vsmp_smp_ops); 101 102 return 0; 103#else 104 return -ENODEV; 105#endif 106} 107 108#ifdef CONFIG_MIPS_CPS 109extern int register_cps_smp_ops(void); 110#else 111static inline int register_cps_smp_ops(void) 112{ 113 return -ENODEV; 114} 115#endif 116 117#endif /* __ASM_SMP_OPS_H */ 118