intel.c 24.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5
#include <linux/kernel.h>

#include <linux/string.h>
#include <linux/bitops.h>
#include <linux/smp.h>
I
Ingo Molnar 已提交
6
#include <linux/sched.h>
7
#include <linux/sched/clock.h>
L
Linus Torvalds 已提交
8
#include <linux/thread_info.h>
9
#include <linux/init.h>
A
Alan Cox 已提交
10
#include <linux/uaccess.h>
L
Linus Torvalds 已提交
11

12
#include <asm/cpufeature.h>
13
#include <asm/pgtable.h>
L
Linus Torvalds 已提交
14
#include <asm/msr.h>
15
#include <asm/bugs.h>
16
#include <asm/cpu.h>
17
#include <asm/intel-family.h>
18
#include <asm/microcode_intel.h>
19 20
#include <asm/hwcap2.h>
#include <asm/elf.h>
L
Linus Torvalds 已提交
21

22
#ifdef CONFIG_X86_64
A
Alan Cox 已提交
23
#include <linux/topology.h>
24 25
#endif

L
Linus Torvalds 已提交
26 27 28 29 30 31 32
#include "cpu.h"

#ifdef CONFIG_X86_LOCAL_APIC
#include <asm/mpspec.h>
#include <asm/apic.h>
#endif

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
/*
 * Just in case our CPU detection goes bad, or you have a weird system,
 * allow a way to override the automatic disabling of MPX.
 */
static int forcempx;

static int __init forcempx_setup(char *__unused)
{
	forcempx = 1;

	return 1;
}
__setup("intel-skd-046-workaround=disable", forcempx_setup);

void check_mpx_erratum(struct cpuinfo_x86 *c)
{
	if (forcempx)
		return;
	/*
	 * Turn off the MPX feature on CPUs where SMEP is not
	 * available or disabled.
	 *
	 * Works around Intel Erratum SKD046: "Branch Instructions
	 * May Initialize MPX Bound Registers Incorrectly".
	 *
	 * This might falsely disable MPX on systems without
	 * SMEP, like Atom processors without SMEP.  But there
	 * is no such hardware known at the moment.
	 */
	if (cpu_has(c, X86_FEATURE_MPX) && !cpu_has(c, X86_FEATURE_SMEP)) {
		setup_clear_cpu_cap(X86_FEATURE_MPX);
		pr_warn("x86/mpx: Disabling MPX since SMEP not present\n");
	}
}

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
static bool ring3mwait_disabled __read_mostly;

static int __init ring3mwait_disable(char *__unused)
{
	ring3mwait_disabled = true;
	return 0;
}
__setup("ring3mwait=disable", ring3mwait_disable);

static void probe_xeon_phi_r3mwait(struct cpuinfo_x86 *c)
{
	/*
	 * Ring 3 MONITOR/MWAIT feature cannot be detected without
	 * cpu model and family comparison.
	 */
83
	if (c->x86 != 6)
84
		return;
85 86 87 88 89 90 91
	switch (c->x86_model) {
	case INTEL_FAM6_XEON_PHI_KNL:
	case INTEL_FAM6_XEON_PHI_KNM:
		break;
	default:
		return;
	}
92 93

	if (ring3mwait_disabled) {
94 95
		msr_clear_bit(MSR_MISC_FEATURES_ENABLES,
			      MSR_MISC_FEATURES_ENABLES_RING3MWAIT_BIT);
96 97 98
		return;
	}

99 100
	msr_set_bit(MSR_MISC_FEATURES_ENABLES,
		    MSR_MISC_FEATURES_ENABLES_RING3MWAIT_BIT);
101 102 103 104 105 106 107

	set_cpu_cap(c, X86_FEATURE_RING3MWAIT);

	if (c == &boot_cpu_data)
		ELF_HWCAP2 |= HWCAP2_RING3MWAIT;
}

108
static void early_init_intel(struct cpuinfo_x86 *c)
L
Linus Torvalds 已提交
109
{
110 111
	u64 misc_enable;

112
	/* Unmask CPUID levels if masked: */
113
	if (c->x86 > 6 || (c->x86 == 6 && c->x86_model >= 0xd)) {
114 115
		if (msr_clear_bit(MSR_IA32_MISC_ENABLE,
				  MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT) > 0) {
116
			c->cpuid_level = cpuid_eax(0);
117
			get_cpu_cap(c);
118
		}
119 120
	}

121 122 123
	if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
		(c->x86 == 0x6 && c->x86_model >= 0x0e))
		set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
124

125 126
	if (c->x86 >= 6 && !cpu_has(c, X86_FEATURE_IA64))
		c->microcode = intel_get_microcode_revision();
127

128 129 130 131 132 133 134 135
	/*
	 * Atom erratum AAE44/AAF40/AAG38/AAH41:
	 *
	 * A race condition between speculative fetches and invalidating
	 * a large page.  This is worked around in microcode, but we
	 * need the microcode to have already been loaded... so if it is
	 * not, recommend a BIOS update and disable large pages.
	 */
