intel.c 29.1 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 * Intel CPU Microcode Update Driver for Linux
L
Linus Torvalds 已提交
3
 *
4 5
 * Copyright (C) 2000-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
 *		 2006 Shaohua Li <shaohua.li@intel.com>
L
Linus Torvalds 已提交
6
 *
7 8 9 10 11
 * Intel CPU microcode early update for Linux
 *
 * Copyright (C) 2012 Fenghua Yu <fenghua.yu@intel.com>
 *		      H Peter Anvin" <hpa@zytor.com>
 *
12 13 14 15
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
L
Linus Torvalds 已提交
16
 */
17

18 19 20 21 22 23
/*
 * This needs to be before all headers so that pr_debug in printk.h doesn't turn
 * printk calls into no_printk().
 *
 *#define DEBUG
 */
24
#define pr_fmt(fmt) "microcode: " fmt
25

26
#include <linux/earlycpio.h>
I
Ingo Molnar 已提交
27 28
#include <linux/firmware.h>
#include <linux/uaccess.h>
29 30
#include <linux/vmalloc.h>
#include <linux/initrd.h>
I
Ingo Molnar 已提交
31
#include <linux/kernel.h>
32 33 34
#include <linux/slab.h>
#include <linux/cpu.h>
#include <linux/mm.h>
L
Linus Torvalds 已提交
35

36
#include <asm/microcode_intel.h>
I
Ingo Molnar 已提交
37
#include <asm/processor.h>
38 39
#include <asm/tlbflush.h>
#include <asm/setup.h>
I
Ingo Molnar 已提交
40
#include <asm/msr.h>
L
Linus Torvalds 已提交
41

42
/*
43 44 45 46 47 48 49
 * Temporary microcode blobs pointers storage. We note here during early load
 * the pointers to microcode blobs we've got from whatever storage (detached
 * initrd, builtin). Later on, we put those into final storage
 * mc_saved_data.mc_saved.
 *
 * Important: those are offsets from the beginning of initrd or absolute
 * addresses within the kernel image when built-in.
50 51 52
 */
static unsigned long mc_tmp_ptrs[MAX_UCODE_COUNT];

53
static struct mc_saved_data {
54
	unsigned int num_saved;
55 56 57
	struct microcode_intel **mc_saved;
} mc_saved_data;

58 59 60 61 62 63
/* Microcode blobs within the initrd. 0 if builtin. */
static struct ucode_blobs {
	unsigned long start;
	bool valid;
} blobs;

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
static inline bool cpu_signatures_match(unsigned int s1, unsigned int p1,
					unsigned int s2, unsigned int p2)
{
	if (s1 != s2)
		return false;

	/* Processor flags are either both 0 ... */
	if (!p1 && !p2)
		return true;

	/* ... or they intersect. */
	return p1 & p2;
}

/*
 * Returns 1 if update has been found, 0 otherwise.
 */
static int find_matching_signature(void *mc, unsigned int csig, int cpf)
{
	struct microcode_header_intel *mc_hdr = mc;
	struct extended_sigtable *ext_hdr;
	struct extended_signature *ext_sig;
	int i;

	if (cpu_signatures_match(csig, cpf, mc_hdr->sig, mc_hdr->pf))
		return 1;

	/* Look for ext. headers: */
	if (get_totalsize(mc_hdr) <= get_datasize(mc_hdr) + MC_HEADER_SIZE)
		return 0;

	ext_hdr = mc + get_datasize(mc_hdr) + MC_HEADER_SIZE;
	ext_sig = (void *)ext_hdr + EXT_HEADER_SIZE;

	for (i = 0; i < ext_hdr->count; i++) {
		if (cpu_signatures_match(csig, cpf, ext_sig->sig, ext_sig->pf))
			return 1;
		ext_sig++;
	}
	return 0;
}

/*
 * Returns 1 if update has been found, 0 otherwise.
 */
static int has_newer_microcode(void *mc, unsigned int csig, int cpf, int new_rev)
{
	struct microcode_header_intel *mc_hdr = mc;

	if (mc_hdr->rev <= new_rev)
		return 0;

	return find_matching_signature(mc, csig, cpf);
}

119
/* Go through saved patches and find the one suitable for the current CPU. */
120
static enum ucode_state
121
find_microcode_patch(struct microcode_intel **saved,
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
		     unsigned int num_saved, struct ucode_cpu_info *uci)
{
	struct microcode_intel *ucode_ptr, *new_mc = NULL;
	struct microcode_header_intel *mc_hdr;
	int new_rev, ret, i;

	new_rev = uci->cpu_sig.rev;

	for (i = 0; i < num_saved; i++) {
		ucode_ptr = saved[i];
		mc_hdr	  = (struct microcode_header_intel *)ucode_ptr;

		ret = has_newer_microcode(ucode_ptr,
					  uci->cpu_sig.sig,
					  uci->cpu_sig.pf,
					  new_rev);
		if (!ret)
			continue;

		new_rev = mc_hdr->rev;
		new_mc  = ucode_ptr;
	}

	if (!new_mc)
		return UCODE_NFOUND;

	uci->mc = (struct microcode_intel *)new_mc;
	return UCODE_OK;
}

static inline void
153 154
copy_ptrs(struct microcode_intel **mc_saved, unsigned long *mc_ptrs,
	  unsigned long off, int num_saved)
155 156 157 158
{
	int i;

	for (i = 0; i < num_saved; i++)
159
		mc_saved[i] = (struct microcode_intel *)(mc_ptrs[i] + off);
160 161 162 163
}

