xref: /linux/drivers/edac/mce_amd.c (revision fd639726bf15fca8ee1a00dce8e0096d0ad9bd18)
1 #include <linux/module.h>
2 #include <linux/slab.h>
3 
4 #include <asm/cpu.h>
5 
6 #include "mce_amd.h"
7 
8 static struct amd_decoder_ops *fam_ops;
9 
10 static u8 xec_mask	 = 0xf;
11 
12 static bool report_gart_errors;
13 static void (*decode_dram_ecc)(int node_id, struct mce *m);
14 
15 void amd_report_gart_errors(bool v)
16 {
17 	report_gart_errors = v;
18 }
19 EXPORT_SYMBOL_GPL(amd_report_gart_errors);
20 
21 void amd_register_ecc_decoder(void (*f)(int, struct mce *))
22 {
23 	decode_dram_ecc = f;
24 }
25 EXPORT_SYMBOL_GPL(amd_register_ecc_decoder);
26 
27 void amd_unregister_ecc_decoder(void (*f)(int, struct mce *))
28 {
29 	if (decode_dram_ecc) {
30 		WARN_ON(decode_dram_ecc != f);
31 
32 		decode_dram_ecc = NULL;
33 	}
34 }
35 EXPORT_SYMBOL_GPL(amd_unregister_ecc_decoder);
36 
37 /*
38  * string representation for the different MCA reported error types, see F3x48
39  * or MSR0000_0411.
40  */
41 
42 /* transaction type */
43 static const char * const tt_msgs[] = { "INSN", "DATA", "GEN", "RESV" };
44 
45 /* cache level */
46 static const char * const ll_msgs[] = { "RESV", "L1", "L2", "L3/GEN" };
47 
48 /* memory transaction type */
49 static const char * const rrrr_msgs[] = {
50        "GEN", "RD", "WR", "DRD", "DWR", "IRD", "PRF", "EV", "SNP"
51 };
52 
53 /* participating processor */
54 const char * const pp_msgs[] = { "SRC", "RES", "OBS", "GEN" };
55 EXPORT_SYMBOL_GPL(pp_msgs);
56 
57 /* request timeout */
58 static const char * const to_msgs[] = { "no timeout", "timed out" };
59 
60 /* memory or i/o */
61 static const char * const ii_msgs[] = { "MEM", "RESV", "IO", "GEN" };
62 
63 /* internal error type */
64 static const char * const uu_msgs[] = { "RESV", "RESV", "HWA", "RESV" };
65 
66 static const char * const f15h_mc1_mce_desc[] = {
67 	"UC during a demand linefill from L2",
68 	"Parity error during data load from IC",
69 	"Parity error for IC valid bit",
70 	"Main tag parity error",
71 	"Parity error in prediction queue",
72 	"PFB data/address parity error",
73 	"Parity error in the branch status reg",
74 	"PFB promotion address error",
75 	"Tag error during probe/victimization",
76 	"Parity error for IC probe tag valid bit",
77 	"PFB non-cacheable bit parity error",
78 	"PFB valid bit parity error",			/* xec = 0xd */
79 	"Microcode Patch Buffer",			/* xec = 010 */
80 	"uop queue",
81 	"insn buffer",
82 	"predecode buffer",
83 	"fetch address FIFO",
84 	"dispatch uop queue"
85 };
86 
87 static const char * const f15h_mc2_mce_desc[] = {
88 	"Fill ECC error on data fills",			/* xec = 0x4 */
89 	"Fill parity error on insn fills",
90 	"Prefetcher request FIFO parity error",
91 	"PRQ address parity error",
92 	"PRQ data parity error",
93 	"WCC Tag ECC error",
94 	"WCC Data ECC error",
95 	"WCB Data parity error",
96 	"VB Data ECC or parity error",
97 	"L2 Tag ECC error",				/* xec = 0x10 */
98 	"Hard L2 Tag ECC error",
99 	"Multiple hits on L2 tag",
100 	"XAB parity error",
101 	"PRB address parity error"
102 };
103 
104 static const char * const mc4_mce_desc[] = {
105 	"DRAM ECC error detected on the NB",
106 	"CRC error detected on HT link",
107 	"Link-defined sync error packets detected on HT link",
108 	"HT Master abort",
109 	"HT Target abort",
110 	"Invalid GART PTE entry during GART table walk",
111 	"Unsupported atomic RMW received from an IO link",
112 	"Watchdog timeout due to lack of progress",
113 	"DRAM ECC error detected on the NB",
114 	"SVM DMA Exclusion Vector error",
115 	"HT data error detected on link",
116 	"Protocol error (link, L3, probe filter)",
117 	"NB internal arrays parity error",
118 	"DRAM addr/ctl signals parity error",
119 	"IO link transmission error",
120 	"L3 data cache ECC error",			/* xec = 0x1c */
121 	"L3 cache tag error",
122 	"L3 LRU parity bits error",
123 	"ECC Error in the Probe Filter directory"
124 };
125 
126 static const char * const mc5_mce_desc[] = {
127 	"CPU Watchdog timer expire",
128 	"Wakeup array dest tag",
129 	"AG payload array",
130 	"EX payload array",
131 	"IDRF array",
132 	"Retire dispatch queue",
133 	"Mapper checkpoint array",
134 	"Physical register file EX0 port",
135 	"Physical register file EX1 port",
136 	"Physical register file AG0 port",
137 	"Physical register file AG1 port",
138 	"Flag register file",
139 	"DE error occurred",
140 	"Retire status queue"
141 };
142 
143 static const char * const mc6_mce_desc[] = {
144 	"Hardware Assertion",
145 	"Free List",
146 	"Physical Register File",
147 	"Retire Queue",
148 	"Scheduler table",
149 	"Status Register File",
150 };
151 
152 /* Scalable MCA error strings */
153 static const char * const smca_ls_mce_desc[] = {
154 	"Load queue parity",
155 	"Store queue parity",
156 	"Miss address buffer payload parity",
157 	"L1 TLB parity",
158 	"Reserved",
159 	"DC tag error type 6",
160 	"DC tag error type 1",
161 	"Internal error type 1",
162 	"Internal error type 2",
163 	"Sys Read data error thread 0",
164 	"Sys read data error thread 1",
165 	"DC tag error type 2",
166 	"DC data error type 1 (poison consumption)",
167 	"DC data error type 2",
168 	"DC data error type 3",
169 	"DC tag error type 4",
170 	"L2 TLB parity",
171 	"PDC parity error",
172 	"DC tag error type 3",
173 	"DC tag error type 5",
174 	"L2 fill data error",
175 };
176 
177 static const char * const smca_if_mce_desc[] = {
178 	"microtag probe port parity error",
179 	"IC microtag or full tag multi-hit error",
180 	"IC full tag parity",
181 	"IC data array parity",
182 	"Decoupling queue phys addr parity error",
183 	"L0 ITLB parity error",
184 	"L1 ITLB parity error",
185 	"L2 ITLB parity error",
186 	"BPQ snoop parity on Thread 0",
187 	"BPQ snoop parity on Thread 1",
188 	"L1 BTB multi-match error",
189 	"L2 BTB multi-match error",
190 	"L2 Cache Response Poison error",
191 	"System Read Data error",
192 };
193 
194 static const char * const smca_l2_mce_desc[] = {
195 	"L2M tag multi-way-hit error",
196 	"L2M tag ECC error",
197 	"L2M data ECC error",
198 	"HW assert",
199 };
200 
201 static const char * const smca_de_mce_desc[] = {
202 	"uop cache tag parity error",
203 	"uop cache data parity error",
204 	"Insn buffer parity error",
205 	"uop queue parity error",
206 	"Insn dispatch queue parity error",
207 	"Fetch address FIFO parity",
208 	"Patch RAM data parity",
209 	"Patch RAM sequencer parity",
210 	"uop buffer parity"
211 };
212 
213 static const char * const smca_ex_mce_desc[] = {
214 	"Watchdog timeout error",
215 	"Phy register file parity",
216 	"Flag register file parity",
217 	"Immediate displacement register file parity",
218 	"Address generator payload parity",
219 	"EX payload parity",
220 	"Checkpoint queue parity",
221 	"Retire dispatch queue parity",
222 	"Retire status queue parity error",
223 	"Scheduling queue parity error",
224 	"Branch buffer queue parity error",
225 };
226 
227 static const char * const smca_fp_mce_desc[] = {
228 	"Physical register file parity",
229 	"Freelist parity error",
230 	"Schedule queue parity",
231 	"NSQ parity error",
232 	"Retire queue parity",
233 	"Status register file parity",
234 	"Hardware assertion",
235 };
236 
237 static const char * const smca_l3_mce_desc[] = {
238 	"Shadow tag macro ECC error",
239 	"Shadow tag macro multi-way-hit error",
240 	"L3M tag ECC error",
241 	"L3M tag multi-way-hit error",
242 	"L3M data ECC error",
243 	"XI parity, L3 fill done channel error",
244 	"L3 victim queue parity",
245 	"L3 HW assert",
246 };
247 
248 static const char * const smca_cs_mce_desc[] = {
249 	"Illegal request from transport layer",
250 	"Address violation",
251 	"Security violation",
252 	"Illegal response from transport layer",
253 	"Unexpected response",
254 	"Parity error on incoming request or probe response data",
255 	"Parity error on incoming read response data",
256 	"Atomic request parity",
257 	"ECC error on probe filter access",
258 };
259 
260 static const char * const smca_pie_mce_desc[] = {
261 	"HW assert",
262 	"Internal PIE register security violation",
263 	"Error on GMI link",
264 	"Poison data written to internal PIE register",
265 };
266 
267 static const char * const smca_umc_mce_desc[] = {
268 	"DRAM ECC error",
269 	"Data poison error on DRAM",
270 	"SDP parity error",
271 	"Advanced peripheral bus error",
272 	"Command/address parity error",
273 	"Write data CRC error",
274 };
275 
276 static const char * const smca_pb_mce_desc[] = {
277 	"Parameter Block RAM ECC error",
278 };
279 
280 static const char * const smca_psp_mce_desc[] = {
281 	"PSP RAM ECC or parity error",
282 };
283 
284 static const char * const smca_smu_mce_desc[] = {
285 	"SMU RAM ECC or parity error",
286 };
287 
288 struct smca_mce_desc {
289 	const char * const *descs;
290 	unsigned int num_descs;
291 };
292 
293 static struct smca_mce_desc smca_mce_descs[] = {
294 	[SMCA_LS]	= { smca_ls_mce_desc,	ARRAY_SIZE(smca_ls_mce_desc)	},
295 	[SMCA_IF]	= { smca_if_mce_desc,	ARRAY_SIZE(smca_if_mce_desc)	},
296 	[SMCA_L2_CACHE]	= { smca_l2_mce_desc,	ARRAY_SIZE(smca_l2_mce_desc)	},
297 	[SMCA_DE]	= { smca_de_mce_desc,	ARRAY_SIZE(smca_de_mce_desc)	},
298 	[SMCA_EX]	= { smca_ex_mce_desc,	ARRAY_SIZE(smca_ex_mce_desc)	},
299 	[SMCA_FP]	= { smca_fp_mce_desc,	ARRAY_SIZE(smca_fp_mce_desc)	},
300 	[SMCA_L3_CACHE]	= { smca_l3_mce_desc,	ARRAY_SIZE(smca_l3_mce_desc)	},
301 	[SMCA_CS]	= { smca_cs_mce_desc,	ARRAY_SIZE(smca_cs_mce_desc)	},
302 	[SMCA_PIE]	= { smca_pie_mce_desc,	ARRAY_SIZE(smca_pie_mce_desc)	},
303 	[SMCA_UMC]	= { smca_umc_mce_desc,	ARRAY_SIZE(smca_umc_mce_desc)	},
304 	[SMCA_PB]	= { smca_pb_mce_desc,	ARRAY_SIZE(smca_pb_mce_desc)	},
305 	[SMCA_PSP]	= { smca_psp_mce_desc,	ARRAY_SIZE(smca_psp_mce_desc)	},
306 	[SMCA_SMU]	= { smca_smu_mce_desc,	ARRAY_SIZE(smca_smu_mce_desc)	},
307 };
308 
309 static bool f12h_mc0_mce(u16 ec, u8 xec)
310 {
311 	bool ret = false;
312 
313 	if (MEM_ERROR(ec)) {
314 		u8 ll = LL(ec);
315 		ret = true;
316 
317 		if (ll == LL_L2)
318 			pr_cont("during L1 linefill from L2.\n");
319 		else if (ll == LL_L1)
320 			pr_cont("Data/Tag %s error.\n", R4_MSG(ec));
321 		else
322 			ret = false;
323 	}
324 	return ret;
325 }
326 
327 static bool f10h_mc0_mce(u16 ec, u8 xec)
328 {
329 	if (R4(ec) == R4_GEN && LL(ec) == LL_L1) {
330 		pr_cont("during data scrub.\n");
331 		return true;
332 	}
333 	return f12h_mc0_mce(ec, xec);
334 }
335 
336 static bool k8_mc0_mce(u16 ec, u8 xec)
337 {
338 	if (BUS_ERROR(ec)) {
339 		pr_cont("during system linefill.\n");
340 		return true;
341 	}
342 
343 	return f10h_mc0_mce(ec, xec);
344 }
345 
346 static bool cat_mc0_mce(u16 ec, u8 xec)
347 {
348 	u8 r4	 = R4(ec);
349 	bool ret = true;
350 
351 	if (MEM_ERROR(ec)) {
352 
353 		if (TT(ec) != TT_DATA || LL(ec) != LL_L1)
354 			return false;
355 
356 		switch (r4) {
357 		case R4_DRD:
358 		case R4_DWR:
359 			pr_cont("Data/Tag parity error due to %s.\n",
360 				(r4 == R4_DRD ? "load/hw prf" : "store"));
361 			break;
362 		case R4_EVICT:
363 			pr_cont("Copyback parity error on a tag miss.\n");
364 			break;
365 		case R4_SNOOP:
366 			pr_cont("Tag parity error during snoop.\n");
367 			break;
368 		default:
369 			ret = false;
370 		}
371 	} else if (BUS_ERROR(ec)) {
372 
373 		if ((II(ec) != II_MEM && II(ec) != II_IO) || LL(ec) != LL_LG)
374 			return false;
375 
376 		pr_cont("System read data error on a ");
377 
378 		switch (r4) {
379 		case R4_RD:
380 			pr_cont("TLB reload.\n");
381 			break;
382 		case R4_DWR:
383 			pr_cont("store.\n");
384 			break;
385 		case R4_DRD:
386 			pr_cont("load.\n");
387 			break;
388 		default:
389 			ret = false;
390 		}
391 	} else {
392 		ret = false;
393 	}
394 
395 	return ret;
396 }
397 
398 static bool f15h_mc0_mce(u16 ec, u8 xec)
399 {
400 	bool ret = true;
401 
402 	if (MEM_ERROR(ec)) {
403 
404 		switch (xec) {
405 		case 0x0:
406 			pr_cont("Data Array access error.\n");
407 			break;
408 
409 		case 0x1:
410 			pr_cont("UC error during a linefill from L2/NB.\n");
411 			break;
412 
413 		case 0x2:
414 		case 0x11:
415 			pr_cont("STQ access error.\n");
416 			break;
417 
418 		case 0x3:
419 			pr_cont("SCB access error.\n");
420 			break;
421 
422 		case 0x10:
423 			pr_cont("Tag error.\n");
424 			break;
425 
426 		case 0x12:
427 			pr_cont("LDQ access error.\n");
428 			break;
429 
430 		default:
431 			ret = false;
432 		}
433 	} else if (BUS_ERROR(ec)) {
434 
435 		if (!xec)
436 			pr_cont("System Read Data Error.\n");
437 		else
438 			pr_cont(" Internal error condition type %d.\n", xec);
439 	} else if (INT_ERROR(ec)) {
440 		if (xec <= 0x1f)
441 			pr_cont("Hardware Assert.\n");
442 		else
443 			ret = false;
444 
445 	} else
446 		ret = false;
447 
448 	return ret;
449 }
450 
451 static void decode_mc0_mce(struct mce *m)
452 {
453 	u16 ec = EC(m->status);
454 	u8 xec = XEC(m->status, xec_mask);
455 
456 	pr_emerg(HW_ERR "MC0 Error: ");
457 
458 	/* TLB error signatures are the same across families */
459 	if (TLB_ERROR(ec)) {
460 		if (TT(ec) == TT_DATA) {
461 			pr_cont("%s TLB %s.\n", LL_MSG(ec),
462 				((xec == 2) ? "locked miss"
463 					    : (xec ? "multimatch" : "parity")));
464 			return;
465 		}
466 	} else if (fam_ops->mc0_mce(ec, xec))
467 		;
468 	else
469 		pr_emerg(HW_ERR "Corrupted MC0 MCE info?\n");
470 }
471 
472 static bool k8_mc1_mce(u16 ec, u8 xec)
473 {
474 	u8 ll	 = LL(ec);
475 	bool ret = true;
476 
477 	if (!MEM_ERROR(ec))
478 		return false;
479 
480 	if (ll == 0x2)
481 		pr_cont("during a linefill from L2.\n");
482 	else if (ll == 0x1) {
483 		switch (R4(ec)) {
484 		case R4_IRD:
485 			pr_cont("Parity error during data load.\n");
486 			break;
487 
488 		case R4_EVICT:
489 			pr_cont("Copyback Parity/Victim error.\n");
490 			break;
491 
492 		case R4_SNOOP:
493 			pr_cont("Tag Snoop error.\n");
494 			break;
495 
496 		default:
497 			ret = false;
498 			break;
499 		}
500 	} else
501 		ret = false;
502 
503 	return ret;
504 }
505 
506 static bool cat_mc1_mce(u16 ec, u8 xec)
507 {
508 	u8 r4    = R4(ec);
509 	bool ret = true;
510 
511 	if (!MEM_ERROR(ec))
512 		return false;
513 
514 	if (TT(ec) != TT_INSTR)
515 		return false;
516 
517 	if (r4 == R4_IRD)
518 		pr_cont("Data/tag array parity error for a tag hit.\n");
519 	else if (r4 == R4_SNOOP)
520 		pr_cont("Tag error during snoop/victimization.\n");
521 	else if (xec == 0x0)
522 		pr_cont("Tag parity error from victim castout.\n");
523 	else if (xec == 0x2)
524 		pr_cont("Microcode patch RAM parity error.\n");
525 	else
526 		ret = false;
527 
528 	return ret;
529 }
530 
531 static bool f15h_mc1_mce(u16 ec, u8 xec)
532 {
533 	bool ret = true;
534 
535 	if (!MEM_ERROR(ec))
536 		return false;
537 
538 	switch (xec) {
539 	case 0x0 ... 0xa:
540 		pr_cont("%s.\n", f15h_mc1_mce_desc[xec]);
541 		break;
542 
543 	case 0xd:
544 		pr_cont("%s.\n", f15h_mc1_mce_desc[xec-2]);
545 		break;
546 
547 	case 0x10:
548 		pr_cont("%s.\n", f15h_mc1_mce_desc[xec-4]);
549 		break;
550 
551 	case 0x11 ... 0x15:
552 		pr_cont("Decoder %s parity error.\n", f15h_mc1_mce_desc[xec-4]);
553 		break;
554 
555 	default:
556 		ret = false;
557 	}
558 	return ret;
559 }
560 
561 static void decode_mc1_mce(struct mce *m)
562 {
563 	u16 ec = EC(m->status);
564 	u8 xec = XEC(m->status, xec_mask);
565 
566 	pr_emerg(HW_ERR "MC1 Error: ");
567 
568 	if (TLB_ERROR(ec))
569 		pr_cont("%s TLB %s.\n", LL_MSG(ec),
570 			(xec ? "multimatch" : "parity error"));
571 	else if (BUS_ERROR(ec)) {
572 		bool k8 = (boot_cpu_data.x86 == 0xf && (m->status & BIT_64(58)));
573 
574 		pr_cont("during %s.\n", (k8 ? "system linefill" : "NB data read"));
575 	} else if (INT_ERROR(ec)) {
576 		if (xec <= 0x3f)
577 			pr_cont("Hardware Assert.\n");
578 		else
579 			goto wrong_mc1_mce;
580 	} else if (fam_ops->mc1_mce(ec, xec))
581 		;
582 	else
583 		goto wrong_mc1_mce;
584 
585 	return;
586 
587 wrong_mc1_mce:
588 	pr_emerg(HW_ERR "Corrupted MC1 MCE info?\n");
589 }
590 
591 static bool k8_mc2_mce(u16 ec, u8 xec)
592 {
593 	bool ret = true;
594 
595 	if (xec == 0x1)
596 		pr_cont(" in the write data buffers.\n");
597 	else if (xec == 0x3)
598 		pr_cont(" in the victim data buffers.\n");
599 	else if (xec == 0x2 && MEM_ERROR(ec))
600 		pr_cont(": %s error in the L2 cache tags.\n", R4_MSG(ec));
601 	else if (xec == 0x0) {
602 		if (TLB_ERROR(ec))
603 			pr_cont("%s error in a Page Descriptor Cache or Guest TLB.\n",
604 				TT_MSG(ec));
605 		else if (BUS_ERROR(ec))
606 			pr_cont(": %s/ECC error in data read from NB: %s.\n",
607 				R4_MSG(ec), PP_MSG(ec));
608 		else if (MEM_ERROR(ec)) {
609 			u8 r4 = R4(ec);
610 
611 			if (r4 >= 0x7)
612 				pr_cont(": %s error during data copyback.\n",
613 					R4_MSG(ec));
614 			else if (r4 <= 0x1)
615 				pr_cont(": %s parity/ECC error during data "
616 					"access from L2.\n", R4_MSG(ec));
617 			else
618 				ret = false;
619 		} else
620 			ret = false;
621 	} else
622 		ret = false;
623 
624 	return ret;
625 }
626 
627 static bool f15h_mc2_mce(u16 ec, u8 xec)
628 {
629 	bool ret = true;
630 
631 	if (TLB_ERROR(ec)) {
632 		if (xec == 0x0)
633 			pr_cont("Data parity TLB read error.\n");
634 		else if (xec == 0x1)
635 			pr_cont("Poison data provided for TLB fill.\n");
636 		else
637 			ret = false;
638 	} else if (BUS_ERROR(ec)) {
639 		if (xec > 2)
640 			ret = false;
641 
642 		pr_cont("Error during attempted NB data read.\n");
643 	} else if (MEM_ERROR(ec)) {
644 		switch (xec) {
645 		case 0x4 ... 0xc:
646 			pr_cont("%s.\n", f15h_mc2_mce_desc[xec - 0x4]);
647 			break;
648 
649 		case 0x10 ... 0x14:
650 			pr_cont("%s.\n", f15h_mc2_mce_desc[xec - 0x7]);
651 			break;
652 
653 		default:
654 			ret = false;
655 		}
656 	} else if (INT_ERROR(ec)) {
657 		if (xec <= 0x3f)
658 			pr_cont("Hardware Assert.\n");
659 		else
660 			ret = false;
661 	}
662 
663 	return ret;
664 }
665 
666 static bool f16h_mc2_mce(u16 ec, u8 xec)
667 {
668 	u8 r4 = R4(ec);
669 
670 	if (!MEM_ERROR(ec))
671 		return false;
672 
673 	switch (xec) {
674 	case 0x04 ... 0x05:
675 		pr_cont("%cBUFF parity error.\n", (r4 == R4_RD) ? 'I' : 'O');
676 		break;
677 
678 	case 0x09 ... 0x0b:
679 	case 0x0d ... 0x0f:
680 		pr_cont("ECC error in L2 tag (%s).\n",
681 			((r4 == R4_GEN)   ? "BankReq" :
682 			((r4 == R4_SNOOP) ? "Prb"     : "Fill")));
683 		break;
684 
685 	case 0x10 ... 0x19:
686 	case 0x1b:
687 		pr_cont("ECC error in L2 data array (%s).\n",
688 			(((r4 == R4_RD) && !(xec & 0x3)) ? "Hit"  :
689 			((r4 == R4_GEN)   ? "Attr" :
690 			((r4 == R4_EVICT) ? "Vict" : "Fill"))));
691 		break;
692 
693 	case 0x1c ... 0x1d:
694 	case 0x1f:
695 		pr_cont("Parity error in L2 attribute bits (%s).\n",
696 			((r4 == R4_RD)  ? "Hit"  :
697 			((r4 == R4_GEN) ? "Attr" : "Fill")));
698 		break;
699 
700 	default:
701 		return false;
702 	}
703 
704 	return true;
705 }
706 
707 static void decode_mc2_mce(struct mce *m)
708 {
709 	u16 ec = EC(m->status);
710 	u8 xec = XEC(m->status, xec_mask);
711 
712 	pr_emerg(HW_ERR "MC2 Error: ");
713 
714 	if (!fam_ops->mc2_mce(ec, xec))
715 		pr_cont(HW_ERR "Corrupted MC2 MCE info?\n");
716 }
717 
718 static void decode_mc3_mce(struct mce *m)
719 {
720 	u16 ec = EC(m->status);
721 	u8 xec = XEC(m->status, xec_mask);
722 
723 	if (boot_cpu_data.x86 >= 0x14) {
724 		pr_emerg("You shouldn't be seeing MC3 MCE on this cpu family,"
725 			 " please report on LKML.\n");
726 		return;
727 	}
728 
729 	pr_emerg(HW_ERR "MC3 Error");
730 
731 	if (xec == 0x0) {
732 		u8 r4 = R4(ec);
733 
734 		if (!BUS_ERROR(ec) || (r4 != R4_DRD && r4 != R4_DWR))
735 			goto wrong_mc3_mce;
736 
737 		pr_cont(" during %s.\n", R4_MSG(ec));
738 	} else
739 		goto wrong_mc3_mce;
740 
741 	return;
742 
743  wrong_mc3_mce:
744 	pr_emerg(HW_ERR "Corrupted MC3 MCE info?\n");
745 }
746 
747 static void decode_mc4_mce(struct mce *m)
748 {
749 	unsigned int fam = x86_family(m->cpuid);
750 	int node_id = amd_get_nb_id(m->extcpu);
751 	u16 ec = EC(m->status);
752 	u8 xec = XEC(m->status, 0x1f);
753 	u8 offset = 0;
754 
755 	pr_emerg(HW_ERR "MC4 Error (node %d): ", node_id);
756 
757 	switch (xec) {
758 	case 0x0 ... 0xe:
759 
760 		/* special handling for DRAM ECCs */
761 		if (xec == 0x0 || xec == 0x8) {
762 			/* no ECCs on F11h */
763 			if (fam == 0x11)
764 				goto wrong_mc4_mce;
765 
766 			pr_cont("%s.\n", mc4_mce_desc[xec]);
767 
768 			if (decode_dram_ecc)
769 				decode_dram_ecc(node_id, m);
770 			return;
771 		}
772 		break;
773 
774 	case 0xf:
775 		if (TLB_ERROR(ec))
776 			pr_cont("GART Table Walk data error.\n");
777 		else if (BUS_ERROR(ec))
778 			pr_cont("DMA Exclusion Vector Table Walk error.\n");
779 		else
780 			goto wrong_mc4_mce;
781 		return;
782 
783 	case 0x19:
784 		if (fam == 0x15 || fam == 0x16)
785 			pr_cont("Compute Unit Data Error.\n");
786 		else
787 			goto wrong_mc4_mce;
788 		return;
789 
790 	case 0x1c ... 0x1f:
791 		offset = 13;
792 		break;
793 
794 	default:
795 		goto wrong_mc4_mce;
796 	}
797 
798 	pr_cont("%s.\n", mc4_mce_desc[xec - offset]);
799 	return;
800 
801  wrong_mc4_mce:
802 	pr_emerg(HW_ERR "Corrupted MC4 MCE info?\n");
803 }
804 
805 static void decode_mc5_mce(struct mce *m)
806 {
807 	unsigned int fam = x86_family(m->cpuid);
808 	u16 ec = EC(m->status);
809 	u8 xec = XEC(m->status, xec_mask);
810 
811 	if (fam == 0xf || fam == 0x11)
812 		goto wrong_mc5_mce;
813 
814 	pr_emerg(HW_ERR "MC5 Error: ");
815 
816 	if (INT_ERROR(ec)) {
817 		if (xec <= 0x1f) {
818 			pr_cont("Hardware Assert.\n");
819 			return;
820 		} else
821 			goto wrong_mc5_mce;
822 	}
823 
824 	if (xec == 0x0 || xec == 0xc)
825 		pr_cont("%s.\n", mc5_mce_desc[xec]);
826 	else if (xec <= 0xd)
827 		pr_cont("%s parity error.\n", mc5_mce_desc[xec]);
828 	else
829 		goto wrong_mc5_mce;
830 
831 	return;
832 
833  wrong_mc5_mce:
834 	pr_emerg(HW_ERR "Corrupted MC5 MCE info?\n");
835 }
836 
837 static void decode_mc6_mce(struct mce *m)
838 {
839 	u8 xec = XEC(m->status, xec_mask);
840 
841 	pr_emerg(HW_ERR "MC6 Error: ");
842 
843 	if (xec > 0x5)
844 		goto wrong_mc6_mce;
845 
846 	pr_cont("%s parity error.\n", mc6_mce_desc[xec]);
847 	return;
848 
849  wrong_mc6_mce:
850 	pr_emerg(HW_ERR "Corrupted MC6 MCE info?\n");
851 }
852 
853 /* Decode errors according to Scalable MCA specification */
854 static void decode_smca_error(struct mce *m)
855 {
856 	struct smca_hwid *hwid;
857 	unsigned int bank_type;
858 	const char *ip_name;
859 	u8 xec = XEC(m->status, xec_mask);
860 
861 	if (m->bank >= ARRAY_SIZE(smca_banks))
862 		return;
863 
864 	if (x86_family(m->cpuid) >= 0x17 && m->bank == 4)
865 		pr_emerg(HW_ERR "Bank 4 is reserved on Fam17h.\n");
866 
867 	hwid = smca_banks[m->bank].hwid;
868 	if (!hwid)
869 		return;
870 
871 	bank_type = hwid->bank_type;
872 	ip_name = smca_get_long_name(bank_type);
873 
874 	pr_emerg(HW_ERR "%s Extended Error Code: %d\n", ip_name, xec);
875 
876 	/* Only print the decode of valid error codes */
877 	if (xec < smca_mce_descs[bank_type].num_descs &&
878 			(hwid->xec_bitmap & BIT_ULL(xec))) {
879 		pr_emerg(HW_ERR "%s Error: ", ip_name);
880 		pr_cont("%s.\n", smca_mce_descs[bank_type].descs[xec]);
881 	}
882 
883 	if (bank_type == SMCA_UMC && xec == 0 && decode_dram_ecc)
884 		decode_dram_ecc(cpu_to_node(m->extcpu), m);
885 }
886 
887 static inline void amd_decode_err_code(u16 ec)
888 {
889 	if (INT_ERROR(ec)) {
890 		pr_emerg(HW_ERR "internal: %s\n", UU_MSG(ec));
891 		return;
892 	}
893 
894 	pr_emerg(HW_ERR "cache level: %s", LL_MSG(ec));
895 
896 	if (BUS_ERROR(ec))
897 		pr_cont(", mem/io: %s", II_MSG(ec));
898 	else
899 		pr_cont(", tx: %s", TT_MSG(ec));
900 
901 	if (MEM_ERROR(ec) || BUS_ERROR(ec)) {
902 		pr_cont(", mem-tx: %s", R4_MSG(ec));
903 
904 		if (BUS_ERROR(ec))
905 			pr_cont(", part-proc: %s (%s)", PP_MSG(ec), TO_MSG(ec));
906 	}
907 
908 	pr_cont("\n");
909 }
910 
911 /*
912  * Filter out unwanted MCE signatures here.
913  */
914 static bool amd_filter_mce(struct mce *m)
915 {
916 	/*
917 	 * NB GART TLB error reporting is disabled by default.
918 	 */
919 	if (m->bank == 4 && XEC(m->status, 0x1f) == 0x5 && !report_gart_errors)
920 		return true;
921 
922 	return false;
923 }
924 
925 static const char *decode_error_status(struct mce *m)
926 {
927 	if (m->status & MCI_STATUS_UC) {
928 		if (m->status & MCI_STATUS_PCC)
929 			return "System Fatal error.";
930 		if (m->mcgstatus & MCG_STATUS_RIPV)
931 			return "Uncorrected, software restartable error.";
932 		return "Uncorrected, software containable error.";
933 	}
934 
935 	if (m->status & MCI_STATUS_DEFERRED)
936 		return "Deferred error, no action required.";
937 
938 	return "Corrected error, no action required.";
939 }
940 
941 static int
942 amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
943 {
944 	struct mce *m = (struct mce *)data;
945 	unsigned int fam = x86_family(m->cpuid);
946 	int ecc;
947 
948 	if (amd_filter_mce(m))
949 		return NOTIFY_STOP;
950 
951 	pr_emerg(HW_ERR "%s\n", decode_error_status(m));
952 
953 	pr_emerg(HW_ERR "CPU:%d (%x:%x:%x) MC%d_STATUS[%s|%s|%s|%s|%s",
954 		m->extcpu,
955 		fam, x86_model(m->cpuid), x86_stepping(m->cpuid),
956 		m->bank,
957 		((m->status & MCI_STATUS_OVER)	? "Over"  : "-"),
958 		((m->status & MCI_STATUS_UC)	? "UE"	  :
959 		 (m->status & MCI_STATUS_DEFERRED) ? "-"  : "CE"),
960 		((m->status & MCI_STATUS_MISCV)	? "MiscV" : "-"),
961 		((m->status & MCI_STATUS_PCC)	? "PCC"	  : "-"),
962 		((m->status & MCI_STATUS_ADDRV)	? "AddrV" : "-"));
963 
964 	if (fam >= 0x15) {
965 		pr_cont("|%s", (m->status & MCI_STATUS_DEFERRED ? "Deferred" : "-"));
966 
967 		/* F15h, bank4, bit 43 is part of McaStatSubCache. */
968 		if (fam != 0x15 || m->bank != 4)
969 			pr_cont("|%s", (m->status & MCI_STATUS_POISON ? "Poison" : "-"));
970 	}
971 
972 	if (boot_cpu_has(X86_FEATURE_SMCA)) {
973 		u32 low, high;
974 		u32 addr = MSR_AMD64_SMCA_MCx_CONFIG(m->bank);
975 
976 		pr_cont("|%s", ((m->status & MCI_STATUS_SYNDV) ? "SyndV" : "-"));
977 
978 		if (!rdmsr_safe(addr, &low, &high) &&
979 		    (low & MCI_CONFIG_MCAX))
980 			pr_cont("|%s", ((m->status & MCI_STATUS_TCC) ? "TCC" : "-"));
981 	}
982 
983 	/* do the two bits[14:13] together */
984 	ecc = (m->status >> 45) & 0x3;
985 	if (ecc)
986 		pr_cont("|%sECC", ((ecc == 2) ? "C" : "U"));
987 
988 	pr_cont("]: 0x%016llx\n", m->status);
989 
990 	if (m->status & MCI_STATUS_ADDRV)
991 		pr_emerg(HW_ERR "Error Addr: 0x%016llx\n", m->addr);
992 
993 	if (boot_cpu_has(X86_FEATURE_SMCA)) {
994 		pr_emerg(HW_ERR "IPID: 0x%016llx", m->ipid);
995 
996 		if (m->status & MCI_STATUS_SYNDV)
997 			pr_cont(", Syndrome: 0x%016llx", m->synd);
998 
999 		pr_cont("\n");
1000 
1001 		decode_smca_error(m);
1002 		goto err_code;
1003 	}
1004 
1005 	if (m->tsc)
1006 		pr_emerg(HW_ERR "TSC: %llu\n", m->tsc);
1007 
1008 	if (!fam_ops)
1009 		goto err_code;
1010 
1011 	switch (m->bank) {
1012 	case 0:
1013 		decode_mc0_mce(m);
1014 		break;
1015 
1016 	case 1:
1017 		decode_mc1_mce(m);
1018 		break;
1019 
1020 	case 2:
1021 		decode_mc2_mce(m);
1022 		break;
1023 
1024 	case 3:
1025 		decode_mc3_mce(m);
1026 		break;
1027 
1028 	case 4:
1029 		decode_mc4_mce(m);
1030 		break;
1031 
1032 	case 5:
1033 		decode_mc5_mce(m);
1034 		break;
1035 
1036 	case 6:
1037 		decode_mc6_mce(m);
1038 		break;
1039 
1040 	default:
1041 		break;
1042 	}
1043 
1044  err_code:
1045 	amd_decode_err_code(m->status & 0xffff);
1046 
1047 	return NOTIFY_STOP;
1048 }
1049 
1050 static struct notifier_block amd_mce_dec_nb = {
1051 	.notifier_call	= amd_decode_mce,
1052 	.priority	= MCE_PRIO_EDAC,
1053 };
1054 
1055 static int __init mce_amd_init(void)
1056 {
1057 	struct cpuinfo_x86 *c = &boot_cpu_data;
1058 
1059 	if (c->x86_vendor != X86_VENDOR_AMD)
1060 		return -ENODEV;
1061 
1062 	fam_ops = kzalloc(sizeof(struct amd_decoder_ops), GFP_KERNEL);
1063 	if (!fam_ops)
1064 		return -ENOMEM;
1065 
1066 	switch (c->x86) {
1067 	case 0xf:
1068 		fam_ops->mc0_mce = k8_mc0_mce;
1069 		fam_ops->mc1_mce = k8_mc1_mce;
1070 		fam_ops->mc2_mce = k8_mc2_mce;
1071 		break;
1072 
1073 	case 0x10:
1074 		fam_ops->mc0_mce = f10h_mc0_mce;
1075 		fam_ops->mc1_mce = k8_mc1_mce;
1076 		fam_ops->mc2_mce = k8_mc2_mce;
1077 		break;
1078 
1079 	case 0x11:
1080 		fam_ops->mc0_mce = k8_mc0_mce;
1081 		fam_ops->mc1_mce = k8_mc1_mce;
1082 		fam_ops->mc2_mce = k8_mc2_mce;
1083 		break;
1084 
1085 	case 0x12:
1086 		fam_ops->mc0_mce = f12h_mc0_mce;
1087 		fam_ops->mc1_mce = k8_mc1_mce;
1088 		fam_ops->mc2_mce = k8_mc2_mce;
1089 		break;
1090 
1091 	case 0x14:
1092 		fam_ops->mc0_mce = cat_mc0_mce;
1093 		fam_ops->mc1_mce = cat_mc1_mce;
1094 		fam_ops->mc2_mce = k8_mc2_mce;
1095 		break;
1096 
1097 	case 0x15:
1098 		xec_mask = c->x86_model == 0x60 ? 0x3f : 0x1f;
1099 
1100 		fam_ops->mc0_mce = f15h_mc0_mce;
1101 		fam_ops->mc1_mce = f15h_mc1_mce;
1102 		fam_ops->mc2_mce = f15h_mc2_mce;
1103 		break;
1104 
1105 	case 0x16:
1106 		xec_mask = 0x1f;
1107 		fam_ops->mc0_mce = cat_mc0_mce;
1108 		fam_ops->mc1_mce = cat_mc1_mce;
1109 		fam_ops->mc2_mce = f16h_mc2_mce;
1110 		break;
1111 
1112 	case 0x17:
1113 		xec_mask = 0x3f;
1114 		if (!boot_cpu_has(X86_FEATURE_SMCA)) {
1115 			printk(KERN_WARNING "Decoding supported only on Scalable MCA processors.\n");
1116 			goto err_out;
1117 		}
1118 		break;
1119 
1120 	default:
1121 		printk(KERN_WARNING "Huh? What family is it: 0x%x?!\n", c->x86);
1122 		goto err_out;
1123 	}
1124 
1125 	pr_info("MCE: In-kernel MCE decoding enabled.\n");
1126 
1127 	mce_register_decode_chain(&amd_mce_dec_nb);
1128 
1129 	return 0;
1130 
1131 err_out:
1132 	kfree(fam_ops);
1133 	fam_ops = NULL;
1134 	return -EINVAL;
1135 }
1136 early_initcall(mce_amd_init);
1137 
1138 #ifdef MODULE
1139 static void __exit mce_amd_exit(void)
1140 {
1141 	mce_unregister_decode_chain(&amd_mce_dec_nb);
1142 	kfree(fam_ops);
1143 }
1144 
1145 MODULE_DESCRIPTION("AMD MCE decoder");
1146 MODULE_ALIAS("edac-mce-amd");
1147 MODULE_LICENSE("GPL");
1148 module_exit(mce_amd_exit);
1149 #endif
1150