136 137
	if (c->x86 == 6 && c->x86_model == 0x1c && c->x86_mask <= 2 &&
	    c->microcode < 0x20e) {
138
		pr_warn("Atom PSE erratum detected, BIOS microcode update recommended\n");
139
		clear_cpu_cap(c, X86_FEATURE_PSE);
140 141
	}

142 143 144 145 146 147 148
#ifdef CONFIG_X86_64
	set_cpu_cap(c, X86_FEATURE_SYSENTER32);
#else
	/* Netburst reports 64 bytes clflush size, but does IO in 128 bytes */
	if (c->x86 == 15 && c->x86_cache_alignment == 64)
		c->x86_cache_alignment = 128;
#endif
149

150 151 152 153 154
	/* CPUID workaround for 0F33/0F34 CPU */
	if (c->x86 == 0xF && c->x86_model == 0x3
	    && (c->x86_mask == 0x3 || c->x86_mask == 0x4))
		c->x86_phys_bits = 36;

155 156
	/*
	 * c->x86_power is 8000_0007 edx. Bit 8 is TSC runs at constant rate
I
Ingo Molnar 已提交
157 158 159 160
	 * with P/T states and does not stop in deep C-states.
	 *
	 * It is also reliable across cores and sockets. (but not across
	 * cabinets - we turn it off in that case explicitly.)
161 162 163 164 165 166
	 */
	if (c->x86_power & (1 << 8)) {
		set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
		set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC);
	}

167 168 169 170 171
	/* Penwell and Cloverview have the TSC which doesn't sleep on S3 */
	if (c->x86 == 6) {
		switch (c->x86_model) {
		case 0x27:	/* Penwell */
		case 0x35:	/* Cloverview */
172
		case 0x4a:	/* Merrifield */
173 174 175 176 177 178 179
			set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC_S3);
			break;
		default:
			break;
		}
	}

180 181 182 183 184 185 186 187 188 189 190 191
	/*
	 * There is a known erratum on Pentium III and Core Solo
	 * and Core Duo CPUs.
	 * " Page with PAT set to WC while associated MTRR is UC
	 *   may consolidate to UC "
	 * Because of this erratum, it is better to stick with
	 * setting WC in MTRR rather than using PAT on these CPUs.
	 *
	 * Enable PAT WC only on P4, Core 2 or later CPUs.
	 */
	if (c->x86 == 6 && c->x86_model < 15)
		clear_cpu_cap(c, X86_FEATURE_PAT);
V
Vegard Nossum 已提交
192 193 194 195 196 197 198 199 200 201

#ifdef CONFIG_KMEMCHECK
	/*
	 * P4s have a "fast strings" feature which causes single-
	 * stepping REP instructions to only generate a #DB on
	 * cache-line boundaries.
	 *
	 * Ingo Molnar reported a Pentium D (model 6) and a Xeon
	 * (model 2) with the same problem.
	 */
202
	if (c->x86 == 15)
203 204
		if (msr_clear_bit(MSR_IA32_MISC_ENABLE,
				  MSR_IA32_MISC_ENABLE_FAST_STRING_BIT) > 0)
205
			pr_info("kmemcheck: Disabling fast string operations\n");
V
Vegard Nossum 已提交
206
#endif
207 208 209 210 211 212 213 214

	/*
	 * If fast string is not enabled in IA32_MISC_ENABLE for any reason,
	 * clear the fast string and enhanced fast string CPU capabilities.
	 */
	if (c->x86 > 6 || (c->x86 == 6 && c->x86_model >= 0xd)) {
		rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
		if (!(misc_enable & MSR_IA32_MISC_ENABLE_FAST_STRING)) {
215
			pr_info("Disabled fast string operations\n");
216 217 218 219
			setup_clear_cpu_cap(X86_FEATURE_REP_GOOD);
			setup_clear_cpu_cap(X86_FEATURE_ERMS);
		}
	}
220 221 222 223 224 225 226

	/*
	 * Intel Quark Core DevMan_001.pdf section 6.4.11
	 * "The operating system also is required to invalidate (i.e., flush)
	 *  the TLB when any changes are made to any of the page table entries.
	 *  The operating system must reload CR3 to cause the TLB to be flushed"
	 *
227 228 229
	 * As a result, boot_cpu_has(X86_FEATURE_PGE) in arch/x86/include/asm/tlbflush.h
	 * should be false so that __flush_tlb_all() causes CR3 insted of CR4.PGE
	 * to be modified.
230 231 232 233 234
	 */
	if (c->x86 == 5 && c->x86_model == 9) {
		pr_info("Disabling PGE capability bit\n");
		setup_clear_cpu_cap(X86_FEATURE_PGE);
	}