#ifdef CONFIG_X86_32
static void
164
microcode_phys(struct microcode_intel **mc_saved_tmp, struct mc_saved_data *mcs)
165 166 167 168
{
	int i;
	struct microcode_intel ***mc_saved;

169 170
	mc_saved = (struct microcode_intel ***)__pa_nodebug(&mcs->mc_saved);

171
	for (i = 0; i < mcs->num_saved; i++) {
172 173
		struct microcode_intel *p;

174
		p = *(struct microcode_intel **)__pa_nodebug(mcs->mc_saved + i);
175 176 177 178 179 180
		mc_saved_tmp[i] = (struct microcode_intel *)__pa_nodebug(p);
	}
}
#endif

static enum ucode_state
181 182
load_microcode(struct mc_saved_data *mcs, unsigned long *mc_ptrs,
	       unsigned long offset, struct ucode_cpu_info *uci)
183 184
{
	struct microcode_intel *mc_saved_tmp[MAX_UCODE_COUNT];
185
	unsigned int count = mcs->num_saved;
186

187
	if (!mcs->mc_saved) {
188
		copy_ptrs(mc_saved_tmp, mc_ptrs, offset, count);
189

190
		return find_microcode_patch(mc_saved_tmp, count, uci);
191 192
	} else {
#ifdef CONFIG_X86_32
193
		microcode_phys(mc_saved_tmp, mcs);
194
		return find_microcode_patch(mc_saved_tmp, count, uci);
195
#else
196
		return find_microcode_patch(mcs->mc_saved, count, uci);
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
#endif
	}
}

/*
 * Given CPU signature and a microcode patch, this function finds if the
 * microcode patch has matching family and model with the CPU.
 */
static enum ucode_state
matching_model_microcode(struct microcode_header_intel *mc_header,
			unsigned long sig)
{
	unsigned int fam, model;
	unsigned int fam_ucode, model_ucode;
	struct extended_sigtable *ext_header;
	unsigned long total_size = get_totalsize(mc_header);
	unsigned long data_size = get_datasize(mc_header);
	int ext_sigcount, i;
	struct extended_signature *ext_sig;

217
	fam   = x86_family(sig);
218 219
	model = x86_model(sig);

220
	fam_ucode   = x86_family(mc_header->sig);
221 222 223 224 225 226 227 228 229 230 231 232 233 234
	model_ucode = x86_model(mc_header->sig);

	if (fam == fam_ucode && model == model_ucode)
		return UCODE_OK;

	/* Look for ext. headers: */
	if (total_size <= data_size + MC_HEADER_SIZE)
		return UCODE_NFOUND;

	ext_header   = (void *) mc_header + data_size + MC_HEADER_SIZE;
	ext_sig      = (void *)ext_header + EXT_HEADER_SIZE;
	ext_sigcount = ext_header->count;

	for (i = 0; i < ext_sigcount; i++) {
235
		fam_ucode   = x86_family(ext_sig->sig);
236 237 238 239 240 241 242 243 244 245 246
		model_ucode = x86_model(ext_sig->sig);

		if (fam == fam_ucode && model == model_ucode)
			return UCODE_OK;

		ext_sig++;
	}
	return UCODE_NFOUND;
}

static int
247
save_microcode(struct mc_saved_data *mcs,
248
	       struct microcode_intel **mc_saved_src,
249
	       unsigned int num_saved)
250 251 252 253 254
{
	int i, j;
	struct microcode_intel **saved_ptr;
	int ret;

255
	if (!num_saved)
256 257 258 259 260
		return -EINVAL;

	/*
	 * Copy new microcode data.
	 */
261
	saved_ptr = kcalloc(num_saved, sizeof(struct microcode_intel *), GFP_KERNEL);
262 263 264
	if (!saved_ptr)
		return -ENOMEM;

265
	for (i = 0; i < num_saved; i++) {
266 267 268 269 270 271 272 273 274 275 276 277 278
		struct microcode_header_intel *mc_hdr;
		struct microcode_intel *mc;
		unsigned long size;

		if (!mc_saved_src[i]) {
			ret = -EINVAL;
			goto err;
		}

		mc     = mc_saved_src[i];
		mc_hdr = &mc->hdr;
		size   = get_totalsize(mc_hdr);

279
		saved_ptr[i] = kmemdup(mc, size, GFP_KERNEL);
280 281 282 283 284 285 286 287 288
		if (!saved_ptr[i]) {
			ret = -ENOMEM;
			goto err;
		}
	}

	/*
	 * Point to newly saved microcode.
	 */
289 290
	mcs->mc_saved  = saved_ptr;
	mcs->num_saved = num_saved;
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348

	return 0;

err:
	for (j = 0; j <= i; j++)
		kfree(saved_ptr[j]);
	kfree(saved_ptr);

	return ret;
}

/*
 * A microcode patch in ucode_ptr is saved into mc_saved
 * - if it has matching signature and newer revision compared to an existing
 *   patch mc_saved.
 * - or if it is a newly discovered microcode patch.
 *
 * The microcode patch should have matching model with CPU.
 *
 * Returns: The updated number @num_saved of saved microcode patches.
 */
static unsigned int _save_mc(struct microcode_intel **mc_saved,
			     u8 *ucode_ptr, unsigned int num_saved)
{
	struct microcode_header_intel *mc_hdr, *mc_saved_hdr;
	unsigned int sig, pf;
	int found = 0, i;

	mc_hdr = (struct microcode_header_intel *)ucode_ptr;

	for (i = 0; i < num_saved; i++) {
		mc_saved_hdr = (struct microcode_header_intel *)mc_saved[i];
		sig	     = mc_saved_hdr->sig;
		pf	     = mc_saved_hdr->pf;

		if (!find_matching_signature(ucode_ptr, sig, pf))
			continue;

		found = 1;

		if (mc_hdr->rev <= mc_saved_hdr->rev)
			continue;

		/*
		 * Found an older ucode saved earlier. Replace it with
		 * this newer one.
		 */
		mc_saved[i] = (struct microcode_intel *)ucode_ptr;
		break;
	}

	/* Newly detected microcode, save it to memory. */
	if (i >= num_saved && !found)
		mc_saved[num_saved++] = (struct microcode_intel *)ucode_ptr;

	return num_saved;
}

