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