mce_amd.c 17.9 KB
Newer Older
1
#include <linux/module.h>
2 3
#include <linux/slab.h>

B
Borislav Petkov 已提交
4
#include "mce_amd.h"
D
Doug Thompson 已提交
5

6 7
static struct amd_decoder_ops *fam_ops;

8
static u8 xec_mask	 = 0xf;
9 10
static u8 nb_err_cpumask = 0xf;

11
static bool report_gart_errors;
12
static void (*nb_bus_decoder)(int node_id, struct mce *m);
13 14 15 16 17 18 19

void amd_report_gart_errors(bool v)
{
	report_gart_errors = v;
}
EXPORT_SYMBOL_GPL(amd_report_gart_errors);

20
void amd_register_ecc_decoder(void (*f)(int, struct mce *))
21 22 23 24 25
{
	nb_bus_decoder = f;
}
EXPORT_SYMBOL_GPL(amd_register_ecc_decoder);

26
void amd_unregister_ecc_decoder(void (*f)(int, struct mce *))
27 28 29 30 31 32 33 34 35
{
	if (nb_bus_decoder) {
		WARN_ON(nb_bus_decoder != f);

		nb_bus_decoder = NULL;
	}
}
EXPORT_SYMBOL_GPL(amd_unregister_ecc_decoder);

D
Doug Thompson 已提交
36 37 38 39
/*
 * string representation for the different MCA reported error types, see F3x48
 * or MSR0000_0411.
 */
B
Borislav Petkov 已提交
40 41

/* transaction type */
42
static const char * const tt_msgs[] = { "INSN", "DATA", "GEN", "RESV" };
D
Doug Thompson 已提交
43

B
Borislav Petkov 已提交
44
/* cache level */
45
static const char * const ll_msgs[] = { "RESV", "L1", "L2", "L3/GEN" };
D
Doug Thompson 已提交
46

B
Borislav Petkov 已提交
47
/* memory transaction type */
48
static const char * const rrrr_msgs[] = {
B
Borislav Petkov 已提交
49
       "GEN", "RD", "WR", "DRD", "DWR", "IRD", "PRF", "EV", "SNP"
D
Doug Thompson 已提交
50 51
};

B
Borislav Petkov 已提交
52
/* participating processor */
53
const char * const pp_msgs[] = { "SRC", "RES", "OBS", "GEN" };
54
EXPORT_SYMBOL_GPL(pp_msgs);
D
Doug Thompson 已提交
55

B
Borislav Petkov 已提交
56
/* request timeout */
57
static const char * const to_msgs[] = { "no timeout", "timed out" };
D
Doug Thompson 已提交
58

B
Borislav Petkov 已提交
59
/* memory or i/o */
60
static const char * const ii_msgs[] = { "MEM", "RESV", "IO", "GEN" };
D
Doug Thompson 已提交
61

62
/* internal error type */
63
static const char * const uu_msgs[] = { "RESV", "RESV", "HWA", "RESV" };
64

65
static const char * const f15h_mc1_mce_desc[] = {
66 67 68 69 70 71 72 73 74 75 76 77
	"UC during a demand linefill from L2",
	"Parity error during data load from IC",
	"Parity error for IC valid bit",
	"Main tag parity error",
	"Parity error in prediction queue",
	"PFB data/address parity error",
	"Parity error in the branch status reg",
	"PFB promotion address error",
	"Tag error during probe/victimization",
	"Parity error for IC probe tag valid bit",
	"PFB non-cacheable bit parity error",
	"PFB valid bit parity error",			/* xec = 0xd */
78
	"Microcode Patch Buffer",			/* xec = 010 */
79 80 81 82 83 84
	"uop queue",
	"insn buffer",
	"predecode buffer",
	"fetch address FIFO"
};

85
static const char * const f15h_mc2_mce_desc[] = {
86 87 88 89 90 91 92 93
	"Fill ECC error on data fills",			/* xec = 0x4 */
	"Fill parity error on insn fills",
	"Prefetcher request FIFO parity error",
	"PRQ address parity error",
	"PRQ data parity error",
	"WCC Tag ECC error",
	"WCC Data ECC error",
	"WCB Data parity error",
94
	"VB Data ECC or parity error",
95 96 97 98 99 100 101
	"L2 Tag ECC error",				/* xec = 0x10 */
	"Hard L2 Tag ECC error",
	"Multiple hits on L2 tag",
	"XAB parity error",
	"PRB address parity error"
};

