Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 #ifndef __ASM_SMP_H
  2 #define __ASM_SMP_H
  3 
  4 #include <linux/cpumask.h>
  5 #include <linux/init.h>
  6 
  7 /*
  8  * We need the APIC definitions automatically as part of 'smp.h'
  9  */
 10 #include <asm/apic.h>
 11 #include <asm/io_apic.h>
 12 #include <asm/mpspec.h>
 13 #include <asm/pda.h>
 14 #include <asm/thread_info.h>
 15 
 16 extern cpumask_t cpu_callout_map;
 17 extern cpumask_t cpu_initialized;
 18 
 19 extern int smp_num_siblings;
 20 extern unsigned int num_processors;
 21 
 22 extern void smp_alloc_memory(void);
 23 extern void lock_ipi_call_lock(void);
 24 extern void unlock_ipi_call_lock(void);
 25 
 26 extern int smp_call_function_mask(cpumask_t mask, void (*func)(void *),
 27                                   void *info, int wait);
 28 
 29 extern u16 __initdata x86_cpu_to_apicid_init[];
 30 extern u16 __initdata x86_bios_cpu_apicid_init[];
 31 extern void *x86_cpu_to_apicid_early_ptr;
 32 extern void *x86_bios_cpu_apicid_early_ptr;
 33 
 34 DECLARE_PER_CPU(cpumask_t, cpu_sibling_map);
 35 DECLARE_PER_CPU(cpumask_t, cpu_core_map);
 36 DECLARE_PER_CPU(u16, cpu_llc_id);
 37 DECLARE_PER_CPU(u16, x86_cpu_to_apicid);
 38 DECLARE_PER_CPU(u16, x86_bios_cpu_apicid);
 39 
 40 static inline int cpu_present_to_apicid(int mps_cpu)
 41 {
 42         if (cpu_present(mps_cpu))
 43                 return (int)per_cpu(x86_bios_cpu_apicid, mps_cpu);
 44         else
 45                 return BAD_APICID;
 46 }
 47 
 48 #ifdef CONFIG_SMP
 49 
 50 #define SMP_TRAMPOLINE_BASE 0x6000
 51 
 52 extern int __cpu_disable(void);
 53 extern void __cpu_die(unsigned int cpu);
 54 extern void prefill_possible_map(void);
 55 extern unsigned __cpuinitdata disabled_cpus;
 56 
 57 #define raw_smp_processor_id()  read_pda(cpunumber)
 58 #define cpu_physical_id(cpu)    per_cpu(x86_cpu_to_apicid, cpu)
 59 
 60 #define stack_smp_processor_id()                                        \
 61         ({                                                              \
 62         struct thread_info *ti;                                         \
 63         __asm__("andq %%rsp,%0; ":"=r" (ti) : "" (CURRENT_MASK));      \
 64         ti->cpu;                                                        \
 65 })
 66 
 67 /*
 68  * On x86 all CPUs are mapped 1:1 to the APIC space. This simplifies
 69  * scheduling and IPI sending and compresses data structures.
 70  */
 71 static inline int num_booting_cpus(void)
 72 {
 73         return cpus_weight(cpu_callout_map);
 74 }
 75 
 76 extern void smp_send_reschedule(int cpu);
 77 
 78 #else /* CONFIG_SMP */
 79 
 80 extern unsigned int boot_cpu_id;
 81 #define cpu_physical_id(cpu)    boot_cpu_id
 82 #define stack_smp_processor_id() 0
 83 
 84 #endif /* !CONFIG_SMP */
 85 
 86 #define safe_smp_processor_id()         smp_processor_id()
 87 
 88 static __inline int logical_smp_processor_id(void)
 89 {
 90         /* we don't want to mark this access volatile - bad code generation */
 91         return GET_APIC_LOGICAL_ID(*(u32 *)(APIC_BASE + APIC_LDR));
 92 }
 93 
 94 static inline int hard_smp_processor_id(void)
 95 {
 96         /* we don't want to mark this access volatile - bad code generation */
 97         return GET_APIC_ID(*(u32 *)(APIC_BASE + APIC_ID));
 98 }
 99 
100 #endif
101 
102 
  This page was automatically generated by the LXR engine.