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