102
static const char * const mc4_mce_desc[] = {
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
	"DRAM ECC error detected on the NB",
	"CRC error detected on HT link",
	"Link-defined sync error packets detected on HT link",
	"HT Master abort",
	"HT Target abort",
	"Invalid GART PTE entry during GART table walk",
	"Unsupported atomic RMW received from an IO link",
	"Watchdog timeout due to lack of progress",
	"DRAM ECC error detected on the NB",
	"SVM DMA Exclusion Vector error",
	"HT data error detected on link",
	"Protocol error (link, L3, probe filter)",
	"NB internal arrays parity error",
	"DRAM addr/ctl signals parity error",
	"IO link transmission error",
	"L3 data cache ECC error",			/* xec = 0x1c */
	"L3 cache tag error",
	"L3 LRU parity bits error",
	"ECC Error in the Probe Filter directory"
};

124
static const char * const mc5_mce_desc[] = {
125 126 127 128 129 130 131 132 133 134 135 136
	"CPU Watchdog timer expire",
	"Wakeup array dest tag",
	"AG payload array",
	"EX payload array",
	"IDRF array",
	"Retire dispatch queue",
	"Mapper checkpoint array",
	"Physical register file EX0 port",
	"Physical register file EX1 port",
	"Physical register file AG0 port",
	"Physical register file AG1 port",
	"Flag register file",
137 138
	"DE error occurred",
	"Retire status queue"
139 140
};

141
static bool f12h_mc0_mce(u16 ec, u8 xec)
142
{
143
	bool ret = false;
144

145
	if (MEM_ERROR(ec)) {
146
		u8 ll = LL(ec);
147
		ret = true;
148

149 150 151
		if (ll == LL_L2)
			pr_cont("during L1 linefill from L2.\n");
		else if (ll == LL_L1)
152
			pr_cont("Data/Tag %s error.\n", R4_MSG(ec));
153 154 155 156 157
		else
			ret = false;
	}
	return ret;
}
158

159
static bool f10h_mc0_mce(u16 ec, u8 xec)
160
{
161
	if (R4(ec) == R4_GEN && LL(ec) == LL_L1) {
162 163 164
		pr_cont("during data scrub.\n");
		return true;
	}
165
	return f12h_mc0_mce(ec, xec);
166 167
}

168
static bool k8_mc0_mce(u16 ec, u8 xec)
169 170 171 172 173
{
	if (BUS_ERROR(ec)) {
		pr_cont("during system linefill.\n");
		return true;
	}
174

175
	return f10h_mc0_mce(ec, xec);
176 177
}

178
static bool cat_mc0_mce(u16 ec, u8 xec)
179
{
180
	u8 r4	 = R4(ec);
181 182 183 184
	bool ret = true;

	if (MEM_ERROR(ec)) {

185
		if (TT(ec) != TT_DATA || LL(ec) != LL_L1)
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
			return false;

		switch (r4) {
		case R4_DRD:
		case R4_DWR:
			pr_cont("Data/Tag parity error due to %s.\n",
				(r4 == R4_DRD ? "load/hw prf" : "store"));
			break;
		case R4_EVICT:
			pr_cont("Copyback parity error on a tag miss.\n");
			break;
		case R4_SNOOP:
			pr_cont("Tag parity error during snoop.\n");
			break;
		default:
			ret = false;
		}
	} else if (BUS_ERROR(ec)) {

205
		if ((II(ec) != II_MEM && II(ec) != II_IO) || LL(ec) != LL_LG)
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
			return false;

		pr_cont("System read data error on a ");

		switch (r4) {
		case R4_RD:
			pr_cont("TLB reload.\n");
			break;
		case R4_DWR:
			pr_cont("store.\n");
			break;
		case R4_DRD:
			pr_cont("load.\n");
			break;
		default:
			ret = false;
		}
	} else {
		ret = false;
	}

	return ret;
}