235 236 237 238 239 240 241 242 243 244 245 246 247

	if (c->cpuid_level >= 0x00000001) {
		u32 eax, ebx, ecx, edx;

		cpuid(0x00000001, &eax, &ebx, &ecx, &edx);
		/*
		 * If HTT (EDX[28]) is set EBX[16:23] contain the number of
		 * apicids which are reserved per package. Store the resulting
		 * shift value for the package management code.
		 */
		if (edx & (1U << 28))
			c->x86_coreid_bits = get_count_order((ebx >> 16) & 0xff);
	}
248 249

	check_mpx_erratum(c);
L
Linus Torvalds 已提交
250 251
}

252
#ifdef CONFIG_X86_32
L
Linus Torvalds 已提交
253 254 255 256 257
/*
 *	Early probe support logic for ppro memory erratum #50
 *
 *	This is called before we do cpu ident work
 */
258

259
int ppro_with_ram_bug(void)
L
Linus Torvalds 已提交
260 261 262 263 264 265
{
	/* Uses data from early_cpu_detect now */
	if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
	    boot_cpu_data.x86 == 6 &&
	    boot_cpu_data.x86_model == 1 &&
	    boot_cpu_data.x86_mask < 8) {
266
		pr_info("Pentium Pro with Errata#50 detected. Taking evasive action.\n");
L
Linus Torvalds 已提交
267 268 269 270
		return 1;
	}
	return 0;
}
271

272
static void intel_smp_check(struct cpuinfo_x86 *c)
273 274
{
	/* calling is from identify_secondary_cpu() ? */
275
	if (!c->cpu_index)
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
		return;

	/*
	 * Mask B, Pentium, but not Pentium MMX
	 */
	if (c->x86 == 5 &&
	    c->x86_mask >= 1 && c->x86_mask <= 4 &&
	    c->x86_model <= 3) {
		/*
		 * Remember we have B step Pentia with bugs
		 */
		WARN_ONCE(1, "WARNING: SMP operation may be unreliable"
				    "with B stepping processors.\n");
	}
}

292 293 294 295 296 297 298 299
static int forcepae;
static int __init forcepae_setup(char *__unused)
{
	forcepae = 1;
	return 1;
}
__setup("forcepae", forcepae_setup);

300
static void intel_workarounds(struct cpuinfo_x86 *c)
L
Linus Torvalds 已提交
301
{
302 303
#ifdef CONFIG_X86_F00F_BUG
	/*
304
	 * All models of Pentium and Pentium with MMX technology CPUs
A
Alan Cox 已提交
305
	 * have the F0 0F bug, which lets nonprivileged users lock up the
306
	 * system. Announce that the fault handler will be checking for it.
307
	 * The Quark is also family 5, but does not have the same bug.
308
	 */
309
	clear_cpu_bug(c, X86_BUG_F00F);
310
	if (c->x86 == 5 && c->x86_model < 9) {
311 312
		static int f00f_workaround_enabled;

313
		set_cpu_bug(c, X86_BUG_F00F);
314
		if (!f00f_workaround_enabled) {
315
			pr_notice("Intel Pentium with F0 0F bug - workaround enabled.\n");
316 317 318 319 320 321 322 323 324 325 326 327
			f00f_workaround_enabled = 1;
		}
	}
#endif

	/*
	 * SEP CPUID bug: Pentium Pro reports SEP but doesn't have it until
	 * model 3 mask 3
	 */
	if ((c->x86<<8 | c->x86_model<<4 | c->x86_mask) < 0x633)
		clear_cpu_cap(c, X86_FEATURE_SEP);

328 329 330 331 332 333
	/*
	 * PAE CPUID issue: many Pentium M report no PAE but may have a
	 * functionally usable PAE implementation.
	 * Forcefully enable PAE if kernel parameter "forcepae" is present.
	 */
	if (forcepae) {
334
		pr_warn("PAE forced!\n");
335 336 337 338
		set_cpu_cap(c, X86_FEATURE_PAE);
		add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_NOW_UNRELIABLE);
	}

339
	/*
340
	 * P4 Xeon erratum 037 workaround.
341 342
	 * Hardware prefetcher may cause stale data to be loaded into the cache.
	 */
L
Linus Torvalds 已提交
343
	if ((c->x86 == 15) && (c->x86_model == 1) && (c->x86_mask == 1)) {
344
		if (msr_set_bit(MSR_IA32_MISC_ENABLE,
345
				MSR_IA32_MISC_ENABLE_PREFETCH_DISABLE_BIT) > 0) {
346
			pr_info("CPU: C0 stepping P4 Xeon detected.\n");
347
			pr_info("CPU: Disabling hardware prefetching (Erratum 037)\n");
L
Linus Torvalds 已提交
348 349 350
		}
	}

351 352 353 354 355 356
	/*
	 * See if we have a good local APIC by checking for buggy Pentia,
	 * i.e. all B steppings and the C2 stepping of P54C when using their
	 * integrated APIC (see 11AP erratum in "Pentium Processor
	 * Specification Update").
	 */
