2007-11-19 12:23:51 +00:00
/*
* This file is subject to the terms and conditions of the GNU General
* Public License . See the file " COPYING " in the main directory of this
* archive for more details .
*
* Copyright ( C ) 2000 - 2001 by Kanoj Sarcar ( kanoj @ sgi . com )
* Copyright ( C ) 2000 - 2001 by Silicon Graphics , Inc .
* Copyright ( C ) 2000 , 2001 , 2002 Ralf Baechle
* Copyright ( C ) 2000 , 2001 Broadcom Corporation
*/
# ifndef __ASM_SMP_OPS_H
# define __ASM_SMP_OPS_H
2011-06-01 14:20:09 +01:00
# include <linux/errno.h>
2014-01-15 10:31:54 +00:00
# include <asm/mips-cm.h>
2007-11-19 12:23:51 +00:00
# ifdef CONFIG_SMP
# include <linux/cpumask.h>
2009-03-25 14:41:09 +01:00
struct task_struct ;
2007-11-19 12:23:51 +00:00
struct plat_smp_ops {
void ( * send_ipi_single ) ( int cpu , unsigned int action ) ;
2009-09-24 09:34:44 -06:00
void ( * send_ipi_mask ) ( const struct cpumask * mask , unsigned int action ) ;
2007-11-19 12:23:51 +00:00
void ( * init_secondary ) ( void ) ;
void ( * smp_finish ) ( void ) ;
void ( * boot_secondary ) ( int cpu , struct task_struct * idle ) ;
void ( * smp_setup ) ( void ) ;
void ( * prepare_cpus ) ( unsigned int max_cpus ) ;
2009-06-23 10:00:31 +01:00
# ifdef CONFIG_HOTPLUG_CPU
int ( * cpu_disable ) ( void ) ;
void ( * cpu_die ) ( unsigned int cpu ) ;
# endif
2007-11-19 12:23:51 +00:00
} ;
extern void register_smp_ops ( struct plat_smp_ops * ops ) ;
static inline void plat_smp_setup ( void )
{
extern struct plat_smp_ops * mp_ops ; /* private */
mp_ops - > smp_setup ( ) ;
}
2014-03-24 10:19:33 +00:00
extern void gic_send_ipi_single ( int cpu , unsigned int action ) ;
extern void gic_send_ipi_mask ( const struct cpumask * mask , unsigned int action ) ;
2007-11-19 12:23:51 +00:00
# else /* !CONFIG_SMP */
struct plat_smp_ops ;
static inline void plat_smp_setup ( void )
{
/* UP, nothing to do ... */
}
static inline void register_smp_ops ( struct plat_smp_ops * ops )
{
}
# endif /* !CONFIG_SMP */
2011-05-28 15:27:59 +01:00
static inline int register_up_smp_ops ( void )
{
# ifdef CONFIG_SMP_UP
extern struct plat_smp_ops up_smp_ops ;
register_smp_ops ( & up_smp_ops ) ;
return 0 ;
# else
return - ENODEV ;
# endif
}
static inline int register_cmp_smp_ops ( void )
{
# ifdef CONFIG_MIPS_CMP
extern struct plat_smp_ops cmp_smp_ops ;
2014-01-15 10:31:54 +00:00
if ( ! mips_cm_present ( ) )
return - ENODEV ;
2011-05-28 15:27:59 +01:00
register_smp_ops ( & cmp_smp_ops ) ;
return 0 ;
# else
return - ENODEV ;
# endif
}
static inline int register_vsmp_smp_ops ( void )
{
# ifdef CONFIG_MIPS_MT_SMP
extern struct plat_smp_ops vsmp_smp_ops ;
register_smp_ops ( & vsmp_smp_ops ) ;
return 0 ;
# else
return - ENODEV ;
# endif
}
2007-11-19 12:23:51 +00:00
2014-01-15 10:31:53 +00:00
# ifdef CONFIG_MIPS_CPS
extern int register_cps_smp_ops ( void ) ;
# else
static inline int register_cps_smp_ops ( void )
{
return - ENODEV ;
}
# endif
2007-11-19 12:23:51 +00:00
# endif /* __ASM_SMP_OPS_H */