2005-04-17 02:20:36 +04:00
# ifndef __ASM_SH_SMP_H
# define __ASM_SH_SMP_H
# include <linux/bitops.h>
# include <linux/cpumask.h>
# ifdef CONFIG_SMP
2007-05-31 08:46:21 +04:00
# include <linux/spinlock.h>
2005-04-17 02:20:36 +04:00
# include <asm/atomic.h>
# include <asm/current.h>
2005-06-22 04:14:34 +04:00
# define raw_smp_processor_id() (current_thread_info()->cpu)
2007-09-21 13:32:32 +04:00
# define hard_smp_processor_id() plat_smp_processor_id()
/* 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-17 02:20:36 +04:00
/* I've no idea what the real meaning of this is */
# define PROC_CHANGE_PENALTY 20
# define NO_PROC_ID (-1)
struct smp_fn_call_struct {
spinlock_t lock ;
atomic_t finished ;
void ( * fn ) ( void * ) ;
void * data ;
} ;
extern struct smp_fn_call_struct smp_fn_call ;
2007-09-21 13:32:32 +04:00
# define SMP_MSG_FUNCTION 0
# define SMP_MSG_RESCHEDULE 1
# define SMP_MSG_NR 2
2005-04-17 02:20:36 +04:00
2007-09-21 13:32:32 +04:00
void plat_smp_setup ( void ) ;
void plat_prepare_cpus ( unsigned int max_cpus ) ;
int plat_smp_processor_id ( void ) ;
void plat_start_cpu ( unsigned int cpu , unsigned long entry_point ) ;
void plat_send_ipi ( unsigned int cpu , unsigned int message ) ;
int plat_register_ipi_handler ( unsigned int message ,
void ( * handler ) ( void * ) , void * arg ) ;
# else
2005-04-17 02:20:36 +04:00
2007-06-20 13:23:49 +04:00
# define hard_smp_processor_id() (0)
2007-09-21 13:32:32 +04:00
# endif /* CONFIG_SMP */
2005-04-17 02:20:36 +04:00
# endif /* __ASM_SH_SMP_H */