diff options
Diffstat (limited to 'arch/x86/kernel/cpu/intel.c')
-rw-r--r-- | arch/x86/kernel/cpu/intel.c | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 25c559ba8d54..7437fa133c02 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <linux/string.h> | 4 | #include <linux/string.h> |
5 | #include <linux/bitops.h> | 5 | #include <linux/bitops.h> |
6 | #include <linux/smp.h> | 6 | #include <linux/smp.h> |
7 | #include <linux/sched.h> | ||
7 | #include <linux/thread_info.h> | 8 | #include <linux/thread_info.h> |
8 | #include <linux/module.h> | 9 | #include <linux/module.h> |
9 | 10 | ||
@@ -13,6 +14,7 @@ | |||
13 | #include <asm/uaccess.h> | 14 | #include <asm/uaccess.h> |
14 | #include <asm/ds.h> | 15 | #include <asm/ds.h> |
15 | #include <asm/bugs.h> | 16 | #include <asm/bugs.h> |
17 | #include <asm/cpu.h> | ||
16 | 18 | ||
17 | #ifdef CONFIG_X86_64 | 19 | #ifdef CONFIG_X86_64 |
18 | #include <asm/topology.h> | 20 | #include <asm/topology.h> |
@@ -53,13 +55,23 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) | |||
53 | c->x86_cache_alignment = 128; | 55 | c->x86_cache_alignment = 128; |
54 | #endif | 56 | #endif |
55 | 57 | ||
58 | /* CPUID workaround for 0F33/0F34 CPU */ | ||
59 | if (c->x86 == 0xF && c->x86_model == 0x3 | ||
60 | && (c->x86_mask == 0x3 || c->x86_mask == 0x4)) | ||
61 | c->x86_phys_bits = 36; | ||
62 | |||
56 | /* | 63 | /* |
57 | * c->x86_power is 8000_0007 edx. Bit 8 is TSC runs at constant rate | 64 | * c->x86_power is 8000_0007 edx. Bit 8 is TSC runs at constant rate |
58 | * with P/T states and does not stop in deep C-states | 65 | * with P/T states and does not stop in deep C-states. |
66 | * | ||
67 | * It is also reliable across cores and sockets. (but not across | ||
68 | * cabinets - we turn it off in that case explicitly.) | ||
59 | */ | 69 | */ |
60 | if (c->x86_power & (1 << 8)) { | 70 | if (c->x86_power & (1 << 8)) { |
61 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); | 71 | set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); |
62 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); | 72 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); |
73 | set_cpu_cap(c, X86_FEATURE_TSC_RELIABLE); | ||
74 | sched_clock_stable = 1; | ||
63 | } | 75 | } |
64 | 76 | ||
65 | /* | 77 | /* |
@@ -110,6 +122,28 @@ static void __cpuinit trap_init_f00f_bug(void) | |||
110 | } | 122 | } |
111 | #endif | 123 | #endif |
112 | 124 | ||
125 | static void __cpuinit intel_smp_check(struct cpuinfo_x86 *c) | ||
126 | { | ||
127 | #ifdef CONFIG_SMP | ||
128 | /* calling is from identify_secondary_cpu() ? */ | ||
129 | if (c->cpu_index == boot_cpu_id) | ||
130 | return; | ||
131 | |||
132 | /* | ||
133 | * Mask B, Pentium, but not Pentium MMX | ||
134 | */ | ||
135 | if (c->x86 == 5 && | ||
136 | c->x86_mask >= 1 && c->x86_mask <= 4 && | ||
137 | c->x86_model <= 3) { | ||
138 | /* | ||
139 | * Remember we have B step Pentia with bugs | ||
140 | */ | ||
141 | WARN_ONCE(1, "WARNING: SMP operation may be unreliable" | ||
142 | "with B stepping processors.\n"); | ||
143 | } | ||
144 | #endif | ||
145 | } | ||
146 | |||
113 | static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c) | 147 | static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c) |
114 | { | 148 | { |
115 | unsigned long lo, hi; | 149 | unsigned long lo, hi; |
@@ -186,6 +220,8 @@ static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c) | |||
186 | #ifdef CONFIG_X86_NUMAQ | 220 | #ifdef CONFIG_X86_NUMAQ |
187 | numaq_tsc_disable(); | 221 | numaq_tsc_disable(); |
188 | #endif | 222 | #endif |
223 | |||
224 | intel_smp_check(c); | ||
189 | } | 225 | } |
190 | #else | 226 | #else |
191 | static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c) | 227 | static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c) |
@@ -385,7 +421,7 @@ static unsigned int __cpuinit intel_size_cache(struct cpuinfo_x86 *c, unsigned i | |||
385 | } | 421 | } |
386 | #endif | 422 | #endif |
387 | 423 | ||
388 | static struct cpu_dev intel_cpu_dev __cpuinitdata = { | 424 | static const struct cpu_dev __cpuinitconst intel_cpu_dev = { |
389 | .c_vendor = "Intel", | 425 | .c_vendor = "Intel", |
390 | .c_ident = { "GenuineIntel" }, | 426 | .c_ident = { "GenuineIntel" }, |
391 | #ifdef CONFIG_X86_32 | 427 | #ifdef CONFIG_X86_32 |