357
	if (boot_cpu_has(X86_FEATURE_APIC) && (c->x86<<8 | c->x86_model<<4) == 0x520 &&
358
	    (c->x86_mask < 0x6 || c->x86_mask == 0xb))
359
		set_cpu_bug(c, X86_BUG_11AP);
360 361


362
#ifdef CONFIG_X86_INTEL_USERCOPY
363
	/*
364
	 * Set up the preferred alignment for movsl bulk memory moves
365
	 */
366 367 368 369 370 371 372 373 374 375 376 377
	switch (c->x86) {
	case 4:		/* 486: untested */
		break;
	case 5:		/* Old Pentia: untested */
		break;
	case 6:		/* PII/PIII only like movsl with 8-byte alignment */
		movsl_mask.mask = 7;
		break;
	case 15:	/* P4 is OK down to 8-byte alignment */
		movsl_mask.mask = 7;
		break;
	}
378
#endif
379

380
	intel_smp_check(c);
381 382
}
#else
383
static void intel_workarounds(struct cpuinfo_x86 *c)
384 385
{
}
386 387
#endif

388
static void srat_detect_node(struct cpuinfo_x86 *c)
389
{
390
#ifdef CONFIG_NUMA
391 392 393 394 395
	unsigned node;
	int cpu = smp_processor_id();

	/* Don't do the funky fallback heuristics the AMD version employs
	   for now. */
396
	node = numa_cpu_node(cpu);
397
	if (node == NUMA_NO_NODE || !node_online(node)) {
398 399 400
		/* reuse the value from init_cpu_to_node() */
		node = cpu_to_node(cpu);
	}
401 402 403 404
	numa_set_node(cpu, node);
#endif
}

405 406 407
/*
 * find out the number of processor cores on the die
 */
408
static int intel_num_cpu_cores(struct cpuinfo_x86 *c)
409
{
Z
Zachary Amsden 已提交
410
	unsigned int eax, ebx, ecx, edx;
411

412
	if (!IS_ENABLED(CONFIG_SMP) || c->cpuid_level < 4)
413 414
		return 1;

Z
Zachary Amsden 已提交
415 416
	/* Intel has a non-standard dependency on %ecx for this CPUID level. */
	cpuid_count(4, 0, &eax, &ebx, &ecx, &edx);
417
	if (eax & 0x1f)
A
Alan Cox 已提交
418
		return (eax >> 26) + 1;
419 420 421 422
	else
		return 1;
}

423
static void detect_vmx_virtcap(struct cpuinfo_x86 *c)
424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
{
	/* Intel VMX MSR indicated features */
#define X86_VMX_FEATURE_PROC_CTLS_TPR_SHADOW	0x00200000
#define X86_VMX_FEATURE_PROC_CTLS_VNMI		0x00400000
#define X86_VMX_FEATURE_PROC_CTLS_2ND_CTLS	0x80000000
#define X86_VMX_FEATURE_PROC_CTLS2_VIRT_APIC	0x00000001
#define X86_VMX_FEATURE_PROC_CTLS2_EPT		0x00000002
#define X86_VMX_FEATURE_PROC_CTLS2_VPID		0x00000020

	u32 vmx_msr_low, vmx_msr_high, msr_ctl, msr_ctl2;

	clear_cpu_cap(c, X86_FEATURE_TPR_SHADOW);
	clear_cpu_cap(c, X86_FEATURE_VNMI);
	clear_cpu_cap(c, X86_FEATURE_FLEXPRIORITY);
	clear_cpu_cap(c, X86_FEATURE_EPT);
	clear_cpu_cap(c, X86_FEATURE_VPID);

	rdmsr(MSR_IA32_VMX_PROCBASED_CTLS, vmx_msr_low, vmx_msr_high);
	msr_ctl = vmx_msr_high | vmx_msr_low;
	if (msr_ctl & X86_VMX_FEATURE_PROC_CTLS_TPR_SHADOW)
		set_cpu_cap(c, X86_FEATURE_TPR_SHADOW);
	if (msr_ctl & X86_VMX_FEATURE_PROC_CTLS_VNMI)
		set_cpu_cap(c, X86_FEATURE_VNMI);
	if (msr_ctl & X86_VMX_FEATURE_PROC_CTLS_2ND_CTLS) {
		rdmsr(MSR_IA32_VMX_PROCBASED_CTLS2,
		      vmx_msr_low, vmx_msr_high);
		msr_ctl2 = vmx_msr_high | vmx_msr_low;
		if ((msr_ctl2 & X86_VMX_FEATURE_PROC_CTLS2_VIRT_APIC) &&
		    (msr_ctl & X86_VMX_FEATURE_PROC_CTLS_TPR_SHADOW))
			set_cpu_cap(c, X86_FEATURE_FLEXPRIORITY);
		if (msr_ctl2 & X86_VMX_FEATURE_PROC_CTLS2_EPT)
			set_cpu_cap(c, X86_FEATURE_EPT);
		if (msr_ctl2 & X86_VMX_FEATURE_PROC_CTLS2_VPID)
			set_cpu_cap(c, X86_FEATURE_VPID);
	}
}