349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
static int microcode_sanity_check(void *mc, int print_err)
{
	unsigned long total_size, data_size, ext_table_size;
	struct microcode_header_intel *mc_header = mc;
	struct extended_sigtable *ext_header = NULL;
	u32 sum, orig_sum, ext_sigcount = 0, i;
	struct extended_signature *ext_sig;

	total_size = get_totalsize(mc_header);
	data_size = get_datasize(mc_header);

	if (data_size + MC_HEADER_SIZE > total_size) {
		if (print_err)
			pr_err("Error: bad microcode data file size.\n");
		return -EINVAL;
	}

	if (mc_header->ldrver != 1 || mc_header->hdrver != 1) {
		if (print_err)
			pr_err("Error: invalid/unknown microcode update format.\n");
		return -EINVAL;
	}

	ext_table_size = total_size - (MC_HEADER_SIZE + data_size);
	if (ext_table_size) {
		u32 ext_table_sum = 0;
		u32 *ext_tablep;

		if ((ext_table_size < EXT_HEADER_SIZE)
		 || ((ext_table_size - EXT_HEADER_SIZE) % EXT_SIGNATURE_SIZE)) {
			if (print_err)
				pr_err("Error: truncated extended signature table.\n");
			return -EINVAL;
		}

		ext_header = mc + MC_HEADER_SIZE + data_size;
		if (ext_table_size != exttable_size(ext_header)) {
			if (print_err)
				pr_err("Error: extended signature table size mismatch.\n");
			return -EFAULT;
		}

		ext_sigcount = ext_header->count;

		/*
		 * Check extended table checksum: the sum of all dwords that
		 * comprise a valid table must be 0.
		 */
		ext_tablep = (u32 *)ext_header;

		i = ext_table_size / sizeof(u32);
		while (i--)
			ext_table_sum += ext_tablep[i];

		if (ext_table_sum) {
			if (print_err)
				pr_warn("Bad extended signature table checksum, aborting.\n");
			return -EINVAL;
		}
	}

	/*
	 * Calculate the checksum of update data and header. The checksum of
	 * valid update data and header including the extended signature table
	 * must be 0.
	 */
	orig_sum = 0;
	i = (MC_HEADER_SIZE + data_size) / sizeof(u32);
	while (i--)
		orig_sum += ((u32 *)mc)[i];

	if (orig_sum) {
		if (print_err)
			pr_err("Bad microcode data checksum, aborting.\n");
		return -EINVAL;
	}

	if (!ext_table_size)
		return 0;

	/*
	 * Check extended signature checksum: 0 => valid.
	 */
	for (i = 0; i < ext_sigcount; i++) {
		ext_sig = (void *)ext_header + EXT_HEADER_SIZE +
			  EXT_SIGNATURE_SIZE * i;

		sum = (mc_header->sig + mc_header->pf + mc_header->cksum) -
		      (ext_sig->sig + ext_sig->pf + ext_sig->cksum);
		if (sum) {
			if (print_err)
				pr_err("Bad extended signature checksum, aborting.\n");
			return -EINVAL;
		}
	}
	return 0;
}

447 448 449 450 451
/*
 * Get microcode matching with BSP's model. Only CPUs with the same model as
 * BSP can stay in the platform.
 */
static enum ucode_state __init
452 453
get_matching_model_microcode(unsigned long start, void *data, size_t size,
			     struct mc_saved_data *mcs, unsigned long *mc_ptrs,
454 455 456
			     struct ucode_cpu_info *uci)
{
	struct microcode_intel *mc_saved_tmp[MAX_UCODE_COUNT];
457
	struct microcode_header_intel *mc_header;
458
	unsigned int num_saved = mcs->num_saved;
459 460 461 462
	enum ucode_state state = UCODE_OK;
	unsigned int leftover = size;
	u8 *ucode_ptr = data;
	unsigned int mc_size;
463 464
	int i;

465
	while (leftover && num_saved < ARRAY_SIZE(mc_saved_tmp)) {
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483

		if (leftover < sizeof(mc_header))
			break;

		mc_header = (struct microcode_header_intel *)ucode_ptr;

		mc_size = get_totalsize(mc_header);
		if (!mc_size || mc_size > leftover ||
			microcode_sanity_check(ucode_ptr, 0) < 0)
			break;

		leftover -= mc_size;

		/*
		 * Since APs with same family and model as the BSP may boot in
		 * the platform, we need to find and save microcode patches
		 * with the same family and model as the BSP.
		 */
484
		if (matching_model_microcode(mc_header, uci->cpu_sig.sig) != UCODE_OK) {
485 486 487 488
			ucode_ptr += mc_size;
			continue;
		}

489
		num_saved = _save_mc(mc_saved_tmp, ucode_ptr, num_saved);
490 491 492 493 494 495

		ucode_ptr += mc_size;
	}

	if (leftover) {
		state = UCODE_ERROR;
496
		return state;
497 498
	}

499
	if (!num_saved) {
500
		state = UCODE_NFOUND;
501
		return state;
502 503
	}

504
	for (i = 0; i < num_saved; i++)
505
		mc_ptrs[i] = (unsigned long)mc_saved_tmp[i] - start;
506

507
	mcs->num_saved = num_saved;
508

509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
	return state;
}

