2005-04-16 15:20:36 -07: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_H
# define __ASM_SMP_H
# include <linux/bitops.h>
# include <linux/linkage.h>
2009-06-19 14:05:26 +01:00
# include <linux/smp.h>
2005-04-16 15:20:36 -07:00
# include <linux/threads.h>
# include <linux/cpumask.h>
2007-11-19 12:23:51 +00:00
2005-04-16 15:20:36 -07:00
# include <asm/atomic.h>
2007-11-19 12:23:51 +00:00
# include <asm/smp-ops.h>
2005-04-16 15:20:36 -07:00
2007-03-02 20:42:04 +00:00
extern int smp_num_siblings ;
extern cpumask_t cpu_sibling_map [ ] ;
2005-06-21 17:14:34 -07:00
# define raw_smp_processor_id() (current_thread_info()->cpu)
2005-04-16 15:20:36 -07:00
/* Map from cpu id to sequential logical cpu number. This will only
not be idempotent when cpus failed to come on - line . */
extern int __cpu_number_map [ NR_CPUS ] ;
# define cpu_number_map(cpu) __cpu_number_map[cpu]
/* The reverse map from sequential logical cpu number to cpu id. */
extern int __cpu_logical_map [ NR_CPUS ] ;
# define cpu_logical_map(cpu) __cpu_logical_map[cpu]
# define NO_PROC_ID (-1)
# define SMP_RESCHEDULE_YOURSELF 0x1 /* XXX braindead */
# define SMP_CALL_FUNCTION 0x2
2008-12-11 15:33:32 -08:00
/* Octeon - Tell another core to flush its icache */
# define SMP_ICACHE_FLUSH 0x4
2009-06-23 10:36:38 +01:00
extern volatile cpumask_t cpu_callin_map ;
2005-04-16 15:20:36 -07:00
extern void asmlinkage smp_bootstrap ( void ) ;
/*
* this function sends a ' reschedule ' IPI to another CPU .
* it goes straight through and wastes no time serializing
* anything . Worst case is that we lose a reschedule . . .
*/
static inline void smp_send_reschedule ( int cpu )
{
2007-11-19 12:23:51 +00:00
extern struct plat_smp_ops * mp_ops ; /* private */
mp_ops - > send_ipi_single ( cpu , SMP_RESCHEDULE_YOURSELF ) ;
2005-04-16 15:20:36 -07:00
}
2009-06-23 10:00:31 +01:00
# ifdef CONFIG_HOTPLUG_CPU
static inline int __cpu_disable ( void )
{
extern struct plat_smp_ops * mp_ops ; /* private */
return mp_ops - > cpu_disable ( ) ;
}
static inline void __cpu_die ( unsigned int cpu )
{
extern struct plat_smp_ops * mp_ops ; /* private */
mp_ops - > cpu_die ( cpu ) ;
}
extern void play_dead ( void ) ;
# endif
2005-04-16 15:20:36 -07:00
extern asmlinkage void smp_call_function_interrupt ( void ) ;
2009-09-25 15:35:28 +01:00
static inline void arch_send_call_function_single_ipi ( int cpu )
{
extern struct plat_smp_ops * mp_ops ; /* private */
mp_ops - > send_ipi_mask ( & cpumask_of_cpu ( cpu ) , SMP_CALL_FUNCTION ) ;
}
static inline void arch_send_call_function_ipi_mask ( const struct cpumask * mask )
{
extern struct plat_smp_ops * mp_ops ; /* private */
mp_ops - > send_ipi_mask ( mask , SMP_CALL_FUNCTION ) ;
}
2008-06-17 10:45:23 +02:00
2005-04-16 15:20:36 -07:00
# endif /* __ASM_SMP_H */