461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490
static void init_intel_energy_perf(struct cpuinfo_x86 *c)
{
	u64 epb;

	/*
	 * Initialize MSR_IA32_ENERGY_PERF_BIAS if not already initialized.
	 * (x86_energy_perf_policy(8) is available to change it at run-time.)
	 */
	if (!cpu_has(c, X86_FEATURE_EPB))
		return;

	rdmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
	if ((epb & 0xF) != ENERGY_PERF_BIAS_PERFORMANCE)
		return;

	pr_warn_once("ENERGY_PERF_BIAS: Set to 'normal', was 'performance'\n");
	pr_warn_once("ENERGY_PERF_BIAS: View and update with x86_energy_perf_policy(8)\n");
	epb = (epb & ~0xF) | ENERGY_PERF_BIAS_NORMAL;
	wrmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
}

static void intel_bsp_resume(struct cpuinfo_x86 *c)
{
	/*
	 * MSR_IA32_ENERGY_PERF_BIAS is lost across suspend/resume,
	 * so reinitialize it properly like during bootup:
	 */
	init_intel_energy_perf(c);
}

491
static void init_intel(struct cpuinfo_x86 *c)
L
Linus Torvalds 已提交
492 493 494
{
	unsigned int l2 = 0;

495 496
	early_init_intel(c);

497
	intel_workarounds(c);
L
Linus Torvalds 已提交
498

499 500 501 502 503 504 505
	/*
	 * Detect the extended topology information if available. This
	 * will reinitialise the initial_apicid which will be used
	 * in init_intel_cacheinfo()
	 */
	detect_extended_topology(c);

506 507 508 509 510 511 512 513 514 515 516
	if (!cpu_has(c, X86_FEATURE_XTOPOLOGY)) {
		/*
		 * let's use the legacy cpuid vector 0x1 and 0x4 for topology
		 * detection.
		 */
		c->x86_max_cores = intel_num_cpu_cores(c);
#ifdef CONFIG_X86_32
		detect_ht(c);
#endif
	}

L
Linus Torvalds 已提交
517
	l2 = init_intel_cacheinfo(c);
518 519 520 521 522 523 524

	/* Detect legacy cache sizes if init_intel_cacheinfo did not */
	if (l2 == 0) {
		cpu_detect_cache_sizes(c);
		l2 = c->x86_cache_size;
	}

525
	if (c->cpuid_level > 9) {
526 527 528
		unsigned eax = cpuid_eax(10);
		/* Check for version and the number of counters */
		if ((eax & 0xff) && (((eax>>8) & 0xff) > 1))
529
			set_cpu_cap(c, X86_FEATURE_ARCH_PERFMON);
530
	}
L
Linus Torvalds 已提交
531

532
	if (cpu_has(c, X86_FEATURE_XMM2))
533
		set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
534 535

	if (boot_cpu_has(X86_FEATURE_DS)) {
536 537 538 539 540 541 542
		unsigned int l1;
		rdmsr(MSR_IA32_MISC_ENABLE, l1, l2);
		if (!(l1 & (1<<11)))
			set_cpu_cap(c, X86_FEATURE_BTS);
		if (!(l1 & (1<<12)))
			set_cpu_cap(c, X86_FEATURE_PEBS);
	}
L
Linus Torvalds 已提交
543

544
	if (c->x86 == 6 && boot_cpu_has(X86_FEATURE_CLFLUSH) &&
545
	    (c->x86_model == 29 || c->x86_model == 46 || c->x86_model == 47))
546
		set_cpu_bug(c, X86_BUG_CLFLUSH_MONITOR);
547

548 549 550 551
	if (c->x86 == 6 && boot_cpu_has(X86_FEATURE_MWAIT) &&
		((c->x86_model == INTEL_FAM6_ATOM_GOLDMONT)))
		set_cpu_bug(c, X86_BUG_MONITOR);

552 553 554 555 556 557
#ifdef CONFIG_X86_64
	if (c->x86 == 15)
		c->x86_cache_alignment = c->x86_clflush_size * 2;
	if (c->x86 == 6)
		set_cpu_cap(c, X86_FEATURE_REP_GOOD);
#else
558 559 560 561 562
	/*
	 * Names for the Pentium II/Celeron processors
	 * detectable only by also checking the cache size.
	 * Dixon is NOT a Celeron.
	 */
L
Linus Torvalds 已提交
563
	if (c->x86 == 6) {
564 565
		char *p = NULL;

L
Linus Torvalds 已提交
566 567
		switch (c->x86_model) {
		case 5:
568 569 570 571
			if (l2 == 0)
				p = "Celeron (Covington)";
			else if (l2 == 256)
				p = "Mobile Pentium II (Dixon)";
L
Linus Torvalds 已提交
572
			break;
573

L
Linus Torvalds 已提交
574 575 576 577 578 579
		case 6:
			if (l2 == 128)
				p = "Celeron (Mendocino)";
			else if (c->x86_mask == 0 || c->x86_mask == 5)
				p = "Celeron-A";
			break;
580

L
Linus Torvalds 已提交
581 582 583 584 585 586
		case 8:
			if (l2 == 128)
				p = "Celeron (Coppermine)";
			break;
		}

587 588
		if (p)
			strcpy(c->x86_model_id, p);
L
Linus Torvalds 已提交
589 590
	}

591 592 593 594
	if (c->x86 == 15)
		set_cpu_cap(c, X86_FEATURE_P4);
	if (c->x86 == 6)
		set_cpu_cap(c, X86_FEATURE_P3);
595
#endif
596 597

	/* Work around errata */
598
	srat_detect_node(c);
599 600 601

	if (cpu_has(c, X86_FEATURE_VMX))
		detect_vmx_virtcap(c);
602

603
	init_intel_energy_perf(c);
604 605

	probe_xeon_phi_r3mwait(c);
606
}
L
Linus Torvalds 已提交
607

