1
2#ifndef _ASM_X86_MPSPEC_H
3#define _ASM_X86_MPSPEC_H
4
5
6#include <asm/mpspec_def.h>
7#include <asm/x86_init.h>
8#include <asm/apicdef.h>
9
10extern int pic_mode;
11
12#ifdef CONFIG_X86_32
13
14
15
16
17
18#if CONFIG_BASE_SMALL == 0
19# define MAX_MP_BUSSES 260
20#else
21# define MAX_MP_BUSSES 32
22#endif
23
24#define MAX_IRQ_SOURCES 256
25
26extern unsigned int def_to_bigsmp;
27
28#else
29
30#define MAX_MP_BUSSES 256
31
32#define MAX_IRQ_SOURCES (MAX_MP_BUSSES * 4)
33
34#endif
35
36#ifdef CONFIG_EISA
37extern int mp_bus_id_to_type[MAX_MP_BUSSES];
38#endif
39
40extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
41
42extern unsigned int boot_cpu_physical_apicid;
43extern u8 boot_cpu_apic_version;
44extern unsigned long mp_lapic_addr;
45
46#ifdef CONFIG_X86_LOCAL_APIC
47extern int smp_found_config;
48#else
49# define smp_found_config 0
50#endif
51
52static inline void get_smp_config(void)
53{
54 x86_init.mpparse.get_smp_config(0);
55}
56
57static inline void early_get_smp_config(void)
58{
59 x86_init.mpparse.get_smp_config(1);
60}
61
62static inline void find_smp_config(void)
63{
64 x86_init.mpparse.find_smp_config();
65}
66
67#ifdef CONFIG_X86_MPPARSE
68extern void e820__memblock_alloc_reserved_mpc_new(void);
69extern int enable_update_mptable;
70extern void default_find_smp_config(void);
71extern void default_get_smp_config(unsigned int early);
72#else
73static inline void e820__memblock_alloc_reserved_mpc_new(void) { }
74#define enable_update_mptable 0
75#define default_find_smp_config x86_init_noop
76#define default_get_smp_config x86_init_uint_noop
77#endif
78
79int generic_processor_info(int apicid, int version);
80
81#define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_LOCAL_APIC)
82
83struct physid_mask {
84 unsigned long mask[PHYSID_ARRAY_SIZE];
85};
86
87typedef struct physid_mask physid_mask_t;
88
89#define physid_set(physid, map) set_bit(physid, (map).mask)
90#define physid_clear(physid, map) clear_bit(physid, (map).mask)
91#define physid_isset(physid, map) test_bit(physid, (map).mask)
92#define physid_test_and_set(physid, map) \
93 test_and_set_bit(physid, (map).mask)
94
95#define physids_and(dst, src1, src2) \
96 bitmap_and((dst).mask, (src1).mask, (src2).mask, MAX_LOCAL_APIC)
97
98#define physids_or(dst, src1, src2) \
99 bitmap_or((dst).mask, (src1).mask, (src2).mask, MAX_LOCAL_APIC)
100
101#define physids_clear(map) \
102 bitmap_zero((map).mask, MAX_LOCAL_APIC)
103
104#define physids_complement(dst, src) \
105 bitmap_complement((dst).mask, (src).mask, MAX_LOCAL_APIC)
106
107#define physids_empty(map) \
108 bitmap_empty((map).mask, MAX_LOCAL_APIC)
109
110#define physids_equal(map1, map2) \
111 bitmap_equal((map1).mask, (map2).mask, MAX_LOCAL_APIC)
112
113#define physids_weight(map) \
114 bitmap_weight((map).mask, MAX_LOCAL_APIC)
115
116#define physids_shift_right(d, s, n) \
117 bitmap_shift_right((d).mask, (s).mask, n, MAX_LOCAL_APIC)
118
119#define physids_shift_left(d, s, n) \
120 bitmap_shift_left((d).mask, (s).mask, n, MAX_LOCAL_APIC)
121
122static inline unsigned long physids_coerce(physid_mask_t *map)
123{
124 return map->mask[0];
125}
126
127static inline void physids_promote(unsigned long physids, physid_mask_t *map)
128{
129 physids_clear(*map);
130 map->mask[0] = physids;
131}
132
133static inline void physid_set_mask_of_physid(int physid, physid_mask_t *map)
134{
135 physids_clear(*map);
136 physid_set(physid, *map);
137}
138
139#define PHYSID_MASK_ALL { {[0 ... PHYSID_ARRAY_SIZE-1] = ~0UL} }
140#define PHYSID_MASK_NONE { {[0 ... PHYSID_ARRAY_SIZE-1] = 0UL} }
141
142extern physid_mask_t phys_cpu_present_map;
143
144#endif
145