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