608
#ifdef CONFIG_X86_32
609
static unsigned int intel_size_cache(struct cpuinfo_x86 *c, unsigned int size)
L
Linus Torvalds 已提交
610
{
611 612
	/*
	 * Intel PIII Tualatin. This comes in two flavours.
L
Linus Torvalds 已提交
613 614 615 616 617 618
	 * One has 256kb of cache, the other 512. We have no way
	 * to determine which, so we use a boottime override
	 * for the 512kb model, and assume 256 otherwise.
	 */
	if ((c->x86 == 6) && (c->x86_model == 11) && (size == 0))
		size = 256;
619 620 621 622 623 624 625

	/*
	 * Intel Quark SoC X1000 contains a 4-way set associative
	 * 16K cache with a 16 byte cache line and 256 lines per tag
	 */
	if ((c->x86 == 5) && (c->x86_model == 9))
		size = 16;
L
Linus Torvalds 已提交
626 627
	return size;
}
628
#endif
L
Linus Torvalds 已提交
629

630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648
#define TLB_INST_4K	0x01
#define TLB_INST_4M	0x02
#define TLB_INST_2M_4M	0x03

#define TLB_INST_ALL	0x05
#define TLB_INST_1G	0x06

#define TLB_DATA_4K	0x11
#define TLB_DATA_4M	0x12
#define TLB_DATA_2M_4M	0x13
#define TLB_DATA_4K_4M	0x14

#define TLB_DATA_1G	0x16

#define TLB_DATA0_4K	0x21
#define TLB_DATA0_4M	0x22
#define TLB_DATA0_2M_4M	0x23

#define STLB_4K		0x41
649
#define STLB_4K_2M	0x42
650

