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