230
static bool f15h_mc0_mce(u16 ec, u8 xec)
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
{
	bool ret = true;

	if (MEM_ERROR(ec)) {

		switch (xec) {
		case 0x0:
			pr_cont("Data Array access error.\n");
			break;

		case 0x1:
			pr_cont("UC error during a linefill from L2/NB.\n");
			break;

		case 0x2:
		case 0x11:
			pr_cont("STQ access error.\n");
			break;

		case 0x3:
			pr_cont("SCB access error.\n");
			break;

		case 0x10:
			pr_cont("Tag error.\n");
			break;

		case 0x12:
			pr_cont("LDQ access error.\n");
			break;

		default:
			ret = false;
		}
	} else if (BUS_ERROR(ec)) {

		if (!xec)
268
			pr_cont("System Read Data Error.\n");
269
		else
270
			pr_cont(" Internal error condition type %d.\n", xec);
271 272 273 274 275 276
	} else
		ret = false;

	return ret;
}

277
static void decode_mc0_mce(struct mce *m)
278
{
279 280
	u16 ec = EC(m->status);
	u8 xec = XEC(m->status, xec_mask);
281

282
	pr_emerg(HW_ERR "MC0 Error: ");
283 284 285

	/* TLB error signatures are the same across families */
	if (TLB_ERROR(ec)) {
286
		if (TT(ec) == TT_DATA) {
287
			pr_cont("%s TLB %s.\n", LL_MSG(ec),
288 289
				((xec == 2) ? "locked miss"
					    : (xec ? "multimatch" : "parity")));
290 291
			return;
		}
292
	} else if (fam_ops->mc0_mce(ec, xec))
293 294
		;
	else
295
		pr_emerg(HW_ERR "Corrupted MC0 MCE info?\n");
296 297
}

298
static bool k8_mc1_mce(u16 ec, u8 xec)
299
{
300
	u8 ll	 = LL(ec);
301
	bool ret = true;
302

303 304
	if (!MEM_ERROR(ec))
		return false;
305

306 307 308
	if (ll == 0x2)
		pr_cont("during a linefill from L2.\n");
	else if (ll == 0x1) {
309
		switch (R4(ec)) {
310 311 312
		case R4_IRD:
			pr_cont("Parity error during data load.\n");
			break;
313

314 315 316 317 318 319 320 321 322 323 324 325
		case R4_EVICT:
			pr_cont("Copyback Parity/Victim error.\n");
			break;

		case R4_SNOOP:
			pr_cont("Tag Snoop error.\n");
			break;

		default:
			ret = false;
			break;
		}
326
	} else
327
		ret = false;
328

329 330 331
	return ret;
}

332
static bool cat_mc1_mce(u16 ec, u8 xec)
333
{
334
	u8 r4    = R4(ec);
335
	bool ret = true;
336

337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
	if (!MEM_ERROR(ec))
		return false;

	if (TT(ec) != TT_INSTR)
		return false;

	if (r4 == R4_IRD)
		pr_cont("Data/tag array parity error for a tag hit.\n");
	else if (r4 == R4_SNOOP)
		pr_cont("Tag error during snoop/victimization.\n");
	else if (xec == 0x0)
		pr_cont("Tag parity error from victim castout.\n");
	else if (xec == 0x2)
		pr_cont("Microcode patch RAM parity error.\n");
	else
		ret = false;
353 354 355 356

	return ret;
}

357
static bool f15h_mc1_mce(u16 ec, u8 xec)
358 359 360 361 362 363 364 365
{
	bool ret = true;

	if (!MEM_ERROR(ec))
		return false;

	switch (xec) {
	case 0x0 ... 0xa:
366
		pr_cont("%s.\n", f15h_mc1_mce_desc[xec]);
367 368 369
		break;

	case 0xd:
370
		pr_cont("%s.\n", f15h_mc1_mce_desc[xec-2]);
371 372
		break;

373
	case 0x10:
374
		pr_cont("%s.\n", f15h_mc1_mce_desc[xec-4]);
375 376 377
		break;

	case 0x11 ... 0x14:
378
		pr_cont("Decoder %s parity error.\n", f15h_mc1_mce_desc[xec-4]);
379 380 381 382 383 384 385 386
		break;

	default:
		ret = false;
	}
	return ret;
}

387
static void decode_mc1_mce(struct mce *m)
388
{
389 390
	u16 ec = EC(m->status);
	u8 xec = XEC(m->status, xec_mask);
391

392
	pr_emerg(HW_ERR "MC1 Error: ");
393 394 395 396 397

	if (TLB_ERROR(ec))
		pr_cont("%s TLB %s.\n", LL_MSG(ec),
			(xec ? "multimatch" : "parity error"));
	else if (BUS_ERROR(ec)) {
398
		bool k8 = (boot_cpu_data.x86 == 0xf && (m->status & BIT_64(58)));
399 400

		pr_cont("during %s.\n", (k8 ? "system linefill" : "NB data read"));
401
	} else if (fam_ops->mc1_mce(ec, xec))
402 403
		;
	else
404
		pr_emerg(HW_ERR "Corrupted MC1 MCE info?\n");
405 406
}

