]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/edac/mce_amd.c
Merge branch 'ipvs'
[karo-tx-linux.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 };
83
84 static const char * const f15h_mc2_mce_desc[] = {
85         "Fill ECC error on data fills",                 /* xec = 0x4 */
86         "Fill parity error on insn fills",
87         "Prefetcher request FIFO parity error",
88         "PRQ address parity error",
89         "PRQ data parity error",
90         "WCC Tag ECC error",
91         "WCC Data ECC error",
92         "WCB Data parity error",
93         "VB Data ECC or parity error",
94         "L2 Tag ECC error",                             /* xec = 0x10 */
95         "Hard L2 Tag ECC error",
96         "Multiple hits on L2 tag",
97         "XAB parity error",
98         "PRB address parity error"
99 };
100
101 static const char * const mc4_mce_desc[] = {
102         "DRAM ECC error detected on the NB",
103         "CRC error detected on HT link",
104         "Link-defined sync error packets detected on HT link",
105         "HT Master abort",
106         "HT Target abort",
107         "Invalid GART PTE entry during GART table walk",
108         "Unsupported atomic RMW received from an IO link",
109         "Watchdog timeout due to lack of progress",
110         "DRAM ECC error detected on the NB",
111         "SVM DMA Exclusion Vector error",
112         "HT data error detected on link",
113         "Protocol error (link, L3, probe filter)",
114         "NB internal arrays parity error",
115         "DRAM addr/ctl signals parity error",
116         "IO link transmission error",
117         "L3 data cache ECC error",                      /* xec = 0x1c */
118         "L3 cache tag error",
119         "L3 LRU parity bits error",
120         "ECC Error in the Probe Filter directory"
121 };
122
123 static const char * const mc5_mce_desc[] = {
124         "CPU Watchdog timer expire",
125         "Wakeup array dest tag",
126         "AG payload array",
127         "EX payload array",
128         "IDRF array",
129         "Retire dispatch queue",
130         "Mapper checkpoint array",
131         "Physical register file EX0 port",
132         "Physical register file EX1 port",
133         "Physical register file AG0 port",
134         "Physical register file AG1 port",
135         "Flag register file",
136         "DE error occurred",
137         "Retire status queue"
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         pr_emerg(HW_ERR "%s\n", decode_error_status(m));
744
745         pr_emerg(HW_ERR "CPU:%d (%x:%x:%x) MC%d_STATUS[%s|%s|%s|%s|%s",
746                 m->extcpu,
747                 c->x86, c->x86_model, c->x86_mask,
748                 m->bank,
749                 ((m->status & MCI_STATUS_OVER)  ? "Over"  : "-"),
750                 ((m->status & MCI_STATUS_UC)    ? "UE"    : "CE"),
751                 ((m->status & MCI_STATUS_MISCV) ? "MiscV" : "-"),
752                 ((m->status & MCI_STATUS_PCC)   ? "PCC"   : "-"),
753                 ((m->status & MCI_STATUS_ADDRV) ? "AddrV" : "-"));
754
755         if (c->x86 == 0x15 || c->x86 == 0x16)
756                 pr_cont("|%s|%s",
757                         ((m->status & MCI_STATUS_DEFERRED) ? "Deferred" : "-"),
758                         ((m->status & MCI_STATUS_POISON)   ? "Poison"   : "-"));
759
760         /* do the two bits[14:13] together */
761         ecc = (m->status >> 45) & 0x3;
762         if (ecc)
763                 pr_cont("|%sECC", ((ecc == 2) ? "C" : "U"));
764
765         pr_cont("]: 0x%016llx\n", m->status);
766
767         if (m->status & MCI_STATUS_ADDRV)
768                 pr_emerg(HW_ERR "MC%d_ADDR: 0x%016llx\n", m->bank, m->addr);
769
770         if (!fam_ops)
771                 goto err_code;
772
773         switch (m->bank) {
774         case 0:
775                 decode_mc0_mce(m);
776                 break;
777
778         case 1:
779                 decode_mc1_mce(m);
780                 break;
781
782         case 2:
783                 decode_mc2_mce(m);
784                 break;
785
786         case 3:
787                 decode_mc3_mce(m);
788                 break;
789
790         case 4:
791                 decode_mc4_mce(m);
792                 break;
793
794         case 5:
795                 decode_mc5_mce(m);
796                 break;
797
798         case 6:
799                 decode_mc6_mce(m);
800                 break;
801
802         default:
803                 break;
804         }
805
806  err_code:
807         amd_decode_err_code(m->status & 0xffff);
808
809         return NOTIFY_STOP;
810 }
811 EXPORT_SYMBOL_GPL(amd_decode_mce);
812
813 static struct notifier_block amd_mce_dec_nb = {
814         .notifier_call  = amd_decode_mce,
815 };
816
817 static int __init mce_amd_init(void)
818 {
819         struct cpuinfo_x86 *c = &boot_cpu_data;
820
821         if (c->x86_vendor != X86_VENDOR_AMD)
822                 return -ENODEV;
823
824         fam_ops = kzalloc(sizeof(struct amd_decoder_ops), GFP_KERNEL);
825         if (!fam_ops)
826                 return -ENOMEM;
827
828         switch (c->x86) {
829         case 0xf:
830                 fam_ops->mc0_mce = k8_mc0_mce;
831                 fam_ops->mc1_mce = k8_mc1_mce;
832                 fam_ops->mc2_mce = k8_mc2_mce;
833                 break;
834
835         case 0x10:
836                 fam_ops->mc0_mce = f10h_mc0_mce;
837                 fam_ops->mc1_mce = k8_mc1_mce;
838                 fam_ops->mc2_mce = k8_mc2_mce;
839                 break;
840
841         case 0x11:
842                 fam_ops->mc0_mce = k8_mc0_mce;
843                 fam_ops->mc1_mce = k8_mc1_mce;
844                 fam_ops->mc2_mce = k8_mc2_mce;
845                 break;
846
847         case 0x12:
848                 fam_ops->mc0_mce = f12h_mc0_mce;
849                 fam_ops->mc1_mce = k8_mc1_mce;
850                 fam_ops->mc2_mce = k8_mc2_mce;
851                 break;
852
853         case 0x14:
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                 fam_ops = NULL;
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