static int collect_cpu_info_early(struct ucode_cpu_info *uci)
{
	unsigned int val[2];
	unsigned int family, model;
	struct cpu_signature csig;
	unsigned int eax, ebx, ecx, edx;

	csig.sig = 0;
	csig.pf = 0;
	csig.rev = 0;

	memset(uci, 0, sizeof(*uci));

	eax = 0x00000001;
	ecx = 0;
	native_cpuid(&eax, &ebx, &ecx, &edx);
	csig.sig = eax;

530
	family = x86_family(csig.sig);
531 532 533 534 535 536 537
	model  = x86_model(csig.sig);

	if ((model >= 5) || (family > 6)) {
		/* get processor flags from MSR 0x17 */
		native_rdmsr(MSR_IA32_PLATFORM_ID, val[0], val[1]);
		csig.pf = 1 << ((val[1] >> 18) & 7);
	}
538
	native_wrmsrl(MSR_IA32_UCODE_REV, 0);
539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555

	/* As documented in the SDM: Do a CPUID 1 here */
	sync_core();

	/* get the current revision from MSR 0x8B */
	native_rdmsr(MSR_IA32_UCODE_REV, val[0], val[1]);

	csig.rev = val[1];

	uci->cpu_sig = csig;
	uci->valid = 1;

	return 0;
}

static void show_saved_mc(void)
{
556
#ifdef DEBUG
557 558 559 560
	int i, j;
	unsigned int sig, pf, rev, total_size, data_size, date;
	struct ucode_cpu_info uci;

561
	if (!mc_saved_data.num_saved) {
562 563 564
		pr_debug("no microcode data saved.\n");
		return;
	}
565
	pr_debug("Total microcode saved: %d\n", mc_saved_data.num_saved);
566 567 568 569 570 571 572 573

	collect_cpu_info_early(&uci);

	sig = uci.cpu_sig.sig;
	pf = uci.cpu_sig.pf;
	rev = uci.cpu_sig.rev;
	pr_debug("CPU: sig=0x%x, pf=0x%x, rev=0x%x\n", sig, pf, rev);

574
	for (i = 0; i < mc_saved_data.num_saved; i++) {
575 576 577 578 579 580 581 582 583 584 585 586 587 588
		struct microcode_header_intel *mc_saved_header;
		struct extended_sigtable *ext_header;
		int ext_sigcount;
		struct extended_signature *ext_sig;

		mc_saved_header = (struct microcode_header_intel *)
				  mc_saved_data.mc_saved[i];
		sig = mc_saved_header->sig;
		pf = mc_saved_header->pf;
		rev = mc_saved_header->rev;
		total_size = get_totalsize(mc_saved_header);
		data_size = get_datasize(mc_saved_header);
		date = mc_saved_header->date;

M
Masanari Iida 已提交
589
		pr_debug("mc_saved[%d]: sig=0x%x, pf=0x%x, rev=0x%x, total size=0x%x, date = %04x-%02x-%02x\n",
590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614
			 i, sig, pf, rev, total_size,
			 date & 0xffff,
			 date >> 24,
			 (date >> 16) & 0xff);

		/* Look for ext. headers: */
		if (total_size <= data_size + MC_HEADER_SIZE)
			continue;

		ext_header = (void *) mc_saved_header + data_size + MC_HEADER_SIZE;
		ext_sigcount = ext_header->count;
		ext_sig = (void *)ext_header + EXT_HEADER_SIZE;

		for (j = 0; j < ext_sigcount; j++) {
			sig = ext_sig->sig;
			pf = ext_sig->pf;

			pr_debug("\tExtended[%d]: sig=0x%x, pf=0x%x\n",
				 j, sig, pf);

			ext_sig++;
		}

	}
#endif
615
}
616 617 618 619 620 621 622 623

/*
 * Save this mc into mc_saved_data. So it will be loaded early when a CPU is
 * hot added or resumes.
 *
 * Please make sure this mc should be a valid microcode patch before calling
 * this function.
 */
624
static void save_mc_for_early(u8 *mc)
625
{
626
#ifdef CONFIG_HOTPLUG_CPU
627
	/* Synchronization during CPU hotplug. */
628 629
	static DEFINE_MUTEX(x86_cpu_microcode_mutex);

630 631
	struct microcode_intel *mc_saved_tmp[MAX_UCODE_COUNT];
	unsigned int mc_saved_count_init;
632
	unsigned int num_saved;
633
	struct microcode_intel **mc_saved;
634
	int ret, i;
635 636 637

	mutex_lock(&x86_cpu_microcode_mutex);

638 639
	mc_saved_count_init = mc_saved_data.num_saved;
	num_saved = mc_saved_data.num_saved;
640 641
	mc_saved = mc_saved_data.mc_saved;

642
	if (mc_saved && num_saved)
643
		memcpy(mc_saved_tmp, mc_saved,
644
		       num_saved * sizeof(struct microcode_intel *));
645 646 647 648
	/*
	 * Save the microcode patch mc in mc_save_tmp structure if it's a newer
	 * version.
	 */
649
	num_saved = _save_mc(mc_saved_tmp, mc, num_saved);
650 651 652 653

	/*
	 * Save the mc_save_tmp in global mc_saved_data.
	 */
654
	ret = save_microcode(&mc_saved_data, mc_saved_tmp, num_saved);
655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
	if (ret) {
		pr_err("Cannot save microcode patch.\n");
		goto out;
	}

	show_saved_mc();

	/*
	 * Free old saved microcode data.
	 */
	if (mc_saved) {
		for (i = 0; i < mc_saved_count_init; i++)
			kfree(mc_saved[i]);
		kfree(mc_saved);
	}

out:
	mutex_unlock(&x86_cpu_microcode_mutex);
#endif
674
}
675 676 677 678 679 680 681 682 683