407
static bool k8_mc2_mce(u16 ec, u8 xec)
408
{
409
	bool ret = true;
410 411 412 413 414 415

	if (xec == 0x1)
		pr_cont(" in the write data buffers.\n");
	else if (xec == 0x3)
		pr_cont(" in the victim data buffers.\n");
	else if (xec == 0x2 && MEM_ERROR(ec))
416
		pr_cont(": %s error in the L2 cache tags.\n", R4_MSG(ec));
417 418 419 420 421 422
	else if (xec == 0x0) {
		if (TLB_ERROR(ec))
			pr_cont(": %s error in a Page Descriptor Cache or "
				"Guest TLB.\n", TT_MSG(ec));
		else if (BUS_ERROR(ec))
			pr_cont(": %s/ECC error in data read from NB: %s.\n",
423
				R4_MSG(ec), PP_MSG(ec));
424
		else if (MEM_ERROR(ec)) {
425
			u8 r4 = R4(ec);
426

427
			if (r4 >= 0x7)
428
				pr_cont(": %s error during data copyback.\n",
429 430
					R4_MSG(ec));
			else if (r4 <= 0x1)
431
				pr_cont(": %s parity/ECC error during data "
432
					"access from L2.\n", R4_MSG(ec));
433
			else
434
				ret = false;
435
		} else
436
			ret = false;
437
	} else
438
		ret = false;
439

440
	return ret;
441 442
}

443
static bool f15h_mc2_mce(u16 ec, u8 xec)
444
{
445
	bool ret = true;
446 447 448 449 450 451 452

	if (TLB_ERROR(ec)) {
		if (xec == 0x0)
			pr_cont("Data parity TLB read error.\n");
		else if (xec == 0x1)
			pr_cont("Poison data provided for TLB fill.\n");
		else
453
			ret = false;
454 455
	} else if (BUS_ERROR(ec)) {
		if (xec > 2)
456
			ret = false;
457 458 459 460 461

		pr_cont("Error during attempted NB data read.\n");
	} else if (MEM_ERROR(ec)) {
		switch (xec) {
		case 0x4 ... 0xc:
462
			pr_cont("%s.\n", f15h_mc2_mce_desc[xec - 0x4]);
463 464 465
			break;

		case 0x10 ... 0x14:
466
			pr_cont("%s.\n", f15h_mc2_mce_desc[xec - 0x7]);
467 468 469
			break;

		default:
470
			ret = false;
471 472 473
		}
	}

474 475 476
	return ret;
}

477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517
static bool f16h_mc2_mce(u16 ec, u8 xec)
{
	u8 r4 = R4(ec);

	if (!MEM_ERROR(ec))
		return false;

	switch (xec) {
	case 0x04 ... 0x05:
		pr_cont("%cBUFF parity error.\n", (r4 == R4_RD) ? 'I' : 'O');
		break;

	case 0x09 ... 0x0b:
	case 0x0d ... 0x0f:
		pr_cont("ECC error in L2 tag (%s).\n",
			((r4 == R4_GEN)   ? "BankReq" :
			((r4 == R4_SNOOP) ? "Prb"     : "Fill")));
		break;

	case 0x10 ... 0x19:
	case 0x1b:
		pr_cont("ECC error in L2 data array (%s).\n",
			(((r4 == R4_RD) && !(xec & 0x3)) ? "Hit"  :
			((r4 == R4_GEN)   ? "Attr" :
			((r4 == R4_EVICT) ? "Vict" : "Fill"))));
		break;

	case 0x1c ... 0x1d:
	case 0x1f:
		pr_cont("Parity error in L2 attribute bits (%s).\n",
			((r4 == R4_RD)  ? "Hit"  :
			((r4 == R4_GEN) ? "Attr" : "Fill")));
		break;

	default:
		return false;
	}

	return true;
}

518 519 520 521
static void decode_mc2_mce(struct mce *m)
{
	u16 ec = EC(m->status);
	u8 xec = XEC(m->status, xec_mask);
522

523 524 525 526
	pr_emerg(HW_ERR "MC2 Error: ");

	if (!fam_ops->mc2_mce(ec, xec))
		pr_cont(HW_ERR "Corrupted MC2 MCE info?\n");
527 528
}

