2005-04-16 15:20:36 -07:00
# ifndef __ASM_SMP_H
# define __ASM_SMP_H
/*
* We need the APIC definitions automatically as part of ' smp . h '
*/
# include <linux/threads.h>
# include <linux/cpumask.h>
# include <linux/bitops.h>
2007-03-16 21:07:36 +01:00
# include <linux/init.h>
2005-04-16 15:20:36 -07:00
extern int disable_apic ;
# include <asm/mpspec.h>
# include <asm/apic.h>
2007-05-02 19:27:04 +02:00
# include <asm/io_apic.h>
2005-04-16 15:20:36 -07:00
# include <asm/thread_info.h>
# ifdef CONFIG_SMP
# include <asm/pda.h>
struct pt_regs ;
2005-04-16 15:25:19 -07:00
extern cpumask_t cpu_present_mask ;
extern cpumask_t cpu_possible_map ;
extern cpumask_t cpu_online_map ;
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
2005-04-16 15:20:36 -07:00
/*
* Private routines / data
*/
extern void smp_alloc_memory ( void ) ;
extern volatile unsigned long smp_invalidate_needed ;
2005-06-25 14:55:02 -07:00
extern void lock_ipi_call_lock ( void ) ;
extern void unlock_ipi_call_lock ( void ) ;
2005-04-16 15:20:36 -07:00
extern int smp_num_siblings ;
extern void smp_send_reschedule ( int cpu ) ;
2005-07-29 14:03:29 -07:00
2005-04-16 15:20:36 -07:00
extern cpumask_t cpu_sibling_map [ NR_CPUS ] ;
2005-04-16 15:25:15 -07:00
extern cpumask_t cpu_core_map [ NR_CPUS ] ;
2006-03-27 01:15:22 -08:00
extern u8 cpu_llc_id [ NR_CPUS ] ;
2005-04-16 15:20:36 -07:00
# define SMP_TRAMPOLINE_BASE 0x6000
/*
* On x86 all CPUs are mapped 1 : 1 to the APIC space .
* This simplifies scheduling and IPI sending and
* compresses data structures .
*/
static inline int num_booting_cpus ( void )
{
return cpus_weight ( cpu_callout_map ) ;
}
2005-06-21 17:14:34 -07:00
# define raw_smp_processor_id() read_pda(cpunumber)
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 ) ;
2005-11-05 17:25:54 +01:00
extern unsigned num_processors ;
2007-03-16 21:07:36 +01:00
extern unsigned __cpuinitdata disabled_cpus ;
2005-04-16 15:20:36 -07:00
# define NO_PROC_ID 0xFF /* No processor magic marker */
2007-05-09 02:33:25 -07:00
# endif /* CONFIG_SMP */
2005-04-16 15:20:36 -07:00
2007-05-09 02:33:28 -07:00
static inline int hard_smp_processor_id ( void )
{
/* we don't want to mark this access volatile - bad code generation */
return GET_APIC_ID ( * ( unsigned int * ) ( APIC_BASE + APIC_ID ) ) ;
}
2005-04-16 15:20:36 -07:00
/*
* Some lowlevel functions might want to know about
* the real APIC ID < - > CPU # mapping .
*/
extern u8 x86_cpu_to_apicid [ NR_CPUS ] ; /* physical ID */
extern u8 x86_cpu_to_log_apicid [ NR_CPUS ] ;
extern u8 bios_cpu_apicid [ ] ;
static inline int cpu_present_to_apicid ( int mps_cpu )
{
if ( mps_cpu < NR_CPUS )
return ( int ) bios_cpu_apicid [ mps_cpu ] ;
else
return BAD_APICID ;
}
# ifndef CONFIG_SMP
# define stack_smp_processor_id() 0
# define cpu_logical_map(x) (x)
# else
# include <asm/thread_info.h>
# define stack_smp_processor_id() \
( { \
struct thread_info * ti ; \
__asm__ ( " andq %%rsp,%0; " : " =r " ( ti ) : " 0 " ( CURRENT_MASK ) ) ; \
ti - > cpu ; \
} )
# endif
static __inline int logical_smp_processor_id ( void )
{
/* we don't want to mark this access volatile - bad code generation */
return GET_APIC_LOGICAL_ID ( * ( unsigned long * ) ( APIC_BASE + APIC_LDR ) ) ;
}
2005-11-08 21:42:33 -08:00
# ifdef CONFIG_SMP
# define cpu_physical_id(cpu) x86_cpu_to_apicid[cpu]
# else
# define cpu_physical_id(cpu) boot_cpu_id
2006-09-26 10:52:28 +02:00
# endif /* !CONFIG_SMP */
2005-04-16 15:20:36 -07:00
# endif