static bool __init load_builtin_intel_microcode(struct cpio_data *cp)
{
#ifdef CONFIG_X86_64
	unsigned int eax = 0x00000001, ebx, ecx = 0, edx;
	char name[30];

	native_cpuid(&eax, &ebx, &ecx, &edx);

684 685
	sprintf(name, "intel-ucode/%02x-%02x-%02x",
		      x86_family(eax), x86_model(eax), x86_stepping(eax));
686 687 688 689 690 691 692 693 694 695 696 697 698

	return get_builtin_firmware(cp, name);
#else
	return false;
#endif
}

/*
 * Print ucode update info.
 */
static void
print_ucode_info(struct ucode_cpu_info *uci, unsigned int date)
{
699 700 701 702 703
	pr_info_once("microcode updated early to revision 0x%x, date = %04x-%02x-%02x\n",
		     uci->cpu_sig.rev,
		     date & 0xffff,
		     date >> 24,
		     (date >> 16) & 0xff);
704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731
}

#ifdef CONFIG_X86_32

static int delay_ucode_info;
static int current_mc_date;

/*
 * Print early updated ucode info after printk works. This is delayed info dump.
 */
void show_ucode_info_early(void)
{
	struct ucode_cpu_info uci;

	if (delay_ucode_info) {
		collect_cpu_info_early(&uci);
		print_ucode_info(&uci, current_mc_date);
		delay_ucode_info = 0;
	}
}

/*
 * At this point, we can not call printk() yet. Keep microcode patch number in
 * mc_saved_data.mc_saved and delay printing microcode info in
 * show_ucode_info_early() until printk() works.
 */
static void print_ucode(struct ucode_cpu_info *uci)
{
732
	struct microcode_intel *mc;
733 734 735
	int *delay_ucode_info_p;
	int *current_mc_date_p;

736 737
	mc = uci->mc;
	if (!mc)
738 739 740 741 742 743
		return;

	delay_ucode_info_p = (int *)__pa_nodebug(&delay_ucode_info);
	current_mc_date_p = (int *)__pa_nodebug(&current_mc_date);

	*delay_ucode_info_p = 1;
744
	*current_mc_date_p = mc->hdr.date;
745 746 747 748 749 750 751 752 753 754 755 756 757 758
}
#else

/*
 * Flush global tlb. We only do this in x86_64 where paging has been enabled
 * already and PGE should be enabled as well.
 */
static inline void flush_tlb_early(void)
{
	__native_flush_tlb_global_irq_disabled();
}

static inline void print_ucode(struct ucode_cpu_info *uci)
{
759
	struct microcode_intel *mc;
760

761 762
	mc = uci->mc;
	if (!mc)
763 764
		return;

765
	print_ucode_info(uci, mc->hdr.date);
766 767 768 769 770
}
#endif

static int apply_microcode_early(struct ucode_cpu_info *uci, bool early)
{
771
	struct microcode_intel *mc;
772 773
	unsigned int val[2];

774 775
	mc = uci->mc;
	if (!mc)
776 777 778
		return 0;

	/* write microcode via MSR 0x79 */
779 780
	native_wrmsrl(MSR_IA32_UCODE_WRITE, (unsigned long)mc->bits);
	native_wrmsrl(MSR_IA32_UCODE_REV, 0);
781 782 783 784 785 786

	/* As documented in the SDM: Do a CPUID 1 here */
	sync_core();

	/* get the current revision from MSR 0x8B */
	native_rdmsr(MSR_IA32_UCODE_REV, val[0], val[1]);
787
	if (val[1] != mc->hdr.rev)
788 789 790 791 792 793 794 795 796 797 798
		return -1;

#ifdef CONFIG_X86_64
	/* Flush global tlb. This is precaution. */
	flush_tlb_early();
#endif
	uci->cpu_sig.rev = val[1];

	if (early)
		print_ucode(uci);
	else
799
		print_ucode_info(uci, mc->hdr.date);
800 801 802 803 804 805

	return 0;
}

/*
 * This function converts microcode patch offsets previously stored in
806
 * mc_tmp_ptrs to pointers and stores the pointers in mc_saved_data.
807 808 809 810
 */
int __init save_microcode_in_initrd_intel(void)
{
	struct microcode_intel *mc_saved[MAX_UCODE_COUNT];
811 812 813
	unsigned int count = mc_saved_data.num_saved;
	unsigned long offset = 0;
	int ret;
814

815
	if (!count)
816
		return 0;
817

818 819 820 821 822 823 824 825
	/*
	 * We have found a valid initrd but it might've been relocated in the
	 * meantime so get its updated address.
	 */
	if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && blobs.valid)
		offset = initrd_start;

	copy_ptrs(mc_saved, mc_tmp_ptrs, offset, count);
826

827 828 829
	ret = save_microcode(&mc_saved_data, mc_saved, count);
	if (ret)
		pr_err("Cannot save microcode patches from initrd.\n");
830 831
	else
		show_saved_mc();
832 833 834 835

	return ret;
}

