1#include "amd64_edac.h"
2#include <asm/amd_nb.h>
3
4static struct edac_pci_ctl_info *pci_ctl;
5
6static int report_gart_errors;
7module_param(report_gart_errors, int, 0644);
8
9
10
11
12
13static int ecc_enable_override;
14module_param(ecc_enable_override, int, 0644);
15
16static struct msr __percpu *msrs;
17
18
19
20
21static atomic_t drv_instances = ATOMIC_INIT(0);
22
23
24static struct ecc_settings **ecc_stngs;
25
26
27
28
29
30
31
32
33static const struct scrubrate {
34 u32 scrubval;
35 u32 bandwidth;
36} scrubrates[] = {
37 { 0x01, 1600000000UL},
38 { 0x02, 800000000UL},
39 { 0x03, 400000000UL},
40 { 0x04, 200000000UL},
41 { 0x05, 100000000UL},
42 { 0x06, 50000000UL},
43 { 0x07, 25000000UL},
44 { 0x08, 12284069UL},
45 { 0x09, 6274509UL},
46 { 0x0A, 3121951UL},
47 { 0x0B, 1560975UL},
48 { 0x0C, 781440UL},
49 { 0x0D, 390720UL},
50 { 0x0E, 195300UL},
51 { 0x0F, 97650UL},
52 { 0x10, 48854UL},
53 { 0x11, 24427UL},
54 { 0x12, 12213UL},
55 { 0x13, 6101UL},
56 { 0x14, 3051UL},
57 { 0x15, 1523UL},
58 { 0x16, 761UL},
59 { 0x00, 0UL},
60};
61
62int __amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset,
63 u32 *val, const char *func)
64{
65 int err = 0;
66
67 err = pci_read_config_dword(pdev, offset, val);
68 if (err)
69 amd64_warn("%s: error reading F%dx%03x.\n",
70 func, PCI_FUNC(pdev->devfn), offset);
71
72 return err;
73}
74
75int __amd64_write_pci_cfg_dword(struct pci_dev *pdev, int offset,
76 u32 val, const char *func)
77{
78 int err = 0;
79
80 err = pci_write_config_dword(pdev, offset, val);
81 if (err)
82 amd64_warn("%s: error writing to F%dx%03x.\n",
83 func, PCI_FUNC(pdev->devfn), offset);
84
85 return err;
86}
87
88
89
90
91static void f15h_select_dct(struct amd64_pvt *pvt, u8 dct)
92{
93 u32 reg = 0;
94
95 amd64_read_pci_cfg(pvt->F1, DCT_CFG_SEL, ®);
96 reg &= (pvt->model == 0x30) ? ~3 : ~1;
97 reg |= dct;
98 amd64_write_pci_cfg(pvt->F1, DCT_CFG_SEL, reg);
99}
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115static inline int amd64_read_dct_pci_cfg(struct amd64_pvt *pvt, u8 dct,
116 int offset, u32 *val)
117{
118 switch (pvt->fam) {
119 case 0xf:
120 if (dct || offset >= 0x100)
121 return -EINVAL;
122 break;
123
124 case 0x10:
125 if (dct) {
126
127
128
129
130
131 if (dct_ganging_enabled(pvt))
132 return 0;
133
134 offset += 0x100;
135 }
136 break;
137
138 case 0x15:
139
140
141
142
143 dct = (dct && pvt->model == 0x30) ? 3 : dct;
144 f15h_select_dct(pvt, dct);
145 break;
146
147 case 0x16:
148 if (dct)
149 return -EINVAL;
150 break;
151
152 default:
153 break;
154 }
155 return amd64_read_pci_cfg(pvt->F2, offset, val);
156}
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176static int __set_scrub_rate(struct amd64_pvt *pvt, u32 new_bw, u32 min_rate)
177{
178 u32 scrubval;
179 int i;
180
181
182
183
184
185
186
187
188
189
190 for (i = 0; i < ARRAY_SIZE(scrubrates) - 1; i++) {
191
192
193
194
195 if (scrubrates[i].scrubval < min_rate)
196 continue;
197
198 if (scrubrates[i].bandwidth <= new_bw)
199 break;
200 }
201
202 scrubval = scrubrates[i].scrubval;
203
204 if (pvt->fam == 0x15 && pvt->model == 0x60) {
205 f15h_select_dct(pvt, 0);
206 pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
207 f15h_select_dct(pvt, 1);
208 pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
209 } else {
210 pci_write_bits32(pvt->F3, SCRCTRL, scrubval, 0x001F);
211 }
212
213 if (scrubval)
214 return scrubrates[i].bandwidth;
215
216 return 0;
217}
218
219static int set_scrub_rate(struct mem_ctl_info *mci, u32 bw)
220{
221 struct amd64_pvt *pvt = mci->pvt_info;
222 u32 min_scrubrate = 0x5;
223
224 if (pvt->fam == 0xf)
225 min_scrubrate = 0x0;
226
227 if (pvt->fam == 0x15) {
228
229 if (pvt->model < 0x10)
230 f15h_select_dct(pvt, 0);
231
232 if (pvt->model == 0x60)
233 min_scrubrate = 0x6;
234 }
235 return __set_scrub_rate(pvt, bw, min_scrubrate);
236}
237
238static int get_scrub_rate(struct mem_ctl_info *mci)
239{
240 struct amd64_pvt *pvt = mci->pvt_info;
241 u32 scrubval = 0;
242 int i, retval = -EINVAL;
243
244 if (pvt->fam == 0x15) {
245
246 if (pvt->model < 0x10)
247 f15h_select_dct(pvt, 0);
248
249 if (pvt->model == 0x60)
250 amd64_read_pci_cfg(pvt->F2, F15H_M60H_SCRCTRL, &scrubval);
251 } else
252 amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
253
254 scrubval = scrubval & 0x001F;
255
256 for (i = 0; i < ARRAY_SIZE(scrubrates); i++) {
257 if (scrubrates[i].scrubval == scrubval) {
258 retval = scrubrates[i].bandwidth;
259 break;
260 }
261 }
262 return retval;
263}
264
265
266
267
268
269static bool base_limit_match(struct amd64_pvt *pvt, u64 sys_addr, u8 nid)
270{
271 u64 addr;
272
273
274
275
276
277
278
279 addr = sys_addr & 0x000000ffffffffffull;
280
281 return ((addr >= get_dram_base(pvt, nid)) &&
282 (addr <= get_dram_limit(pvt, nid)));
283}
284
285
286
287
288
289
290
291static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci,
292 u64 sys_addr)
293{
294 struct amd64_pvt *pvt;
295 u8 node_id;
296 u32 intlv_en, bits;
297
298
299
300
301
302 pvt = mci->pvt_info;
303
304
305
306
307
308
309 intlv_en = dram_intlv_en(pvt, 0);
310
311 if (intlv_en == 0) {
312 for (node_id = 0; node_id < DRAM_RANGES; node_id++) {
313 if (base_limit_match(pvt, sys_addr, node_id))
314 goto found;
315 }
316 goto err_no_match;
317 }
318
319 if (unlikely((intlv_en != 0x01) &&
320 (intlv_en != 0x03) &&
321 (intlv_en != 0x07))) {
322 amd64_warn("DRAM Base[IntlvEn] junk value: 0x%x, BIOS bug?\n", intlv_en);
323 return NULL;
324 }
325
326 bits = (((u32) sys_addr) >> 12) & intlv_en;
327
328 for (node_id = 0; ; ) {
329 if ((dram_intlv_sel(pvt, node_id) & intlv_en) == bits)
330 break;
331
332 if (++node_id >= DRAM_RANGES)
333 goto err_no_match;
334 }
335
336
337 if (unlikely(!base_limit_match(pvt, sys_addr, node_id))) {
338 amd64_warn("%s: sys_addr 0x%llx falls outside base/limit address"
339 "range for node %d with node interleaving enabled.\n",
340 __func__, sys_addr, node_id);
341 return NULL;
342 }
343
344found:
345 return edac_mc_find((int)node_id);
346
347err_no_match:
348 edac_dbg(2, "sys_addr 0x%lx doesn't match any node\n",
349 (unsigned long)sys_addr);
350
351 return NULL;
352}
353
354
355
356
357
358static void get_cs_base_and_mask(struct amd64_pvt *pvt, int csrow, u8 dct,
359 u64 *base, u64 *mask)
360{
361 u64 csbase, csmask, base_bits, mask_bits;
362 u8 addr_shift;
363
364 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
365 csbase = pvt->csels[dct].csbases[csrow];
366 csmask = pvt->csels[dct].csmasks[csrow];
367 base_bits = GENMASK_ULL(31, 21) | GENMASK_ULL(15, 9);
368 mask_bits = GENMASK_ULL(29, 21) | GENMASK_ULL(15, 9);
369 addr_shift = 4;
370
371
372
373
374
375 } else if (pvt->fam == 0x16 ||
376 (pvt->fam == 0x15 && pvt->model >= 0x30)) {
377 csbase = pvt->csels[dct].csbases[csrow];
378 csmask = pvt->csels[dct].csmasks[csrow >> 1];
379
380 *base = (csbase & GENMASK_ULL(15, 5)) << 6;
381 *base |= (csbase & GENMASK_ULL(30, 19)) << 8;
382
383 *mask = ~0ULL;
384
385 *mask &= ~((GENMASK_ULL(15, 5) << 6) |
386 (GENMASK_ULL(30, 19) << 8));
387
388 *mask |= (csmask & GENMASK_ULL(15, 5)) << 6;
389 *mask |= (csmask & GENMASK_ULL(30, 19)) << 8;
390
391 return;
392 } else {
393 csbase = pvt->csels[dct].csbases[csrow];
394 csmask = pvt->csels[dct].csmasks[csrow >> 1];
395 addr_shift = 8;
396
397 if (pvt->fam == 0x15)
398 base_bits = mask_bits =
399 GENMASK_ULL(30,19) | GENMASK_ULL(13,5);
400 else
401 base_bits = mask_bits =
402 GENMASK_ULL(28,19) | GENMASK_ULL(13,5);
403 }
404
405 *base = (csbase & base_bits) << addr_shift;
406
407 *mask = ~0ULL;
408
409 *mask &= ~(mask_bits << addr_shift);
410
411 *mask |= (csmask & mask_bits) << addr_shift;
412}
413
414#define for_each_chip_select(i, dct, pvt) \
415 for (i = 0; i < pvt->csels[dct].b_cnt; i++)
416
417#define chip_select_base(i, dct, pvt) \
418 pvt->csels[dct].csbases[i]
419
420#define for_each_chip_select_mask(i, dct, pvt) \
421 for (i = 0; i < pvt->csels[dct].m_cnt; i++)
422
423
424
425
426
427static int input_addr_to_csrow(struct mem_ctl_info *mci, u64 input_addr)
428{
429 struct amd64_pvt *pvt;
430 int csrow;
431 u64 base, mask;
432
433 pvt = mci->pvt_info;
434
435 for_each_chip_select(csrow, 0, pvt) {
436 if (!csrow_enabled(csrow, 0, pvt))
437 continue;
438
439 get_cs_base_and_mask(pvt, csrow, 0, &base, &mask);
440
441 mask = ~mask;
442
443 if ((input_addr & mask) == (base & mask)) {
444 edac_dbg(2, "InputAddr 0x%lx matches csrow %d (node %d)\n",
445 (unsigned long)input_addr, csrow,
446 pvt->mc_node_id);
447
448 return csrow;
449 }
450 }
451 edac_dbg(2, "no matching csrow for InputAddr 0x%lx (MC node %d)\n",
452 (unsigned long)input_addr, pvt->mc_node_id);
453
454 return -1;
455}
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473int amd64_get_dram_hole_info(struct mem_ctl_info *mci, u64 *hole_base,
474 u64 *hole_offset, u64 *hole_size)
475{
476 struct amd64_pvt *pvt = mci->pvt_info;
477
478
479 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_E) {
480 edac_dbg(1, " revision %d for node %d does not support DHAR\n",
481 pvt->ext_model, pvt->mc_node_id);
482 return 1;
483 }
484
485
486 if (pvt->fam >= 0x10 && !dhar_mem_hoist_valid(pvt)) {
487 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this system\n");
488 return 1;
489 }
490
491 if (!dhar_valid(pvt)) {
492 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this node %d\n",
493 pvt->mc_node_id);
494 return 1;
495 }
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515 *hole_base = dhar_base(pvt);
516 *hole_size = (1ULL << 32) - *hole_base;
517
518 *hole_offset = (pvt->fam > 0xf) ? f10_dhar_offset(pvt)
519 : k8_dhar_offset(pvt);
520
521 edac_dbg(1, " DHAR info for node %d base 0x%lx offset 0x%lx size 0x%lx\n",
522 pvt->mc_node_id, (unsigned long)*hole_base,
523 (unsigned long)*hole_offset, (unsigned long)*hole_size);
524
525 return 0;
526}
527EXPORT_SYMBOL_GPL(amd64_get_dram_hole_info);
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558static u64 sys_addr_to_dram_addr(struct mem_ctl_info *mci, u64 sys_addr)
559{
560 struct amd64_pvt *pvt = mci->pvt_info;
561 u64 dram_base, hole_base, hole_offset, hole_size, dram_addr;
562 int ret;
563
564 dram_base = get_dram_base(pvt, pvt->mc_node_id);
565
566 ret = amd64_get_dram_hole_info(mci, &hole_base, &hole_offset,
567 &hole_size);
568 if (!ret) {
569 if ((sys_addr >= (1ULL << 32)) &&
570 (sys_addr < ((1ULL << 32) + hole_size))) {
571
572 dram_addr = sys_addr - hole_offset;
573
574 edac_dbg(2, "using DHAR to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
575 (unsigned long)sys_addr,
576 (unsigned long)dram_addr);
577
578 return dram_addr;
579 }
580 }
581
582
583
584
585
586
587
588
589
590
591 dram_addr = (sys_addr & GENMASK_ULL(39, 0)) - dram_base;
592
593 edac_dbg(2, "using DRAM Base register to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
594 (unsigned long)sys_addr, (unsigned long)dram_addr);
595 return dram_addr;
596}
597
598
599
600
601
602
603static int num_node_interleave_bits(unsigned intlv_en)
604{
605 static const int intlv_shift_table[] = { 0, 1, 0, 2, 0, 0, 0, 3 };
606 int n;
607
608 BUG_ON(intlv_en > 7);
609 n = intlv_shift_table[intlv_en];
610 return n;
611}
612
613
614static u64 dram_addr_to_input_addr(struct mem_ctl_info *mci, u64 dram_addr)
615{
616 struct amd64_pvt *pvt;
617 int intlv_shift;
618 u64 input_addr;
619
620 pvt = mci->pvt_info;
621
622
623
624
625
626 intlv_shift = num_node_interleave_bits(dram_intlv_en(pvt, 0));
627 input_addr = ((dram_addr >> intlv_shift) & GENMASK_ULL(35, 12)) +
628 (dram_addr & 0xfff);
629
630 edac_dbg(2, " Intlv Shift=%d DramAddr=0x%lx maps to InputAddr=0x%lx\n",
631 intlv_shift, (unsigned long)dram_addr,
632 (unsigned long)input_addr);
633
634 return input_addr;
635}
636
637
638
639
640
641static u64 sys_addr_to_input_addr(struct mem_ctl_info *mci, u64 sys_addr)
642{
643 u64 input_addr;
644
645 input_addr =
646 dram_addr_to_input_addr(mci, sys_addr_to_dram_addr(mci, sys_addr));
647
648 edac_dbg(2, "SysAdddr 0x%lx translates to InputAddr 0x%lx\n",
649 (unsigned long)sys_addr, (unsigned long)input_addr);
650
651 return input_addr;
652}
653
654
655static inline void error_address_to_page_and_offset(u64 error_address,
656 struct err_info *err)
657{
658 err->page = (u32) (error_address >> PAGE_SHIFT);
659 err->offset = ((u32) error_address) & ~PAGE_MASK;
660}
661
662
663
664
665
666
667
668
669
670static int sys_addr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr)
671{
672 int csrow;
673
674 csrow = input_addr_to_csrow(mci, sys_addr_to_input_addr(mci, sys_addr));
675
676 if (csrow == -1)
677 amd64_mc_err(mci, "Failed to translate InputAddr to csrow for "
678 "address 0x%lx\n", (unsigned long)sys_addr);
679 return csrow;
680}
681
682static int get_channel_from_ecc_syndrome(struct mem_ctl_info *, u16);
683
684
685
686
687
688static unsigned long determine_edac_cap(struct amd64_pvt *pvt)
689{
690 u8 bit;
691 unsigned long edac_cap = EDAC_FLAG_NONE;
692
693 bit = (pvt->fam > 0xf || pvt->ext_model >= K8_REV_F)
694 ? 19
695 : 17;
696
697 if (pvt->dclr0 & BIT(bit))
698 edac_cap = EDAC_FLAG_SECDED;
699
700 return edac_cap;
701}
702
703static void debug_display_dimm_sizes(struct amd64_pvt *, u8);
704
705static void debug_dump_dramcfg_low(struct amd64_pvt *pvt, u32 dclr, int chan)
706{
707 edac_dbg(1, "F2x%d90 (DRAM Cfg Low): 0x%08x\n", chan, dclr);
708
709 if (pvt->dram_type == MEM_LRDDR3) {
710 u32 dcsm = pvt->csels[chan].csmasks[0];
711
712
713
714
715
716 edac_dbg(1, " LRDIMM %dx rank multiply\n", (dcsm & 0x3));
717 }
718
719 edac_dbg(1, "All DIMMs support ECC:%s\n",
720 (dclr & BIT(19)) ? "yes" : "no");
721
722
723 edac_dbg(1, " PAR/ERR parity: %s\n",
724 (dclr & BIT(8)) ? "enabled" : "disabled");
725
726 if (pvt->fam == 0x10)
727 edac_dbg(1, " DCT 128bit mode width: %s\n",
728 (dclr & BIT(11)) ? "128b" : "64b");
729
730 edac_dbg(1, " x4 logical DIMMs present: L0: %s L1: %s L2: %s L3: %s\n",
731 (dclr & BIT(12)) ? "yes" : "no",
732 (dclr & BIT(13)) ? "yes" : "no",
733 (dclr & BIT(14)) ? "yes" : "no",
734 (dclr & BIT(15)) ? "yes" : "no");
735}
736
737
738static void dump_misc_regs(struct amd64_pvt *pvt)
739{
740 edac_dbg(1, "F3xE8 (NB Cap): 0x%08x\n", pvt->nbcap);
741
742 edac_dbg(1, " NB two channel DRAM capable: %s\n",
743 (pvt->nbcap & NBCAP_DCT_DUAL) ? "yes" : "no");
744
745 edac_dbg(1, " ECC capable: %s, ChipKill ECC capable: %s\n",
746 (pvt->nbcap & NBCAP_SECDED) ? "yes" : "no",
747 (pvt->nbcap & NBCAP_CHIPKILL) ? "yes" : "no");
748
749 debug_dump_dramcfg_low(pvt, pvt->dclr0, 0);
750
751 edac_dbg(1, "F3xB0 (Online Spare): 0x%08x\n", pvt->online_spare);
752
753 edac_dbg(1, "F1xF0 (DRAM Hole Address): 0x%08x, base: 0x%08x, offset: 0x%08x\n",
754 pvt->dhar, dhar_base(pvt),
755 (pvt->fam == 0xf) ? k8_dhar_offset(pvt)
756 : f10_dhar_offset(pvt));
757
758 edac_dbg(1, " DramHoleValid: %s\n", dhar_valid(pvt) ? "yes" : "no");
759
760 debug_display_dimm_sizes(pvt, 0);
761
762
763 if (pvt->fam == 0xf)
764 return;
765
766 debug_display_dimm_sizes(pvt, 1);
767
768 amd64_info("using %s syndromes.\n", ((pvt->ecc_sym_sz == 8) ? "x8" : "x4"));
769
770
771 if (!dct_ganging_enabled(pvt))
772 debug_dump_dramcfg_low(pvt, pvt->dclr1, 1);
773}
774
775
776
777
778static void prep_chip_selects(struct amd64_pvt *pvt)
779{
780 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
781 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
782 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 8;
783 } else if (pvt->fam == 0x15 && pvt->model == 0x30) {
784 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 4;
785 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 2;
786 } else {
787 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
788 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 4;
789 }
790}
791
792
793
794
795static void read_dct_base_mask(struct amd64_pvt *pvt)
796{
797 int cs;
798
799 prep_chip_selects(pvt);
800
801 for_each_chip_select(cs, 0, pvt) {
802 int reg0 = DCSB0 + (cs * 4);
803 int reg1 = DCSB1 + (cs * 4);
804 u32 *base0 = &pvt->csels[0].csbases[cs];
805 u32 *base1 = &pvt->csels[1].csbases[cs];
806
807 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0))
808 edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n",
809 cs, *base0, reg0);
810
811 if (pvt->fam == 0xf)
812 continue;
813
814 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1))
815 edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n",
816 cs, *base1, (pvt->fam == 0x10) ? reg1
817 : reg0);
818 }
819
820 for_each_chip_select_mask(cs, 0, pvt) {
821 int reg0 = DCSM0 + (cs * 4);
822 int reg1 = DCSM1 + (cs * 4);
823 u32 *mask0 = &pvt->csels[0].csmasks[cs];
824 u32 *mask1 = &pvt->csels[1].csmasks[cs];
825
826 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0))
827 edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n",
828 cs, *mask0, reg0);
829
830 if (pvt->fam == 0xf)
831 continue;
832
833 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1))
834 edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n",
835 cs, *mask1, (pvt->fam == 0x10) ? reg1
836 : reg0);
837 }
838}
839
840static void determine_memory_type(struct amd64_pvt *pvt)
841{
842 u32 dram_ctrl, dcsm;
843
844 switch (pvt->fam) {
845 case 0xf:
846 if (pvt->ext_model >= K8_REV_F)
847 goto ddr3;
848
849 pvt->dram_type = (pvt->dclr0 & BIT(18)) ? MEM_DDR : MEM_RDDR;
850 return;
851
852 case 0x10:
853 if (pvt->dchr0 & DDR3_MODE)
854 goto ddr3;
855
856 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR2 : MEM_RDDR2;
857 return;
858
859 case 0x15:
860 if (pvt->model < 0x60)
861 goto ddr3;
862
863
864
865
866
867
868
869
870
871
872 amd64_read_dct_pci_cfg(pvt, 0, DRAM_CONTROL, &dram_ctrl);
873 dcsm = pvt->csels[0].csmasks[0];
874
875 if (((dram_ctrl >> 8) & 0x7) == 0x2)
876 pvt->dram_type = MEM_DDR4;
877 else if (pvt->dclr0 & BIT(16))
878 pvt->dram_type = MEM_DDR3;
879 else if (dcsm & 0x3)
880 pvt->dram_type = MEM_LRDDR3;
881 else
882 pvt->dram_type = MEM_RDDR3;
883
884 return;
885
886 case 0x16:
887 goto ddr3;
888
889 default:
890 WARN(1, KERN_ERR "%s: Family??? 0x%x\n", __func__, pvt->fam);
891 pvt->dram_type = MEM_EMPTY;
892 }
893 return;
894
895ddr3:
896 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR3 : MEM_RDDR3;
897}
898
899
900static int k8_early_channel_count(struct amd64_pvt *pvt)
901{
902 int flag;
903
904 if (pvt->ext_model >= K8_REV_F)
905
906 flag = pvt->dclr0 & WIDTH_128;
907 else
908
909 flag = pvt->dclr0 & REVE_WIDTH_128;
910
911
912 pvt->dclr1 = 0;
913
914 return (flag) ? 2 : 1;
915}
916
917
918static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m)
919{
920 u16 mce_nid = amd_get_nb_id(m->extcpu);
921 struct mem_ctl_info *mci;
922 u8 start_bit = 1;
923 u8 end_bit = 47;
924 u64 addr;
925
926 mci = edac_mc_find(mce_nid);
927 if (!mci)
928 return 0;
929
930 pvt = mci->pvt_info;
931
932 if (pvt->fam == 0xf) {
933 start_bit = 3;
934 end_bit = 39;
935 }
936
937 addr = m->addr & GENMASK_ULL(end_bit, start_bit);
938
939
940
941
942 if (pvt->fam == 0x15) {
943 u64 cc6_base, tmp_addr;
944 u32 tmp;
945 u8 intlv_en;
946
947 if ((addr & GENMASK_ULL(47, 24)) >> 24 != 0x00fdf7)
948 return addr;
949
950
951 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_LIM, &tmp);
952 intlv_en = tmp >> 21 & 0x7;
953
954
955 cc6_base = (tmp & GENMASK_ULL(20, 0)) << 3;
956
957
958 cc6_base |= intlv_en ^ 0x7;
959
960
961 cc6_base <<= 24;
962
963 if (!intlv_en)
964 return cc6_base | (addr & GENMASK_ULL(23, 0));
965
966 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_BASE, &tmp);
967
968
969 tmp_addr = (addr & GENMASK_ULL(23, 12)) << __fls(intlv_en + 1);
970
971
972 tmp_addr |= (tmp & GENMASK_ULL(23, 21)) >> 9;
973
974
975 tmp_addr |= addr & GENMASK_ULL(11, 0);
976
977 return cc6_base | tmp_addr;
978 }
979
980 return addr;
981}
982
983static struct pci_dev *pci_get_related_function(unsigned int vendor,
984 unsigned int device,
985 struct pci_dev *related)
986{
987 struct pci_dev *dev = NULL;
988
989 while ((dev = pci_get_device(vendor, device, dev))) {
990 if (pci_domain_nr(dev->bus) == pci_domain_nr(related->bus) &&
991 (dev->bus->number == related->bus->number) &&
992 (PCI_SLOT(dev->devfn) == PCI_SLOT(related->devfn)))
993 break;
994 }
995
996 return dev;
997}
998
999static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range)
1000{
1001 struct amd_northbridge *nb;
1002 struct pci_dev *f1 = NULL;
1003 unsigned int pci_func;
1004 int off = range << 3;
1005 u32 llim;
1006
1007 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_LO + off, &pvt->ranges[range].base.lo);
1008 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_LO + off, &pvt->ranges[range].lim.lo);
1009
1010 if (pvt->fam == 0xf)
1011 return;
1012
1013 if (!dram_rw(pvt, range))
1014 return;
1015
1016 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_HI + off, &pvt->ranges[range].base.hi);
1017 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi);
1018
1019
1020 if (pvt->fam != 0x15)
1021 return;
1022
1023 nb = node_to_amd_nb(dram_dst_node(pvt, range));
1024 if (WARN_ON(!nb))
1025 return;
1026
1027 if (pvt->model == 0x60)
1028 pci_func = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1;
1029 else if (pvt->model == 0x30)
1030 pci_func = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1;
1031 else
1032 pci_func = PCI_DEVICE_ID_AMD_15H_NB_F1;
1033
1034 f1 = pci_get_related_function(nb->misc->vendor, pci_func, nb->misc);
1035 if (WARN_ON(!f1))
1036 return;
1037
1038 amd64_read_pci_cfg(f1, DRAM_LOCAL_NODE_LIM, &llim);
1039
1040 pvt->ranges[range].lim.lo &= GENMASK_ULL(15, 0);
1041
1042
1043 pvt->ranges[range].lim.lo |= ((llim & 0x1fff) << 3 | 0x7) << 16;
1044
1045 pvt->ranges[range].lim.hi &= GENMASK_ULL(7, 0);
1046
1047
1048 pvt->ranges[range].lim.hi |= llim >> 13;
1049
1050 pci_dev_put(f1);
1051}
1052
1053static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1054 struct err_info *err)
1055{
1056 struct amd64_pvt *pvt = mci->pvt_info;
1057
1058 error_address_to_page_and_offset(sys_addr, err);
1059
1060
1061
1062
1063
1064 err->src_mci = find_mc_by_sys_addr(mci, sys_addr);
1065 if (!err->src_mci) {
1066 amd64_mc_err(mci, "failed to map error addr 0x%lx to a node\n",
1067 (unsigned long)sys_addr);
1068 err->err_code = ERR_NODE;
1069 return;
1070 }
1071
1072
1073 err->csrow = sys_addr_to_csrow(err->src_mci, sys_addr);
1074 if (err->csrow < 0) {
1075 err->err_code = ERR_CSROW;
1076 return;
1077 }
1078
1079
1080 if (pvt->nbcfg & NBCFG_CHIPKILL) {
1081 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
1082 if (err->channel < 0) {
1083
1084
1085
1086
1087
1088 amd64_mc_warn(err->src_mci, "unknown syndrome 0x%04x - "
1089 "possible error reporting race\n",
1090 err->syndrome);
1091 err->err_code = ERR_CHANNEL;
1092 return;
1093 }
1094 } else {
1095
1096
1097
1098
1099
1100
1101
1102
1103 err->channel = ((sys_addr & BIT(3)) != 0);
1104 }
1105}
1106
1107static int ddr2_cs_size(unsigned i, bool dct_width)
1108{
1109 unsigned shift = 0;
1110
1111 if (i <= 2)
1112 shift = i;
1113 else if (!(i & 0x1))
1114 shift = i >> 1;
1115 else
1116 shift = (i + 1) >> 1;
1117
1118 return 128 << (shift + !!dct_width);
1119}
1120
1121static int k8_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1122 unsigned cs_mode, int cs_mask_nr)
1123{
1124 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1125
1126 if (pvt->ext_model >= K8_REV_F) {
1127 WARN_ON(cs_mode > 11);
1128 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1129 }
1130 else if (pvt->ext_model >= K8_REV_D) {
1131 unsigned diff;
1132 WARN_ON(cs_mode > 10);
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158 diff = cs_mode/3 + (unsigned)(cs_mode > 5);
1159
1160 return 32 << (cs_mode - diff);
1161 }
1162 else {
1163 WARN_ON(cs_mode > 6);
1164 return 32 << cs_mode;
1165 }
1166}
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176static int f1x_early_channel_count(struct amd64_pvt *pvt)
1177{
1178 int i, j, channels = 0;
1179
1180
1181 if (pvt->fam == 0x10 && (pvt->dclr0 & WIDTH_128))
1182 return 2;
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192 edac_dbg(0, "Data width is not 128 bits - need more decoding\n");
1193
1194
1195
1196
1197
1198
1199 for (i = 0; i < 2; i++) {
1200 u32 dbam = (i ? pvt->dbam1 : pvt->dbam0);
1201
1202 for (j = 0; j < 4; j++) {
1203 if (DBAM_DIMM(j, dbam) > 0) {
1204 channels++;
1205 break;
1206 }
1207 }
1208 }
1209
1210 if (channels > 2)
1211 channels = 2;
1212
1213 amd64_info("MCT channel count: %d\n", channels);
1214
1215 return channels;
1216}
1217
1218static int ddr3_cs_size(unsigned i, bool dct_width)
1219{
1220 unsigned shift = 0;
1221 int cs_size = 0;
1222
1223 if (i == 0 || i == 3 || i == 4)
1224 cs_size = -1;
1225 else if (i <= 2)
1226 shift = i;
1227 else if (i == 12)
1228 shift = 7;
1229 else if (!(i & 0x1))
1230 shift = i >> 1;
1231 else
1232 shift = (i + 1) >> 1;
1233
1234 if (cs_size != -1)
1235 cs_size = (128 * (1 << !!dct_width)) << shift;
1236
1237 return cs_size;
1238}
1239
1240static int ddr3_lrdimm_cs_size(unsigned i, unsigned rank_multiply)
1241{
1242 unsigned shift = 0;
1243 int cs_size = 0;
1244
1245 if (i < 4 || i == 6)
1246 cs_size = -1;
1247 else if (i == 12)
1248 shift = 7;
1249 else if (!(i & 0x1))
1250 shift = i >> 1;
1251 else
1252 shift = (i + 1) >> 1;
1253
1254 if (cs_size != -1)
1255 cs_size = rank_multiply * (128 << shift);
1256
1257 return cs_size;
1258}
1259
1260static int ddr4_cs_size(unsigned i)
1261{
1262 int cs_size = 0;
1263
1264 if (i == 0)
1265 cs_size = -1;
1266 else if (i == 1)
1267 cs_size = 1024;
1268 else
1269
1270 cs_size = 1024 * (1 << (i >> 1));
1271
1272 return cs_size;
1273}
1274
1275static int f10_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1276 unsigned cs_mode, int cs_mask_nr)
1277{
1278 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1279
1280 WARN_ON(cs_mode > 11);
1281
1282 if (pvt->dchr0 & DDR3_MODE || pvt->dchr1 & DDR3_MODE)
1283 return ddr3_cs_size(cs_mode, dclr & WIDTH_128);
1284 else
1285 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1286}
1287
1288
1289
1290
1291static int f15_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1292 unsigned cs_mode, int cs_mask_nr)
1293{
1294 WARN_ON(cs_mode > 12);
1295
1296 return ddr3_cs_size(cs_mode, false);
1297}
1298
1299
1300static int f15_m60h_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1301 unsigned cs_mode, int cs_mask_nr)
1302{
1303 int cs_size;
1304 u32 dcsm = pvt->csels[dct].csmasks[cs_mask_nr];
1305
1306 WARN_ON(cs_mode > 12);
1307
1308 if (pvt->dram_type == MEM_DDR4) {
1309 if (cs_mode > 9)
1310 return -1;
1311
1312 cs_size = ddr4_cs_size(cs_mode);
1313 } else if (pvt->dram_type == MEM_LRDDR3) {
1314 unsigned rank_multiply = dcsm & 0xf;
1315
1316 if (rank_multiply == 3)
1317 rank_multiply = 4;
1318 cs_size = ddr3_lrdimm_cs_size(cs_mode, rank_multiply);
1319 } else {
1320
1321 if (cs_mode == 0x1)
1322 return -1;
1323
1324 cs_size = ddr3_cs_size(cs_mode, false);
1325 }
1326
1327 return cs_size;
1328}
1329
1330
1331
1332
1333static int f16_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1334 unsigned cs_mode, int cs_mask_nr)
1335{
1336 WARN_ON(cs_mode > 12);
1337
1338 if (cs_mode == 6 || cs_mode == 8 ||
1339 cs_mode == 9 || cs_mode == 12)
1340 return -1;
1341 else
1342 return ddr3_cs_size(cs_mode, false);
1343}
1344
1345static void read_dram_ctl_register(struct amd64_pvt *pvt)
1346{
1347
1348 if (pvt->fam == 0xf)
1349 return;
1350
1351 if (!amd64_read_pci_cfg(pvt->F2, DCT_SEL_LO, &pvt->dct_sel_lo)) {
1352 edac_dbg(0, "F2x110 (DCTSelLow): 0x%08x, High range addrs at: 0x%x\n",
1353 pvt->dct_sel_lo, dct_sel_baseaddr(pvt));
1354
1355 edac_dbg(0, " DCTs operate in %s mode\n",
1356 (dct_ganging_enabled(pvt) ? "ganged" : "unganged"));
1357
1358 if (!dct_ganging_enabled(pvt))
1359 edac_dbg(0, " Address range split per DCT: %s\n",
1360 (dct_high_range_enabled(pvt) ? "yes" : "no"));
1361
1362 edac_dbg(0, " data interleave for ECC: %s, DRAM cleared since last warm reset: %s\n",
1363 (dct_data_intlv_enabled(pvt) ? "enabled" : "disabled"),
1364 (dct_memory_cleared(pvt) ? "yes" : "no"));
1365
1366 edac_dbg(0, " channel interleave: %s, "
1367 "interleave bits selector: 0x%x\n",
1368 (dct_interleave_enabled(pvt) ? "enabled" : "disabled"),
1369 dct_sel_interleave_addr(pvt));
1370 }
1371
1372 amd64_read_pci_cfg(pvt->F2, DCT_SEL_HI, &pvt->dct_sel_hi);
1373}
1374
1375
1376
1377
1378
1379static u8 f15_m30h_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
1380 u8 intlv_en, int num_dcts_intlv,
1381 u32 dct_sel)
1382{
1383 u8 channel = 0;
1384 u8 select;
1385
1386 if (!(intlv_en))
1387 return (u8)(dct_sel);
1388
1389 if (num_dcts_intlv == 2) {
1390 select = (sys_addr >> 8) & 0x3;
1391 channel = select ? 0x3 : 0;
1392 } else if (num_dcts_intlv == 4) {
1393 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1394 switch (intlv_addr) {
1395 case 0x4:
1396 channel = (sys_addr >> 8) & 0x3;
1397 break;
1398 case 0x5:
1399 channel = (sys_addr >> 9) & 0x3;
1400 break;
1401 }
1402 }
1403 return channel;
1404}
1405
1406
1407
1408
1409
1410static u8 f1x_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
1411 bool hi_range_sel, u8 intlv_en)
1412{
1413 u8 dct_sel_high = (pvt->dct_sel_lo >> 1) & 1;
1414
1415 if (dct_ganging_enabled(pvt))
1416 return 0;
1417
1418 if (hi_range_sel)
1419 return dct_sel_high;
1420
1421
1422
1423
1424 if (dct_interleave_enabled(pvt)) {
1425 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1426
1427
1428 if (!intlv_addr)
1429 return sys_addr >> 6 & 1;
1430
1431 if (intlv_addr & 0x2) {
1432 u8 shift = intlv_addr & 0x1 ? 9 : 6;
1433 u32 temp = hweight_long((u32) ((sys_addr >> 16) & 0x1F)) % 2;
1434
1435 return ((sys_addr >> shift) & 1) ^ temp;
1436 }
1437
1438 return (sys_addr >> (12 + hweight8(intlv_en))) & 1;
1439 }
1440
1441 if (dct_high_range_enabled(pvt))
1442 return ~dct_sel_high & 1;
1443
1444 return 0;
1445}
1446
1447
1448static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, u8 range,
1449 u64 sys_addr, bool hi_rng,
1450 u32 dct_sel_base_addr)
1451{
1452 u64 chan_off;
1453 u64 dram_base = get_dram_base(pvt, range);
1454 u64 hole_off = f10_dhar_offset(pvt);
1455 u64 dct_sel_base_off = (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16;
1456
1457 if (hi_rng) {
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469 if ((!(dct_sel_base_addr >> 16) ||
1470 dct_sel_base_addr < dhar_base(pvt)) &&
1471 dhar_valid(pvt) &&
1472 (sys_addr >= BIT_64(32)))
1473 chan_off = hole_off;
1474 else
1475 chan_off = dct_sel_base_off;
1476 } else {
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486 if (dhar_valid(pvt) && (sys_addr >= BIT_64(32)))
1487 chan_off = hole_off;
1488 else
1489 chan_off = dram_base;
1490 }
1491
1492 return (sys_addr & GENMASK_ULL(47,6)) - (chan_off & GENMASK_ULL(47,23));
1493}
1494
1495
1496
1497
1498
1499static int f10_process_possible_spare(struct amd64_pvt *pvt, u8 dct, int csrow)
1500{
1501 int tmp_cs;
1502
1503 if (online_spare_swap_done(pvt, dct) &&
1504 csrow == online_spare_bad_dramcs(pvt, dct)) {
1505
1506 for_each_chip_select(tmp_cs, dct, pvt) {
1507 if (chip_select_base(tmp_cs, dct, pvt) & 0x2) {
1508 csrow = tmp_cs;
1509 break;
1510 }
1511 }
1512 }
1513 return csrow;
1514}
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524static int f1x_lookup_addr_in_dct(u64 in_addr, u8 nid, u8 dct)
1525{
1526 struct mem_ctl_info *mci;
1527 struct amd64_pvt *pvt;
1528 u64 cs_base, cs_mask;
1529 int cs_found = -EINVAL;
1530 int csrow;
1531
1532 mci = edac_mc_find(nid);
1533 if (!mci)
1534 return cs_found;
1535
1536 pvt = mci->pvt_info;
1537
1538 edac_dbg(1, "input addr: 0x%llx, DCT: %d\n", in_addr, dct);
1539
1540 for_each_chip_select(csrow, dct, pvt) {
1541 if (!csrow_enabled(csrow, dct, pvt))
1542 continue;
1543
1544 get_cs_base_and_mask(pvt, csrow, dct, &cs_base, &cs_mask);
1545
1546 edac_dbg(1, " CSROW=%d CSBase=0x%llx CSMask=0x%llx\n",
1547 csrow, cs_base, cs_mask);
1548
1549 cs_mask = ~cs_mask;
1550
1551 edac_dbg(1, " (InputAddr & ~CSMask)=0x%llx (CSBase & ~CSMask)=0x%llx\n",
1552 (in_addr & cs_mask), (cs_base & cs_mask));
1553
1554 if ((in_addr & cs_mask) == (cs_base & cs_mask)) {
1555 if (pvt->fam == 0x15 && pvt->model >= 0x30) {
1556 cs_found = csrow;
1557 break;
1558 }
1559 cs_found = f10_process_possible_spare(pvt, dct, csrow);
1560
1561 edac_dbg(1, " MATCH csrow=%d\n", cs_found);
1562 break;
1563 }
1564 }
1565 return cs_found;
1566}
1567
1568
1569
1570
1571
1572
1573static u64 f1x_swap_interleaved_region(struct amd64_pvt *pvt, u64 sys_addr)
1574{
1575 u32 swap_reg, swap_base, swap_limit, rgn_size, tmp_addr;
1576
1577 if (pvt->fam == 0x10) {
1578
1579 if (pvt->model < 4 || (pvt->model < 0xa && pvt->stepping < 3))
1580 return sys_addr;
1581 }
1582
1583 amd64_read_pci_cfg(pvt->F2, SWAP_INTLV_REG, &swap_reg);
1584
1585 if (!(swap_reg & 0x1))
1586 return sys_addr;
1587
1588 swap_base = (swap_reg >> 3) & 0x7f;
1589 swap_limit = (swap_reg >> 11) & 0x7f;
1590 rgn_size = (swap_reg >> 20) & 0x7f;
1591 tmp_addr = sys_addr >> 27;
1592
1593 if (!(sys_addr >> 34) &&
1594 (((tmp_addr >= swap_base) &&
1595 (tmp_addr <= swap_limit)) ||
1596 (tmp_addr < rgn_size)))
1597 return sys_addr ^ (u64)swap_base << 27;
1598
1599 return sys_addr;
1600}
1601
1602
1603static int f1x_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
1604 u64 sys_addr, int *chan_sel)
1605{
1606 int cs_found = -EINVAL;
1607 u64 chan_addr;
1608 u32 dct_sel_base;
1609 u8 channel;
1610 bool high_range = false;
1611
1612 u8 node_id = dram_dst_node(pvt, range);
1613 u8 intlv_en = dram_intlv_en(pvt, range);
1614 u32 intlv_sel = dram_intlv_sel(pvt, range);
1615
1616 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
1617 range, sys_addr, get_dram_limit(pvt, range));
1618
1619 if (dhar_valid(pvt) &&
1620 dhar_base(pvt) <= sys_addr &&
1621 sys_addr < BIT_64(32)) {
1622 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
1623 sys_addr);
1624 return -EINVAL;
1625 }
1626
1627 if (intlv_en && (intlv_sel != ((sys_addr >> 12) & intlv_en)))
1628 return -EINVAL;
1629
1630 sys_addr = f1x_swap_interleaved_region(pvt, sys_addr);
1631
1632 dct_sel_base = dct_sel_baseaddr(pvt);
1633
1634
1635
1636
1637
1638 if (dct_high_range_enabled(pvt) &&
1639 !dct_ganging_enabled(pvt) &&
1640 ((sys_addr >> 27) >= (dct_sel_base >> 11)))
1641 high_range = true;
1642
1643 channel = f1x_determine_channel(pvt, sys_addr, high_range, intlv_en);
1644
1645 chan_addr = f1x_get_norm_dct_addr(pvt, range, sys_addr,
1646 high_range, dct_sel_base);
1647
1648
1649 if (intlv_en)
1650 chan_addr = ((chan_addr >> (12 + hweight8(intlv_en))) << 12) |
1651 (chan_addr & 0xfff);
1652
1653
1654 if (dct_interleave_enabled(pvt) &&
1655 !dct_high_range_enabled(pvt) &&
1656 !dct_ganging_enabled(pvt)) {
1657
1658 if (dct_sel_interleave_addr(pvt) != 1) {
1659 if (dct_sel_interleave_addr(pvt) == 0x3)
1660
1661 chan_addr = ((chan_addr >> 10) << 9) |
1662 (chan_addr & 0x1ff);
1663 else
1664
1665 chan_addr = ((chan_addr >> 7) << 6) |
1666 (chan_addr & 0x3f);
1667 } else
1668
1669 chan_addr = ((chan_addr >> 13) << 12) |
1670 (chan_addr & 0xfff);
1671 }
1672
1673 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
1674
1675 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, channel);
1676
1677 if (cs_found >= 0)
1678 *chan_sel = channel;
1679
1680 return cs_found;
1681}
1682
1683static int f15_m30h_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
1684 u64 sys_addr, int *chan_sel)
1685{
1686 int cs_found = -EINVAL;
1687 int num_dcts_intlv = 0;
1688 u64 chan_addr, chan_offset;
1689 u64 dct_base, dct_limit;
1690 u32 dct_cont_base_reg, dct_cont_limit_reg, tmp;
1691 u8 channel, alias_channel, leg_mmio_hole, dct_sel, dct_offset_en;
1692
1693 u64 dhar_offset = f10_dhar_offset(pvt);
1694 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1695 u8 node_id = dram_dst_node(pvt, range);
1696 u8 intlv_en = dram_intlv_en(pvt, range);
1697
1698 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_BASE, &dct_cont_base_reg);
1699 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_LIMIT, &dct_cont_limit_reg);
1700
1701 dct_offset_en = (u8) ((dct_cont_base_reg >> 3) & BIT(0));
1702 dct_sel = (u8) ((dct_cont_base_reg >> 4) & 0x7);
1703
1704 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
1705 range, sys_addr, get_dram_limit(pvt, range));
1706
1707 if (!(get_dram_base(pvt, range) <= sys_addr) &&
1708 !(get_dram_limit(pvt, range) >= sys_addr))
1709 return -EINVAL;
1710
1711 if (dhar_valid(pvt) &&
1712 dhar_base(pvt) <= sys_addr &&
1713 sys_addr < BIT_64(32)) {
1714 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
1715 sys_addr);
1716 return -EINVAL;
1717 }
1718
1719
1720 dct_base = (u64) dct_sel_baseaddr(pvt);
1721 dct_limit = (dct_cont_limit_reg >> 11) & 0x1FFF;
1722
1723 if (!(dct_cont_base_reg & BIT(0)) &&
1724 !(dct_base <= (sys_addr >> 27) &&
1725 dct_limit >= (sys_addr >> 27)))
1726 return -EINVAL;
1727
1728
1729 num_dcts_intlv = (int) hweight8(intlv_en);
1730
1731 if (!(num_dcts_intlv % 2 == 0) || (num_dcts_intlv > 4))
1732 return -EINVAL;
1733
1734 channel = f15_m30h_determine_channel(pvt, sys_addr, intlv_en,
1735 num_dcts_intlv, dct_sel);
1736
1737
1738 if (channel > 3)
1739 return -EINVAL;
1740
1741 leg_mmio_hole = (u8) (dct_cont_base_reg >> 1 & BIT(0));
1742
1743
1744 if (leg_mmio_hole && (sys_addr >= BIT_64(32)))
1745 chan_offset = dhar_offset;
1746 else
1747 chan_offset = dct_base << 27;
1748
1749 chan_addr = sys_addr - chan_offset;
1750
1751
1752 if (num_dcts_intlv == 2) {
1753 if (intlv_addr == 0x4)
1754 chan_addr = ((chan_addr >> 9) << 8) |
1755 (chan_addr & 0xff);
1756 else if (intlv_addr == 0x5)
1757 chan_addr = ((chan_addr >> 10) << 9) |
1758 (chan_addr & 0x1ff);
1759 else
1760 return -EINVAL;
1761
1762 } else if (num_dcts_intlv == 4) {
1763 if (intlv_addr == 0x4)
1764 chan_addr = ((chan_addr >> 10) << 8) |
1765 (chan_addr & 0xff);
1766 else if (intlv_addr == 0x5)
1767 chan_addr = ((chan_addr >> 11) << 9) |
1768 (chan_addr & 0x1ff);
1769 else
1770 return -EINVAL;
1771 }
1772
1773 if (dct_offset_en) {
1774 amd64_read_pci_cfg(pvt->F1,
1775 DRAM_CONT_HIGH_OFF + (int) channel * 4,
1776 &tmp);
1777 chan_addr += (u64) ((tmp >> 11) & 0xfff) << 27;
1778 }
1779
1780 f15h_select_dct(pvt, channel);
1781
1782 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792 alias_channel = (channel == 3) ? 1 : channel;
1793
1794 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, alias_channel);
1795
1796 if (cs_found >= 0)
1797 *chan_sel = alias_channel;
1798
1799 return cs_found;
1800}
1801
1802static int f1x_translate_sysaddr_to_cs(struct amd64_pvt *pvt,
1803 u64 sys_addr,
1804 int *chan_sel)
1805{
1806 int cs_found = -EINVAL;
1807 unsigned range;
1808
1809 for (range = 0; range < DRAM_RANGES; range++) {
1810 if (!dram_rw(pvt, range))
1811 continue;
1812
1813 if (pvt->fam == 0x15 && pvt->model >= 0x30)
1814 cs_found = f15_m30h_match_to_this_node(pvt, range,
1815 sys_addr,
1816 chan_sel);
1817
1818 else if ((get_dram_base(pvt, range) <= sys_addr) &&
1819 (get_dram_limit(pvt, range) >= sys_addr)) {
1820 cs_found = f1x_match_to_this_node(pvt, range,
1821 sys_addr, chan_sel);
1822 if (cs_found >= 0)
1823 break;
1824 }
1825 }
1826 return cs_found;
1827}
1828
1829
1830
1831
1832
1833
1834
1835
1836static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1837 struct err_info *err)
1838{
1839 struct amd64_pvt *pvt = mci->pvt_info;
1840
1841 error_address_to_page_and_offset(sys_addr, err);
1842
1843 err->csrow = f1x_translate_sysaddr_to_cs(pvt, sys_addr, &err->channel);
1844 if (err->csrow < 0) {
1845 err->err_code = ERR_CSROW;
1846 return;
1847 }
1848
1849
1850
1851
1852
1853
1854 if (dct_ganging_enabled(pvt))
1855 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
1856}
1857
1858
1859
1860
1861
1862static void debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
1863{
1864 int dimm, size0, size1;
1865 u32 *dcsb = ctrl ? pvt->csels[1].csbases : pvt->csels[0].csbases;
1866 u32 dbam = ctrl ? pvt->dbam1 : pvt->dbam0;
1867
1868 if (pvt->fam == 0xf) {
1869
1870 if (pvt->ext_model < K8_REV_F)
1871 return;
1872 else
1873 WARN_ON(ctrl != 0);
1874 }
1875
1876 if (pvt->fam == 0x10) {
1877 dbam = (ctrl && !dct_ganging_enabled(pvt)) ? pvt->dbam1
1878 : pvt->dbam0;
1879 dcsb = (ctrl && !dct_ganging_enabled(pvt)) ?
1880 pvt->csels[1].csbases :
1881 pvt->csels[0].csbases;
1882 } else if (ctrl) {
1883 dbam = pvt->dbam0;
1884 dcsb = pvt->csels[1].csbases;
1885 }
1886 edac_dbg(1, "F2x%d80 (DRAM Bank Address Mapping): 0x%08x\n",
1887 ctrl, dbam);
1888
1889 edac_printk(KERN_DEBUG, EDAC_MC, "DCT%d chip selects:\n", ctrl);
1890
1891
1892 for (dimm = 0; dimm < 4; dimm++) {
1893
1894 size0 = 0;
1895 if (dcsb[dimm*2] & DCSB_CS_ENABLE)
1896
1897
1898
1899
1900
1901 size0 = pvt->ops->dbam_to_cs(pvt, ctrl,
1902 DBAM_DIMM(dimm, dbam),
1903 dimm);
1904
1905 size1 = 0;
1906 if (dcsb[dimm*2 + 1] & DCSB_CS_ENABLE)
1907 size1 = pvt->ops->dbam_to_cs(pvt, ctrl,
1908 DBAM_DIMM(dimm, dbam),
1909 dimm);
1910
1911 amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
1912 dimm * 2, size0,
1913 dimm * 2 + 1, size1);
1914 }
1915}
1916
1917static struct amd64_family_type family_types[] = {
1918 [K8_CPUS] = {
1919 .ctl_name = "K8",
1920 .f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP,
1921 .f3_id = PCI_DEVICE_ID_AMD_K8_NB_MISC,
1922 .ops = {
1923 .early_channel_count = k8_early_channel_count,
1924 .map_sysaddr_to_csrow = k8_map_sysaddr_to_csrow,
1925 .dbam_to_cs = k8_dbam_to_chip_select,
1926 }
1927 },
1928 [F10_CPUS] = {
1929 .ctl_name = "F10h",
1930 .f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP,
1931 .f3_id = PCI_DEVICE_ID_AMD_10H_NB_MISC,
1932 .ops = {
1933 .early_channel_count = f1x_early_channel_count,
1934 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
1935 .dbam_to_cs = f10_dbam_to_chip_select,
1936 }
1937 },
1938 [F15_CPUS] = {
1939 .ctl_name = "F15h",
1940 .f1_id = PCI_DEVICE_ID_AMD_15H_NB_F1,
1941 .f3_id = PCI_DEVICE_ID_AMD_15H_NB_F3,
1942 .ops = {
1943 .early_channel_count = f1x_early_channel_count,
1944 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
1945 .dbam_to_cs = f15_dbam_to_chip_select,
1946 }
1947 },
1948 [F15_M30H_CPUS] = {
1949 .ctl_name = "F15h_M30h",
1950 .f1_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1,
1951 .f3_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F3,
1952 .ops = {
1953 .early_channel_count = f1x_early_channel_count,
1954 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
1955 .dbam_to_cs = f16_dbam_to_chip_select,
1956 }
1957 },
1958 [F15_M60H_CPUS] = {
1959 .ctl_name = "F15h_M60h",
1960 .f1_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1,
1961 .f3_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F3,
1962 .ops = {
1963 .early_channel_count = f1x_early_channel_count,
1964 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
1965 .dbam_to_cs = f15_m60h_dbam_to_chip_select,
1966 }
1967 },
1968 [F16_CPUS] = {
1969 .ctl_name = "F16h",
1970 .f1_id = PCI_DEVICE_ID_AMD_16H_NB_F1,
1971 .f3_id = PCI_DEVICE_ID_AMD_16H_NB_F3,
1972 .ops = {
1973 .early_channel_count = f1x_early_channel_count,
1974 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
1975 .dbam_to_cs = f16_dbam_to_chip_select,
1976 }
1977 },
1978 [F16_M30H_CPUS] = {
1979 .ctl_name = "F16h_M30h",
1980 .f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1,
1981 .f3_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F3,
1982 .ops = {
1983 .early_channel_count = f1x_early_channel_count,
1984 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
1985 .dbam_to_cs = f16_dbam_to_chip_select,
1986 }
1987 },
1988};
1989
1990
1991
1992
1993
1994
1995
1996
1997static const u16 x4_vectors[] = {
1998 0x2f57, 0x1afe, 0x66cc, 0xdd88,
1999 0x11eb, 0x3396, 0x7f4c, 0xeac8,
2000 0x0001, 0x0002, 0x0004, 0x0008,
2001 0x1013, 0x3032, 0x4044, 0x8088,
2002 0x106b, 0x30d6, 0x70fc, 0xe0a8,
2003 0x4857, 0xc4fe, 0x13cc, 0x3288,
2004 0x1ac5, 0x2f4a, 0x5394, 0xa1e8,
2005 0x1f39, 0x251e, 0xbd6c, 0x6bd8,
2006 0x15c1, 0x2a42, 0x89ac, 0x4758,
2007 0x2b03, 0x1602, 0x4f0c, 0xca08,
2008 0x1f07, 0x3a0e, 0x6b04, 0xbd08,
2009 0x8ba7, 0x465e, 0x244c, 0x1cc8,
2010 0x2b87, 0x164e, 0x642c, 0xdc18,
2011 0x40b9, 0x80de, 0x1094, 0x20e8,
2012 0x27db, 0x1eb6, 0x9dac, 0x7b58,
2013 0x11c1, 0x2242, 0x84ac, 0x4c58,
2014 0x1be5, 0x2d7a, 0x5e34, 0xa718,
2015 0x4b39, 0x8d1e, 0x14b4, 0x28d8,
2016 0x4c97, 0xc87e, 0x11fc, 0x33a8,
2017 0x8e97, 0x497e, 0x2ffc, 0x1aa8,
2018 0x16b3, 0x3d62, 0x4f34, 0x8518,
2019 0x1e2f, 0x391a, 0x5cac, 0xf858,
2020 0x1d9f, 0x3b7a, 0x572c, 0xfe18,
2021 0x15f5, 0x2a5a, 0x5264, 0xa3b8,
2022 0x1dbb, 0x3b66, 0x715c, 0xe3f8,
2023 0x4397, 0xc27e, 0x17fc, 0x3ea8,
2024 0x1617, 0x3d3e, 0x6464, 0xb8b8,
2025 0x23ff, 0x12aa, 0xab6c, 0x56d8,
2026 0x2dfb, 0x1ba6, 0x913c, 0x7328,
2027 0x185d, 0x2ca6, 0x7914, 0x9e28,
2028 0x171b, 0x3e36, 0x7d7c, 0xebe8,
2029 0x4199, 0x82ee, 0x19f4, 0x2e58,
2030 0x4807, 0xc40e, 0x130c, 0x3208,
2031 0x1905, 0x2e0a, 0x5804, 0xac08,
2032 0x213f, 0x132a, 0xadfc, 0x5ba8,
2033 0x19a9, 0x2efe, 0xb5cc, 0x6f88,
2034};
2035
2036static const u16 x8_vectors[] = {
2037 0x0145, 0x028a, 0x2374, 0x43c8, 0xa1f0, 0x0520, 0x0a40, 0x1480,
2038 0x0211, 0x0422, 0x0844, 0x1088, 0x01b0, 0x44e0, 0x23c0, 0xed80,
2039 0x1011, 0x0116, 0x022c, 0x0458, 0x08b0, 0x8c60, 0x2740, 0x4e80,
2040 0x0411, 0x0822, 0x1044, 0x0158, 0x02b0, 0x2360, 0x46c0, 0xab80,
2041 0x0811, 0x1022, 0x012c, 0x0258, 0x04b0, 0x4660, 0x8cc0, 0x2780,
2042 0x2071, 0x40e2, 0xa0c4, 0x0108, 0x0210, 0x0420, 0x0840, 0x1080,
2043 0x4071, 0x80e2, 0x0104, 0x0208, 0x0410, 0x0820, 0x1040, 0x2080,
2044 0x8071, 0x0102, 0x0204, 0x0408, 0x0810, 0x1020, 0x2040, 0x4080,
2045 0x019d, 0x03d6, 0x136c, 0x2198, 0x50b0, 0xb2e0, 0x0740, 0x0e80,
2046 0x0189, 0x03ea, 0x072c, 0x0e58, 0x1cb0, 0x56e0, 0x37c0, 0xf580,
2047 0x01fd, 0x0376, 0x06ec, 0x0bb8, 0x1110, 0x2220, 0x4440, 0x8880,
2048 0x0163, 0x02c6, 0x1104, 0x0758, 0x0eb0, 0x2be0, 0x6140, 0xc280,
2049 0x02fd, 0x01c6, 0x0b5c, 0x1108, 0x07b0, 0x25a0, 0x8840, 0x6180,
2050 0x0801, 0x012e, 0x025c, 0x04b8, 0x1370, 0x26e0, 0x57c0, 0xb580,
2051 0x0401, 0x0802, 0x015c, 0x02b8, 0x22b0, 0x13e0, 0x7140, 0xe280,
2052 0x0201, 0x0402, 0x0804, 0x01b8, 0x11b0, 0x31a0, 0x8040, 0x7180,
2053 0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
2054 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
2055 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
2056};
2057
2058static int decode_syndrome(u16 syndrome, const u16 *vectors, unsigned num_vecs,
2059 unsigned v_dim)
2060{
2061 unsigned int i, err_sym;
2062
2063 for (err_sym = 0; err_sym < num_vecs / v_dim; err_sym++) {
2064 u16 s = syndrome;
2065 unsigned v_idx = err_sym * v_dim;
2066 unsigned v_end = (err_sym + 1) * v_dim;
2067
2068
2069 for (i = 1; i < (1U << 16); i <<= 1) {
2070
2071
2072 if (v_idx < v_end && vectors[v_idx] & i) {
2073 u16 ev_comp = vectors[v_idx++];
2074
2075
2076 if (s & i) {
2077
2078 s ^= ev_comp;
2079
2080 if (!s)
2081 return err_sym;
2082 }
2083
2084 } else if (s & i)
2085
2086 break;
2087 }
2088 }
2089
2090 edac_dbg(0, "syndrome(%x) not found\n", syndrome);
2091 return -1;
2092}
2093
2094static int map_err_sym_to_channel(int err_sym, int sym_size)
2095{
2096 if (sym_size == 4)
2097 switch (err_sym) {
2098 case 0x20:
2099 case 0x21:
2100 return 0;
2101 break;
2102 case 0x22:
2103 case 0x23:
2104 return 1;
2105 break;
2106 default:
2107 return err_sym >> 4;
2108 break;
2109 }
2110
2111 else
2112 switch (err_sym) {
2113
2114 case 0x10:
2115 WARN(1, KERN_ERR "Invalid error symbol: 0x%x\n",
2116 err_sym);
2117 return -1;
2118 break;
2119
2120 case 0x11:
2121 return 0;
2122 break;
2123 case 0x12:
2124 return 1;
2125 break;
2126 default:
2127 return err_sym >> 3;
2128 break;
2129 }
2130 return -1;
2131}
2132
2133static int get_channel_from_ecc_syndrome(struct mem_ctl_info *mci, u16 syndrome)
2134{
2135 struct amd64_pvt *pvt = mci->pvt_info;
2136 int err_sym = -1;
2137
2138 if (pvt->ecc_sym_sz == 8)
2139 err_sym = decode_syndrome(syndrome, x8_vectors,
2140 ARRAY_SIZE(x8_vectors),
2141 pvt->ecc_sym_sz);
2142 else if (pvt->ecc_sym_sz == 4)
2143 err_sym = decode_syndrome(syndrome, x4_vectors,
2144 ARRAY_SIZE(x4_vectors),
2145 pvt->ecc_sym_sz);
2146 else {
2147 amd64_warn("Illegal syndrome type: %u\n", pvt->ecc_sym_sz);
2148 return err_sym;
2149 }
2150
2151 return map_err_sym_to_channel(err_sym, pvt->ecc_sym_sz);
2152}
2153
2154static void __log_bus_error(struct mem_ctl_info *mci, struct err_info *err,
2155 u8 ecc_type)
2156{
2157 enum hw_event_mc_err_type err_type;
2158 const char *string;
2159
2160 if (ecc_type == 2)
2161 err_type = HW_EVENT_ERR_CORRECTED;
2162 else if (ecc_type == 1)
2163 err_type = HW_EVENT_ERR_UNCORRECTED;
2164 else {
2165 WARN(1, "Something is rotten in the state of Denmark.\n");
2166 return;
2167 }
2168
2169 switch (err->err_code) {
2170 case DECODE_OK:
2171 string = "";
2172 break;
2173 case ERR_NODE:
2174 string = "Failed to map error addr to a node";
2175 break;
2176 case ERR_CSROW:
2177 string = "Failed to map error addr to a csrow";
2178 break;
2179 case ERR_CHANNEL:
2180 string = "unknown syndrome - possible error reporting race";
2181 break;
2182 default:
2183 string = "WTF error";
2184 break;
2185 }
2186
2187 edac_mc_handle_error(err_type, mci, 1,
2188 err->page, err->offset, err->syndrome,
2189 err->csrow, err->channel, -1,
2190 string, "");
2191}
2192
2193static inline void decode_bus_error(int node_id, struct mce *m)
2194{
2195 struct mem_ctl_info *mci;
2196 struct amd64_pvt *pvt;
2197 u8 ecc_type = (m->status >> 45) & 0x3;
2198 u8 xec = XEC(m->status, 0x1f);
2199 u16 ec = EC(m->status);
2200 u64 sys_addr;
2201 struct err_info err;
2202
2203 mci = edac_mc_find(node_id);
2204 if (!mci)
2205 return;
2206
2207 pvt = mci->pvt_info;
2208
2209
2210 if (PP(ec) == NBSL_PP_OBS)
2211 return;
2212
2213
2214 if (xec && xec != F10_NBSL_EXT_ERR_ECC)
2215 return;
2216
2217 memset(&err, 0, sizeof(err));
2218
2219 sys_addr = get_error_address(pvt, m);
2220
2221 if (ecc_type == 2)
2222 err.syndrome = extract_syndrome(m->status);
2223
2224 pvt->ops->map_sysaddr_to_csrow(mci, sys_addr, &err);
2225
2226 __log_bus_error(mci, &err, ecc_type);
2227}
2228
2229
2230
2231
2232
2233static int reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 f1_id, u16 f3_id)
2234{
2235
2236 pvt->F1 = pci_get_related_function(pvt->F2->vendor, f1_id, pvt->F2);
2237 if (!pvt->F1) {
2238 amd64_err("error address map device not found: "
2239 "vendor %x device 0x%x (broken BIOS?)\n",
2240 PCI_VENDOR_ID_AMD, f1_id);
2241 return -ENODEV;
2242 }
2243
2244
2245 pvt->F3 = pci_get_related_function(pvt->F2->vendor, f3_id, pvt->F2);
2246 if (!pvt->F3) {
2247 pci_dev_put(pvt->F1);
2248 pvt->F1 = NULL;
2249
2250 amd64_err("error F3 device not found: "
2251 "vendor %x device 0x%x (broken BIOS?)\n",
2252 PCI_VENDOR_ID_AMD, f3_id);
2253
2254 return -ENODEV;
2255 }
2256 edac_dbg(1, "F1: %s\n", pci_name(pvt->F1));
2257 edac_dbg(1, "F2: %s\n", pci_name(pvt->F2));
2258 edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
2259
2260 return 0;
2261}
2262
2263static void free_mc_sibling_devs(struct amd64_pvt *pvt)
2264{
2265 pci_dev_put(pvt->F1);
2266 pci_dev_put(pvt->F3);
2267}
2268
2269
2270
2271
2272
2273static void read_mc_regs(struct amd64_pvt *pvt)
2274{
2275 unsigned range;
2276 u64 msr_val;
2277 u32 tmp;
2278
2279
2280
2281
2282
2283 rdmsrl(MSR_K8_TOP_MEM1, pvt->top_mem);
2284 edac_dbg(0, " TOP_MEM: 0x%016llx\n", pvt->top_mem);
2285
2286
2287 rdmsrl(MSR_K8_SYSCFG, msr_val);
2288 if (msr_val & (1U << 21)) {
2289 rdmsrl(MSR_K8_TOP_MEM2, pvt->top_mem2);
2290 edac_dbg(0, " TOP_MEM2: 0x%016llx\n", pvt->top_mem2);
2291 } else
2292 edac_dbg(0, " TOP_MEM2 disabled\n");
2293
2294 amd64_read_pci_cfg(pvt->F3, NBCAP, &pvt->nbcap);
2295
2296 read_dram_ctl_register(pvt);
2297
2298 for (range = 0; range < DRAM_RANGES; range++) {
2299 u8 rw;
2300
2301
2302 read_dram_base_limit_regs(pvt, range);
2303
2304 rw = dram_rw(pvt, range);
2305 if (!rw)
2306 continue;
2307
2308 edac_dbg(1, " DRAM range[%d], base: 0x%016llx; limit: 0x%016llx\n",
2309 range,
2310 get_dram_base(pvt, range),
2311 get_dram_limit(pvt, range));
2312
2313 edac_dbg(1, " IntlvEn=%s; Range access: %s%s IntlvSel=%d DstNode=%d\n",
2314 dram_intlv_en(pvt, range) ? "Enabled" : "Disabled",
2315 (rw & 0x1) ? "R" : "-",
2316 (rw & 0x2) ? "W" : "-",
2317 dram_intlv_sel(pvt, range),
2318 dram_dst_node(pvt, range));
2319 }
2320
2321 read_dct_base_mask(pvt);
2322
2323 amd64_read_pci_cfg(pvt->F1, DHAR, &pvt->dhar);
2324 amd64_read_dct_pci_cfg(pvt, 0, DBAM0, &pvt->dbam0);
2325
2326 amd64_read_pci_cfg(pvt->F3, F10_ONLINE_SPARE, &pvt->online_spare);
2327
2328 amd64_read_dct_pci_cfg(pvt, 0, DCLR0, &pvt->dclr0);
2329 amd64_read_dct_pci_cfg(pvt, 0, DCHR0, &pvt->dchr0);
2330
2331 if (!dct_ganging_enabled(pvt)) {
2332 amd64_read_dct_pci_cfg(pvt, 1, DCLR0, &pvt->dclr1);
2333 amd64_read_dct_pci_cfg(pvt, 1, DCHR0, &pvt->dchr1);
2334 }
2335
2336 pvt->ecc_sym_sz = 4;
2337 determine_memory_type(pvt);
2338 edac_dbg(1, " DIMM type: %s\n", edac_mem_types[pvt->dram_type]);
2339
2340 if (pvt->fam >= 0x10) {
2341 amd64_read_pci_cfg(pvt->F3, EXT_NB_MCA_CFG, &tmp);
2342
2343 if (pvt->fam != 0x16)
2344 amd64_read_dct_pci_cfg(pvt, 1, DBAM0, &pvt->dbam1);
2345
2346
2347 if ((pvt->fam > 0x10 || pvt->model > 7) && tmp & BIT(25))
2348 pvt->ecc_sym_sz = 8;
2349 }
2350 dump_misc_regs(pvt);
2351}
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387static u32 get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr)
2388{
2389 u32 cs_mode, nr_pages;
2390 u32 dbam = dct ? pvt->dbam1 : pvt->dbam0;
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400 cs_mode = DBAM_DIMM(csrow_nr / 2, dbam);
2401
2402 nr_pages = pvt->ops->dbam_to_cs(pvt, dct, cs_mode, (csrow_nr / 2))
2403 << (20 - PAGE_SHIFT);
2404
2405 edac_dbg(0, "csrow: %d, channel: %d, DBAM idx: %d\n",
2406 csrow_nr, dct, cs_mode);
2407 edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
2408
2409 return nr_pages;
2410}
2411
2412
2413
2414
2415
2416static int init_csrows(struct mem_ctl_info *mci)
2417{
2418 struct amd64_pvt *pvt = mci->pvt_info;
2419 struct csrow_info *csrow;
2420 struct dimm_info *dimm;
2421 enum edac_type edac_mode;
2422 int i, j, empty = 1;
2423 int nr_pages = 0;
2424 u32 val;
2425
2426 amd64_read_pci_cfg(pvt->F3, NBCFG, &val);
2427
2428 pvt->nbcfg = val;
2429
2430 edac_dbg(0, "node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
2431 pvt->mc_node_id, val,
2432 !!(val & NBCFG_CHIPKILL), !!(val & NBCFG_ECC_ENABLE));
2433
2434
2435
2436
2437 for_each_chip_select(i, 0, pvt) {
2438 bool row_dct0 = !!csrow_enabled(i, 0, pvt);
2439 bool row_dct1 = false;
2440
2441 if (pvt->fam != 0xf)
2442 row_dct1 = !!csrow_enabled(i, 1, pvt);
2443
2444 if (!row_dct0 && !row_dct1)
2445 continue;
2446
2447 csrow = mci->csrows[i];
2448 empty = 0;
2449
2450 edac_dbg(1, "MC node: %d, csrow: %d\n",
2451 pvt->mc_node_id, i);
2452
2453 if (row_dct0) {
2454 nr_pages = get_csrow_nr_pages(pvt, 0, i);
2455 csrow->channels[0]->dimm->nr_pages = nr_pages;
2456 }
2457
2458
2459 if (pvt->fam != 0xf && row_dct1) {
2460 int row_dct1_pages = get_csrow_nr_pages(pvt, 1, i);
2461
2462 csrow->channels[1]->dimm->nr_pages = row_dct1_pages;
2463 nr_pages += row_dct1_pages;
2464 }
2465
2466 edac_dbg(1, "Total csrow%d pages: %u\n", i, nr_pages);
2467
2468
2469
2470
2471 if (pvt->nbcfg & NBCFG_ECC_ENABLE)
2472 edac_mode = (pvt->nbcfg & NBCFG_CHIPKILL) ?
2473 EDAC_S4ECD4ED : EDAC_SECDED;
2474 else
2475 edac_mode = EDAC_NONE;
2476
2477 for (j = 0; j < pvt->channel_count; j++) {
2478 dimm = csrow->channels[j]->dimm;
2479 dimm->mtype = pvt->dram_type;
2480 dimm->edac_mode = edac_mode;
2481 }
2482 }
2483
2484 return empty;
2485}
2486
2487
2488static void get_cpus_on_this_dct_cpumask(struct cpumask *mask, u16 nid)
2489{
2490 int cpu;
2491
2492 for_each_online_cpu(cpu)
2493 if (amd_get_nb_id(cpu) == nid)
2494 cpumask_set_cpu(cpu, mask);
2495}
2496
2497
2498static bool nb_mce_bank_enabled_on_node(u16 nid)
2499{
2500 cpumask_var_t mask;
2501 int cpu, nbe;
2502 bool ret = false;
2503
2504 if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) {
2505 amd64_warn("%s: Error allocating mask\n", __func__);
2506 return false;
2507 }
2508
2509 get_cpus_on_this_dct_cpumask(mask, nid);
2510
2511 rdmsr_on_cpus(mask, MSR_IA32_MCG_CTL, msrs);
2512
2513 for_each_cpu(cpu, mask) {
2514 struct msr *reg = per_cpu_ptr(msrs, cpu);
2515 nbe = reg->l & MSR_MCGCTL_NBE;
2516
2517 edac_dbg(0, "core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
2518 cpu, reg->q,
2519 (nbe ? "enabled" : "disabled"));
2520
2521 if (!nbe)
2522 goto out;
2523 }
2524 ret = true;
2525
2526out:
2527 free_cpumask_var(mask);
2528 return ret;
2529}
2530
2531static int toggle_ecc_err_reporting(struct ecc_settings *s, u16 nid, bool on)
2532{
2533 cpumask_var_t cmask;
2534 int cpu;
2535
2536 if (!zalloc_cpumask_var(&cmask, GFP_KERNEL)) {
2537 amd64_warn("%s: error allocating mask\n", __func__);
2538 return false;
2539 }
2540
2541 get_cpus_on_this_dct_cpumask(cmask, nid);
2542
2543 rdmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
2544
2545 for_each_cpu(cpu, cmask) {
2546
2547 struct msr *reg = per_cpu_ptr(msrs, cpu);
2548
2549 if (on) {
2550 if (reg->l & MSR_MCGCTL_NBE)
2551 s->flags.nb_mce_enable = 1;
2552
2553 reg->l |= MSR_MCGCTL_NBE;
2554 } else {
2555
2556
2557
2558 if (!s->flags.nb_mce_enable)
2559 reg->l &= ~MSR_MCGCTL_NBE;
2560 }
2561 }
2562 wrmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
2563
2564 free_cpumask_var(cmask);
2565
2566 return 0;
2567}
2568
2569static bool enable_ecc_error_reporting(struct ecc_settings *s, u16 nid,
2570 struct pci_dev *F3)
2571{
2572 bool ret = true;
2573 u32 value, mask = 0x3;
2574
2575 if (toggle_ecc_err_reporting(s, nid, ON)) {
2576 amd64_warn("Error enabling ECC reporting over MCGCTL!\n");
2577 return false;
2578 }
2579
2580 amd64_read_pci_cfg(F3, NBCTL, &value);
2581
2582 s->old_nbctl = value & mask;
2583 s->nbctl_valid = true;
2584
2585 value |= mask;
2586 amd64_write_pci_cfg(F3, NBCTL, value);
2587
2588 amd64_read_pci_cfg(F3, NBCFG, &value);
2589
2590 edac_dbg(0, "1: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
2591 nid, value, !!(value & NBCFG_ECC_ENABLE));
2592
2593 if (!(value & NBCFG_ECC_ENABLE)) {
2594 amd64_warn("DRAM ECC disabled on this node, enabling...\n");
2595
2596 s->flags.nb_ecc_prev = 0;
2597
2598
2599 value |= NBCFG_ECC_ENABLE;
2600 amd64_write_pci_cfg(F3, NBCFG, value);
2601
2602 amd64_read_pci_cfg(F3, NBCFG, &value);
2603
2604 if (!(value & NBCFG_ECC_ENABLE)) {
2605 amd64_warn("Hardware rejected DRAM ECC enable,"
2606 "check memory DIMM configuration.\n");
2607 ret = false;
2608 } else {
2609 amd64_info("Hardware accepted DRAM ECC Enable\n");
2610 }
2611 } else {
2612 s->flags.nb_ecc_prev = 1;
2613 }
2614
2615 edac_dbg(0, "2: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
2616 nid, value, !!(value & NBCFG_ECC_ENABLE));
2617
2618 return ret;
2619}
2620
2621static void restore_ecc_error_reporting(struct ecc_settings *s, u16 nid,
2622 struct pci_dev *F3)
2623{
2624 u32 value, mask = 0x3;
2625
2626
2627 if (!s->nbctl_valid)
2628 return;
2629
2630 amd64_read_pci_cfg(F3, NBCTL, &value);
2631 value &= ~mask;
2632 value |= s->old_nbctl;
2633
2634 amd64_write_pci_cfg(F3, NBCTL, value);
2635
2636
2637 if (!s->flags.nb_ecc_prev) {
2638 amd64_read_pci_cfg(F3, NBCFG, &value);
2639 value &= ~NBCFG_ECC_ENABLE;
2640 amd64_write_pci_cfg(F3, NBCFG, value);
2641 }
2642
2643
2644 if (toggle_ecc_err_reporting(s, nid, OFF))
2645 amd64_warn("Error restoring NB MCGCTL settings!\n");
2646}
2647
2648
2649
2650
2651
2652
2653
2654static const char *ecc_msg =
2655 "ECC disabled in the BIOS or no ECC capability, module will not load.\n"
2656 " Either enable ECC checking or force module loading by setting "
2657 "'ecc_enable_override'.\n"
2658 " (Note that use of the override may cause unknown side effects.)\n";
2659
2660static bool ecc_enabled(struct pci_dev *F3, u16 nid)
2661{
2662 u32 value;
2663 u8 ecc_en = 0;
2664 bool nb_mce_en = false;
2665
2666 amd64_read_pci_cfg(F3, NBCFG, &value);
2667
2668 ecc_en = !!(value & NBCFG_ECC_ENABLE);
2669 amd64_info("DRAM ECC %s.\n", (ecc_en ? "enabled" : "disabled"));
2670
2671 nb_mce_en = nb_mce_bank_enabled_on_node(nid);
2672 if (!nb_mce_en)
2673 amd64_notice("NB MCE bank disabled, set MSR "
2674 "0x%08x[4] on node %d to enable.\n",
2675 MSR_IA32_MCG_CTL, nid);
2676
2677 if (!ecc_en || !nb_mce_en) {
2678 amd64_notice("%s", ecc_msg);
2679 return false;
2680 }
2681 return true;
2682}
2683
2684static void setup_mci_misc_attrs(struct mem_ctl_info *mci,
2685 struct amd64_family_type *fam)
2686{
2687 struct amd64_pvt *pvt = mci->pvt_info;
2688
2689 mci->mtype_cap = MEM_FLAG_DDR2 | MEM_FLAG_RDDR2;
2690 mci->edac_ctl_cap = EDAC_FLAG_NONE;
2691
2692 if (pvt->nbcap & NBCAP_SECDED)
2693 mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
2694
2695 if (pvt->nbcap & NBCAP_CHIPKILL)
2696 mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
2697
2698 mci->edac_cap = determine_edac_cap(pvt);
2699 mci->mod_name = EDAC_MOD_STR;
2700 mci->mod_ver = EDAC_AMD64_VERSION;
2701 mci->ctl_name = fam->ctl_name;
2702 mci->dev_name = pci_name(pvt->F2);
2703 mci->ctl_page_to_phys = NULL;
2704
2705
2706 mci->set_sdram_scrub_rate = set_scrub_rate;
2707 mci->get_sdram_scrub_rate = get_scrub_rate;
2708}
2709
2710
2711
2712
2713static struct amd64_family_type *per_family_init(struct amd64_pvt *pvt)
2714{
2715 struct amd64_family_type *fam_type = NULL;
2716
2717 pvt->ext_model = boot_cpu_data.x86_model >> 4;
2718 pvt->stepping = boot_cpu_data.x86_mask;
2719 pvt->model = boot_cpu_data.x86_model;
2720 pvt->fam = boot_cpu_data.x86;
2721
2722 switch (pvt->fam) {
2723 case 0xf:
2724 fam_type = &family_types[K8_CPUS];
2725 pvt->ops = &family_types[K8_CPUS].ops;
2726 break;
2727
2728 case 0x10:
2729 fam_type = &family_types[F10_CPUS];
2730 pvt->ops = &family_types[F10_CPUS].ops;
2731 break;
2732
2733 case 0x15:
2734 if (pvt->model == 0x30) {
2735 fam_type = &family_types[F15_M30H_CPUS];
2736 pvt->ops = &family_types[F15_M30H_CPUS].ops;
2737 break;
2738 } else if (pvt->model == 0x60) {
2739 fam_type = &family_types[F15_M60H_CPUS];
2740 pvt->ops = &family_types[F15_M60H_CPUS].ops;
2741 break;
2742 }
2743
2744 fam_type = &family_types[F15_CPUS];
2745 pvt->ops = &family_types[F15_CPUS].ops;
2746 break;
2747
2748 case 0x16:
2749 if (pvt->model == 0x30) {
2750 fam_type = &family_types[F16_M30H_CPUS];
2751 pvt->ops = &family_types[F16_M30H_CPUS].ops;
2752 break;
2753 }
2754 fam_type = &family_types[F16_CPUS];
2755 pvt->ops = &family_types[F16_CPUS].ops;
2756 break;
2757
2758 default:
2759 amd64_err("Unsupported family!\n");
2760 return NULL;
2761 }
2762
2763 amd64_info("%s %sdetected (node %d).\n", fam_type->ctl_name,
2764 (pvt->fam == 0xf ?
2765 (pvt->ext_model >= K8_REV_F ? "revF or later "
2766 : "revE or earlier ")
2767 : ""), pvt->mc_node_id);
2768 return fam_type;
2769}
2770
2771static const struct attribute_group *amd64_edac_attr_groups[] = {
2772#ifdef CONFIG_EDAC_DEBUG
2773 &amd64_edac_dbg_group,
2774#endif
2775#ifdef CONFIG_EDAC_AMD64_ERROR_INJECTION
2776 &amd64_edac_inj_group,
2777#endif
2778 NULL
2779};
2780
2781static int init_one_instance(struct pci_dev *F2)
2782{
2783 struct amd64_pvt *pvt = NULL;
2784 struct amd64_family_type *fam_type = NULL;
2785 struct mem_ctl_info *mci = NULL;
2786 struct edac_mc_layer layers[2];
2787 int err = 0, ret;
2788 u16 nid = amd_pci_dev_to_node_id(F2);
2789
2790 ret = -ENOMEM;
2791 pvt = kzalloc(sizeof(struct amd64_pvt), GFP_KERNEL);
2792 if (!pvt)
2793 goto err_ret;
2794
2795 pvt->mc_node_id = nid;
2796 pvt->F2 = F2;
2797
2798 ret = -EINVAL;
2799 fam_type = per_family_init(pvt);
2800 if (!fam_type)
2801 goto err_free;
2802
2803 ret = -ENODEV;
2804 err = reserve_mc_sibling_devs(pvt, fam_type->f1_id, fam_type->f3_id);
2805 if (err)
2806 goto err_free;
2807
2808 read_mc_regs(pvt);
2809
2810
2811
2812
2813
2814
2815 ret = -EINVAL;
2816 pvt->channel_count = pvt->ops->early_channel_count(pvt);
2817 if (pvt->channel_count < 0)
2818 goto err_siblings;
2819
2820 ret = -ENOMEM;
2821 layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
2822 layers[0].size = pvt->csels[0].b_cnt;
2823 layers[0].is_virt_csrow = true;
2824 layers[1].type = EDAC_MC_LAYER_CHANNEL;
2825
2826
2827
2828
2829
2830
2831 layers[1].size = 2;
2832 layers[1].is_virt_csrow = false;
2833
2834 mci = edac_mc_alloc(nid, ARRAY_SIZE(layers), layers, 0);
2835 if (!mci)
2836 goto err_siblings;
2837
2838 mci->pvt_info = pvt;
2839 mci->pdev = &pvt->F2->dev;
2840
2841 setup_mci_misc_attrs(mci, fam_type);
2842
2843 if (init_csrows(mci))
2844 mci->edac_cap = EDAC_FLAG_NONE;
2845
2846 ret = -ENODEV;
2847 if (edac_mc_add_mc_with_groups(mci, amd64_edac_attr_groups)) {
2848 edac_dbg(1, "failed edac_mc_add_mc()\n");
2849 goto err_add_mc;
2850 }
2851
2852
2853 if (report_gart_errors)
2854 amd_report_gart_errors(true);
2855
2856 amd_register_ecc_decoder(decode_bus_error);
2857
2858 atomic_inc(&drv_instances);
2859
2860 return 0;
2861
2862err_add_mc:
2863 edac_mc_free(mci);
2864
2865err_siblings:
2866 free_mc_sibling_devs(pvt);
2867
2868err_free:
2869 kfree(pvt);
2870
2871err_ret:
2872 return ret;
2873}
2874
2875static int probe_one_instance(struct pci_dev *pdev,
2876 const struct pci_device_id *mc_type)
2877{
2878 u16 nid = amd_pci_dev_to_node_id(pdev);
2879 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
2880 struct ecc_settings *s;
2881 int ret = 0;
2882
2883 ret = pci_enable_device(pdev);
2884 if (ret < 0) {
2885 edac_dbg(0, "ret=%d\n", ret);
2886 return -EIO;
2887 }
2888
2889 ret = -ENOMEM;
2890 s = kzalloc(sizeof(struct ecc_settings), GFP_KERNEL);
2891 if (!s)
2892 goto err_out;
2893
2894 ecc_stngs[nid] = s;
2895
2896 if (!ecc_enabled(F3, nid)) {
2897 ret = -ENODEV;
2898
2899 if (!ecc_enable_override)
2900 goto err_enable;
2901
2902 amd64_warn("Forcing ECC on!\n");
2903
2904 if (!enable_ecc_error_reporting(s, nid, F3))
2905 goto err_enable;
2906 }
2907
2908 ret = init_one_instance(pdev);
2909 if (ret < 0) {
2910 amd64_err("Error probing instance: %d\n", nid);
2911 restore_ecc_error_reporting(s, nid, F3);
2912 }
2913
2914 return ret;
2915
2916err_enable:
2917 kfree(s);
2918 ecc_stngs[nid] = NULL;
2919
2920err_out:
2921 return ret;
2922}
2923
2924static void remove_one_instance(struct pci_dev *pdev)
2925{
2926 struct mem_ctl_info *mci;
2927 struct amd64_pvt *pvt;
2928 u16 nid = amd_pci_dev_to_node_id(pdev);
2929 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
2930 struct ecc_settings *s = ecc_stngs[nid];
2931
2932 mci = find_mci_by_dev(&pdev->dev);
2933 WARN_ON(!mci);
2934
2935
2936 mci = edac_mc_del_mc(&pdev->dev);
2937 if (!mci)
2938 return;
2939
2940 pvt = mci->pvt_info;
2941
2942 restore_ecc_error_reporting(s, nid, F3);
2943
2944 free_mc_sibling_devs(pvt);
2945
2946
2947 amd_report_gart_errors(false);
2948 amd_unregister_ecc_decoder(decode_bus_error);
2949
2950 kfree(ecc_stngs[nid]);
2951 ecc_stngs[nid] = NULL;
2952
2953
2954 mci->pvt_info = NULL;
2955
2956 kfree(pvt);
2957 edac_mc_free(mci);
2958}
2959
2960
2961
2962
2963
2964
2965static const struct pci_device_id amd64_pci_table[] = {
2966 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_K8_NB_MEMCTL) },
2967 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_10H_NB_DRAM) },
2968 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_NB_F2) },
2969 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_M30H_NB_F2) },
2970 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_M60H_NB_F2) },
2971 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_16H_NB_F2) },
2972 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_16H_M30H_NB_F2) },
2973 {0, }
2974};
2975MODULE_DEVICE_TABLE(pci, amd64_pci_table);
2976
2977static struct pci_driver amd64_pci_driver = {
2978 .name = EDAC_MOD_STR,
2979 .probe = probe_one_instance,
2980 .remove = remove_one_instance,
2981 .id_table = amd64_pci_table,
2982 .driver.probe_type = PROBE_FORCE_SYNCHRONOUS,
2983};
2984
2985static void setup_pci_device(void)
2986{
2987 struct mem_ctl_info *mci;
2988 struct amd64_pvt *pvt;
2989
2990 if (pci_ctl)
2991 return;
2992
2993 mci = edac_mc_find(0);
2994 if (!mci)
2995 return;
2996
2997 pvt = mci->pvt_info;
2998 pci_ctl = edac_pci_create_generic_ctl(&pvt->F2->dev, EDAC_MOD_STR);
2999 if (!pci_ctl) {
3000 pr_warn("%s(): Unable to create PCI control\n", __func__);
3001 pr_warn("%s(): PCI error report via EDAC not set\n", __func__);
3002 }
3003}
3004
3005static int __init amd64_edac_init(void)
3006{
3007 int err = -ENODEV;
3008
3009 printk(KERN_INFO "AMD64 EDAC driver v%s\n", EDAC_AMD64_VERSION);
3010
3011 opstate_init();
3012
3013 if (amd_cache_northbridges() < 0)
3014 goto err_ret;
3015
3016 err = -ENOMEM;
3017 ecc_stngs = kzalloc(amd_nb_num() * sizeof(ecc_stngs[0]), GFP_KERNEL);
3018 if (!ecc_stngs)
3019 goto err_free;
3020
3021 msrs = msrs_alloc();
3022 if (!msrs)
3023 goto err_free;
3024
3025 err = pci_register_driver(&amd64_pci_driver);
3026 if (err)
3027 goto err_pci;
3028
3029 err = -ENODEV;
3030 if (!atomic_read(&drv_instances))
3031 goto err_no_instances;
3032
3033 setup_pci_device();
3034
3035#ifdef CONFIG_X86_32
3036 amd64_err("%s on 32-bit is unsupported. USE AT YOUR OWN RISK!\n", EDAC_MOD_STR);
3037#endif
3038
3039 return 0;
3040
3041err_no_instances:
3042 pci_unregister_driver(&amd64_pci_driver);
3043
3044err_pci:
3045 msrs_free(msrs);
3046 msrs = NULL;
3047
3048err_free:
3049 kfree(ecc_stngs);
3050 ecc_stngs = NULL;
3051
3052err_ret:
3053 return err;
3054}
3055
3056static void __exit amd64_edac_exit(void)
3057{
3058 if (pci_ctl)
3059 edac_pci_release_generic_ctl(pci_ctl);
3060
3061 pci_unregister_driver(&amd64_pci_driver);
3062
3063 kfree(ecc_stngs);
3064 ecc_stngs = NULL;
3065
3066 msrs_free(msrs);
3067 msrs = NULL;
3068}
3069
3070module_init(amd64_edac_init);
3071module_exit(amd64_edac_exit);
3072
3073MODULE_LICENSE("GPL");
3074MODULE_AUTHOR("SoftwareBitMaker: Doug Thompson, "
3075 "Dave Peterson, Thayne Harbaugh");
3076MODULE_DESCRIPTION("MC support for AMD64 memory controllers - "
3077 EDAC_AMD64_VERSION);
3078
3079module_param(edac_op_state, int, 0444);
3080MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");
3081