]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - drivers/edac/mce_amd.c
Merge tag 'edac_fixes_for_3.10' of git://git.kernel.org/pub/scm/linux/kernel/git...
[mirror_ubuntu-bionic-kernel.git] / drivers / edac / mce_amd.c
1 #include <linux/module.h>
2 #include <linux/slab.h>
3
4 #include "mce_amd.h"
5
6 static struct amd_decoder_ops *fam_ops;
7
8 static u8 xec_mask = 0xf;
9 static u8 nb_err_cpumask = 0xf;
10
11 static bool report_gart_errors;
12 static void (*nb_bus_decoder)(int node_id, struct mce *m);
13
14 void amd_report_gart_errors(bool v)
15 {
16 report_gart_errors = v;
17 }
18 EXPORT_SYMBOL_GPL(amd_report_gart_errors);
19
20 void amd_register_ecc_decoder(void (*f)(int, struct mce *))
21 {
22 nb_bus_decoder = f;
23 }
24 EXPORT_SYMBOL_GPL(amd_register_ecc_decoder);
25
26 void amd_unregister_ecc_decoder(void (*f)(int, struct mce *))
27 {
28 if (nb_bus_decoder) {
29 WARN_ON(nb_bus_decoder != f);
30
31 nb_bus_decoder = NULL;
32 }
33 }
34 EXPORT_SYMBOL_GPL(amd_unregister_ecc_decoder);
35
36 /*
37 * string representation for the different MCA reported error types, see F3x48
38 * or MSR0000_0411.
39 */
40
41 /* transaction type */
42 static const char * const tt_msgs[] = { "INSN", "DATA", "GEN", "RESV" };
43
44 /* cache level */
45 static const char * const ll_msgs[] = { "RESV", "L1", "L2", "L3/GEN" };
46
47 /* memory transaction type */
48 static const char * const rrrr_msgs[] = {
49 "GEN", "RD", "WR", "DRD", "DWR", "IRD", "PRF", "EV", "SNP"
50 };
51
52 /* participating processor */
53 const char * const pp_msgs[] = { "SRC", "RES", "OBS", "GEN" };
54 EXPORT_SYMBOL_GPL(pp_msgs);
55
56 /* request timeout */
57 static const char * const to_msgs[] = { "no timeout", "timed out" };
58
59 /* memory or i/o */
60 static const char * const ii_msgs[] = { "MEM", "RESV", "IO", "GEN" };
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 "UC during a demand linefill from L2",
67 "Parity error during data load from IC",
68 "Parity error for IC valid bit",
69 "Main tag parity error",
70 "Parity error in prediction queue",
71 "PFB data/address parity error",
72 "Parity error in the branch status reg",
73 "PFB promotion address error",
74 "Tag error during probe/victimization",
75 "Parity error for IC probe tag valid bit",
76 "PFB non-cacheable bit parity error",
77 "PFB valid bit parity error", /* xec = 0xd */
78 "Microcode Patch Buffer", /* xec = 010 */
79 "uop queue",
80 "insn buffer",
81 "predecode buffer",
82 "fetch address FIFO"
83 };
84
85 static const char * const f15h_mc2_mce_desc[] = {
86 "Fill ECC error on data fills", /* xec = 0x4 */
87 "Fill parity error on insn fills",
88 "Prefetcher request FIFO parity error",
89 "PRQ address parity error",
90 "PRQ data parity error",
91 "WCC Tag ECC error",
92 "WCC Data ECC error",
93 "WCB Data parity error",
94 "VB Data ECC or parity error",
95 "L2 Tag ECC error", /* xec = 0x10 */
96 "Hard L2 Tag ECC error",
97 "Multiple hits on L2 tag",
98 "XAB parity error",
99 "PRB address parity error"
100 };
101
102 static const char * const mc4_mce_desc[] = {
103 "DRAM ECC error detected on the NB",
104 "CRC error detected on HT link",
105 "Link-defined sync error packets detected on HT link",
106 "HT Master abort",
107 "HT Target abort",
108 "Invalid GART PTE entry during GART table walk",
109 "Unsupported atomic RMW received from an IO link",
110 "Watchdog timeout due to lack of progress",
111 "DRAM ECC error detected on the NB",
112 "SVM DMA Exclusion Vector error",
113 "HT data error detected on link",
114 "Protocol error (link, L3, probe filter)",
115 "NB internal arrays parity error",
116 "DRAM addr/ctl signals parity error",
117 "IO link transmission error",
118 "L3 data cache ECC error", /* xec = 0x1c */
119 "L3 cache tag error",
120 "L3 LRU parity bits error",
121 "ECC Error in the Probe Filter directory"
122 };
123
124 static const char * const mc5_mce_desc[] = {
125 "CPU Watchdog timer expire",
126 "Wakeup array dest tag",
127 "AG payload array",
128 "EX payload array",
129 "IDRF array",
130 "Retire dispatch queue",
131 "Mapper checkpoint array",
132 "Physical register file EX0 port",
133 "Physical register file EX1 port",
134 "Physical register file AG0 port",
135 "Physical register file AG1 port",
136 "Flag register file",
137 "DE error occurred"
138 };
139
140 static bool f12h_mc0_mce(u16 ec, u8 xec)
141 {
142 bool ret = false;
143
144 if (MEM_ERROR(ec)) {
145 u8 ll = LL(ec);
146 ret = true;
147
148 if (ll == LL_L2)
149 pr_cont("during L1 linefill from L2.\n");
150 else if (ll == LL_L1)
151 pr_cont("Data/Tag %s error.\n", R4_MSG(ec));
152 else
153 ret = false;
154 }
155 return ret;
156 }
157
158 static bool f10h_mc0_mce(u16 ec, u8 xec)
159 {
160 if (R4(ec) == R4_GEN && LL(ec) == LL_L1) {
161 pr_cont("during data scrub.\n");
162 return true;
163 }
164 return f12h_mc0_mce(ec, xec);
165 }
166
167 static bool k8_mc0_mce(u16 ec, u8 xec)
168 {
169 if (BUS_ERROR(ec)) {
170 pr_cont("during system linefill.\n");
171 return true;
172 }
173
174 return f10h_mc0_mce(ec, xec);
175 }
176
177 static bool cat_mc0_mce(u16 ec, u8 xec)
178 {
179 u8 r4 = R4(ec);
180 bool ret = true;
181
182 if (MEM_ERROR(ec)) {
183
184 if (TT(ec) != TT_DATA || LL(ec) != LL_L1)
185 return false;
186
187 switch (r4) {
188 case R4_DRD:
189 case R4_DWR:
190 pr_cont("Data/Tag parity error due to %s.\n",
191 (r4 == R4_DRD ? "load/hw prf" : "store"));
192 break;
193 case R4_EVICT:
194 pr_cont("Copyback parity error on a tag miss.\n");
195 break;
196 case R4_SNOOP:
197 pr_cont("Tag parity error during snoop.\n");
198 break;
199 default:
200 ret = false;
201 }
202 } else if (BUS_ERROR(ec)) {
203
204 if ((II(ec) != II_MEM && II(ec) != II_IO) || LL(ec) != LL_LG)
205 return false;
206
207 pr_cont("System read data error on a ");
208
209 switch (r4) {
210 case R4_RD:
211 pr_cont("TLB reload.\n");
212 break;
213 case R4_DWR:
214 pr_cont("store.\n");
215 break;
216 case R4_DRD:
217 pr_cont("load.\n");
218 break;
219 default:
220 ret = false;
221 }
222 } else {
223 ret = false;
224 }
225
226 return ret;
227 }
228
229 static bool f15h_mc0_mce(u16 ec, u8 xec)
230 {
231 bool ret = true;
232
233 if (MEM_ERROR(ec)) {
234
235 switch (xec) {
236 case 0x0:
237 pr_cont("Data Array access error.\n");
238 break;
239
240 case 0x1:
241 pr_cont("UC error during a linefill from L2/NB.\n");
242 break;
243
244 case 0x2:
245 case 0x11:
246 pr_cont("STQ access error.\n");
247 break;
248
249 case 0x3:
250 pr_cont("SCB access error.\n");
251 break;
252
253 case 0x10:
254 pr_cont("Tag error.\n");
255 break;
256
257 case 0x12:
258 pr_cont("LDQ access error.\n");
259 break;
260
261 default:
262 ret = false;
263 }
264 } else if (BUS_ERROR(ec)) {
265
266 if (!xec)
267 pr_cont("System Read Data Error.\n");
268 else
269 pr_cont(" Internal error condition type %d.\n", xec);
270 } else
271 ret = false;
272
273 return ret;
274 }
275
276 static void decode_mc0_mce(struct mce *m)
277 {
278 u16 ec = EC(m->status);
279 u8 xec = XEC(m->status, xec_mask);
280
281 pr_emerg(HW_ERR "MC0 Error: ");
282
283 /* TLB error signatures are the same across families */
284 if (TLB_ERROR(ec)) {
285 if (TT(ec) == TT_DATA) {
286 pr_cont("%s TLB %s.\n", LL_MSG(ec),
287 ((xec == 2) ? "locked miss"
288 : (xec ? "multimatch" : "parity")));
289 return;
290 }
291 } else if (fam_ops->mc0_mce(ec, xec))
292 ;
293 else
294 pr_emerg(HW_ERR "Corrupted MC0 MCE info?\n");
295 }
296
297 static bool k8_mc1_mce(u16 ec, u8 xec)
298 {
299 u8 ll = LL(ec);
300 bool ret = true;
301
302 if (!MEM_ERROR(ec))
303 return false;
304
305 if (ll == 0x2)
306 pr_cont("during a linefill from L2.\n");
307 else if (ll == 0x1) {
308 switch (R4(ec)) {
309 case R4_IRD:
310 pr_cont("Parity error during data load.\n");
311 break;
312
313 case R4_EVICT:
314 pr_cont("Copyback Parity/Victim error.\n");
315 break;
316
317 case R4_SNOOP:
318 pr_cont("Tag Snoop error.\n");
319 break;
320
321 default:
322 ret = false;
323 break;
324 }
325 } else
326 ret = false;
327
328 return ret;
329 }
330
331 static bool cat_mc1_mce(u16 ec, u8 xec)
332 {
333 u8 r4 = R4(ec);
334 bool ret = true;
335
336 if (!MEM_ERROR(ec))
337 return false;
338
339 if (TT(ec) != TT_INSTR)
340 return false;
341
342 if (r4 == R4_IRD)
343 pr_cont("Data/tag array parity error for a tag hit.\n");
344 else if (r4 == R4_SNOOP)
345 pr_cont("Tag error during snoop/victimization.\n");
346 else if (xec == 0x0)
347 pr_cont("Tag parity error from victim castout.\n");
348 else if (xec == 0x2)
349 pr_cont("Microcode patch RAM parity error.\n");
350 else
351 ret = false;
352
353 return ret;
354 }
355
356 static bool f15h_mc1_mce(u16 ec, u8 xec)
357 {
358 bool ret = true;
359
360 if (!MEM_ERROR(ec))
361 return false;
362
363 switch (xec) {
364 case 0x0 ... 0xa:
365 pr_cont("%s.\n", f15h_mc1_mce_desc[xec]);
366 break;
367
368 case 0xd:
369 pr_cont("%s.\n", f15h_mc1_mce_desc[xec-2]);
370 break;
371
372 case 0x10:
373 pr_cont("%s.\n", f15h_mc1_mce_desc[xec-4]);
374 break;
375
376 case 0x11 ... 0x14:
377 pr_cont("Decoder %s parity error.\n", f15h_mc1_mce_desc[xec-4]);
378 break;
379
380 default:
381 ret = false;
382 }
383 return ret;
384 }
385
386 static void decode_mc1_mce(struct mce *m)
387 {
388 u16 ec = EC(m->status);
389 u8 xec = XEC(m->status, xec_mask);
390
391 pr_emerg(HW_ERR "MC1 Error: ");
392
393 if (TLB_ERROR(ec))
394 pr_cont("%s TLB %s.\n", LL_MSG(ec),
395 (xec ? "multimatch" : "parity error"));
396 else if (BUS_ERROR(ec)) {
397 bool k8 = (boot_cpu_data.x86 == 0xf && (m->status & BIT_64(58)));
398
399 pr_cont("during %s.\n", (k8 ? "system linefill" : "NB data read"));
400 } else if (fam_ops->mc1_mce(ec, xec))
401 ;
402 else
403 pr_emerg(HW_ERR "Corrupted MC1 MCE info?\n");
404 }
405
406 static bool k8_mc2_mce(u16 ec, u8 xec)
407 {
408 bool ret = true;
409
410 if (xec == 0x1)
411 pr_cont(" in the write data buffers.\n");
412 else if (xec == 0x3)
413 pr_cont(" in the victim data buffers.\n");
414 else if (xec == 0x2 && MEM_ERROR(ec))
415 pr_cont(": %s error in the L2 cache tags.\n", R4_MSG(ec));
416 else if (xec == 0x0) {
417 if (TLB_ERROR(ec))
418 pr_cont(": %s error in a Page Descriptor Cache or "
419 "Guest TLB.\n", TT_MSG(ec));
420 else if (BUS_ERROR(ec))
421 pr_cont(": %s/ECC error in data read from NB: %s.\n",
422 R4_MSG(ec), PP_MSG(ec));
423 else if (MEM_ERROR(ec)) {
424 u8 r4 = R4(ec);
425
426 if (r4 >= 0x7)
427 pr_cont(": %s error during data copyback.\n",
428 R4_MSG(ec));
429 else if (r4 <= 0x1)
430 pr_cont(": %s parity/ECC error during data "
431 "access from L2.\n", R4_MSG(ec));
432 else
433 ret = false;
434 } else
435 ret = false;
436 } else
437 ret = false;
438
439 return ret;
440 }
441
442 static bool f15h_mc2_mce(u16 ec, u8 xec)
443 {
444 bool ret = true;
445
446 if (TLB_ERROR(ec)) {
447 if (xec == 0x0)
448 pr_cont("Data parity TLB read error.\n");
449 else if (xec == 0x1)
450 pr_cont("Poison data provided for TLB fill.\n");
451 else
452 ret = false;
453 } else if (BUS_ERROR(ec)) {
454 if (xec > 2)
455 ret = false;
456
457 pr_cont("Error during attempted NB data read.\n");
458 } else if (MEM_ERROR(ec)) {
459 switch (xec) {
460 case 0x4 ... 0xc:
461 pr_cont("%s.\n", f15h_mc2_mce_desc[xec - 0x4]);
462 break;
463
464 case 0x10 ... 0x14:
465 pr_cont("%s.\n", f15h_mc2_mce_desc[xec - 0x7]);
466 break;
467
468 default:
469 ret = false;
470 }
471 }
472
473 return ret;
474 }
475
476 static bool f16h_mc2_mce(u16 ec, u8 xec)
477 {
478 u8 r4 = R4(ec);
479
480 if (!MEM_ERROR(ec))
481 return false;
482
483 switch (xec) {
484 case 0x04 ... 0x05:
485 pr_cont("%cBUFF parity error.\n", (r4 == R4_RD) ? 'I' : 'O');
486 break;
487
488 case 0x09 ... 0x0b:
489 case 0x0d ... 0x0f:
490 pr_cont("ECC error in L2 tag (%s).\n",
491 ((r4 == R4_GEN) ? "BankReq" :
492 ((r4 == R4_SNOOP) ? "Prb" : "Fill")));
493 break;
494
495 case 0x10 ... 0x19:
496 case 0x1b:
497 pr_cont("ECC error in L2 data array (%s).\n",
498 (((r4 == R4_RD) && !(xec & 0x3)) ? "Hit" :
499 ((r4 == R4_GEN) ? "Attr" :
500 ((r4 == R4_EVICT) ? "Vict" : "Fill"))));
501 break;
502
503 case 0x1c ... 0x1d:
504 case 0x1f:
505 pr_cont("Parity error in L2 attribute bits (%s).\n",
506 ((r4 == R4_RD) ? "Hit" :
507 ((r4 == R4_GEN) ? "Attr" : "Fill")));
508 break;
509
510 default:
511 return false;
512 }
513
514 return true;
515 }
516
517 static void decode_mc2_mce(struct mce *m)
518 {
519 u16 ec = EC(m->status);
520 u8 xec = XEC(m->status, xec_mask);
521
522 pr_emerg(HW_ERR "MC2 Error: ");
523
524 if (!fam_ops->mc2_mce(ec, xec))
525 pr_cont(HW_ERR "Corrupted MC2 MCE info?\n");
526 }
527
528 static void decode_mc3_mce(struct mce *m)
529 {
530 u16 ec = EC(m->status);
531 u8 xec = XEC(m->status, xec_mask);
532
533 if (boot_cpu_data.x86 >= 0x14) {
534 pr_emerg("You shouldn't be seeing MC3 MCE on this cpu family,"
535 " please report on LKML.\n");
536 return;
537 }
538
539 pr_emerg(HW_ERR "MC3 Error");
540
541 if (xec == 0x0) {
542 u8 r4 = R4(ec);
543
544 if (!BUS_ERROR(ec) || (r4 != R4_DRD && r4 != R4_DWR))
545 goto wrong_mc3_mce;
546
547 pr_cont(" during %s.\n", R4_MSG(ec));
548 } else
549 goto wrong_mc3_mce;
550
551 return;
552
553 wrong_mc3_mce:
554 pr_emerg(HW_ERR "Corrupted MC3 MCE info?\n");
555 }
556
557 static void decode_mc4_mce(struct mce *m)
558 {
559 struct cpuinfo_x86 *c = &boot_cpu_data;
560 int node_id = amd_get_nb_id(m->extcpu);
561 u16 ec = EC(m->status);
562 u8 xec = XEC(m->status, 0x1f);
563 u8 offset = 0;
564
565 pr_emerg(HW_ERR "MC4 Error (node %d): ", node_id);
566
567 switch (xec) {
568 case 0x0 ... 0xe:
569
570 /* special handling for DRAM ECCs */
571 if (xec == 0x0 || xec == 0x8) {
572 /* no ECCs on F11h */
573 if (c->x86 == 0x11)
574 goto wrong_mc4_mce;
575
576 pr_cont("%s.\n", mc4_mce_desc[xec]);
577
578 if (nb_bus_decoder)
579 nb_bus_decoder(node_id, m);
580 return;
581 }
582 break;
583
584 case 0xf:
585 if (TLB_ERROR(ec))
586 pr_cont("GART Table Walk data error.\n");
587 else if (BUS_ERROR(ec))
588 pr_cont("DMA Exclusion Vector Table Walk error.\n");
589 else
590 goto wrong_mc4_mce;
591 return;
592
593 case 0x19:
594 if (boot_cpu_data.x86 == 0x15 || boot_cpu_data.x86 == 0x16)
595 pr_cont("Compute Unit Data Error.\n");
596 else
597 goto wrong_mc4_mce;
598 return;
599
600 case 0x1c ... 0x1f:
601 offset = 13;
602 break;
603
604 default:
605 goto wrong_mc4_mce;
606 }
607
608 pr_cont("%s.\n", mc4_mce_desc[xec - offset]);
609 return;
610
611 wrong_mc4_mce:
612 pr_emerg(HW_ERR "Corrupted MC4 MCE info?\n");
613 }
614
615 static void decode_mc5_mce(struct mce *m)
616 {
617 struct cpuinfo_x86 *c = &boot_cpu_data;
618 u8 xec = XEC(m->status, xec_mask);
619
620 if (c->x86 == 0xf || c->x86 == 0x11)
621 goto wrong_mc5_mce;
622
623 pr_emerg(HW_ERR "MC5 Error: ");
624
625 if (xec == 0x0 || xec == 0xc)
626 pr_cont("%s.\n", mc5_mce_desc[xec]);
627 else if (xec < 0xd)
628 pr_cont("%s parity error.\n", mc5_mce_desc[xec]);
629 else
630 goto wrong_mc5_mce;
631
632 return;
633
634 wrong_mc5_mce:
635 pr_emerg(HW_ERR "Corrupted MC5 MCE info?\n");
636 }
637
638 static void decode_mc6_mce(struct mce *m)
639 {
640 u8 xec = XEC(m->status, xec_mask);
641
642 pr_emerg(HW_ERR "MC6 Error: ");
643
644 switch (xec) {
645 case 0x1:
646 pr_cont("Free List");
647 break;
648
649 case 0x2:
650 pr_cont("Physical Register File");
651 break;
652
653 case 0x3:
654 pr_cont("Retire Queue");
655 break;
656
657 case 0x4:
658 pr_cont("Scheduler table");
659 break;
660
661 case 0x5:
662 pr_cont("Status Register File");
663 break;
664
665 default:
666 goto wrong_mc6_mce;
667 break;
668 }
669
670 pr_cont(" parity error.\n");
671
672 return;
673
674 wrong_mc6_mce:
675 pr_emerg(HW_ERR "Corrupted MC6 MCE info?\n");
676 }
677
678 static inline void amd_decode_err_code(u16 ec)
679 {
680 if (INT_ERROR(ec)) {
681 pr_emerg(HW_ERR "internal: %s\n", UU_MSG(ec));
682 return;
683 }
684
685 pr_emerg(HW_ERR "cache level: %s", LL_MSG(ec));
686
687 if (BUS_ERROR(ec))
688 pr_cont(", mem/io: %s", II_MSG(ec));
689 else
690 pr_cont(", tx: %s", TT_MSG(ec));
691
692 if (MEM_ERROR(ec) || BUS_ERROR(ec)) {
693 pr_cont(", mem-tx: %s", R4_MSG(ec));
694
695 if (BUS_ERROR(ec))
696 pr_cont(", part-proc: %s (%s)", PP_MSG(ec), TO_MSG(ec));
697 }
698
699 pr_cont("\n");
700 }
701
702 /*
703 * Filter out unwanted MCE signatures here.
704 */
705 static bool amd_filter_mce(struct mce *m)
706 {
707 u8 xec = (m->status >> 16) & 0x1f;
708
709 /*
710 * NB GART TLB error reporting is disabled by default.
711 */
712 if (m->bank == 4 && xec == 0x5 && !report_gart_errors)
713 return true;
714
715 return false;
716 }
717
718 static const char *decode_error_status(struct mce *m)
719 {
720 if (m->status & MCI_STATUS_UC) {
721 if (m->status & MCI_STATUS_PCC)
722 return "System Fatal error.";
723 if (m->mcgstatus & MCG_STATUS_RIPV)
724 return "Uncorrected, software restartable error.";
725 return "Uncorrected, software containable error.";
726 }
727
728 if (m->status & MCI_STATUS_DEFERRED)
729 return "Deferred error.";
730
731 return "Corrected error, no action required.";
732 }
733
734 int amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)
735 {
736 struct mce *m = (struct mce *)data;
737 struct cpuinfo_x86 *c = &cpu_data(m->extcpu);
738 int ecc;
739
740 if (amd_filter_mce(m))
741 return NOTIFY_STOP;
742
743 switch (m->bank) {
744 case 0:
745 decode_mc0_mce(m);
746 break;
747
748 case 1:
749 decode_mc1_mce(m);
750 break;
751
752 case 2:
753 decode_mc2_mce(m);
754 break;
755
756 case 3:
757 decode_mc3_mce(m);
758 break;
759
760 case 4:
761 decode_mc4_mce(m);
762 break;
763
764 case 5:
765 decode_mc5_mce(m);
766 break;
767
768 case 6:
769 decode_mc6_mce(m);
770 break;
771
772 default:
773 break;
774 }
775
776 pr_emerg(HW_ERR "Error Status: %s\n", decode_error_status(m));
777
778 pr_emerg(HW_ERR "CPU:%d (%x:%x:%x) MC%d_STATUS[%s|%s|%s|%s|%s",
779 m->extcpu,
780 c->x86, c->x86_model, c->x86_mask,
781 m->bank,
782 ((m->status & MCI_STATUS_OVER) ? "Over" : "-"),
783 ((m->status & MCI_STATUS_UC) ? "UE" : "CE"),
784 ((m->status & MCI_STATUS_MISCV) ? "MiscV" : "-"),
785 ((m->status & MCI_STATUS_PCC) ? "PCC" : "-"),
786 ((m->status & MCI_STATUS_ADDRV) ? "AddrV" : "-"));
787
788 if (c->x86 == 0x15 || c->x86 == 0x16)
789 pr_cont("|%s|%s",
790 ((m->status & MCI_STATUS_DEFERRED) ? "Deferred" : "-"),
791 ((m->status & MCI_STATUS_POISON) ? "Poison" : "-"));
792
793 /* do the two bits[14:13] together */
794 ecc = (m->status >> 45) & 0x3;
795 if (ecc)
796 pr_cont("|%sECC", ((ecc == 2) ? "C" : "U"));
797
798 pr_cont("]: 0x%016llx\n", m->status);
799
800 if (m->status & MCI_STATUS_ADDRV)
801 pr_emerg(HW_ERR "MC%d_ADDR: 0x%016llx\n", m->bank, m->addr);
802
803 amd_decode_err_code(m->status & 0xffff);
804
805 return NOTIFY_STOP;
806 }
807 EXPORT_SYMBOL_GPL(amd_decode_mce);
808
809 static struct notifier_block amd_mce_dec_nb = {
810 .notifier_call = amd_decode_mce,
811 };
812
813 static int __init mce_amd_init(void)
814 {
815 struct cpuinfo_x86 *c = &boot_cpu_data;
816
817 if (c->x86_vendor != X86_VENDOR_AMD)
818 return 0;
819
820 if (c->x86 < 0xf || c->x86 > 0x16)
821 return 0;
822
823 fam_ops = kzalloc(sizeof(struct amd_decoder_ops), GFP_KERNEL);
824 if (!fam_ops)
825 return -ENOMEM;
826
827 switch (c->x86) {
828 case 0xf:
829 fam_ops->mc0_mce = k8_mc0_mce;
830 fam_ops->mc1_mce = k8_mc1_mce;
831 fam_ops->mc2_mce = k8_mc2_mce;
832 break;
833
834 case 0x10:
835 fam_ops->mc0_mce = f10h_mc0_mce;
836 fam_ops->mc1_mce = k8_mc1_mce;
837 fam_ops->mc2_mce = k8_mc2_mce;
838 break;
839
840 case 0x11:
841 fam_ops->mc0_mce = k8_mc0_mce;
842 fam_ops->mc1_mce = k8_mc1_mce;
843 fam_ops->mc2_mce = k8_mc2_mce;
844 break;
845
846 case 0x12:
847 fam_ops->mc0_mce = f12h_mc0_mce;
848 fam_ops->mc1_mce = k8_mc1_mce;
849 fam_ops->mc2_mce = k8_mc2_mce;
850 break;
851
852 case 0x14:
853 nb_err_cpumask = 0x3;
854 fam_ops->mc0_mce = cat_mc0_mce;
855 fam_ops->mc1_mce = cat_mc1_mce;
856 fam_ops->mc2_mce = k8_mc2_mce;
857 break;
858
859 case 0x15:
860 xec_mask = 0x1f;
861 fam_ops->mc0_mce = f15h_mc0_mce;
862 fam_ops->mc1_mce = f15h_mc1_mce;
863 fam_ops->mc2_mce = f15h_mc2_mce;
864 break;
865
866 case 0x16:
867 xec_mask = 0x1f;
868 fam_ops->mc0_mce = cat_mc0_mce;
869 fam_ops->mc1_mce = cat_mc1_mce;
870 fam_ops->mc2_mce = f16h_mc2_mce;
871 break;
872
873 default:
874 printk(KERN_WARNING "Huh? What family is it: 0x%x?!\n", c->x86);
875 kfree(fam_ops);
876 return -EINVAL;
877 }
878
879 pr_info("MCE: In-kernel MCE decoding enabled.\n");
880
881 mce_register_decode_chain(&amd_mce_dec_nb);
882
883 return 0;
884 }
885 early_initcall(mce_amd_init);
886
887 #ifdef MODULE
888 static void __exit mce_amd_exit(void)
889 {
890 mce_unregister_decode_chain(&amd_mce_dec_nb);
891 kfree(fam_ops);
892 }
893
894 MODULE_DESCRIPTION("AMD MCE decoder");
895 MODULE_ALIAS("edac-mce-amd");
896 MODULE_LICENSE("GPL");
897 module_exit(mce_amd_exit);
898 #endif