836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869
static __init enum ucode_state
__scan_microcode_initrd(struct cpio_data *cd, struct ucode_blobs *blbp)
{
#ifdef CONFIG_BLK_DEV_INITRD
	static __initdata char ucode_name[] = "kernel/x86/microcode/GenuineIntel.bin";
	char *p = IS_ENABLED(CONFIG_X86_32) ? (char *)__pa_nodebug(ucode_name)
						    : ucode_name;
# ifdef CONFIG_X86_32
	unsigned long start = 0, size;
	struct boot_params *params;

	params = (struct boot_params *)__pa_nodebug(&boot_params);
	size   = params->hdr.ramdisk_size;

	/*
	 * Set start only if we have an initrd image. We cannot use initrd_start
	 * because it is not set that early yet.
	 */
	start = (size ? params->hdr.ramdisk_image : 0);

# else /* CONFIG_X86_64 */
	unsigned long start = 0, size;

	size  = (u64)boot_params.ext_ramdisk_size << 32;
	size |= boot_params.hdr.ramdisk_size;

	if (size) {
		start  = (u64)boot_params.ext_ramdisk_image << 32;
		start |= boot_params.hdr.ramdisk_image;

		start += PAGE_OFFSET;
	}
# endif

870
	*cd = find_cpio_data(p, (void *)start, size, NULL);
871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906
	if (cd->data) {
		blbp->start = start;
		blbp->valid = true;

		return UCODE_OK;
	} else
#endif /* CONFIG_BLK_DEV_INITRD */
		return UCODE_ERROR;
}

static __init enum ucode_state
scan_microcode(struct mc_saved_data *mcs, unsigned long *mc_ptrs,
	       struct ucode_cpu_info *uci, struct ucode_blobs *blbp)
{
	struct cpio_data cd = { NULL, 0, "" };
	enum ucode_state ret;

	/* try built-in microcode first */
	if (load_builtin_intel_microcode(&cd))
		/*
		 * Invalidate blobs as we might've gotten an initrd too,
		 * supplied by the boot loader, by mistake or simply forgotten
		 * there. That's fine, we ignore it since we've found builtin
		 * microcode already.
		 */
		blbp->valid = false;
	else {
		ret = __scan_microcode_initrd(&cd, blbp);
		if (ret != UCODE_OK)
			return ret;
	}

	return get_matching_model_microcode(blbp->start, cd.data, cd.size,
					    mcs, mc_ptrs, uci);
}

907
static void __init
908
_load_ucode_intel_bsp(struct mc_saved_data *mcs, unsigned long *mc_ptrs,
909
		      struct ucode_blobs *blbp)
910 911 912 913 914 915
{
	struct ucode_cpu_info uci;
	enum ucode_state ret;

	collect_cpu_info_early(&uci);

916
	ret = scan_microcode(mcs, mc_ptrs, &uci, blbp);
917 918 919
	if (ret != UCODE_OK)
		return;

920
	ret = load_microcode(mcs, mc_ptrs, blbp->start, &uci);
921 922 923 924 925 926 927 928
	if (ret != UCODE_OK)
		return;

	apply_microcode_early(&uci, true);
}

void __init load_ucode_intel_bsp(void)
{
929 930 931
	struct ucode_blobs *blobs_p;
	struct mc_saved_data *mcs;
	unsigned long *ptrs;
932

933 934 935 936
#ifdef CONFIG_X86_32
	mcs	= (struct mc_saved_data *)__pa_nodebug(&mc_saved_data);
	ptrs	= (unsigned long *)__pa_nodebug(&mc_tmp_ptrs);
	blobs_p	= (struct ucode_blobs *)__pa_nodebug(&blobs);
937
#else
938 939 940
	mcs	= &mc_saved_data;
	ptrs	= mc_tmp_ptrs;
	blobs_p = &blobs;
941
#endif
942 943

	_load_ucode_intel_bsp(mcs, ptrs, blobs_p);
944 945 946 947
}

void load_ucode_intel_ap(void)
{
948
	struct ucode_blobs *blobs_p;
949
	unsigned long *ptrs, start = 0;
950
	struct mc_saved_data *mcs;
951
	struct ucode_cpu_info uci;
952 953
	enum ucode_state ret;

954 955 956 957
#ifdef CONFIG_X86_32
	mcs	= (struct mc_saved_data *)__pa_nodebug(&mc_saved_data);
	ptrs	= (unsigned long *)__pa_nodebug(mc_tmp_ptrs);
	blobs_p	= (struct ucode_blobs *)__pa_nodebug(&blobs);
958
#else
959 960 961
	mcs	= &mc_saved_data;
	ptrs	= mc_tmp_ptrs;
	blobs_p = &blobs;
962 963 964 965 966 967
#endif

	/*
	 * If there is no valid ucode previously saved in memory, no need to
	 * update ucode on this AP.
	 */
968
	if (!mcs->num_saved)
969 970
		return;

971 972 973 974 975 976 977 978 979 980
	if (blobs_p->valid) {
		start = blobs_p->start;

		/*
		 * Pay attention to CONFIG_RANDOMIZE_MEMORY=y as it shuffles
		 * physmem mapping too and there we have the initrd.
		 */
		start += PAGE_OFFSET - __PAGE_OFFSET_BASE;
	}

981
	collect_cpu_info_early(&uci);
982
	ret = load_microcode(mcs, ptrs, start, &uci);
983 984 985 986 987 988 989 990 991 992 993
	if (ret != UCODE_OK)
		return;

	apply_microcode_early(&uci, true);
}

void reload_ucode_intel(void)
{
	struct ucode_cpu_info uci;
	enum ucode_state ret;

994
	if (!mc_saved_data.num_saved)
995 996 997 998
		return;

	collect_cpu_info_early(&uci);

999
	ret = find_microcode_patch(mc_saved_data.mc_saved,
1000
				   mc_saved_data.num_saved, &uci);
1001 1002 1003 1004 1005 1006
	if (ret != UCODE_OK)
		return;

	apply_microcode_early(&uci, false);
}