529
static void decode_mc3_mce(struct mce *m)
530
{
531 532
	u16 ec = EC(m->status);
	u8 xec = XEC(m->status, xec_mask);
533

534
	if (boot_cpu_data.x86 >= 0x14) {
535
		pr_emerg("You shouldn't be seeing MC3 MCE on this cpu family,"
536 537 538
			 " please report on LKML.\n");
		return;
	}
539

540
	pr_emerg(HW_ERR "MC3 Error");
541 542

	if (xec == 0x0) {
543
		u8 r4 = R4(ec);
544

545
		if (!BUS_ERROR(ec) || (r4 != R4_DRD && r4 != R4_DWR))
546
			goto wrong_mc3_mce;
547

548
		pr_cont(" during %s.\n", R4_MSG(ec));
549
	} else
550
		goto wrong_mc3_mce;
551

552 553
	return;

554 555
 wrong_mc3_mce:
	pr_emerg(HW_ERR "Corrupted MC3 MCE info?\n");
556 557
}

558
static void decode_mc4_mce(struct mce *m)
559
{
560 561 562 563 564
	struct cpuinfo_x86 *c = &boot_cpu_data;
	int node_id = amd_get_nb_id(m->extcpu);
	u16 ec = EC(m->status);
	u8 xec = XEC(m->status, 0x1f);
	u8 offset = 0;
565

566
	pr_emerg(HW_ERR "MC4 Error (node %d): ", node_id);
567

568 569
	switch (xec) {
	case 0x0 ... 0xe:
570

571 572 573 574
		/* special handling for DRAM ECCs */
		if (xec == 0x0 || xec == 0x8) {
			/* no ECCs on F11h */
			if (c->x86 == 0x11)
575
				goto wrong_mc4_mce;
576

577
			pr_cont("%s.\n", mc4_mce_desc[xec]);
578

579 580 581 582
			if (nb_bus_decoder)
				nb_bus_decoder(node_id, m);
			return;
		}
583 584 585 586 587 588 589 590
		break;

	case 0xf:
		if (TLB_ERROR(ec))
			pr_cont("GART Table Walk data error.\n");
		else if (BUS_ERROR(ec))
			pr_cont("DMA Exclusion Vector Table Walk error.\n");
		else
591
			goto wrong_mc4_mce;
592
		return;
593

594
	case 0x19:
595
		if (boot_cpu_data.x86 == 0x15 || boot_cpu_data.x86 == 0x16)
596 597
			pr_cont("Compute Unit Data Error.\n");
		else
598
			goto wrong_mc4_mce;
599
		return;
600

601
	case 0x1c ... 0x1f:
602
		offset = 13;
603 604 605
		break;

	default:
606
		goto wrong_mc4_mce;
607
	}
608

609
	pr_cont("%s.\n", mc4_mce_desc[xec - offset]);
610 611
	return;

612 613
 wrong_mc4_mce:
	pr_emerg(HW_ERR "Corrupted MC4 MCE info?\n");
614 615
}

616
static void decode_mc5_mce(struct mce *m)
B
Borislav Petkov 已提交
617
{
618
	struct cpuinfo_x86 *c = &boot_cpu_data;
619
	u8 xec = XEC(m->status, xec_mask);
620 621

	if (c->x86 == 0xf || c->x86 == 0x11)
622
		goto wrong_mc5_mce;
B
Borislav Petkov 已提交
623

624
	pr_emerg(HW_ERR "MC5 Error: ");
625 626

	if (xec == 0x0 || xec == 0xc)
627
		pr_cont("%s.\n", mc5_mce_desc[xec]);
628
	else if (xec <= 0xd)
629
		pr_cont("%s parity error.\n", mc5_mce_desc[xec]);
630
	else
631
		goto wrong_mc5_mce;
632 633

	return;
B
Borislav Petkov 已提交
634

635 636
 wrong_mc5_mce:
	pr_emerg(HW_ERR "Corrupted MC5 MCE info?\n");
B
Borislav Petkov 已提交
637 638
}