651
static const struct _tlb_table intel_tlb_table[] = {
652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669
	{ 0x01, TLB_INST_4K,		32,	" TLB_INST 4 KByte pages, 4-way set associative" },
	{ 0x02, TLB_INST_4M,		2,	" TLB_INST 4 MByte pages, full associative" },
	{ 0x03, TLB_DATA_4K,		64,	" TLB_DATA 4 KByte pages, 4-way set associative" },
	{ 0x04, TLB_DATA_4M,		8,	" TLB_DATA 4 MByte pages, 4-way set associative" },
	{ 0x05, TLB_DATA_4M,		32,	" TLB_DATA 4 MByte pages, 4-way set associative" },
	{ 0x0b, TLB_INST_4M,		4,	" TLB_INST 4 MByte pages, 4-way set associative" },
	{ 0x4f, TLB_INST_4K,		32,	" TLB_INST 4 KByte pages */" },
	{ 0x50, TLB_INST_ALL,		64,	" TLB_INST 4 KByte and 2-MByte or 4-MByte pages" },
	{ 0x51, TLB_INST_ALL,		128,	" TLB_INST 4 KByte and 2-MByte or 4-MByte pages" },
	{ 0x52, TLB_INST_ALL,		256,	" TLB_INST 4 KByte and 2-MByte or 4-MByte pages" },
	{ 0x55, TLB_INST_2M_4M,		7,	" TLB_INST 2-MByte or 4-MByte pages, fully associative" },
	{ 0x56, TLB_DATA0_4M,		16,	" TLB_DATA0 4 MByte pages, 4-way set associative" },
	{ 0x57, TLB_DATA0_4K,		16,	" TLB_DATA0 4 KByte pages, 4-way associative" },
	{ 0x59, TLB_DATA0_4K,		16,	" TLB_DATA0 4 KByte pages, fully associative" },
	{ 0x5a, TLB_DATA0_2M_4M,	32,	" TLB_DATA0 2-MByte or 4 MByte pages, 4-way set associative" },
	{ 0x5b, TLB_DATA_4K_4M,		64,	" TLB_DATA 4 KByte and 4 MByte pages" },
	{ 0x5c, TLB_DATA_4K_4M,		128,	" TLB_DATA 4 KByte and 4 MByte pages" },
	{ 0x5d, TLB_DATA_4K_4M,		256,	" TLB_DATA 4 KByte and 4 MByte pages" },
670 671 672
	{ 0x61, TLB_INST_4K,		48,	" TLB_INST 4 KByte pages, full associative" },
	{ 0x63, TLB_DATA_1G,		4,	" TLB_DATA 1 GByte pages, 4-way set associative" },
	{ 0x76, TLB_INST_2M_4M,		8,	" TLB_INST 2-MByte or 4-MByte pages, fully associative" },
673 674 675 676 677
	{ 0xb0, TLB_INST_4K,		128,	" TLB_INST 4 KByte pages, 4-way set associative" },
	{ 0xb1, TLB_INST_2M_4M,		4,	" TLB_INST 2M pages, 4-way, 8 entries or 4M pages, 4-way entries" },
	{ 0xb2, TLB_INST_4K,		64,	" TLB_INST 4KByte pages, 4-way set associative" },
	{ 0xb3, TLB_DATA_4K,		128,	" TLB_DATA 4 KByte pages, 4-way set associative" },
	{ 0xb4, TLB_DATA_4K,		256,	" TLB_DATA 4 KByte pages, 4-way associative" },
678 679
	{ 0xb5, TLB_INST_4K,		64,	" TLB_INST 4 KByte pages, 8-way set associative" },
	{ 0xb6, TLB_INST_4K,		128,	" TLB_INST 4 KByte pages, 8-way set associative" },
680 681
	{ 0xba, TLB_DATA_4K,		64,	" TLB_DATA 4 KByte pages, 4-way associative" },
	{ 0xc0, TLB_DATA_4K_4M,		8,	" TLB_DATA 4 KByte and 4 MByte pages, 4-way associative" },
682 683
	{ 0xc1, STLB_4K_2M,		1024,	" STLB 4 KByte and 2 MByte pages, 8-way associative" },
	{ 0xc2, TLB_DATA_2M_4M,		16,	" DTLB 2 MByte/4MByte pages, 4-way associative" },
684 685 686 687
	{ 0xca, STLB_4K,		512,	" STLB 4 KByte pages, 4-way associative" },
	{ 0x00, 0, 0 }
};