1007
static int collect_cpu_info(int cpu_num, struct cpu_signature *csig)
L
Linus Torvalds 已提交
1008
{
1009
	static struct cpu_signature prev;
1010
	struct cpuinfo_x86 *c = &cpu_data(cpu_num);
L
Linus Torvalds 已提交
1011 1012
	unsigned int val[2];

1013
	memset(csig, 0, sizeof(*csig));
L
Linus Torvalds 已提交
1014

1015
	csig->sig = cpuid_eax(0x00000001);
1016 1017 1018 1019

	if ((c->x86_model >= 5) || (c->x86 > 6)) {
		/* get processor flags from MSR 0x17 */
		rdmsr(MSR_IA32_PLATFORM_ID, val[0], val[1]);
1020
		csig->pf = 1 << ((val[1] >> 18) & 7);
L
Linus Torvalds 已提交
1021 1022
	}

1023
	csig->rev = c->microcode;
1024 1025 1026 1027 1028 1029 1030

	/* No extra locking on prev, races are harmless. */
	if (csig->sig != prev.sig || csig->pf != prev.pf || csig->rev != prev.rev) {
		pr_info("sig=0x%x, pf=0x%x, revision=0x%x\n",
			csig->sig, csig->pf, csig->rev);
		prev = *csig;
	}
1031 1032

	return 0;
L
Linus Torvalds 已提交
1033 1034
}

1035 1036 1037 1038
/*
 * return 0 - no update found
 * return 1 - found update
 */
1039
static int get_matching_mc(struct microcode_intel *mc, int cpu)
1040
{
1041 1042
	struct cpu_signature cpu_sig;
	unsigned int csig, cpf, crev;
1043

1044
	collect_cpu_info(cpu, &cpu_sig);
D
Dmitry Adamushko 已提交
1045

1046 1047 1048
	csig = cpu_sig.sig;
	cpf = cpu_sig.pf;
	crev = cpu_sig.rev;
1049

1050
	return has_newer_microcode(mc, csig, cpf, crev);
L
Linus Torvalds 已提交
1051 1052
}

1053
static int apply_microcode_intel(int cpu)
L
Linus Torvalds 已提交
1054
{
1055
	struct microcode_intel *mc;
I
Ingo Molnar 已提交
1056
	struct ucode_cpu_info *uci;
1057
	struct cpuinfo_x86 *c;
L
Linus Torvalds 已提交
1058
	unsigned int val[2];
1059
	static int prev_rev;
I
Ingo Molnar 已提交
1060

1061
	/* We should bind the task to the CPU */
1062
	if (WARN_ON(raw_smp_processor_id() != cpu))
1063
		return -1;
1064

1065 1066
	uci = ucode_cpu_info + cpu;
	mc = uci->mc;
1067
	if (!mc)
1068
		return 0;
L
Linus Torvalds 已提交
1069

1070 1071
	/*
	 * Microcode on this CPU could be updated earlier. Only apply the
1072
	 * microcode patch in mc when it is newer than the one on this
1073 1074
	 * CPU.
	 */
1075
	if (!get_matching_mc(mc, cpu))
1076 1077
		return 0;

L
Linus Torvalds 已提交
1078
	/* write microcode via MSR 0x79 */
1079 1080
	wrmsrl(MSR_IA32_UCODE_WRITE, (unsigned long)mc->bits);
	wrmsrl(MSR_IA32_UCODE_REV, 0);
L
Linus Torvalds 已提交
1081

1082
	/* As documented in the SDM: Do a CPUID 1 here */
1083
	sync_core();
1084

L
Linus Torvalds 已提交
1085 1086 1087
	/* get the current revision from MSR 0x8B */
	rdmsr(MSR_IA32_UCODE_REV, val[0], val[1]);

1088
	if (val[1] != mc->hdr.rev) {
1089
		pr_err("CPU%d update to revision 0x%x failed\n",
1090
		       cpu, mc->hdr.rev);
1091
		return -1;
1092
	}
1093

1094 1095 1096 1097 1098 1099 1100 1101
	if (val[1] != prev_rev) {
		pr_info("updated to revision 0x%x, date = %04x-%02x-%02x\n",
			val[1],
			mc->hdr.date & 0xffff,
			mc->hdr.date >> 24,
			(mc->hdr.date >> 16) & 0xff);
		prev_rev = val[1];
	}
I
Ingo Molnar 已提交
1102

1103 1104
	c = &cpu_data(cpu);

1105
	uci->cpu_sig.rev = val[1];
1106
	c->microcode = val[1];
1107 1108

	return 0;
L
Linus Torvalds 已提交
1109 1110
}

1111 1112
static enum ucode_state generic_load_microcode(int cpu, void *data, size_t size,
				int (*get_ucode_data)(void *, const void *, size_t))
