linux/arch/mips/include/asm/smp-ops.h
<<
>>
Prefs
   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