2005-04-16 15:20:36 -07:00
# ifndef __ASM_SMP_H
# define __ASM_SMP_H
# include <linux/cpumask.h>
2007-03-16 21:07:36 +01:00
# include <linux/init.h>
2005-04-16 15:20:36 -07:00
2008-01-30 13:30:36 +01:00
/*
* We need the APIC definitions automatically as part of ' smp . h '
*/
2005-04-16 15:20:36 -07:00
# include <asm/apic.h>
2007-05-02 19:27:04 +02:00
# include <asm/io_apic.h>
2008-01-30 13:30:36 +01:00
# include <asm/mpspec.h>
2005-04-16 15:20:36 -07:00
# include <asm/pda.h>
2008-01-30 13:30:36 +01:00
# include <asm/thread_info.h>
2005-04-16 15:20:36 -07:00
2005-04-16 15:25:19 -07:00
extern cpumask_t cpu_callout_map ;
2006-01-11 22:45:12 +01:00
extern cpumask_t cpu_initialized ;
2005-04-16 15:25:19 -07:00
2008-01-30 13:30:36 +01:00
extern int smp_num_siblings ;
extern unsigned int num_processors ;
2005-04-16 15:20:36 -07:00
extern void smp_alloc_memory ( void ) ;
2005-06-25 14:55:02 -07:00
extern void lock_ipi_call_lock ( void ) ;
extern void unlock_ipi_call_lock ( void ) ;
2008-01-30 13:30:36 +01:00
2007-10-19 20:35:03 +02:00
extern int smp_call_function_mask ( cpumask_t mask , void ( * func ) ( void * ) ,
void * info , int wait ) ;
2005-07-29 14:03:29 -07:00
2008-01-30 13:33:10 +01:00
extern u16 __initdata x86_cpu_to_apicid_init [ ] ;
2008-01-30 13:33:12 +01:00
extern u16 __initdata x86_bios_cpu_apicid_init [ ] ;
2008-01-30 13:33:11 +01:00
extern void * x86_cpu_to_apicid_early_ptr ;
2008-01-30 13:33:12 +01:00
extern void * x86_bios_cpu_apicid_early_ptr ;
2008-01-30 13:30:36 +01:00
2007-10-16 01:24:05 -07:00
DECLARE_PER_CPU ( cpumask_t , cpu_sibling_map ) ;
2007-10-16 01:24:04 -07:00
DECLARE_PER_CPU ( cpumask_t , cpu_core_map ) ;
2008-01-30 13:33:10 +01:00
DECLARE_PER_CPU ( u16 , cpu_llc_id ) ;
DECLARE_PER_CPU ( u16 , x86_cpu_to_apicid ) ;
2008-01-30 13:33:12 +01:00
DECLARE_PER_CPU ( u16 , x86_bios_cpu_apicid ) ;
2005-04-16 15:20:36 -07:00
2008-01-30 13:30:36 +01:00
static inline int cpu_present_to_apicid ( int mps_cpu )
2005-04-16 15:20:36 -07:00
{
2008-01-30 13:33:12 +01:00
if ( cpu_present ( mps_cpu ) )
return ( int ) per_cpu ( x86_bios_cpu_apicid , mps_cpu ) ;
2008-01-30 13:30:36 +01:00
else
return BAD_APICID ;
2005-04-16 15:20:36 -07:00
}
2008-01-30 13:30:36 +01:00
# ifdef CONFIG_SMP
# define SMP_TRAMPOLINE_BASE 0x6000
2005-04-16 15:20:36 -07:00
2005-06-25 14:55:00 -07:00
extern int __cpu_disable ( void ) ;
extern void __cpu_die ( unsigned int cpu ) ;
2005-10-10 22:32:45 +02:00
extern void prefill_possible_map ( void ) ;
2007-03-16 21:07:36 +01:00
extern unsigned __cpuinitdata disabled_cpus ;
2005-04-16 15:20:36 -07:00
2008-01-30 13:30:36 +01:00
# define raw_smp_processor_id() read_pda(cpunumber)
# define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu)
2007-10-19 18:23:02 -07:00
2008-01-30 13:30:36 +01:00
# define stack_smp_processor_id() \
( { \
struct thread_info * ti ; \
__asm__ ( " andq %%rsp,%0; " : " =r " ( ti ) : " 0 " ( CURRENT_MASK ) ) ; \
ti - > cpu ; \
} )
2007-05-09 02:33:28 -07:00
2005-04-16 15:20:36 -07:00
/*
2008-01-30 13:30:36 +01:00
* On x86 all CPUs are mapped 1 : 1 to the APIC space . This simplifies
* scheduling and IPI sending and compresses data structures .
2005-04-16 15:20:36 -07:00
*/
2008-01-30 13:30:36 +01:00
static inline int num_booting_cpus ( void )
2005-04-16 15:20:36 -07:00
{
2008-01-30 13:30:36 +01:00
return cpus_weight ( cpu_callout_map ) ;
2005-04-16 15:20:36 -07:00
}
2008-01-30 13:30:36 +01:00
extern void smp_send_reschedule ( int cpu ) ;
# else /* CONFIG_SMP */
extern unsigned int boot_cpu_id ;
# define cpu_physical_id(cpu) boot_cpu_id
2005-04-16 15:20:36 -07:00
# define stack_smp_processor_id() 0
2008-01-30 13:30:36 +01:00
# endif /* !CONFIG_SMP */
# define safe_smp_processor_id() smp_processor_id()
2005-04-16 15:20:36 -07:00
static __inline int logical_smp_processor_id ( void )
{
/* we don't want to mark this access volatile - bad code generation */
2008-01-30 13:30:36 +01:00
return GET_APIC_LOGICAL_ID ( * ( u32 * ) ( APIC_BASE + APIC_LDR ) ) ;
}
static inline int hard_smp_processor_id ( void )
{
/* we don't want to mark this access volatile - bad code generation */
return GET_APIC_ID ( * ( u32 * ) ( APIC_BASE + APIC_ID ) ) ;
2005-04-16 15:20:36 -07:00
}
# endif