2005-04-16 15:20:36 -07:00
# ifndef __ASM_SH_SMP_H
# define __ASM_SH_SMP_H
# include <linux/bitops.h>
# include <linux/cpumask.h>
2010-03-30 12:38:01 +09:00
# include <asm/smp-ops.h>
2005-04-16 15:20:36 -07:00
# ifdef CONFIG_SMP
2007-05-31 13:46:21 +09:00
# include <linux/spinlock.h>
2005-04-16 15:20:36 -07:00
# include <asm/atomic.h>
# include <asm/current.h>
2005-06-21 17:14:34 -07:00
# define raw_smp_processor_id() (current_thread_info()->cpu)
2007-09-21 18:32:32 +09:00
/* Map from cpu id to sequential logical cpu number. */
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]
2005-04-16 15:20:36 -07:00
2008-08-06 18:21:03 +09:00
enum {
SMP_MSG_FUNCTION ,
SMP_MSG_RESCHEDULE ,
SMP_MSG_FUNCTION_SINGLE ,
SMP_MSG_TIMER ,
SMP_MSG_NR , /* must be last */
} ;
2005-04-16 15:20:36 -07:00
2008-08-06 18:02:48 +09:00
void smp_message_recv ( unsigned int msg ) ;
2008-12-13 21:20:26 +10:30
void smp_timer_broadcast ( const struct cpumask * mask ) ;
2008-08-06 18:21:03 +09:00
2008-08-06 18:37:07 +09:00
void local_timer_interrupt ( void ) ;
void local_timer_setup ( unsigned int cpu ) ;
2008-08-06 18:21:03 +09:00
void arch_send_call_function_single_ipi ( int cpu ) ;
2009-06-12 22:32:35 +09:30
extern void arch_send_call_function_ipi_mask ( const struct cpumask * mask ) ;
2007-09-21 18:32:32 +09:00
2010-03-30 12:38:01 +09:00
static inline int hard_smp_processor_id ( void )
{
extern struct plat_smp_ops * mp_ops ; /* private */
if ( ! mp_ops )
return 0 ; /* boot CPU */
return mp_ops - > smp_processor_id ( ) ;
}
2007-09-21 18:32:32 +09:00
# else
2005-04-16 15:20:36 -07:00
2007-06-20 18:23:49 +09:00
# define hard_smp_processor_id() (0)
2007-09-21 18:32:32 +09:00
# endif /* CONFIG_SMP */
2005-04-16 15:20:36 -07:00
# endif /* __ASM_SH_SMP_H */