639
static void decode_mc6_mce(struct mce *m)
640
{
641
	u8 xec = XEC(m->status, xec_mask);
642

643
	pr_emerg(HW_ERR "MC6 Error: ");
644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666

	switch (xec) {
	case 0x1:
		pr_cont("Free List");
		break;

	case 0x2:
		pr_cont("Physical Register File");
		break;

	case 0x3:
		pr_cont("Retire Queue");
		break;

	case 0x4:
		pr_cont("Scheduler table");
		break;

	case 0x5:
		pr_cont("Status Register File");
		break;

	default:
667
		goto wrong_mc6_mce;
668 669 670 671 672 673 674
		break;
	}

	pr_cont(" parity error.\n");

	return;

675 676
 wrong_mc6_mce:
	pr_emerg(HW_ERR "Corrupted MC6 MCE info?\n");
677 678
}

B
Borislav Petkov 已提交
679
static inline void amd_decode_err_code(u16 ec)
680
{
681 682 683 684
	if (INT_ERROR(ec)) {
		pr_emerg(HW_ERR "internal: %s\n", UU_MSG(ec));
		return;
	}
685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700

	pr_emerg(HW_ERR "cache level: %s", LL_MSG(ec));

	if (BUS_ERROR(ec))
		pr_cont(", mem/io: %s", II_MSG(ec));
	else
		pr_cont(", tx: %s", TT_MSG(ec));

	if (MEM_ERROR(ec) || BUS_ERROR(ec)) {
		pr_cont(", mem-tx: %s", R4_MSG(ec));

		if (BUS_ERROR(ec))
			pr_cont(", part-proc: %s (%s)", PP_MSG(ec), TO_MSG(ec));
	}

	pr_cont("\n");
701 702
}

703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718
/*
 * Filter out unwanted MCE signatures here.
 */
static bool amd_filter_mce(struct mce *m)
{
	u8 xec = (m->status >> 16) & 0x1f;

	/*
	 * NB GART TLB error reporting is disabled by default.
	 */
	if (m->bank == 4 && xec == 0x5 && !report_gart_errors)
		return true;

	return false;
}

B
Borislav Petkov 已提交
719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734
static const char *decode_error_status(struct mce *m)
{
	if (m->status & MCI_STATUS_UC) {
		if (m->status & MCI_STATUS_PCC)
			return "System Fatal error.";
		if (m->mcgstatus & MCG_STATUS_RIPV)
			return "Uncorrected, software restartable error.";
		return "Uncorrected, software containable error.";
	}

	if (m->status & MCI_STATUS_DEFERRED)
		return "Deferred error.";

	return "Corrected error, no action required.";
}

B
Borislav Petkov 已提交
735
int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
736
{
737
	struct mce *m = (struct mce *)data;
738
	struct cpuinfo_x86 *c = &cpu_data(m->extcpu);
739
	int ecc;
740

741 742 743
	if (amd_filter_mce(m))
		return NOTIFY_STOP;

744 745
	switch (m->bank) {
	case 0:
746
		decode_mc0_mce(m);
747
		break;
748

749
	case 1:
750
		decode_mc1_mce(m);
751 752
		break;

753
	case 2:
754
		decode_mc2_mce(m);
755 756
		break;

757
	case 3:
758
		decode_mc3_mce(m);
759 760
		break;

761
	case 4:
762
		decode_mc4_mce(m);
763 764
		break;

B
Borislav Petkov 已提交
765
	case 5:
766
		decode_mc5_mce(m);
B
Borislav Petkov 已提交
767 768
		break;

769
	case 6:
770
		decode_mc6_mce(m);
771 772
		break;

773 774
	default:
		break;
775
	}
776

B
Borislav Petkov 已提交
777 778
	pr_emerg(HW_ERR "Error Status: %s\n", decode_error_status(m));

779 780 781 782 783 784 785 786 787 788
	pr_emerg(HW_ERR "CPU:%d (%x:%x:%x) MC%d_STATUS[%s|%s|%s|%s|%s",
		m->extcpu,
		c->x86, c->x86_model, c->x86_mask,
		m->bank,
		((m->status & MCI_STATUS_OVER)	? "Over"  : "-"),
		((m->status & MCI_STATUS_UC)	? "UE"	  : "CE"),
		((m->status & MCI_STATUS_MISCV)	? "MiscV" : "-"),
		((m->status & MCI_STATUS_PCC)	? "PCC"	  : "-"),
		((m->status & MCI_STATUS_ADDRV)	? "AddrV" : "-"));

789
	if (c->x86 == 0x15 || c->x86 == 0x16)
790
		pr_cont("|%s|%s",
B
Borislav Petkov 已提交
791 792
			((m->status & MCI_STATUS_DEFERRED) ? "Deferred" : "-"),
			((m->status & MCI_STATUS_POISON)   ? "Poison"   : "-"));
793 794 795 796 797 798 799 800 801 802 803

	/* do the two bits[14:13] together */
	ecc = (m->status >> 45) & 0x3;
	if (ecc)
		pr_cont("|%sECC", ((ecc == 2) ? "C" : "U"));

	pr_cont("]: 0x%016llx\n", m->status);

	if (m->status & MCI_STATUS_ADDRV)
		pr_emerg(HW_ERR "MC%d_ADDR: 0x%016llx\n", m->bank, m->addr);

804
	amd_decode_err_code(m->status & 0xffff);
805 806

	return NOTIFY_STOP;
807
}
B
Borislav Petkov 已提交
808
EXPORT_SYMBOL_GPL(amd_decode_mce);
809