1113
{
D
Dmitry Adamushko 已提交
1114
	struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
1115
	u8 *ucode_ptr = data, *new_mc = NULL, *mc = NULL;
D
Dmitry Adamushko 已提交
1116 1117
	int new_rev = uci->cpu_sig.rev;
	unsigned int leftover = size;
1118
	unsigned int curr_mc_size = 0;
1119
	unsigned int csig, cpf;
1120

D
Dmitry Adamushko 已提交
1121 1122 1123
	while (leftover) {
		struct microcode_header_intel mc_header;
		unsigned int mc_size;
1124

1125 1126 1127 1128 1129
		if (leftover < sizeof(mc_header)) {
			pr_err("error! Truncated header in microcode data file\n");
			break;
		}

D
Dmitry Adamushko 已提交
1130 1131
		if (get_ucode_data(&mc_header, ucode_ptr, sizeof(mc_header)))
			break;
1132

D
Dmitry Adamushko 已提交
1133 1134
		mc_size = get_totalsize(&mc_header);
		if (!mc_size || mc_size > leftover) {
1135
			pr_err("error! Bad data in microcode data file\n");
D
Dmitry Adamushko 已提交
1136 1137
			break;
		}
1138

1139 1140
		/* For performance reasons, reuse mc area when possible */
		if (!mc || mc_size > curr_mc_size) {
1141
			vfree(mc);
1142 1143 1144 1145 1146
			mc = vmalloc(mc_size);
			if (!mc)
				break;
			curr_mc_size = mc_size;
		}
D
Dmitry Adamushko 已提交
1147 1148

		if (get_ucode_data(mc, ucode_ptr, mc_size) ||
1149
		    microcode_sanity_check(mc, 1) < 0) {
D
Dmitry Adamushko 已提交
1150 1151 1152
			break;
		}

1153 1154
		csig = uci->cpu_sig.sig;
		cpf = uci->cpu_sig.pf;
1155
		if (has_newer_microcode(mc, csig, cpf, new_rev)) {
1156
			vfree(new_mc);
D
Dmitry Adamushko 已提交
1157 1158
			new_rev = mc_header.rev;
			new_mc  = mc;
1159 1160
			mc = NULL;	/* trigger new vmalloc */
		}
D
Dmitry Adamushko 已提交
1161 1162 1163

		ucode_ptr += mc_size;
		leftover  -= mc_size;
1164 1165
	}

1166
	vfree(mc);
1167

1168
	if (leftover) {
1169
		vfree(new_mc);
1170
		return UCODE_ERROR;
1171
	}
I
Ingo Molnar 已提交
1172

1173 1174
	if (!new_mc)
		return UCODE_NFOUND;
D
Dmitry Adamushko 已提交
1175

1176
	vfree(uci->mc);
I
Ingo Molnar 已提交
1177 1178
	uci->mc = (struct microcode_intel *)new_mc;

1179 1180 1181 1182 1183 1184 1185
	/*
	 * If early loading microcode is supported, save this mc into
	 * permanent memory. So it will be loaded early when a CPU is hot added
	 * or resumes.
	 */
	save_mc_for_early(new_mc);

1186 1187
	pr_debug("CPU%d found a matching microcode update with version 0x%x (current=0x%x)\n",
		 cpu, new_rev, uci->cpu_sig.rev);
1188 1189

	return UCODE_OK;
1190 1191
}

D
Dmitry Adamushko 已提交
1192 1193 1194 1195 1196
static int get_ucode_fw(void *to, const void *from, size_t n)
{
	memcpy(to, from, n);
	return 0;
}
1197

1198 1199
static enum ucode_state request_microcode_fw(int cpu, struct device *device,
					     bool refresh_fw)
1200 1201
{
	char name[30];
1202
	struct cpuinfo_x86 *c = &cpu_data(cpu);
1203
	const struct firmware *firmware;
1204
	enum ucode_state ret;
1205

P
Peter Oruba 已提交
1206
	sprintf(name, "intel-ucode/%02x-%02x-%02x",
1207
		c->x86, c->x86_model, c->x86_mask);
1208

1209
	if (request_firmware_direct(&firmware, name, device)) {
1210
		pr_debug("data file %s load failed\n", name);
1211
		return UCODE_NFOUND;
1212
	}
D
Dmitry Adamushko 已提交
1213

1214 1215
	ret = generic_load_microcode(cpu, (void *)firmware->data,
				     firmware->size, &get_ucode_fw);
D
Dmitry Adamushko 已提交
1216

1217 1218
	release_firmware(firmware);

D
Dmitry Adamushko 已提交
1219 1220 1221 1222 1223 1224 1225 1226
	return ret;
}

static int get_ucode_user(void *to, const void *from, size_t n)
{
	return copy_from_user(to, from, n);
}

1227 1228
static enum ucode_state
request_microcode_user(int cpu, const void __user *buf, size_t size)
D
Dmitry Adamushko 已提交
1229
{
1230
	return generic_load_microcode(cpu, (void *)buf, size, &get_ucode_user);
1231 1232
}

P
Peter Oruba 已提交
1233
static void microcode_fini_cpu(int cpu)
1234 1235 1236
{
	struct ucode_cpu_info *uci = ucode_cpu_info + cpu;

1237 1238
	vfree(uci->mc);
	uci->mc = NULL;
1239
}
P
Peter Oruba 已提交
1240

H
Hannes Eder 已提交
1241
static struct microcode_ops microcode_intel_ops = {
D
Dmitry Adamushko 已提交
1242 1243
	.request_microcode_user		  = request_microcode_user,
	.request_microcode_fw             = request_microcode_fw,
P
Peter Oruba 已提交
1244
	.collect_cpu_info                 = collect_cpu_info,
1245
	.apply_microcode                  = apply_microcode_intel,
P
Peter Oruba 已提交
1246 1247 1248
	.microcode_fini_cpu               = microcode_fini_cpu,
};

1249
struct microcode_ops * __init init_intel_microcode(void)
P
Peter Oruba 已提交
1250
{
1251
	struct cpuinfo_x86 *c = &boot_cpu_data;
1252 1253 1254 1255 1256 1257 1258

	if (c->x86_vendor != X86_VENDOR_INTEL || c->x86 < 6 ||
	    cpu_has(c, X86_FEATURE_IA64)) {
		pr_err("Intel CPU family 0x%x not supported\n", c->x86);
		return NULL;
	}

1259
	return &microcode_intel_ops;
P
Peter Oruba 已提交
1260
}