diff options
Diffstat (limited to 'include/asm-i386/smp.h')
-rw-r--r-- | include/asm-i386/smp.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/include/asm-i386/smp.h b/include/asm-i386/smp.h new file mode 100644 index 000000000000..dd1491225d51 --- /dev/null +++ b/include/asm-i386/smp.h | |||
@@ -0,0 +1,90 @@ | |||
1 | #ifndef __ASM_SMP_H | ||
2 | #define __ASM_SMP_H | ||
3 | |||
4 | /* | ||
5 | * We need the APIC definitions automatically as part of 'smp.h' | ||
6 | */ | ||
7 | #ifndef __ASSEMBLY__ | ||
8 | #include <linux/config.h> | ||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/threads.h> | ||
11 | #include <linux/cpumask.h> | ||
12 | #endif | ||
13 | |||
14 | #ifdef CONFIG_X86_LOCAL_APIC | ||
15 | #ifndef __ASSEMBLY__ | ||
16 | #include <asm/fixmap.h> | ||
17 | #include <asm/bitops.h> | ||
18 | #include <asm/mpspec.h> | ||
19 | #ifdef CONFIG_X86_IO_APIC | ||
20 | #include <asm/io_apic.h> | ||
21 | #endif | ||
22 | #include <asm/apic.h> | ||
23 | #endif | ||
24 | #endif | ||
25 | |||
26 | #define BAD_APICID 0xFFu | ||
27 | #ifdef CONFIG_SMP | ||
28 | #ifndef __ASSEMBLY__ | ||
29 | |||
30 | /* | ||
31 | * Private routines/data | ||
32 | */ | ||
33 | |||
34 | extern void smp_alloc_memory(void); | ||
35 | extern int pic_mode; | ||
36 | extern int smp_num_siblings; | ||
37 | extern cpumask_t cpu_sibling_map[]; | ||
38 | |||
39 | extern void smp_flush_tlb(void); | ||
40 | extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs); | ||
41 | extern void smp_invalidate_rcv(void); /* Process an NMI */ | ||
42 | extern void (*mtrr_hook) (void); | ||
43 | extern void zap_low_mappings (void); | ||
44 | |||
45 | #define MAX_APICID 256 | ||
46 | extern u8 x86_cpu_to_apicid[]; | ||
47 | |||
48 | /* | ||
49 | * This function is needed by all SMP systems. It must _always_ be valid | ||
50 | * from the initial startup. We map APIC_BASE very early in page_setup(), | ||
51 | * so this is correct in the x86 case. | ||
52 | */ | ||
53 | #define __smp_processor_id() (current_thread_info()->cpu) | ||
54 | |||
55 | extern cpumask_t cpu_callout_map; | ||
56 | extern cpumask_t cpu_callin_map; | ||
57 | #define cpu_possible_map cpu_callout_map | ||
58 | |||
59 | /* We don't mark CPUs online until __cpu_up(), so we need another measure */ | ||
60 | static inline int num_booting_cpus(void) | ||
61 | { | ||
62 | return cpus_weight(cpu_callout_map); | ||
63 | } | ||
64 | |||
65 | #ifdef CONFIG_X86_LOCAL_APIC | ||
66 | |||
67 | #ifdef APIC_DEFINITION | ||
68 | extern int hard_smp_processor_id(void); | ||
69 | #else | ||
70 | #include <mach_apicdef.h> | ||
71 | static inline int hard_smp_processor_id(void) | ||
72 | { | ||
73 | /* we don't want to mark this access volatile - bad code generation */ | ||
74 | return GET_APIC_ID(*(unsigned long *)(APIC_BASE+APIC_ID)); | ||
75 | } | ||
76 | #endif | ||
77 | |||
78 | static __inline int logical_smp_processor_id(void) | ||
79 | { | ||
80 | /* we don't want to mark this access volatile - bad code generation */ | ||
81 | return GET_APIC_LOGICAL_ID(*(unsigned long *)(APIC_BASE+APIC_LDR)); | ||
82 | } | ||
83 | |||
84 | #endif | ||
85 | #endif /* !__ASSEMBLY__ */ | ||
86 | |||
87 | #define NO_PROC_ID 0xFF /* No processor magic marker */ | ||
88 | |||
89 | #endif | ||
90 | #endif | ||