diff options
29 files changed, 639 insertions, 76 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 67d6af3581bc..5731eb70e0a0 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -342,6 +342,7 @@ config X86_EXTENDED_PLATFORM | |||
342 | 342 | ||
343 | If you enable this option then you'll be able to select support | 343 | If you enable this option then you'll be able to select support |
344 | for the following (non-PC) 64 bit x86 platforms: | 344 | for the following (non-PC) 64 bit x86 platforms: |
345 | Numascale NumaChip | ||
345 | ScaleMP vSMP | 346 | ScaleMP vSMP |
346 | SGI Ultraviolet | 347 | SGI Ultraviolet |
347 | 348 | ||
@@ -350,6 +351,18 @@ config X86_EXTENDED_PLATFORM | |||
350 | endif | 351 | endif |
351 | # This is an alphabetically sorted list of 64 bit extended platforms | 352 | # This is an alphabetically sorted list of 64 bit extended platforms |
352 | # Please maintain the alphabetic order if and when there are additions | 353 | # Please maintain the alphabetic order if and when there are additions |
354 | config X86_NUMACHIP | ||
355 | bool "Numascale NumaChip" | ||
356 | depends on X86_64 | ||
357 | depends on X86_EXTENDED_PLATFORM | ||
358 | depends on NUMA | ||
359 | depends on SMP | ||
360 | depends on X86_X2APIC | ||
361 | depends on !EDAC_AMD64 | ||
362 | ---help--- | ||
363 | Adds support for Numascale NumaChip large-SMP systems. Needed to | ||
364 | enable more than ~168 cores. | ||
365 | If you don't have one of these, you should say N here. | ||
353 | 366 | ||
354 | config X86_VSMP | 367 | config X86_VSMP |
355 | bool "ScaleMP vSMP" | 368 | bool "ScaleMP vSMP" |
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index 1a6c09af048f..3ab9bdd87e79 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h | |||
@@ -176,6 +176,7 @@ static inline u64 native_x2apic_icr_read(void) | |||
176 | } | 176 | } |
177 | 177 | ||
178 | extern int x2apic_phys; | 178 | extern int x2apic_phys; |
179 | extern int x2apic_preenabled; | ||
179 | extern void check_x2apic(void); | 180 | extern void check_x2apic(void); |
180 | extern void enable_x2apic(void); | 181 | extern void enable_x2apic(void); |
181 | extern void x2apic_icr_write(u32 low, u32 id); | 182 | extern void x2apic_icr_write(u32 low, u32 id); |
@@ -198,6 +199,9 @@ static inline void x2apic_force_phys(void) | |||
198 | x2apic_phys = 1; | 199 | x2apic_phys = 1; |
199 | } | 200 | } |
200 | #else | 201 | #else |
202 | static inline void disable_x2apic(void) | ||
203 | { | ||
204 | } | ||
201 | static inline void check_x2apic(void) | 205 | static inline void check_x2apic(void) |
202 | { | 206 | { |
203 | } | 207 | } |
@@ -212,6 +216,7 @@ static inline void x2apic_force_phys(void) | |||
212 | { | 216 | { |
213 | } | 217 | } |
214 | 218 | ||
219 | #define nox2apic 0 | ||
215 | #define x2apic_preenabled 0 | 220 | #define x2apic_preenabled 0 |
216 | #define x2apic_supported() 0 | 221 | #define x2apic_supported() 0 |
217 | #endif | 222 | #endif |
@@ -410,6 +415,7 @@ extern int wakeup_secondary_cpu_via_nmi(int apicid, unsigned long start_eip); | |||
410 | #endif | 415 | #endif |
411 | 416 | ||
412 | #ifdef CONFIG_X86_LOCAL_APIC | 417 | #ifdef CONFIG_X86_LOCAL_APIC |
418 | |||
413 | static inline u32 apic_read(u32 reg) | 419 | static inline u32 apic_read(u32 reg) |
414 | { | 420 | { |
415 | return apic->read(reg); | 421 | return apic->read(reg); |
diff --git a/arch/x86/include/asm/apic_flat_64.h b/arch/x86/include/asm/apic_flat_64.h new file mode 100644 index 000000000000..a2d312796440 --- /dev/null +++ b/arch/x86/include/asm/apic_flat_64.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef _ASM_X86_APIC_FLAT_64_H | ||
2 | #define _ASM_X86_APIC_FLAT_64_H | ||
3 | |||
4 | extern void flat_init_apic_ldr(void); | ||
5 | |||
6 | #endif | ||
7 | |||
diff --git a/arch/x86/include/asm/apicdef.h b/arch/x86/include/asm/apicdef.h index 3925d8007864..134bba00df09 100644 --- a/arch/x86/include/asm/apicdef.h +++ b/arch/x86/include/asm/apicdef.h | |||
@@ -144,6 +144,7 @@ | |||
144 | 144 | ||
145 | #define APIC_BASE (fix_to_virt(FIX_APIC_BASE)) | 145 | #define APIC_BASE (fix_to_virt(FIX_APIC_BASE)) |
146 | #define APIC_BASE_MSR 0x800 | 146 | #define APIC_BASE_MSR 0x800 |
147 | #define XAPIC_ENABLE (1UL << 11) | ||
147 | #define X2APIC_ENABLE (1UL << 10) | 148 | #define X2APIC_ENABLE (1UL << 10) |
148 | 149 | ||
149 | #ifdef CONFIG_X86_32 | 150 | #ifdef CONFIG_X86_32 |
diff --git a/arch/x86/include/asm/hardirq.h b/arch/x86/include/asm/hardirq.h index 55e4de613f0e..da0b3ca815b7 100644 --- a/arch/x86/include/asm/hardirq.h +++ b/arch/x86/include/asm/hardirq.h | |||
@@ -11,6 +11,7 @@ typedef struct { | |||
11 | #ifdef CONFIG_X86_LOCAL_APIC | 11 | #ifdef CONFIG_X86_LOCAL_APIC |
12 | unsigned int apic_timer_irqs; /* arch dependent */ | 12 | unsigned int apic_timer_irqs; /* arch dependent */ |
13 | unsigned int irq_spurious_count; | 13 | unsigned int irq_spurious_count; |
14 | unsigned int icr_read_retry_count; | ||
14 | #endif | 15 | #endif |
15 | unsigned int x86_platform_ipis; /* arch dependent */ | 16 | unsigned int x86_platform_ipis; /* arch dependent */ |
16 | unsigned int apic_perf_irqs; | 17 | unsigned int apic_perf_irqs; |
diff --git a/arch/x86/include/asm/numachip/numachip_csr.h b/arch/x86/include/asm/numachip/numachip_csr.h new file mode 100644 index 000000000000..660f843df928 --- /dev/null +++ b/arch/x86/include/asm/numachip/numachip_csr.h | |||
@@ -0,0 +1,167 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Numascale NumaConnect-Specific Header file | ||
7 | * | ||
8 | * Copyright (C) 2011 Numascale AS. All rights reserved. | ||
9 | * | ||
10 | * Send feedback to <support@numascale.com> | ||
11 | * | ||
12 | */ | ||
13 | |||
14 | #ifndef _ASM_X86_NUMACHIP_NUMACHIP_CSR_H | ||
15 | #define _ASM_X86_NUMACHIP_NUMACHIP_CSR_H | ||
16 | |||
17 | #include <linux/numa.h> | ||
18 | #include <linux/percpu.h> | ||
19 | #include <linux/io.h> | ||
20 | #include <linux/swab.h> | ||
21 | #include <asm/types.h> | ||
22 | #include <asm/processor.h> | ||
23 | |||
24 | #define CSR_NODE_SHIFT 16 | ||
25 | #define CSR_NODE_BITS(p) (((unsigned long)(p)) << CSR_NODE_SHIFT) | ||
26 | #define CSR_NODE_MASK 0x0fff /* 4K nodes */ | ||
27 | |||
28 | /* 32K CSR space, b15 indicates geo/non-geo */ | ||
29 | #define CSR_OFFSET_MASK 0x7fffUL | ||
30 | |||
31 | /* Global CSR space covers all 4K possible nodes with 64K CSR space per node */ | ||
32 | #define NUMACHIP_GCSR_BASE 0x3fff00000000ULL | ||
33 | #define NUMACHIP_GCSR_LIM 0x3fff0fffffffULL | ||
34 | #define NUMACHIP_GCSR_SIZE (NUMACHIP_GCSR_LIM - NUMACHIP_GCSR_BASE + 1) | ||
35 | |||
36 | /* | ||
37 | * Local CSR space starts in global CSR space with "nodeid" = 0xfff0, however | ||
38 | * when using the direct mapping on x86_64, both start and size needs to be | ||
39 | * aligned with PMD_SIZE which is 2M | ||
40 | */ | ||
41 | #define NUMACHIP_LCSR_BASE 0x3ffffe000000ULL | ||
42 | #define NUMACHIP_LCSR_LIM 0x3fffffffffffULL | ||
43 | #define NUMACHIP_LCSR_SIZE (NUMACHIP_LCSR_LIM - NUMACHIP_LCSR_BASE + 1) | ||
44 | |||
45 | static inline void *gcsr_address(int node, unsigned long offset) | ||
46 | { | ||
47 | return __va(NUMACHIP_GCSR_BASE | (1UL << 15) | | ||
48 | CSR_NODE_BITS(node & CSR_NODE_MASK) | (offset & CSR_OFFSET_MASK)); | ||
49 | } | ||
50 | |||
51 | static inline void *lcsr_address(unsigned long offset) | ||
52 | { | ||
53 | return __va(NUMACHIP_LCSR_BASE | (1UL << 15) | | ||
54 | CSR_NODE_BITS(0xfff0) | (offset & CSR_OFFSET_MASK)); | ||
55 | } | ||
56 | |||
57 | static inline unsigned int read_gcsr(int node, unsigned long offset) | ||
58 | { | ||
59 | return swab32(readl(gcsr_address(node, offset))); | ||
60 | } | ||
61 | |||
62 | static inline void write_gcsr(int node, unsigned long offset, unsigned int val) | ||
63 | { | ||
64 | writel(swab32(val), gcsr_address(node, offset)); | ||
65 | } | ||
66 | |||
67 | static inline unsigned int read_lcsr(unsigned long offset) | ||
68 | { | ||
69 | return swab32(readl(lcsr_address(offset))); | ||
70 | } | ||
71 | |||
72 | static inline void write_lcsr(unsigned long offset, unsigned int val) | ||
73 | { | ||
74 | writel(swab32(val), lcsr_address(offset)); | ||
75 | } | ||
76 | |||
77 | /* ========================================================================= */ | ||
78 | /* CSR_G0_STATE_CLEAR */ | ||
79 | /* ========================================================================= */ | ||
80 | |||
81 | #define CSR_G0_STATE_CLEAR (0x000 + (0 << 12)) | ||
82 | union numachip_csr_g0_state_clear { | ||
83 | unsigned int v; | ||
84 | struct numachip_csr_g0_state_clear_s { | ||
85 | unsigned int _state:2; | ||
86 | unsigned int _rsvd_2_6:5; | ||
87 | unsigned int _lost:1; | ||
88 | unsigned int _rsvd_8_31:24; | ||
89 | } s; | ||
90 | }; | ||
91 | |||
92 | /* ========================================================================= */ | ||
93 | /* CSR_G0_NODE_IDS */ | ||
94 | /* ========================================================================= */ | ||
95 | |||
96 | #define CSR_G0_NODE_IDS (0x008 + (0 << 12)) | ||
97 | union numachip_csr_g0_node_ids { | ||
98 | unsigned int v; | ||
99 | struct numachip_csr_g0_node_ids_s { | ||
100 | unsigned int _initialid:16; | ||
101 | unsigned int _nodeid:12; | ||
102 | unsigned int _rsvd_28_31:4; | ||
103 | } s; | ||
104 | }; | ||
105 | |||
106 | /* ========================================================================= */ | ||
107 | /* CSR_G3_EXT_IRQ_GEN */ | ||
108 | /* ========================================================================= */ | ||
109 | |||
110 | #define CSR_G3_EXT_IRQ_GEN (0x030 + (3 << 12)) | ||
111 | union numachip_csr_g3_ext_irq_gen { | ||
112 | unsigned int v; | ||
113 | struct numachip_csr_g3_ext_irq_gen_s { | ||
114 | unsigned int _vector:8; | ||
115 | unsigned int _msgtype:3; | ||
116 | unsigned int _index:5; | ||
117 | unsigned int _destination_apic_id:16; | ||
118 | } s; | ||
119 | }; | ||
120 | |||
121 | /* ========================================================================= */ | ||
122 | /* CSR_G3_EXT_IRQ_STATUS */ | ||
123 | /* ========================================================================= */ | ||
124 | |||
125 | #define CSR_G3_EXT_IRQ_STATUS (0x034 + (3 << 12)) | ||
126 | union numachip_csr_g3_ext_irq_status { | ||
127 | unsigned int v; | ||
128 | struct numachip_csr_g3_ext_irq_status_s { | ||
129 | unsigned int _result:32; | ||
130 | } s; | ||
131 | }; | ||
132 | |||
133 | /* ========================================================================= */ | ||
134 | /* CSR_G3_EXT_IRQ_DEST */ | ||
135 | /* ========================================================================= */ | ||
136 | |||
137 | #define CSR_G3_EXT_IRQ_DEST (0x038 + (3 << 12)) | ||
138 | union numachip_csr_g3_ext_irq_dest { | ||
139 | unsigned int v; | ||
140 | struct numachip_csr_g3_ext_irq_dest_s { | ||
141 | unsigned int _irq:8; | ||
142 | unsigned int _rsvd_8_31:24; | ||
143 | } s; | ||
144 | }; | ||
145 | |||
146 | /* ========================================================================= */ | ||
147 | /* CSR_G3_NC_ATT_MAP_SELECT */ | ||
148 | /* ========================================================================= */ | ||
149 | |||
150 | #define CSR_G3_NC_ATT_MAP_SELECT (0x7fc + (3 << 12)) | ||
151 | union numachip_csr_g3_nc_att_map_select { | ||
152 | unsigned int v; | ||
153 | struct numachip_csr_g3_nc_att_map_select_s { | ||
154 | unsigned int _upper_address_bits:4; | ||
155 | unsigned int _select_ram:4; | ||
156 | unsigned int _rsvd_8_31:24; | ||
157 | } s; | ||
158 | }; | ||
159 | |||
160 | /* ========================================================================= */ | ||
161 | /* CSR_G3_NC_ATT_MAP_SELECT_0-255 */ | ||
162 | /* ========================================================================= */ | ||
163 | |||
164 | #define CSR_G3_NC_ATT_MAP_SELECT_0 (0x800 + (3 << 12)) | ||
165 | |||
166 | #endif /* _ASM_X86_NUMACHIP_NUMACHIP_CSR_H */ | ||
167 | |||
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index b650435ffb53..aa9088c26931 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
@@ -99,7 +99,6 @@ struct cpuinfo_x86 { | |||
99 | u16 apicid; | 99 | u16 apicid; |
100 | u16 initial_apicid; | 100 | u16 initial_apicid; |
101 | u16 x86_clflush_size; | 101 | u16 x86_clflush_size; |
102 | #ifdef CONFIG_SMP | ||
103 | /* number of cores as seen by the OS: */ | 102 | /* number of cores as seen by the OS: */ |
104 | u16 booted_cores; | 103 | u16 booted_cores; |
105 | /* Physical processor id: */ | 104 | /* Physical processor id: */ |
@@ -110,7 +109,6 @@ struct cpuinfo_x86 { | |||
110 | u8 compute_unit_id; | 109 | u8 compute_unit_id; |
111 | /* Index into per_cpu list: */ | 110 | /* Index into per_cpu list: */ |
112 | u16 cpu_index; | 111 | u16 cpu_index; |
113 | #endif | ||
114 | u32 microcode; | 112 | u32 microcode; |
115 | } __attribute__((__aligned__(SMP_CACHE_BYTES))); | 113 | } __attribute__((__aligned__(SMP_CACHE_BYTES))); |
116 | 114 | ||
diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 1971e652d24b..1ac860a09849 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h | |||
@@ -7,6 +7,7 @@ | |||
7 | struct mpc_bus; | 7 | struct mpc_bus; |
8 | struct mpc_cpu; | 8 | struct mpc_cpu; |
9 | struct mpc_table; | 9 | struct mpc_table; |
10 | struct cpuinfo_x86; | ||
10 | 11 | ||
11 | /** | 12 | /** |
12 | * struct x86_init_mpparse - platform specific mpparse ops | 13 | * struct x86_init_mpparse - platform specific mpparse ops |
@@ -147,6 +148,7 @@ struct x86_init_ops { | |||
147 | */ | 148 | */ |
148 | struct x86_cpuinit_ops { | 149 | struct x86_cpuinit_ops { |
149 | void (*setup_percpu_clockev)(void); | 150 | void (*setup_percpu_clockev)(void); |
151 | void (*fixup_cpu_id)(struct cpuinfo_x86 *c, int node); | ||
150 | }; | 152 | }; |
151 | 153 | ||
152 | /** | 154 | /** |
@@ -186,5 +188,6 @@ extern struct x86_msi_ops x86_msi; | |||
186 | 188 | ||
187 | extern void x86_init_noop(void); | 189 | extern void x86_init_noop(void); |
188 | extern void x86_init_uint_noop(unsigned int unused); | 190 | extern void x86_init_uint_noop(unsigned int unused); |
191 | extern void x86_default_fixup_cpu_id(struct cpuinfo_x86 *c, int node); | ||
189 | 192 | ||
190 | #endif | 193 | #endif |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 4558f0d0822d..ce664f33ea8e 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -219,6 +219,8 @@ static int __init | |||
219 | acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end) | 219 | acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end) |
220 | { | 220 | { |
221 | struct acpi_madt_local_x2apic *processor = NULL; | 221 | struct acpi_madt_local_x2apic *processor = NULL; |
222 | int apic_id; | ||
223 | u8 enabled; | ||
222 | 224 | ||
223 | processor = (struct acpi_madt_local_x2apic *)header; | 225 | processor = (struct acpi_madt_local_x2apic *)header; |
224 | 226 | ||
@@ -227,6 +229,8 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end) | |||
227 | 229 | ||
228 | acpi_table_print_madt_entry(header); | 230 | acpi_table_print_madt_entry(header); |
229 | 231 | ||
232 | apic_id = processor->local_apic_id; | ||
233 | enabled = processor->lapic_flags & ACPI_MADT_ENABLED; | ||
230 | #ifdef CONFIG_X86_X2APIC | 234 | #ifdef CONFIG_X86_X2APIC |
231 | /* | 235 | /* |
232 | * We need to register disabled CPU as well to permit | 236 | * We need to register disabled CPU as well to permit |
@@ -235,8 +239,10 @@ acpi_parse_x2apic(struct acpi_subtable_header *header, const unsigned long end) | |||
235 | * to not preallocating memory for all NR_CPUS | 239 | * to not preallocating memory for all NR_CPUS |
236 | * when we use CPU hotplug. | 240 | * when we use CPU hotplug. |
237 | */ | 241 | */ |
238 | acpi_register_lapic(processor->local_apic_id, /* APIC ID */ | 242 | if (!cpu_has_x2apic && (apic_id >= 0xff) && enabled) |
239 | processor->lapic_flags & ACPI_MADT_ENABLED); | 243 | printk(KERN_WARNING PREFIX "x2apic entry ignored\n"); |
244 | else | ||
245 | acpi_register_lapic(apic_id, enabled); | ||
240 | #else | 246 | #else |
241 | printk(KERN_WARNING PREFIX "x2apic entry ignored\n"); | 247 | printk(KERN_WARNING PREFIX "x2apic entry ignored\n"); |
242 | #endif | 248 | #endif |
diff --git a/arch/x86/kernel/amd_nb.c b/arch/x86/kernel/amd_nb.c index 4c39baa8facc..013c1810ce72 100644 --- a/arch/x86/kernel/amd_nb.c +++ b/arch/x86/kernel/amd_nb.c | |||
@@ -123,16 +123,14 @@ int amd_get_subcaches(int cpu) | |||
123 | { | 123 | { |
124 | struct pci_dev *link = node_to_amd_nb(amd_get_nb_id(cpu))->link; | 124 | struct pci_dev *link = node_to_amd_nb(amd_get_nb_id(cpu))->link; |
125 | unsigned int mask; | 125 | unsigned int mask; |
126 | int cuid = 0; | 126 | int cuid; |
127 | 127 | ||
128 | if (!amd_nb_has_feature(AMD_NB_L3_PARTITIONING)) | 128 | if (!amd_nb_has_feature(AMD_NB_L3_PARTITIONING)) |
129 | return 0; | 129 | return 0; |
130 | 130 | ||
131 | pci_read_config_dword(link, 0x1d4, &mask); | 131 | pci_read_config_dword(link, 0x1d4, &mask); |
132 | 132 | ||
133 | #ifdef CONFIG_SMP | ||
134 | cuid = cpu_data(cpu).compute_unit_id; | 133 | cuid = cpu_data(cpu).compute_unit_id; |
135 | #endif | ||
136 | return (mask >> (4 * cuid)) & 0xf; | 134 | return (mask >> (4 * cuid)) & 0xf; |
137 | } | 135 | } |
138 | 136 | ||
@@ -141,7 +139,7 @@ int amd_set_subcaches(int cpu, int mask) | |||
141 | static unsigned int reset, ban; | 139 | static unsigned int reset, ban; |
142 | struct amd_northbridge *nb = node_to_amd_nb(amd_get_nb_id(cpu)); | 140 | struct amd_northbridge *nb = node_to_amd_nb(amd_get_nb_id(cpu)); |
143 | unsigned int reg; | 141 | unsigned int reg; |
144 | int cuid = 0; | 142 | int cuid; |
145 | 143 | ||
146 | if (!amd_nb_has_feature(AMD_NB_L3_PARTITIONING) || mask > 0xf) | 144 | if (!amd_nb_has_feature(AMD_NB_L3_PARTITIONING) || mask > 0xf) |
147 | return -EINVAL; | 145 | return -EINVAL; |
@@ -159,9 +157,7 @@ int amd_set_subcaches(int cpu, int mask) | |||
159 | pci_write_config_dword(nb->misc, 0x1b8, reg & ~0x180000); | 157 | pci_write_config_dword(nb->misc, 0x1b8, reg & ~0x180000); |
160 | } | 158 | } |
161 | 159 | ||
162 | #ifdef CONFIG_SMP | ||
163 | cuid = cpu_data(cpu).compute_unit_id; | 160 | cuid = cpu_data(cpu).compute_unit_id; |
164 | #endif | ||
165 | mask <<= 4 * cuid; | 161 | mask <<= 4 * cuid; |
166 | mask |= (0xf ^ (1 << cuid)) << 26; | 162 | mask |= (0xf ^ (1 << cuid)) << 26; |
167 | 163 | ||
diff --git a/arch/x86/kernel/apic/Makefile b/arch/x86/kernel/apic/Makefile index 767fd04f2843..0ae0323b1f9c 100644 --- a/arch/x86/kernel/apic/Makefile +++ b/arch/x86/kernel/apic/Makefile | |||
@@ -10,6 +10,7 @@ obj-$(CONFIG_SMP) += ipi.o | |||
10 | 10 | ||
11 | ifeq ($(CONFIG_X86_64),y) | 11 | ifeq ($(CONFIG_X86_64),y) |
12 | # APIC probe will depend on the listing order here | 12 | # APIC probe will depend on the listing order here |
13 | obj-$(CONFIG_X86_NUMACHIP) += apic_numachip.o | ||
13 | obj-$(CONFIG_X86_UV) += x2apic_uv_x.o | 14 | obj-$(CONFIG_X86_UV) += x2apic_uv_x.o |
14 | obj-$(CONFIG_X86_X2APIC) += x2apic_phys.o | 15 | obj-$(CONFIG_X86_X2APIC) += x2apic_phys.o |
15 | obj-$(CONFIG_X86_X2APIC) += x2apic_cluster.o | 16 | obj-$(CONFIG_X86_X2APIC) += x2apic_cluster.o |
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 2cd2d93643dc..2eec05b6d1b8 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
@@ -146,16 +146,26 @@ __setup("apicpmtimer", setup_apicpmtimer); | |||
146 | int x2apic_mode; | 146 | int x2apic_mode; |
147 | #ifdef CONFIG_X86_X2APIC | 147 | #ifdef CONFIG_X86_X2APIC |
148 | /* x2apic enabled before OS handover */ | 148 | /* x2apic enabled before OS handover */ |
149 | static int x2apic_preenabled; | 149 | int x2apic_preenabled; |
150 | static int x2apic_disabled; | ||
151 | static int nox2apic; | ||
150 | static __init int setup_nox2apic(char *str) | 152 | static __init int setup_nox2apic(char *str) |
151 | { | 153 | { |
152 | if (x2apic_enabled()) { | 154 | if (x2apic_enabled()) { |
153 | pr_warning("Bios already enabled x2apic, " | 155 | int apicid = native_apic_msr_read(APIC_ID); |
154 | "can't enforce nox2apic"); | 156 | |
155 | return 0; | 157 | if (apicid >= 255) { |
156 | } | 158 | pr_warning("Apicid: %08x, cannot enforce nox2apic\n", |
159 | apicid); | ||
160 | return 0; | ||
161 | } | ||
162 | |||
163 | pr_warning("x2apic already enabled. will disable it\n"); | ||
164 | } else | ||
165 | setup_clear_cpu_cap(X86_FEATURE_X2APIC); | ||
166 | |||
167 | nox2apic = 1; | ||
157 | 168 | ||
158 | setup_clear_cpu_cap(X86_FEATURE_X2APIC); | ||
159 | return 0; | 169 | return 0; |
160 | } | 170 | } |
161 | early_param("nox2apic", setup_nox2apic); | 171 | early_param("nox2apic", setup_nox2apic); |
@@ -250,6 +260,7 @@ u32 native_safe_apic_wait_icr_idle(void) | |||
250 | send_status = apic_read(APIC_ICR) & APIC_ICR_BUSY; | 260 | send_status = apic_read(APIC_ICR) & APIC_ICR_BUSY; |
251 | if (!send_status) | 261 | if (!send_status) |
252 | break; | 262 | break; |
263 | inc_irq_stat(icr_read_retry_count); | ||
253 | udelay(100); | 264 | udelay(100); |
254 | } while (timeout++ < 1000); | 265 | } while (timeout++ < 1000); |
255 | 266 | ||
@@ -1431,6 +1442,45 @@ void __init bsp_end_local_APIC_setup(void) | |||
1431 | } | 1442 | } |
1432 | 1443 | ||
1433 | #ifdef CONFIG_X86_X2APIC | 1444 | #ifdef CONFIG_X86_X2APIC |
1445 | /* | ||
1446 | * Need to disable xapic and x2apic at the same time and then enable xapic mode | ||
1447 | */ | ||
1448 | static inline void __disable_x2apic(u64 msr) | ||
1449 | { | ||
1450 | wrmsrl(MSR_IA32_APICBASE, | ||
1451 | msr & ~(X2APIC_ENABLE | XAPIC_ENABLE)); | ||
1452 | wrmsrl(MSR_IA32_APICBASE, msr & ~X2APIC_ENABLE); | ||
1453 | } | ||
1454 | |||
1455 | static __init void disable_x2apic(void) | ||
1456 | { | ||
1457 | u64 msr; | ||
1458 | |||
1459 | if (!cpu_has_x2apic) | ||
1460 | return; | ||
1461 | |||
1462 | rdmsrl(MSR_IA32_APICBASE, msr); | ||
1463 | if (msr & X2APIC_ENABLE) { | ||
1464 | u32 x2apic_id = read_apic_id(); | ||
1465 | |||
1466 | if (x2apic_id >= 255) | ||
1467 | panic("Cannot disable x2apic, id: %08x\n", x2apic_id); | ||
1468 | |||
1469 | pr_info("Disabling x2apic\n"); | ||
1470 | __disable_x2apic(msr); | ||
1471 | |||
1472 | if (nox2apic) { | ||
1473 | clear_cpu_cap(&cpu_data(0), X86_FEATURE_X2APIC); | ||
1474 | setup_clear_cpu_cap(X86_FEATURE_X2APIC); | ||
1475 | } | ||
1476 | |||
1477 | x2apic_disabled = 1; | ||
1478 | x2apic_mode = 0; | ||
1479 | |||
1480 | register_lapic_address(mp_lapic_addr); | ||
1481 | } | ||
1482 | } | ||
1483 | |||
1434 | void check_x2apic(void) | 1484 | void check_x2apic(void) |
1435 | { | 1485 | { |
1436 | if (x2apic_enabled()) { | 1486 | if (x2apic_enabled()) { |
@@ -1441,15 +1491,20 @@ void check_x2apic(void) | |||
1441 | 1491 | ||
1442 | void enable_x2apic(void) | 1492 | void enable_x2apic(void) |
1443 | { | 1493 | { |
1444 | int msr, msr2; | 1494 | u64 msr; |
1495 | |||
1496 | rdmsrl(MSR_IA32_APICBASE, msr); | ||
1497 | if (x2apic_disabled) { | ||
1498 | __disable_x2apic(msr); | ||
1499 | return; | ||
1500 | } | ||
1445 | 1501 | ||
1446 | if (!x2apic_mode) | 1502 | if (!x2apic_mode) |
1447 | return; | 1503 | return; |
1448 | 1504 | ||
1449 | rdmsr(MSR_IA32_APICBASE, msr, msr2); | ||
1450 | if (!(msr & X2APIC_ENABLE)) { | 1505 | if (!(msr & X2APIC_ENABLE)) { |
1451 | printk_once(KERN_INFO "Enabling x2apic\n"); | 1506 | printk_once(KERN_INFO "Enabling x2apic\n"); |
1452 | wrmsr(MSR_IA32_APICBASE, msr | X2APIC_ENABLE, msr2); | 1507 | wrmsrl(MSR_IA32_APICBASE, msr | X2APIC_ENABLE); |
1453 | } | 1508 | } |
1454 | } | 1509 | } |
1455 | #endif /* CONFIG_X86_X2APIC */ | 1510 | #endif /* CONFIG_X86_X2APIC */ |
@@ -1486,25 +1541,34 @@ void __init enable_IR_x2apic(void) | |||
1486 | ret = save_ioapic_entries(); | 1541 | ret = save_ioapic_entries(); |
1487 | if (ret) { | 1542 | if (ret) { |
1488 | pr_info("Saving IO-APIC state failed: %d\n", ret); | 1543 | pr_info("Saving IO-APIC state failed: %d\n", ret); |
1489 | goto out; | 1544 | return; |
1490 | } | 1545 | } |
1491 | 1546 | ||
1492 | local_irq_save(flags); | 1547 | local_irq_save(flags); |
1493 | legacy_pic->mask_all(); | 1548 | legacy_pic->mask_all(); |
1494 | mask_ioapic_entries(); | 1549 | mask_ioapic_entries(); |
1495 | 1550 | ||
1551 | if (x2apic_preenabled && nox2apic) | ||
1552 | disable_x2apic(); | ||
1553 | |||
1496 | if (dmar_table_init_ret) | 1554 | if (dmar_table_init_ret) |
1497 | ret = -1; | 1555 | ret = -1; |
1498 | else | 1556 | else |
1499 | ret = enable_IR(); | 1557 | ret = enable_IR(); |
1500 | 1558 | ||
1559 | if (!x2apic_supported()) | ||
1560 | goto skip_x2apic; | ||
1561 | |||
1501 | if (ret < 0) { | 1562 | if (ret < 0) { |
1502 | /* IR is required if there is APIC ID > 255 even when running | 1563 | /* IR is required if there is APIC ID > 255 even when running |
1503 | * under KVM | 1564 | * under KVM |
1504 | */ | 1565 | */ |
1505 | if (max_physical_apicid > 255 || | 1566 | if (max_physical_apicid > 255 || |
1506 | !hypervisor_x2apic_available()) | 1567 | !hypervisor_x2apic_available()) { |
1507 | goto nox2apic; | 1568 | if (x2apic_preenabled) |
1569 | disable_x2apic(); | ||
1570 | goto skip_x2apic; | ||
1571 | } | ||
1508 | /* | 1572 | /* |
1509 | * without IR all CPUs can be addressed by IOAPIC/MSI | 1573 | * without IR all CPUs can be addressed by IOAPIC/MSI |
1510 | * only in physical mode | 1574 | * only in physical mode |
@@ -1512,8 +1576,10 @@ void __init enable_IR_x2apic(void) | |||
1512 | x2apic_force_phys(); | 1576 | x2apic_force_phys(); |
1513 | } | 1577 | } |
1514 | 1578 | ||
1515 | if (ret == IRQ_REMAP_XAPIC_MODE) | 1579 | if (ret == IRQ_REMAP_XAPIC_MODE) { |
1516 | goto nox2apic; | 1580 | pr_info("x2apic not enabled, IRQ remapping is in xapic mode\n"); |
1581 | goto skip_x2apic; | ||
1582 | } | ||
1517 | 1583 | ||
1518 | x2apic_enabled = 1; | 1584 | x2apic_enabled = 1; |
1519 | 1585 | ||
@@ -1523,22 +1589,11 @@ void __init enable_IR_x2apic(void) | |||
1523 | pr_info("Enabled x2apic\n"); | 1589 | pr_info("Enabled x2apic\n"); |
1524 | } | 1590 | } |
1525 | 1591 | ||
1526 | nox2apic: | 1592 | skip_x2apic: |
1527 | if (ret < 0) /* IR enabling failed */ | 1593 | if (ret < 0) /* IR enabling failed */ |
1528 | restore_ioapic_entries(); | 1594 | restore_ioapic_entries(); |
1529 | legacy_pic->restore_mask(); | 1595 | legacy_pic->restore_mask(); |
1530 | local_irq_restore(flags); | 1596 | local_irq_restore(flags); |
1531 | |||
1532 | out: | ||
1533 | if (x2apic_enabled || !x2apic_supported()) | ||
1534 | return; | ||
1535 | |||
1536 | if (x2apic_preenabled) | ||
1537 | panic("x2apic: enabled by BIOS but kernel init failed."); | ||
1538 | else if (ret == IRQ_REMAP_XAPIC_MODE) | ||
1539 | pr_info("x2apic not enabled, IRQ remapping is in xapic mode\n"); | ||
1540 | else if (ret < 0) | ||
1541 | pr_info("x2apic not enabled, IRQ remapping init failed\n"); | ||
1542 | } | 1597 | } |
1543 | 1598 | ||
1544 | #ifdef CONFIG_X86_64 | 1599 | #ifdef CONFIG_X86_64 |
diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c index f7a41e4cae47..8c3cdded6f2b 100644 --- a/arch/x86/kernel/apic/apic_flat_64.c +++ b/arch/x86/kernel/apic/apic_flat_64.c | |||
@@ -62,7 +62,7 @@ static void flat_vector_allocation_domain(int cpu, struct cpumask *retmask) | |||
62 | * an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel | 62 | * an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel |
63 | * document number 292116). So here it goes... | 63 | * document number 292116). So here it goes... |
64 | */ | 64 | */ |
65 | static void flat_init_apic_ldr(void) | 65 | void flat_init_apic_ldr(void) |
66 | { | 66 | { |
67 | unsigned long val; | 67 | unsigned long val; |
68 | unsigned long num, id; | 68 | unsigned long num, id; |
@@ -171,9 +171,14 @@ static int flat_phys_pkg_id(int initial_apic_id, int index_msb) | |||
171 | return initial_apic_id >> index_msb; | 171 | return initial_apic_id >> index_msb; |
172 | } | 172 | } |
173 | 173 | ||
174 | static int flat_probe(void) | ||
175 | { | ||
176 | return 1; | ||
177 | } | ||
178 | |||
174 | static struct apic apic_flat = { | 179 | static struct apic apic_flat = { |
175 | .name = "flat", | 180 | .name = "flat", |
176 | .probe = NULL, | 181 | .probe = flat_probe, |
177 | .acpi_madt_oem_check = flat_acpi_madt_oem_check, | 182 | .acpi_madt_oem_check = flat_acpi_madt_oem_check, |
178 | .apic_id_registered = flat_apic_id_registered, | 183 | .apic_id_registered = flat_apic_id_registered, |
179 | 184 | ||
diff --git a/arch/x86/kernel/apic/apic_numachip.c b/arch/x86/kernel/apic/apic_numachip.c new file mode 100644 index 000000000000..09d3d8c1cd99 --- /dev/null +++ b/arch/x86/kernel/apic/apic_numachip.c | |||
@@ -0,0 +1,294 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Numascale NumaConnect-Specific APIC Code | ||
7 | * | ||
8 | * Copyright (C) 2011 Numascale AS. All rights reserved. | ||
9 | * | ||
10 | * Send feedback to <support@numascale.com> | ||
11 | * | ||
12 | */ | ||
13 | |||
14 | #include <linux/errno.h> | ||
15 | #include <linux/threads.h> | ||
16 | #include <linux/cpumask.h> | ||
17 | #include <linux/string.h> | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/module.h> | ||
20 | #include <linux/ctype.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/hardirq.h> | ||
23 | #include <linux/delay.h> | ||
24 | |||
25 | #include <asm/numachip/numachip_csr.h> | ||
26 | #include <asm/smp.h> | ||
27 | #include <asm/apic.h> | ||
28 | #include <asm/ipi.h> | ||
29 | #include <asm/apic_flat_64.h> | ||
30 | |||
31 | static int numachip_system __read_mostly; | ||
32 | |||
33 | static struct apic apic_numachip __read_mostly; | ||
34 | |||
35 | static unsigned int get_apic_id(unsigned long x) | ||
36 | { | ||
37 | unsigned long value; | ||
38 | unsigned int id; | ||
39 | |||
40 | rdmsrl(MSR_FAM10H_NODE_ID, value); | ||
41 | id = ((x >> 24) & 0xffU) | ((value << 2) & 0x3f00U); | ||
42 | |||
43 | return id; | ||
44 | } | ||
45 | |||
46 | static unsigned long set_apic_id(unsigned int id) | ||
47 | { | ||
48 | unsigned long x; | ||
49 | |||
50 | x = ((id & 0xffU) << 24); | ||
51 | return x; | ||
52 | } | ||
53 | |||
54 | static unsigned int read_xapic_id(void) | ||
55 | { | ||
56 | return get_apic_id(apic_read(APIC_ID)); | ||
57 | } | ||
58 | |||
59 | static int numachip_apic_id_registered(void) | ||
60 | { | ||
61 | return physid_isset(read_xapic_id(), phys_cpu_present_map); | ||
62 | } | ||
63 | |||
64 | static int numachip_phys_pkg_id(int initial_apic_id, int index_msb) | ||
65 | { | ||
66 | return initial_apic_id >> index_msb; | ||
67 | } | ||
68 | |||
69 | static const struct cpumask *numachip_target_cpus(void) | ||
70 | { | ||
71 | return cpu_online_mask; | ||
72 | } | ||
73 | |||
74 | static void numachip_vector_allocation_domain(int cpu, struct cpumask *retmask) | ||
75 | { | ||
76 | cpumask_clear(retmask); | ||
77 | cpumask_set_cpu(cpu, retmask); | ||
78 | } | ||
79 | |||
80 | static int __cpuinit numachip_wakeup_secondary(int phys_apicid, unsigned long start_rip) | ||
81 | { | ||
82 | union numachip_csr_g3_ext_irq_gen int_gen; | ||
83 | |||
84 | int_gen.s._destination_apic_id = phys_apicid; | ||
85 | int_gen.s._vector = 0; | ||
86 | int_gen.s._msgtype = APIC_DM_INIT >> 8; | ||
87 | int_gen.s._index = 0; | ||
88 | |||
89 | write_lcsr(CSR_G3_EXT_IRQ_GEN, int_gen.v); | ||
90 | |||
91 | int_gen.s._msgtype = APIC_DM_STARTUP >> 8; | ||
92 | int_gen.s._vector = start_rip >> 12; | ||
93 | |||
94 | write_lcsr(CSR_G3_EXT_IRQ_GEN, int_gen.v); | ||
95 | |||
96 | atomic_set(&init_deasserted, 1); | ||
97 | return 0; | ||
98 | } | ||
99 | |||
100 | static void numachip_send_IPI_one(int cpu, int vector) | ||
101 | { | ||
102 | union numachip_csr_g3_ext_irq_gen int_gen; | ||
103 | int apicid = per_cpu(x86_cpu_to_apicid, cpu); | ||
104 | |||
105 | int_gen.s._destination_apic_id = apicid; | ||
106 | int_gen.s._vector = vector; | ||
107 | int_gen.s._msgtype = (vector == NMI_VECTOR ? APIC_DM_NMI : APIC_DM_FIXED) >> 8; | ||
108 | int_gen.s._index = 0; | ||
109 | |||
110 | write_lcsr(CSR_G3_EXT_IRQ_GEN, int_gen.v); | ||
111 | } | ||
112 | |||
113 | static void numachip_send_IPI_mask(const struct cpumask *mask, int vector) | ||
114 | { | ||
115 | unsigned int cpu; | ||
116 | |||
117 | for_each_cpu(cpu, mask) | ||
118 | numachip_send_IPI_one(cpu, vector); | ||
119 | } | ||
120 | |||
121 | static void numachip_send_IPI_mask_allbutself(const struct cpumask *mask, | ||
122 | int vector) | ||
123 | { | ||
124 | unsigned int this_cpu = smp_processor_id(); | ||
125 | unsigned int cpu; | ||
126 | |||
127 | for_each_cpu(cpu, mask) { | ||
128 | if (cpu != this_cpu) | ||
129 | numachip_send_IPI_one(cpu, vector); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | static void numachip_send_IPI_allbutself(int vector) | ||
134 | { | ||
135 | unsigned int this_cpu = smp_processor_id(); | ||
136 | unsigned int cpu; | ||
137 | |||
138 | for_each_online_cpu(cpu) { | ||
139 | if (cpu != this_cpu) | ||
140 | numachip_send_IPI_one(cpu, vector); | ||
141 | } | ||
142 | } | ||
143 | |||
144 | static void numachip_send_IPI_all(int vector) | ||
145 | { | ||
146 | numachip_send_IPI_mask(cpu_online_mask, vector); | ||
147 | } | ||
148 | |||
149 | static void numachip_send_IPI_self(int vector) | ||
150 | { | ||
151 | __default_send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL); | ||
152 | } | ||
153 | |||
154 | static unsigned int numachip_cpu_mask_to_apicid(const struct cpumask *cpumask) | ||
155 | { | ||
156 | int cpu; | ||
157 | |||
158 | /* | ||
159 | * We're using fixed IRQ delivery, can only return one phys APIC ID. | ||
160 | * May as well be the first. | ||
161 | */ | ||
162 | cpu = cpumask_first(cpumask); | ||
163 | if (likely((unsigned)cpu < nr_cpu_ids)) | ||
164 | return per_cpu(x86_cpu_to_apicid, cpu); | ||
165 | |||
166 | return BAD_APICID; | ||
167 | } | ||
168 | |||
169 | static unsigned int | ||
170 | numachip_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | ||
171 | const struct cpumask *andmask) | ||
172 | { | ||
173 | int cpu; | ||
174 | |||
175 | /* | ||
176 | * We're using fixed IRQ delivery, can only return one phys APIC ID. | ||
177 | * May as well be the first. | ||
178 | */ | ||
179 | for_each_cpu_and(cpu, cpumask, andmask) { | ||
180 | if (cpumask_test_cpu(cpu, cpu_online_mask)) | ||
181 | break; | ||
182 | } | ||
183 | return per_cpu(x86_cpu_to_apicid, cpu); | ||
184 | } | ||
185 | |||
186 | static int __init numachip_probe(void) | ||
187 | { | ||
188 | return apic == &apic_numachip; | ||
189 | } | ||
190 | |||
191 | static void __init map_csrs(void) | ||
192 | { | ||
193 | printk(KERN_INFO "NumaChip: Mapping local CSR space (%016llx - %016llx)\n", | ||
194 | NUMACHIP_LCSR_BASE, NUMACHIP_LCSR_BASE + NUMACHIP_LCSR_SIZE - 1); | ||
195 | init_extra_mapping_uc(NUMACHIP_LCSR_BASE, NUMACHIP_LCSR_SIZE); | ||
196 | |||
197 | printk(KERN_INFO "NumaChip: Mapping global CSR space (%016llx - %016llx)\n", | ||
198 | NUMACHIP_GCSR_BASE, NUMACHIP_GCSR_BASE + NUMACHIP_GCSR_SIZE - 1); | ||
199 | init_extra_mapping_uc(NUMACHIP_GCSR_BASE, NUMACHIP_GCSR_SIZE); | ||
200 | } | ||
201 | |||
202 | static void fixup_cpu_id(struct cpuinfo_x86 *c, int node) | ||
203 | { | ||
204 | c->phys_proc_id = node; | ||
205 | per_cpu(cpu_llc_id, smp_processor_id()) = node; | ||
206 | } | ||
207 | |||
208 | static int __init numachip_system_init(void) | ||
209 | { | ||
210 | unsigned int val; | ||
211 | |||
212 | if (!numachip_system) | ||
213 | return 0; | ||
214 | |||
215 | x86_cpuinit.fixup_cpu_id = fixup_cpu_id; | ||
216 | |||
217 | map_csrs(); | ||
218 | |||
219 | val = read_lcsr(CSR_G0_NODE_IDS); | ||
220 | printk(KERN_INFO "NumaChip: Local NodeID = %08x\n", val); | ||
221 | |||
222 | return 0; | ||
223 | } | ||
224 | early_initcall(numachip_system_init); | ||
225 | |||
226 | static int numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
227 | { | ||
228 | if (!strncmp(oem_id, "NUMASC", 6)) { | ||
229 | numachip_system = 1; | ||
230 | return 1; | ||
231 | } | ||
232 | |||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | static struct apic apic_numachip __refconst = { | ||
237 | |||
238 | .name = "NumaConnect system", | ||
239 | .probe = numachip_probe, | ||
240 | .acpi_madt_oem_check = numachip_acpi_madt_oem_check, | ||
241 | .apic_id_registered = numachip_apic_id_registered, | ||
242 | |||
243 | .irq_delivery_mode = dest_Fixed, | ||
244 | .irq_dest_mode = 0, /* physical */ | ||
245 | |||
246 | .target_cpus = numachip_target_cpus, | ||
247 | .disable_esr = 0, | ||
248 | .dest_logical = 0, | ||
249 | .check_apicid_used = NULL, | ||
250 | .check_apicid_present = NULL, | ||
251 | |||
252 | .vector_allocation_domain = numachip_vector_allocation_domain, | ||
253 | .init_apic_ldr = flat_init_apic_ldr, | ||
254 | |||
255 | .ioapic_phys_id_map = NULL, | ||
256 | .setup_apic_routing = NULL, | ||
257 | .multi_timer_check = NULL, | ||
258 | .cpu_present_to_apicid = default_cpu_present_to_apicid, | ||
259 | .apicid_to_cpu_present = NULL, | ||
260 | .setup_portio_remap = NULL, | ||
261 | .check_phys_apicid_present = default_check_phys_apicid_present, | ||
262 | .enable_apic_mode = NULL, | ||
263 | .phys_pkg_id = numachip_phys_pkg_id, | ||
264 | .mps_oem_check = NULL, | ||
265 | |||
266 | .get_apic_id = get_apic_id, | ||
267 | .set_apic_id = set_apic_id, | ||
268 | .apic_id_mask = 0xffU << 24, | ||
269 | |||
270 | .cpu_mask_to_apicid = numachip_cpu_mask_to_apicid, | ||
271 | .cpu_mask_to_apicid_and = numachip_cpu_mask_to_apicid_and, | ||
272 | |||
273 | .send_IPI_mask = numachip_send_IPI_mask, | ||
274 | .send_IPI_mask_allbutself = numachip_send_IPI_mask_allbutself, | ||
275 | .send_IPI_allbutself = numachip_send_IPI_allbutself, | ||
276 | .send_IPI_all = numachip_send_IPI_all, | ||
277 | .send_IPI_self = numachip_send_IPI_self, | ||
278 | |||
279 | .wakeup_secondary_cpu = numachip_wakeup_secondary, | ||
280 | .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, | ||
281 | .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, | ||
282 | .wait_for_init_deassert = NULL, | ||
283 | .smp_callin_clear_local_apic = NULL, | ||
284 | .inquire_remote_apic = NULL, /* REMRD not supported */ | ||
285 | |||
286 | .read = native_apic_mem_read, | ||
287 | .write = native_apic_mem_write, | ||
288 | .icr_read = native_apic_icr_read, | ||
289 | .icr_write = native_apic_icr_write, | ||
290 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
291 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
292 | }; | ||
293 | apic_driver(apic_numachip); | ||
294 | |||
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 898055585516..fb072754bc1d 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
@@ -2948,6 +2948,10 @@ static inline void __init check_timer(void) | |||
2948 | } | 2948 | } |
2949 | local_irq_disable(); | 2949 | local_irq_disable(); |
2950 | apic_printk(APIC_QUIET, KERN_INFO "..... failed :(.\n"); | 2950 | apic_printk(APIC_QUIET, KERN_INFO "..... failed :(.\n"); |
2951 | if (x2apic_preenabled) | ||
2952 | apic_printk(APIC_QUIET, KERN_INFO | ||
2953 | "Perhaps problem with the pre-enabled x2apic mode\n" | ||
2954 | "Try booting with x2apic and interrupt-remapping disabled in the bios.\n"); | ||
2951 | panic("IO-APIC + timer doesn't work! Boot with apic=debug and send a " | 2955 | panic("IO-APIC + timer doesn't work! Boot with apic=debug and send a " |
2952 | "report. Then try booting with the 'noapic' option.\n"); | 2956 | "report. Then try booting with the 'noapic' option.\n"); |
2953 | out: | 2957 | out: |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 0bab2b18bb20..f4773f4aae35 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
@@ -148,7 +148,6 @@ static void __cpuinit init_amd_k6(struct cpuinfo_x86 *c) | |||
148 | 148 | ||
149 | static void __cpuinit amd_k7_smp_check(struct cpuinfo_x86 *c) | 149 | static void __cpuinit amd_k7_smp_check(struct cpuinfo_x86 *c) |
150 | { | 150 | { |
151 | #ifdef CONFIG_SMP | ||
152 | /* calling is from identify_secondary_cpu() ? */ | 151 | /* calling is from identify_secondary_cpu() ? */ |
153 | if (!c->cpu_index) | 152 | if (!c->cpu_index) |
154 | return; | 153 | return; |
@@ -192,7 +191,6 @@ static void __cpuinit amd_k7_smp_check(struct cpuinfo_x86 *c) | |||
192 | 191 | ||
193 | valid_k7: | 192 | valid_k7: |
194 | ; | 193 | ; |
195 | #endif | ||
196 | } | 194 | } |
197 | 195 | ||
198 | static void __cpuinit init_amd_k7(struct cpuinfo_x86 *c) | 196 | static void __cpuinit init_amd_k7(struct cpuinfo_x86 *c) |
@@ -353,6 +351,13 @@ static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c) | |||
353 | if (node == NUMA_NO_NODE) | 351 | if (node == NUMA_NO_NODE) |
354 | node = per_cpu(cpu_llc_id, cpu); | 352 | node = per_cpu(cpu_llc_id, cpu); |
355 | 353 | ||
354 | /* | ||
355 | * If core numbers are inconsistent, it's likely a multi-fabric platform, | ||
356 | * so invoke platform-specific handler | ||
357 | */ | ||
358 | if (c->phys_proc_id != node) | ||
359 | x86_cpuinit.fixup_cpu_id(c, node); | ||
360 | |||
356 | if (!node_online(node)) { | 361 | if (!node_online(node)) { |
357 | /* | 362 | /* |
358 | * Two possibilities here: | 363 | * Two possibilities here: |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index aa003b13a831..850f2963a420 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -676,9 +676,7 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c) | |||
676 | if (this_cpu->c_early_init) | 676 | if (this_cpu->c_early_init) |
677 | this_cpu->c_early_init(c); | 677 | this_cpu->c_early_init(c); |
678 | 678 | ||
679 | #ifdef CONFIG_SMP | ||
680 | c->cpu_index = 0; | 679 | c->cpu_index = 0; |
681 | #endif | ||
682 | filter_cpuid_features(c, false); | 680 | filter_cpuid_features(c, false); |
683 | 681 | ||
684 | setup_smep(c); | 682 | setup_smep(c); |
@@ -764,10 +762,7 @@ static void __cpuinit generic_identify(struct cpuinfo_x86 *c) | |||
764 | c->apicid = c->initial_apicid; | 762 | c->apicid = c->initial_apicid; |
765 | # endif | 763 | # endif |
766 | #endif | 764 | #endif |
767 | |||
768 | #ifdef CONFIG_X86_HT | ||
769 | c->phys_proc_id = c->initial_apicid; | 765 | c->phys_proc_id = c->initial_apicid; |
770 | #endif | ||
771 | } | 766 | } |
772 | 767 | ||
773 | setup_smep(c); | 768 | setup_smep(c); |
@@ -1141,6 +1136,15 @@ static void dbg_restore_debug_regs(void) | |||
1141 | #endif /* ! CONFIG_KGDB */ | 1136 | #endif /* ! CONFIG_KGDB */ |
1142 | 1137 | ||
1143 | /* | 1138 | /* |
1139 | * Prints an error where the NUMA and configured core-number mismatch and the | ||
1140 | * platform didn't override this to fix it up | ||
1141 | */ | ||
1142 | void __cpuinit x86_default_fixup_cpu_id(struct cpuinfo_x86 *c, int node) | ||
1143 | { | ||
1144 | pr_err("NUMA core number %d differs from configured core number %d\n", node, c->phys_proc_id); | ||
1145 | } | ||
1146 | |||
1147 | /* | ||
1144 | * cpu_init() initializes state that is per-CPU. Some data is already | 1148 | * cpu_init() initializes state that is per-CPU. Some data is already |
1145 | * initialized (naturally) in the bootstrap process, such as the GDT | 1149 | * initialized (naturally) in the bootstrap process, such as the GDT |
1146 | * and IDT. We reload them nevertheless, this function acts as a | 1150 | * and IDT. We reload them nevertheless, this function acts as a |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 523131213f08..3e6ff6cbf42a 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
@@ -181,7 +181,6 @@ static void __cpuinit trap_init_f00f_bug(void) | |||
181 | 181 | ||
182 | static void __cpuinit intel_smp_check(struct cpuinfo_x86 *c) | 182 | static void __cpuinit intel_smp_check(struct cpuinfo_x86 *c) |
183 | { | 183 | { |
184 | #ifdef CONFIG_SMP | ||
185 | /* calling is from identify_secondary_cpu() ? */ | 184 | /* calling is from identify_secondary_cpu() ? */ |
186 | if (!c->cpu_index) | 185 | if (!c->cpu_index) |
187 | return; | 186 | return; |
@@ -198,7 +197,6 @@ static void __cpuinit intel_smp_check(struct cpuinfo_x86 *c) | |||
198 | WARN_ONCE(1, "WARNING: SMP operation may be unreliable" | 197 | WARN_ONCE(1, "WARNING: SMP operation may be unreliable" |
199 | "with B stepping processors.\n"); | 198 | "with B stepping processors.\n"); |
200 | } | 199 | } |
201 | #endif | ||
202 | } | 200 | } |
203 | 201 | ||
204 | static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c) | 202 | static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c) |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index 2af127d4c3d1..e9c9d0aab36a 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -119,9 +119,7 @@ void mce_setup(struct mce *m) | |||
119 | m->time = get_seconds(); | 119 | m->time = get_seconds(); |
120 | m->cpuvendor = boot_cpu_data.x86_vendor; | 120 | m->cpuvendor = boot_cpu_data.x86_vendor; |
121 | m->cpuid = cpuid_eax(1); | 121 | m->cpuid = cpuid_eax(1); |
122 | #ifdef CONFIG_SMP | ||
123 | m->socketid = cpu_data(m->extcpu).phys_proc_id; | 122 | m->socketid = cpu_data(m->extcpu).phys_proc_id; |
124 | #endif | ||
125 | m->apicid = cpu_data(m->extcpu).initial_apicid; | 123 | m->apicid = cpu_data(m->extcpu).initial_apicid; |
126 | rdmsrl(MSR_IA32_MCG_CAP, m->mcgcap); | 124 | rdmsrl(MSR_IA32_MCG_CAP, m->mcgcap); |
127 | } | 125 | } |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index f5474218cffe..1d76872b6a45 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c | |||
@@ -64,11 +64,9 @@ struct threshold_bank { | |||
64 | }; | 64 | }; |
65 | static DEFINE_PER_CPU(struct threshold_bank * [NR_BANKS], threshold_banks); | 65 | static DEFINE_PER_CPU(struct threshold_bank * [NR_BANKS], threshold_banks); |
66 | 66 | ||
67 | #ifdef CONFIG_SMP | ||
68 | static unsigned char shared_bank[NR_BANKS] = { | 67 | static unsigned char shared_bank[NR_BANKS] = { |
69 | 0, 0, 0, 0, 1 | 68 | 0, 0, 0, 0, 1 |
70 | }; | 69 | }; |
71 | #endif | ||
72 | 70 | ||
73 | static DEFINE_PER_CPU(unsigned char, bank_map); /* see which banks are on */ | 71 | static DEFINE_PER_CPU(unsigned char, bank_map); /* see which banks are on */ |
74 | 72 | ||
@@ -202,10 +200,9 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c) | |||
202 | 200 | ||
203 | if (!block) | 201 | if (!block) |
204 | per_cpu(bank_map, cpu) |= (1 << bank); | 202 | per_cpu(bank_map, cpu) |= (1 << bank); |
205 | #ifdef CONFIG_SMP | ||
206 | if (shared_bank[bank] && c->cpu_core_id) | 203 | if (shared_bank[bank] && c->cpu_core_id) |
207 | break; | 204 | break; |
208 | #endif | 205 | |
209 | offset = setup_APIC_mce(offset, | 206 | offset = setup_APIC_mce(offset, |
210 | (high & MASK_LVTOFF_HI) >> 20); | 207 | (high & MASK_LVTOFF_HI) >> 20); |
211 | 208 | ||
@@ -531,7 +528,6 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
531 | 528 | ||
532 | sprintf(name, "threshold_bank%i", bank); | 529 | sprintf(name, "threshold_bank%i", bank); |
533 | 530 | ||
534 | #ifdef CONFIG_SMP | ||
535 | if (cpu_data(cpu).cpu_core_id && shared_bank[bank]) { /* symlink */ | 531 | if (cpu_data(cpu).cpu_core_id && shared_bank[bank]) { /* symlink */ |
536 | i = cpumask_first(cpu_llc_shared_mask(cpu)); | 532 | i = cpumask_first(cpu_llc_shared_mask(cpu)); |
537 | 533 | ||
@@ -558,7 +554,6 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
558 | 554 | ||
559 | goto out; | 555 | goto out; |
560 | } | 556 | } |
561 | #endif | ||
562 | 557 | ||
563 | b = kzalloc(sizeof(struct threshold_bank), GFP_KERNEL); | 558 | b = kzalloc(sizeof(struct threshold_bank), GFP_KERNEL); |
564 | if (!b) { | 559 | if (!b) { |
diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c index 14b23140e81f..8022c6681485 100644 --- a/arch/x86/kernel/cpu/proc.c +++ b/arch/x86/kernel/cpu/proc.c | |||
@@ -64,12 +64,10 @@ static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c) | |||
64 | static int show_cpuinfo(struct seq_file *m, void *v) | 64 | static int show_cpuinfo(struct seq_file *m, void *v) |
65 | { | 65 | { |
66 | struct cpuinfo_x86 *c = v; | 66 | struct cpuinfo_x86 *c = v; |
67 | unsigned int cpu = 0; | 67 | unsigned int cpu; |
68 | int i; | 68 | int i; |
69 | 69 | ||
70 | #ifdef CONFIG_SMP | ||
71 | cpu = c->cpu_index; | 70 | cpu = c->cpu_index; |
72 | #endif | ||
73 | seq_printf(m, "processor\t: %u\n" | 71 | seq_printf(m, "processor\t: %u\n" |
74 | "vendor_id\t: %s\n" | 72 | "vendor_id\t: %s\n" |
75 | "cpu family\t: %d\n" | 73 | "cpu family\t: %d\n" |
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 5d31e5bdbf85..7943e0c21bde 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
@@ -74,6 +74,10 @@ int arch_show_interrupts(struct seq_file *p, int prec) | |||
74 | for_each_online_cpu(j) | 74 | for_each_online_cpu(j) |
75 | seq_printf(p, "%10u ", irq_stats(j)->apic_irq_work_irqs); | 75 | seq_printf(p, "%10u ", irq_stats(j)->apic_irq_work_irqs); |
76 | seq_printf(p, " IRQ work interrupts\n"); | 76 | seq_printf(p, " IRQ work interrupts\n"); |
77 | seq_printf(p, "%*s: ", prec, "RTR"); | ||
78 | for_each_online_cpu(j) | ||
79 | seq_printf(p, "%10u ", irq_stats(j)->icr_read_retry_count); | ||
80 | seq_printf(p, " APIC ICR read retries\n"); | ||
77 | #endif | 81 | #endif |
78 | if (x86_platform_ipi_callback) { | 82 | if (x86_platform_ipi_callback) { |
79 | seq_printf(p, "%*s: ", prec, "PLT"); | 83 | seq_printf(p, "%*s: ", prec, "PLT"); |
@@ -136,6 +140,7 @@ u64 arch_irq_stat_cpu(unsigned int cpu) | |||
136 | sum += irq_stats(cpu)->irq_spurious_count; | 140 | sum += irq_stats(cpu)->irq_spurious_count; |
137 | sum += irq_stats(cpu)->apic_perf_irqs; | 141 | sum += irq_stats(cpu)->apic_perf_irqs; |
138 | sum += irq_stats(cpu)->apic_irq_work_irqs; | 142 | sum += irq_stats(cpu)->apic_irq_work_irqs; |
143 | sum += irq_stats(cpu)->icr_read_retry_count; | ||
139 | #endif | 144 | #endif |
140 | if (x86_platform_ipi_callback) | 145 | if (x86_platform_ipi_callback) |
141 | sum += irq_stats(cpu)->x86_platform_ipis; | 146 | sum += irq_stats(cpu)->x86_platform_ipis; |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 9f548cb4a958..e38e21754eea 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -840,7 +840,8 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
840 | pr_debug("++++++++++++++++++++=_---CPU UP %u\n", cpu); | 840 | pr_debug("++++++++++++++++++++=_---CPU UP %u\n", cpu); |
841 | 841 | ||
842 | if (apicid == BAD_APICID || apicid == boot_cpu_physical_apicid || | 842 | if (apicid == BAD_APICID || apicid == boot_cpu_physical_apicid || |
843 | !physid_isset(apicid, phys_cpu_present_map)) { | 843 | !physid_isset(apicid, phys_cpu_present_map) || |
844 | (!x2apic_mode && apicid >= 255)) { | ||
844 | printk(KERN_ERR "%s: bad cpu %d\n", __func__, cpu); | 845 | printk(KERN_ERR "%s: bad cpu %d\n", __func__, cpu); |
845 | return -EINVAL; | 846 | return -EINVAL; |
846 | } | 847 | } |
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index c1d6cd549397..91f83e21b989 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c | |||
@@ -92,6 +92,7 @@ struct x86_init_ops x86_init __initdata = { | |||
92 | 92 | ||
93 | struct x86_cpuinit_ops x86_cpuinit __cpuinitdata = { | 93 | struct x86_cpuinit_ops x86_cpuinit __cpuinitdata = { |
94 | .setup_percpu_clockev = setup_secondary_APIC_clock, | 94 | .setup_percpu_clockev = setup_secondary_APIC_clock, |
95 | .fixup_cpu_id = x86_default_fixup_cpu_id, | ||
95 | }; | 96 | }; |
96 | 97 | ||
97 | static void default_nmi_init(void) { }; | 98 | static void default_nmi_init(void) { }; |
diff --git a/arch/x86/mm/srat.c b/arch/x86/mm/srat.c index 81dbfdeb080d..fd61b3fb7341 100644 --- a/arch/x86/mm/srat.c +++ b/arch/x86/mm/srat.c | |||
@@ -69,6 +69,12 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa) | |||
69 | if ((pa->flags & ACPI_SRAT_CPU_ENABLED) == 0) | 69 | if ((pa->flags & ACPI_SRAT_CPU_ENABLED) == 0) |
70 | return; | 70 | return; |
71 | pxm = pa->proximity_domain; | 71 | pxm = pa->proximity_domain; |
72 | apic_id = pa->apic_id; | ||
73 | if (!cpu_has_x2apic && (apic_id >= 0xff)) { | ||
74 | printk(KERN_INFO "SRAT: PXM %u -> X2APIC 0x%04x ignored\n", | ||
75 | pxm, apic_id); | ||
76 | return; | ||
77 | } | ||
72 | node = setup_node(pxm); | 78 | node = setup_node(pxm); |
73 | if (node < 0) { | 79 | if (node < 0) { |
74 | printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm); | 80 | printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm); |
@@ -76,7 +82,6 @@ acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa) | |||
76 | return; | 82 | return; |
77 | } | 83 | } |
78 | 84 | ||
79 | apic_id = pa->apic_id; | ||
80 | if (apic_id >= MAX_LOCAL_APIC) { | 85 | if (apic_id >= MAX_LOCAL_APIC) { |
81 | printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u skipped apicid that is too big\n", pxm, apic_id, node); | 86 | printk(KERN_INFO "SRAT: PXM %u -> APIC 0x%04x -> Node %u skipped apicid that is too big\n", pxm, apic_id, node); |
82 | return; | 87 | return; |
diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c index 7a402bfbee7d..88df48956c1b 100644 --- a/drivers/edac/sb_edac.c +++ b/drivers/edac/sb_edac.c | |||
@@ -1609,11 +1609,9 @@ static int sbridge_mce_check_error(struct notifier_block *nb, unsigned long val, | |||
1609 | mce->cpuvendor, mce->cpuid, mce->time, | 1609 | mce->cpuvendor, mce->cpuid, mce->time, |
1610 | mce->socketid, mce->apicid); | 1610 | mce->socketid, mce->apicid); |
1611 | 1611 | ||
1612 | #ifdef CONFIG_SMP | ||
1613 | /* Only handle if it is the right mc controller */ | 1612 | /* Only handle if it is the right mc controller */ |
1614 | if (cpu_data(mce->cpu).phys_proc_id != pvt->sbridge_dev->mc) | 1613 | if (cpu_data(mce->cpu).phys_proc_id != pvt->sbridge_dev->mc) |
1615 | return NOTIFY_DONE; | 1614 | return NOTIFY_DONE; |
1616 | #endif | ||
1617 | 1615 | ||
1618 | smp_rmb(); | 1616 | smp_rmb(); |
1619 | if ((pvt->mce_out + 1) % MCE_LOG_LEN == pvt->mce_in) { | 1617 | if ((pvt->mce_out + 1) % MCE_LOG_LEN == pvt->mce_in) { |
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 104b3767516c..1fdef885341c 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c | |||
@@ -57,16 +57,15 @@ MODULE_PARM_DESC(tjmax, "TjMax value in degrees Celsius"); | |||
57 | #define TOTAL_ATTRS (MAX_CORE_ATTRS + 1) | 57 | #define TOTAL_ATTRS (MAX_CORE_ATTRS + 1) |
58 | #define MAX_CORE_DATA (NUM_REAL_CORES + BASE_SYSFS_ATTR_NO) | 58 | #define MAX_CORE_DATA (NUM_REAL_CORES + BASE_SYSFS_ATTR_NO) |
59 | 59 | ||
60 | #ifdef CONFIG_SMP | ||
61 | #define TO_PHYS_ID(cpu) cpu_data(cpu).phys_proc_id | 60 | #define TO_PHYS_ID(cpu) cpu_data(cpu).phys_proc_id |
62 | #define TO_CORE_ID(cpu) cpu_data(cpu).cpu_core_id | 61 | #define TO_CORE_ID(cpu) cpu_data(cpu).cpu_core_id |
62 | #define TO_ATTR_NO(cpu) (TO_CORE_ID(cpu) + BASE_SYSFS_ATTR_NO) | ||
63 | |||
64 | #ifdef CONFIG_SMP | ||
63 | #define for_each_sibling(i, cpu) for_each_cpu(i, cpu_sibling_mask(cpu)) | 65 | #define for_each_sibling(i, cpu) for_each_cpu(i, cpu_sibling_mask(cpu)) |
64 | #else | 66 | #else |
65 | #define TO_PHYS_ID(cpu) (cpu) | ||
66 | #define TO_CORE_ID(cpu) (cpu) | ||
67 | #define for_each_sibling(i, cpu) for (i = 0; false; ) | 67 | #define for_each_sibling(i, cpu) for (i = 0; false; ) |
68 | #endif | 68 | #endif |
69 | #define TO_ATTR_NO(cpu) (TO_CORE_ID(cpu) + BASE_SYSFS_ATTR_NO) | ||
70 | 69 | ||
71 | /* | 70 | /* |
72 | * Per-Core Temperature Data | 71 | * Per-Core Temperature Data |
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig index f02b5235056d..37856f7c7781 100644 --- a/drivers/pci/Kconfig +++ b/drivers/pci/Kconfig | |||
@@ -98,11 +98,11 @@ config PCI_PASID | |||
98 | If unsure, say N. | 98 | If unsure, say N. |
99 | 99 | ||
100 | config PCI_IOAPIC | 100 | config PCI_IOAPIC |
101 | bool | 101 | tristate "PCI IO-APIC hotplug support" if X86 |
102 | depends on PCI | 102 | depends on PCI |
103 | depends on ACPI | 103 | depends on ACPI |
104 | depends on HOTPLUG | 104 | depends on HOTPLUG |
105 | default y | 105 | default !X86 |
106 | 106 | ||
107 | config PCI_LABEL | 107 | config PCI_LABEL |
108 | def_bool y if (DMI || ACPI) | 108 | def_bool y if (DMI || ACPI) |
diff --git a/drivers/pci/ioapic.c b/drivers/pci/ioapic.c index 5775638ac017..205af8dc83c2 100644 --- a/drivers/pci/ioapic.c +++ b/drivers/pci/ioapic.c | |||
@@ -17,7 +17,7 @@ | |||
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/pci.h> | 19 | #include <linux/pci.h> |
20 | #include <linux/export.h> | 20 | #include <linux/module.h> |
21 | #include <linux/acpi.h> | 21 | #include <linux/acpi.h> |
22 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
23 | #include <acpi/acpi_bus.h> | 23 | #include <acpi/acpi_bus.h> |
@@ -27,7 +27,7 @@ struct ioapic { | |||
27 | u32 gsi_base; | 27 | u32 gsi_base; |
28 | }; | 28 | }; |
29 | 29 | ||
30 | static int ioapic_probe(struct pci_dev *dev, const struct pci_device_id *ent) | 30 | static int __devinit ioapic_probe(struct pci_dev *dev, const struct pci_device_id *ent) |
31 | { | 31 | { |
32 | acpi_handle handle; | 32 | acpi_handle handle; |
33 | acpi_status status; | 33 | acpi_status status; |
@@ -88,7 +88,7 @@ exit_free: | |||
88 | return -ENODEV; | 88 | return -ENODEV; |
89 | } | 89 | } |
90 | 90 | ||
91 | static void ioapic_remove(struct pci_dev *dev) | 91 | static void __devexit ioapic_remove(struct pci_dev *dev) |
92 | { | 92 | { |
93 | struct ioapic *ioapic = pci_get_drvdata(dev); | 93 | struct ioapic *ioapic = pci_get_drvdata(dev); |
94 | 94 | ||
@@ -99,13 +99,12 @@ static void ioapic_remove(struct pci_dev *dev) | |||
99 | } | 99 | } |
100 | 100 | ||
101 | 101 | ||
102 | static struct pci_device_id ioapic_devices[] = { | 102 | static DEFINE_PCI_DEVICE_TABLE(ioapic_devices) = { |
103 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | 103 | { PCI_DEVICE_CLASS(PCI_CLASS_SYSTEM_PIC_IOAPIC, ~0) }, |
104 | PCI_CLASS_SYSTEM_PIC_IOAPIC << 8, 0xffff00, }, | 104 | { PCI_DEVICE_CLASS(PCI_CLASS_SYSTEM_PIC_IOXAPIC, ~0) }, |
105 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | ||
106 | PCI_CLASS_SYSTEM_PIC_IOXAPIC << 8, 0xffff00, }, | ||
107 | { } | 105 | { } |
108 | }; | 106 | }; |
107 | MODULE_DEVICE_TABLE(pci, ioapic_devices); | ||
109 | 108 | ||
110 | static struct pci_driver ioapic_driver = { | 109 | static struct pci_driver ioapic_driver = { |
111 | .name = "ioapic", | 110 | .name = "ioapic", |