810 811 812 813
static struct notifier_block amd_mce_dec_nb = {
	.notifier_call	= amd_decode_mce,
};

814 815
static int __init mce_amd_init(void)
{
816 817 818
	struct cpuinfo_x86 *c = &boot_cpu_data;

	if (c->x86_vendor != X86_VENDOR_AMD)
819 820
		return 0;

821
	if (c->x86 < 0xf || c->x86 > 0x16)
822 823
		return 0;

824 825 826 827
	fam_ops = kzalloc(sizeof(struct amd_decoder_ops), GFP_KERNEL);
	if (!fam_ops)
		return -ENOMEM;

828
	switch (c->x86) {
829
	case 0xf:
830 831
		fam_ops->mc0_mce = k8_mc0_mce;
		fam_ops->mc1_mce = k8_mc1_mce;
832
		fam_ops->mc2_mce = k8_mc2_mce;
833 834 835
		break;

	case 0x10:
836 837
		fam_ops->mc0_mce = f10h_mc0_mce;
		fam_ops->mc1_mce = k8_mc1_mce;
838
		fam_ops->mc2_mce = k8_mc2_mce;
839 840
		break;

841
	case 0x11:
842 843
		fam_ops->mc0_mce = k8_mc0_mce;
		fam_ops->mc1_mce = k8_mc1_mce;
844
		fam_ops->mc2_mce = k8_mc2_mce;
845 846
		break;

847
	case 0x12:
848 849
		fam_ops->mc0_mce = f12h_mc0_mce;
		fam_ops->mc1_mce = k8_mc1_mce;
850
		fam_ops->mc2_mce = k8_mc2_mce;
851 852
		break;

853
	case 0x14:
854
		nb_err_cpumask  = 0x3;
855 856
		fam_ops->mc0_mce = cat_mc0_mce;
		fam_ops->mc1_mce = cat_mc1_mce;
857
		fam_ops->mc2_mce = k8_mc2_mce;
858 859
		break;

860 861
	case 0x15:
		xec_mask = 0x1f;
862 863
		fam_ops->mc0_mce = f15h_mc0_mce;
		fam_ops->mc1_mce = f15h_mc1_mce;
864
		fam_ops->mc2_mce = f15h_mc2_mce;
865 866
		break;

867 868 869 870 871 872 873
	case 0x16:
		xec_mask = 0x1f;
		fam_ops->mc0_mce = cat_mc0_mce;
		fam_ops->mc1_mce = cat_mc1_mce;
		fam_ops->mc2_mce = f16h_mc2_mce;
		break;

874
	default:
875
		printk(KERN_WARNING "Huh? What family is it: 0x%x?!\n", c->x86);
876 877 878 879
		kfree(fam_ops);
		return -EINVAL;
	}

880 881
	pr_info("MCE: In-kernel MCE decoding enabled.\n");

882
	mce_register_decode_chain(&amd_mce_dec_nb);
883 884 885 886

	return 0;
}
early_initcall(mce_amd_init);
887 888 889 890

#ifdef MODULE
static void __exit mce_amd_exit(void)
{
891
	mce_unregister_decode_chain(&amd_mce_dec_nb);
892
	kfree(fam_ops);
893 894 895 896 897 898 899
}

MODULE_DESCRIPTION("AMD MCE decoder");
MODULE_ALIAS("edac-mce-amd");
MODULE_LICENSE("GPL");
module_exit(mce_amd_exit);
#endif