688
static void intel_tlb_lookup(const unsigned char desc)
689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708
{
	unsigned char k;
	if (desc == 0)
		return;

	/* look up this descriptor in the table */
	for (k = 0; intel_tlb_table[k].descriptor != desc && \
			intel_tlb_table[k].descriptor != 0; k++)
		;

	if (intel_tlb_table[k].tlb_type == 0)
		return;

	switch (intel_tlb_table[k].tlb_type) {
	case STLB_4K:
		if (tlb_lli_4k[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lli_4k[ENTRIES] = intel_tlb_table[k].entries;
		if (tlb_lld_4k[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lld_4k[ENTRIES] = intel_tlb_table[k].entries;
		break;
709 710 711 712 713 714 715 716 717 718 719 720 721 722
	case STLB_4K_2M:
		if (tlb_lli_4k[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lli_4k[ENTRIES] = intel_tlb_table[k].entries;
		if (tlb_lld_4k[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lld_4k[ENTRIES] = intel_tlb_table[k].entries;
		if (tlb_lli_2m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lli_2m[ENTRIES] = intel_tlb_table[k].entries;
		if (tlb_lld_2m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lld_2m[ENTRIES] = intel_tlb_table[k].entries;
		if (tlb_lli_4m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lli_4m[ENTRIES] = intel_tlb_table[k].entries;
		if (tlb_lld_4m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lld_4m[ENTRIES] = intel_tlb_table[k].entries;
		break;
723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767
	case TLB_INST_ALL:
		if (tlb_lli_4k[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lli_4k[ENTRIES] = intel_tlb_table[k].entries;
		if (tlb_lli_2m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lli_2m[ENTRIES] = intel_tlb_table[k].entries;
		if (tlb_lli_4m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lli_4m[ENTRIES] = intel_tlb_table[k].entries;
		break;
	case TLB_INST_4K:
		if (tlb_lli_4k[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lli_4k[ENTRIES] = intel_tlb_table[k].entries;
		break;
	case TLB_INST_4M:
		if (tlb_lli_4m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lli_4m[ENTRIES] = intel_tlb_table[k].entries;
		break;
	case TLB_INST_2M_4M:
		if (tlb_lli_2m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lli_2m[ENTRIES] = intel_tlb_table[k].entries;
		if (tlb_lli_4m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lli_4m[ENTRIES] = intel_tlb_table[k].entries;
		break;
	case TLB_DATA_4K:
	case TLB_DATA0_4K:
		if (tlb_lld_4k[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lld_4k[ENTRIES] = intel_tlb_table[k].entries;
		break;
	case TLB_DATA_4M:
	case TLB_DATA0_4M:
		if (tlb_lld_4m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lld_4m[ENTRIES] = intel_tlb_table[k].entries;
		break;
	case TLB_DATA_2M_4M:
	case TLB_DATA0_2M_4M:
		if (tlb_lld_2m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lld_2m[ENTRIES] = intel_tlb_table[k].entries;
		if (tlb_lld_4m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lld_4m[ENTRIES] = intel_tlb_table[k].entries;
		break;
	case TLB_DATA_4K_4M:
		if (tlb_lld_4k[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lld_4k[ENTRIES] = intel_tlb_table[k].entries;
		if (tlb_lld_4m[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lld_4m[ENTRIES] = intel_tlb_table[k].entries;
		break;
768 769 770
	case TLB_DATA_1G:
		if (tlb_lld_1g[ENTRIES] < intel_tlb_table[k].entries)
			tlb_lld_1g[ENTRIES] = intel_tlb_table[k].entries;
771 772 773 774
		break;
	}
}

775
static void intel_detect_tlb(struct cpuinfo_x86 *c)
776 777 778 779
{
	int i, j, n;
	unsigned int regs[4];
	unsigned char *desc = (unsigned char *)regs;
780 781 782 783

	if (c->cpuid_level < 2)
		return;

784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800
	/* Number of times to iterate */
	n = cpuid_eax(2) & 0xFF;

	for (i = 0 ; i < n ; i++) {
		cpuid(2, &regs[0], &regs[1], &regs[2], &regs[3]);

		/* If bit 31 is set, this is an unknown format */
		for (j = 0 ; j < 3 ; j++)
			if (regs[j] & (1 << 31))
				regs[j] = 0;

		/* Byte 0 is level count, not a descriptor */
		for (j = 1 ; j < 16 ; j++)
			intel_tlb_lookup(desc[j]);
	}
}

801
static const struct cpu_dev intel_cpu_dev = {
L
Linus Torvalds 已提交
802
	.c_vendor	= "Intel",
803
	.c_ident	= { "GenuineIntel" },
804
#ifdef CONFIG_X86_32
805 806
	.legacy_models = {
		{ .family = 4, .model_names =
807 808 809 810 811 812 813 814 815
		  {
			  [0] = "486 DX-25/33",
			  [1] = "486 DX-50",
			  [2] = "486 SX",
			  [3] = "486 DX/2",
			  [4] = "486 SL",
			  [5] = "486 SX/2",
			  [7] = "486 DX/2-WB",
			  [8] = "486 DX/4",
L
Linus Torvalds 已提交
816 817 818
			  [9] = "486 DX/4-WB"
		  }
		},
819
		{ .family = 5, .model_names =
820 821 822
		  {
			  [0] = "Pentium 60/66 A-step",
			  [1] = "Pentium 60/66",
L
Linus Torvalds 已提交
823
			  [2] = "Pentium 75 - 200",
824
			  [3] = "OverDrive PODP5V83",
L
Linus Torvalds 已提交
825
			  [4] = "Pentium MMX",
826
			  [7] = "Mobile Pentium 75 - 200",
827 828
			  [8] = "Mobile Pentium MMX",
			  [9] = "Quark SoC X1000",
L
Linus Torvalds 已提交
829 830
		  }
		},
831
		{ .family = 6, .model_names =
832
		  {
L
Linus Torvalds 已提交
833
			  [0] = "Pentium Pro A-step",
834 835 836 837
			  [1] = "Pentium Pro",
			  [3] = "Pentium II (Klamath)",
			  [4] = "Pentium II (Deschutes)",
			  [5] = "Pentium II (Deschutes)",
L
Linus Torvalds 已提交
838
			  [6] = "Mobile Pentium II",
839 840
			  [7] = "Pentium III (Katmai)",
			  [8] = "Pentium III (Coppermine)",
L
Linus Torvalds 已提交
841 842 843 844
			  [10] = "Pentium III (Cascades)",
			  [11] = "Pentium III (Tualatin)",
		  }
		},
845
		{ .family = 15, .model_names =
L
Linus Torvalds 已提交
846 847 848 849 850 851 852 853 854
		  {
			  [0] = "Pentium 4 (Unknown)",
			  [1] = "Pentium 4 (Willamette)",
			  [2] = "Pentium 4 (Northwood)",
			  [4] = "Pentium 4 (Foster)",
			  [5] = "Pentium 4 (Foster)",
		  }
		},
	},
855
	.legacy_cache_size = intel_size_cache,
856
#endif
857
	.c_detect_tlb	= intel_detect_tlb,
858
	.c_early_init   = early_init_intel,
L
Linus Torvalds 已提交
859
	.c_init		= init_intel,
860
	.c_bsp_resume	= intel_bsp_resume,
Y
Yinghai Lu 已提交
861
	.c_x86_vendor	= X86_VENDOR_INTEL,
L
Linus Torvalds 已提交
862 863
};

Y
Yinghai Lu 已提交
864
cpu_dev_register(intel_cpu_dev);
L
Linus Torvalds 已提交
865