Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0-only
2#include "amd64_edac.h"
3#include <asm/amd_nb.h>
4
5static struct edac_pci_ctl_info *pci_ctl;
6
7/*
8 * Set by command line parameter. If BIOS has enabled the ECC, this override is
9 * cleared to prevent re-enabling the hardware by this driver.
10 */
11static int ecc_enable_override;
12module_param(ecc_enable_override, int, 0644);
13
14static struct msr __percpu *msrs;
15
16static struct amd64_family_type *fam_type;
17
18/* Per-node stuff */
19static struct ecc_settings **ecc_stngs;
20
21/* Device for the PCI component */
22static struct device *pci_ctl_dev;
23
24/*
25 * Valid scrub rates for the K8 hardware memory scrubber. We map the scrubbing
26 * bandwidth to a valid bit pattern. The 'set' operation finds the 'matching-
27 * or higher value'.
28 *
29 *FIXME: Produce a better mapping/linearisation.
30 */
31static const struct scrubrate {
32 u32 scrubval; /* bit pattern for scrub rate */
33 u32 bandwidth; /* bandwidth consumed (bytes/sec) */
34} scrubrates[] = {
35 { 0x01, 1600000000UL},
36 { 0x02, 800000000UL},
37 { 0x03, 400000000UL},
38 { 0x04, 200000000UL},
39 { 0x05, 100000000UL},
40 { 0x06, 50000000UL},
41 { 0x07, 25000000UL},
42 { 0x08, 12284069UL},
43 { 0x09, 6274509UL},
44 { 0x0A, 3121951UL},
45 { 0x0B, 1560975UL},
46 { 0x0C, 781440UL},
47 { 0x0D, 390720UL},
48 { 0x0E, 195300UL},
49 { 0x0F, 97650UL},
50 { 0x10, 48854UL},
51 { 0x11, 24427UL},
52 { 0x12, 12213UL},
53 { 0x13, 6101UL},
54 { 0x14, 3051UL},
55 { 0x15, 1523UL},
56 { 0x16, 761UL},
57 { 0x00, 0UL}, /* scrubbing off */
58};
59
60int __amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset,
61 u32 *val, const char *func)
62{
63 int err = 0;
64
65 err = pci_read_config_dword(pdev, offset, val);
66 if (err)
67 amd64_warn("%s: error reading F%dx%03x.\n",
68 func, PCI_FUNC(pdev->devfn), offset);
69
70 return err;
71}
72
73int __amd64_write_pci_cfg_dword(struct pci_dev *pdev, int offset,
74 u32 val, const char *func)
75{
76 int err = 0;
77
78 err = pci_write_config_dword(pdev, offset, val);
79 if (err)
80 amd64_warn("%s: error writing to F%dx%03x.\n",
81 func, PCI_FUNC(pdev->devfn), offset);
82
83 return err;
84}
85
86/*
87 * Select DCT to which PCI cfg accesses are routed
88 */
89static void f15h_select_dct(struct amd64_pvt *pvt, u8 dct)
90{
91 u32 reg = 0;
92
93 amd64_read_pci_cfg(pvt->F1, DCT_CFG_SEL, ®);
94 reg &= (pvt->model == 0x30) ? ~3 : ~1;
95 reg |= dct;
96 amd64_write_pci_cfg(pvt->F1, DCT_CFG_SEL, reg);
97}
98
99/*
100 *
101 * Depending on the family, F2 DCT reads need special handling:
102 *
103 * K8: has a single DCT only and no address offsets >= 0x100
104 *
105 * F10h: each DCT has its own set of regs
106 * DCT0 -> F2x040..
107 * DCT1 -> F2x140..
108 *
109 * F16h: has only 1 DCT
110 *
111 * F15h: we select which DCT we access using F1x10C[DctCfgSel]
112 */
113static inline int amd64_read_dct_pci_cfg(struct amd64_pvt *pvt, u8 dct,
114 int offset, u32 *val)
115{
116 switch (pvt->fam) {
117 case 0xf:
118 if (dct || offset >= 0x100)
119 return -EINVAL;
120 break;
121
122 case 0x10:
123 if (dct) {
124 /*
125 * Note: If ganging is enabled, barring the regs
126 * F2x[1,0]98 and F2x[1,0]9C; reads reads to F2x1xx
127 * return 0. (cf. Section 2.8.1 F10h BKDG)
128 */
129 if (dct_ganging_enabled(pvt))
130 return 0;
131
132 offset += 0x100;
133 }
134 break;
135
136 case 0x15:
137 /*
138 * F15h: F2x1xx addresses do not map explicitly to DCT1.
139 * We should select which DCT we access using F1x10C[DctCfgSel]
140 */
141 dct = (dct && pvt->model == 0x30) ? 3 : dct;
142 f15h_select_dct(pvt, dct);
143 break;
144
145 case 0x16:
146 if (dct)
147 return -EINVAL;
148 break;
149
150 default:
151 break;
152 }
153 return amd64_read_pci_cfg(pvt->F2, offset, val);
154}
155
156/*
157 * Memory scrubber control interface. For K8, memory scrubbing is handled by
158 * hardware and can involve L2 cache, dcache as well as the main memory. With
159 * F10, this is extended to L3 cache scrubbing on CPU models sporting that
160 * functionality.
161 *
162 * This causes the "units" for the scrubbing speed to vary from 64 byte blocks
163 * (dram) over to cache lines. This is nasty, so we will use bandwidth in
164 * bytes/sec for the setting.
165 *
166 * Currently, we only do dram scrubbing. If the scrubbing is done in software on
167 * other archs, we might not have access to the caches directly.
168 */
169
170static inline void __f17h_set_scrubval(struct amd64_pvt *pvt, u32 scrubval)
171{
172 /*
173 * Fam17h supports scrub values between 0x5 and 0x14. Also, the values
174 * are shifted down by 0x5, so scrubval 0x5 is written to the register
175 * as 0x0, scrubval 0x6 as 0x1, etc.
176 */
177 if (scrubval >= 0x5 && scrubval <= 0x14) {
178 scrubval -= 0x5;
179 pci_write_bits32(pvt->F6, F17H_SCR_LIMIT_ADDR, scrubval, 0xF);
180 pci_write_bits32(pvt->F6, F17H_SCR_BASE_ADDR, 1, 0x1);
181 } else {
182 pci_write_bits32(pvt->F6, F17H_SCR_BASE_ADDR, 0, 0x1);
183 }
184}
185/*
186 * Scan the scrub rate mapping table for a close or matching bandwidth value to
187 * issue. If requested is too big, then use last maximum value found.
188 */
189static int __set_scrub_rate(struct amd64_pvt *pvt, u32 new_bw, u32 min_rate)
190{
191 u32 scrubval;
192 int i;
193
194 /*
195 * map the configured rate (new_bw) to a value specific to the AMD64
196 * memory controller and apply to register. Search for the first
197 * bandwidth entry that is greater or equal than the setting requested
198 * and program that. If at last entry, turn off DRAM scrubbing.
199 *
200 * If no suitable bandwidth is found, turn off DRAM scrubbing entirely
201 * by falling back to the last element in scrubrates[].
202 */
203 for (i = 0; i < ARRAY_SIZE(scrubrates) - 1; i++) {
204 /*
205 * skip scrub rates which aren't recommended
206 * (see F10 BKDG, F3x58)
207 */
208 if (scrubrates[i].scrubval < min_rate)
209 continue;
210
211 if (scrubrates[i].bandwidth <= new_bw)
212 break;
213 }
214
215 scrubval = scrubrates[i].scrubval;
216
217 if (pvt->umc) {
218 __f17h_set_scrubval(pvt, scrubval);
219 } else if (pvt->fam == 0x15 && pvt->model == 0x60) {
220 f15h_select_dct(pvt, 0);
221 pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
222 f15h_select_dct(pvt, 1);
223 pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
224 } else {
225 pci_write_bits32(pvt->F3, SCRCTRL, scrubval, 0x001F);
226 }
227
228 if (scrubval)
229 return scrubrates[i].bandwidth;
230
231 return 0;
232}
233
234static int set_scrub_rate(struct mem_ctl_info *mci, u32 bw)
235{
236 struct amd64_pvt *pvt = mci->pvt_info;
237 u32 min_scrubrate = 0x5;
238
239 if (pvt->fam == 0xf)
240 min_scrubrate = 0x0;
241
242 if (pvt->fam == 0x15) {
243 /* Erratum #505 */
244 if (pvt->model < 0x10)
245 f15h_select_dct(pvt, 0);
246
247 if (pvt->model == 0x60)
248 min_scrubrate = 0x6;
249 }
250 return __set_scrub_rate(pvt, bw, min_scrubrate);
251}
252
253static int get_scrub_rate(struct mem_ctl_info *mci)
254{
255 struct amd64_pvt *pvt = mci->pvt_info;
256 int i, retval = -EINVAL;
257 u32 scrubval = 0;
258
259 if (pvt->umc) {
260 amd64_read_pci_cfg(pvt->F6, F17H_SCR_BASE_ADDR, &scrubval);
261 if (scrubval & BIT(0)) {
262 amd64_read_pci_cfg(pvt->F6, F17H_SCR_LIMIT_ADDR, &scrubval);
263 scrubval &= 0xF;
264 scrubval += 0x5;
265 } else {
266 scrubval = 0;
267 }
268 } else if (pvt->fam == 0x15) {
269 /* Erratum #505 */
270 if (pvt->model < 0x10)
271 f15h_select_dct(pvt, 0);
272
273 if (pvt->model == 0x60)
274 amd64_read_pci_cfg(pvt->F2, F15H_M60H_SCRCTRL, &scrubval);
275 else
276 amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
277 } else {
278 amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
279 }
280
281 scrubval = scrubval & 0x001F;
282
283 for (i = 0; i < ARRAY_SIZE(scrubrates); i++) {
284 if (scrubrates[i].scrubval == scrubval) {
285 retval = scrubrates[i].bandwidth;
286 break;
287 }
288 }
289 return retval;
290}
291
292/*
293 * returns true if the SysAddr given by sys_addr matches the
294 * DRAM base/limit associated with node_id
295 */
296static bool base_limit_match(struct amd64_pvt *pvt, u64 sys_addr, u8 nid)
297{
298 u64 addr;
299
300 /* The K8 treats this as a 40-bit value. However, bits 63-40 will be
301 * all ones if the most significant implemented address bit is 1.
302 * Here we discard bits 63-40. See section 3.4.2 of AMD publication
303 * 24592: AMD x86-64 Architecture Programmer's Manual Volume 1
304 * Application Programming.
305 */
306 addr = sys_addr & 0x000000ffffffffffull;
307
308 return ((addr >= get_dram_base(pvt, nid)) &&
309 (addr <= get_dram_limit(pvt, nid)));
310}
311
312/*
313 * Attempt to map a SysAddr to a node. On success, return a pointer to the
314 * mem_ctl_info structure for the node that the SysAddr maps to.
315 *
316 * On failure, return NULL.
317 */
318static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci,
319 u64 sys_addr)
320{
321 struct amd64_pvt *pvt;
322 u8 node_id;
323 u32 intlv_en, bits;
324
325 /*
326 * Here we use the DRAM Base (section 3.4.4.1) and DRAM Limit (section
327 * 3.4.4.2) registers to map the SysAddr to a node ID.
328 */
329 pvt = mci->pvt_info;
330
331 /*
332 * The value of this field should be the same for all DRAM Base
333 * registers. Therefore we arbitrarily choose to read it from the
334 * register for node 0.
335 */
336 intlv_en = dram_intlv_en(pvt, 0);
337
338 if (intlv_en == 0) {
339 for (node_id = 0; node_id < DRAM_RANGES; node_id++) {
340 if (base_limit_match(pvt, sys_addr, node_id))
341 goto found;
342 }
343 goto err_no_match;
344 }
345
346 if (unlikely((intlv_en != 0x01) &&
347 (intlv_en != 0x03) &&
348 (intlv_en != 0x07))) {
349 amd64_warn("DRAM Base[IntlvEn] junk value: 0x%x, BIOS bug?\n", intlv_en);
350 return NULL;
351 }
352
353 bits = (((u32) sys_addr) >> 12) & intlv_en;
354
355 for (node_id = 0; ; ) {
356 if ((dram_intlv_sel(pvt, node_id) & intlv_en) == bits)
357 break; /* intlv_sel field matches */
358
359 if (++node_id >= DRAM_RANGES)
360 goto err_no_match;
361 }
362
363 /* sanity test for sys_addr */
364 if (unlikely(!base_limit_match(pvt, sys_addr, node_id))) {
365 amd64_warn("%s: sys_addr 0x%llx falls outside base/limit address"
366 "range for node %d with node interleaving enabled.\n",
367 __func__, sys_addr, node_id);
368 return NULL;
369 }
370
371found:
372 return edac_mc_find((int)node_id);
373
374err_no_match:
375 edac_dbg(2, "sys_addr 0x%lx doesn't match any node\n",
376 (unsigned long)sys_addr);
377
378 return NULL;
379}
380
381/*
382 * compute the CS base address of the @csrow on the DRAM controller @dct.
383 * For details see F2x[5C:40] in the processor's BKDG
384 */
385static void get_cs_base_and_mask(struct amd64_pvt *pvt, int csrow, u8 dct,
386 u64 *base, u64 *mask)
387{
388 u64 csbase, csmask, base_bits, mask_bits;
389 u8 addr_shift;
390
391 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
392 csbase = pvt->csels[dct].csbases[csrow];
393 csmask = pvt->csels[dct].csmasks[csrow];
394 base_bits = GENMASK_ULL(31, 21) | GENMASK_ULL(15, 9);
395 mask_bits = GENMASK_ULL(29, 21) | GENMASK_ULL(15, 9);
396 addr_shift = 4;
397
398 /*
399 * F16h and F15h, models 30h and later need two addr_shift values:
400 * 8 for high and 6 for low (cf. F16h BKDG).
401 */
402 } else if (pvt->fam == 0x16 ||
403 (pvt->fam == 0x15 && pvt->model >= 0x30)) {
404 csbase = pvt->csels[dct].csbases[csrow];
405 csmask = pvt->csels[dct].csmasks[csrow >> 1];
406
407 *base = (csbase & GENMASK_ULL(15, 5)) << 6;
408 *base |= (csbase & GENMASK_ULL(30, 19)) << 8;
409
410 *mask = ~0ULL;
411 /* poke holes for the csmask */
412 *mask &= ~((GENMASK_ULL(15, 5) << 6) |
413 (GENMASK_ULL(30, 19) << 8));
414
415 *mask |= (csmask & GENMASK_ULL(15, 5)) << 6;
416 *mask |= (csmask & GENMASK_ULL(30, 19)) << 8;
417
418 return;
419 } else {
420 csbase = pvt->csels[dct].csbases[csrow];
421 csmask = pvt->csels[dct].csmasks[csrow >> 1];
422 addr_shift = 8;
423
424 if (pvt->fam == 0x15)
425 base_bits = mask_bits =
426 GENMASK_ULL(30,19) | GENMASK_ULL(13,5);
427 else
428 base_bits = mask_bits =
429 GENMASK_ULL(28,19) | GENMASK_ULL(13,5);
430 }
431
432 *base = (csbase & base_bits) << addr_shift;
433
434 *mask = ~0ULL;
435 /* poke holes for the csmask */
436 *mask &= ~(mask_bits << addr_shift);
437 /* OR them in */
438 *mask |= (csmask & mask_bits) << addr_shift;
439}
440
441#define for_each_chip_select(i, dct, pvt) \
442 for (i = 0; i < pvt->csels[dct].b_cnt; i++)
443
444#define chip_select_base(i, dct, pvt) \
445 pvt->csels[dct].csbases[i]
446
447#define for_each_chip_select_mask(i, dct, pvt) \
448 for (i = 0; i < pvt->csels[dct].m_cnt; i++)
449
450#define for_each_umc(i) \
451 for (i = 0; i < fam_type->max_mcs; i++)
452
453/*
454 * @input_addr is an InputAddr associated with the node given by mci. Return the
455 * csrow that input_addr maps to, or -1 on failure (no csrow claims input_addr).
456 */
457static int input_addr_to_csrow(struct mem_ctl_info *mci, u64 input_addr)
458{
459 struct amd64_pvt *pvt;
460 int csrow;
461 u64 base, mask;
462
463 pvt = mci->pvt_info;
464
465 for_each_chip_select(csrow, 0, pvt) {
466 if (!csrow_enabled(csrow, 0, pvt))
467 continue;
468
469 get_cs_base_and_mask(pvt, csrow, 0, &base, &mask);
470
471 mask = ~mask;
472
473 if ((input_addr & mask) == (base & mask)) {
474 edac_dbg(2, "InputAddr 0x%lx matches csrow %d (node %d)\n",
475 (unsigned long)input_addr, csrow,
476 pvt->mc_node_id);
477
478 return csrow;
479 }
480 }
481 edac_dbg(2, "no matching csrow for InputAddr 0x%lx (MC node %d)\n",
482 (unsigned long)input_addr, pvt->mc_node_id);
483
484 return -1;
485}
486
487/*
488 * Obtain info from the DRAM Hole Address Register (section 3.4.8, pub #26094)
489 * for the node represented by mci. Info is passed back in *hole_base,
490 * *hole_offset, and *hole_size. Function returns 0 if info is valid or 1 if
491 * info is invalid. Info may be invalid for either of the following reasons:
492 *
493 * - The revision of the node is not E or greater. In this case, the DRAM Hole
494 * Address Register does not exist.
495 *
496 * - The DramHoleValid bit is cleared in the DRAM Hole Address Register,
497 * indicating that its contents are not valid.
498 *
499 * The values passed back in *hole_base, *hole_offset, and *hole_size are
500 * complete 32-bit values despite the fact that the bitfields in the DHAR
501 * only represent bits 31-24 of the base and offset values.
502 */
503int amd64_get_dram_hole_info(struct mem_ctl_info *mci, u64 *hole_base,
504 u64 *hole_offset, u64 *hole_size)
505{
506 struct amd64_pvt *pvt = mci->pvt_info;
507
508 /* only revE and later have the DRAM Hole Address Register */
509 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_E) {
510 edac_dbg(1, " revision %d for node %d does not support DHAR\n",
511 pvt->ext_model, pvt->mc_node_id);
512 return 1;
513 }
514
515 /* valid for Fam10h and above */
516 if (pvt->fam >= 0x10 && !dhar_mem_hoist_valid(pvt)) {
517 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this system\n");
518 return 1;
519 }
520
521 if (!dhar_valid(pvt)) {
522 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this node %d\n",
523 pvt->mc_node_id);
524 return 1;
525 }
526
527 /* This node has Memory Hoisting */
528
529 /* +------------------+--------------------+--------------------+-----
530 * | memory | DRAM hole | relocated |
531 * | [0, (x - 1)] | [x, 0xffffffff] | addresses from |
532 * | | | DRAM hole |
533 * | | | [0x100000000, |
534 * | | | (0x100000000+ |
535 * | | | (0xffffffff-x))] |
536 * +------------------+--------------------+--------------------+-----
537 *
538 * Above is a diagram of physical memory showing the DRAM hole and the
539 * relocated addresses from the DRAM hole. As shown, the DRAM hole
540 * starts at address x (the base address) and extends through address
541 * 0xffffffff. The DRAM Hole Address Register (DHAR) relocates the
542 * addresses in the hole so that they start at 0x100000000.
543 */
544
545 *hole_base = dhar_base(pvt);
546 *hole_size = (1ULL << 32) - *hole_base;
547
548 *hole_offset = (pvt->fam > 0xf) ? f10_dhar_offset(pvt)
549 : k8_dhar_offset(pvt);
550
551 edac_dbg(1, " DHAR info for node %d base 0x%lx offset 0x%lx size 0x%lx\n",
552 pvt->mc_node_id, (unsigned long)*hole_base,
553 (unsigned long)*hole_offset, (unsigned long)*hole_size);
554
555 return 0;
556}
557EXPORT_SYMBOL_GPL(amd64_get_dram_hole_info);
558
559/*
560 * Return the DramAddr that the SysAddr given by @sys_addr maps to. It is
561 * assumed that sys_addr maps to the node given by mci.
562 *
563 * The first part of section 3.4.4 (p. 70) shows how the DRAM Base (section
564 * 3.4.4.1) and DRAM Limit (section 3.4.4.2) registers are used to translate a
565 * SysAddr to a DramAddr. If the DRAM Hole Address Register (DHAR) is enabled,
566 * then it is also involved in translating a SysAddr to a DramAddr. Sections
567 * 3.4.8 and 3.5.8.2 describe the DHAR and how it is used for memory hoisting.
568 * These parts of the documentation are unclear. I interpret them as follows:
569 *
570 * When node n receives a SysAddr, it processes the SysAddr as follows:
571 *
572 * 1. It extracts the DRAMBase and DRAMLimit values from the DRAM Base and DRAM
573 * Limit registers for node n. If the SysAddr is not within the range
574 * specified by the base and limit values, then node n ignores the Sysaddr
575 * (since it does not map to node n). Otherwise continue to step 2 below.
576 *
577 * 2. If the DramHoleValid bit of the DHAR for node n is clear, the DHAR is
578 * disabled so skip to step 3 below. Otherwise see if the SysAddr is within
579 * the range of relocated addresses (starting at 0x100000000) from the DRAM
580 * hole. If not, skip to step 3 below. Else get the value of the
581 * DramHoleOffset field from the DHAR. To obtain the DramAddr, subtract the
582 * offset defined by this value from the SysAddr.
583 *
584 * 3. Obtain the base address for node n from the DRAMBase field of the DRAM
585 * Base register for node n. To obtain the DramAddr, subtract the base
586 * address from the SysAddr, as shown near the start of section 3.4.4 (p.70).
587 */
588static u64 sys_addr_to_dram_addr(struct mem_ctl_info *mci, u64 sys_addr)
589{
590 struct amd64_pvt *pvt = mci->pvt_info;
591 u64 dram_base, hole_base, hole_offset, hole_size, dram_addr;
592 int ret;
593
594 dram_base = get_dram_base(pvt, pvt->mc_node_id);
595
596 ret = amd64_get_dram_hole_info(mci, &hole_base, &hole_offset,
597 &hole_size);
598 if (!ret) {
599 if ((sys_addr >= (1ULL << 32)) &&
600 (sys_addr < ((1ULL << 32) + hole_size))) {
601 /* use DHAR to translate SysAddr to DramAddr */
602 dram_addr = sys_addr - hole_offset;
603
604 edac_dbg(2, "using DHAR to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
605 (unsigned long)sys_addr,
606 (unsigned long)dram_addr);
607
608 return dram_addr;
609 }
610 }
611
612 /*
613 * Translate the SysAddr to a DramAddr as shown near the start of
614 * section 3.4.4 (p. 70). Although sys_addr is a 64-bit value, the k8
615 * only deals with 40-bit values. Therefore we discard bits 63-40 of
616 * sys_addr below. If bit 39 of sys_addr is 1 then the bits we
617 * discard are all 1s. Otherwise the bits we discard are all 0s. See
618 * section 3.4.2 of AMD publication 24592: AMD x86-64 Architecture
619 * Programmer's Manual Volume 1 Application Programming.
620 */
621 dram_addr = (sys_addr & GENMASK_ULL(39, 0)) - dram_base;
622
623 edac_dbg(2, "using DRAM Base register to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
624 (unsigned long)sys_addr, (unsigned long)dram_addr);
625 return dram_addr;
626}
627
628/*
629 * @intlv_en is the value of the IntlvEn field from a DRAM Base register
630 * (section 3.4.4.1). Return the number of bits from a SysAddr that are used
631 * for node interleaving.
632 */
633static int num_node_interleave_bits(unsigned intlv_en)
634{
635 static const int intlv_shift_table[] = { 0, 1, 0, 2, 0, 0, 0, 3 };
636 int n;
637
638 BUG_ON(intlv_en > 7);
639 n = intlv_shift_table[intlv_en];
640 return n;
641}
642
643/* Translate the DramAddr given by @dram_addr to an InputAddr. */
644static u64 dram_addr_to_input_addr(struct mem_ctl_info *mci, u64 dram_addr)
645{
646 struct amd64_pvt *pvt;
647 int intlv_shift;
648 u64 input_addr;
649
650 pvt = mci->pvt_info;
651
652 /*
653 * See the start of section 3.4.4 (p. 70, BKDG #26094, K8, revA-E)
654 * concerning translating a DramAddr to an InputAddr.
655 */
656 intlv_shift = num_node_interleave_bits(dram_intlv_en(pvt, 0));
657 input_addr = ((dram_addr >> intlv_shift) & GENMASK_ULL(35, 12)) +
658 (dram_addr & 0xfff);
659
660 edac_dbg(2, " Intlv Shift=%d DramAddr=0x%lx maps to InputAddr=0x%lx\n",
661 intlv_shift, (unsigned long)dram_addr,
662 (unsigned long)input_addr);
663
664 return input_addr;
665}
666
667/*
668 * Translate the SysAddr represented by @sys_addr to an InputAddr. It is
669 * assumed that @sys_addr maps to the node given by mci.
670 */
671static u64 sys_addr_to_input_addr(struct mem_ctl_info *mci, u64 sys_addr)
672{
673 u64 input_addr;
674
675 input_addr =
676 dram_addr_to_input_addr(mci, sys_addr_to_dram_addr(mci, sys_addr));
677
678 edac_dbg(2, "SysAddr 0x%lx translates to InputAddr 0x%lx\n",
679 (unsigned long)sys_addr, (unsigned long)input_addr);
680
681 return input_addr;
682}
683
684/* Map the Error address to a PAGE and PAGE OFFSET. */
685static inline void error_address_to_page_and_offset(u64 error_address,
686 struct err_info *err)
687{
688 err->page = (u32) (error_address >> PAGE_SHIFT);
689 err->offset = ((u32) error_address) & ~PAGE_MASK;
690}
691
692/*
693 * @sys_addr is an error address (a SysAddr) extracted from the MCA NB Address
694 * Low (section 3.6.4.5) and MCA NB Address High (section 3.6.4.6) registers
695 * of a node that detected an ECC memory error. mci represents the node that
696 * the error address maps to (possibly different from the node that detected
697 * the error). Return the number of the csrow that sys_addr maps to, or -1 on
698 * error.
699 */
700static int sys_addr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr)
701{
702 int csrow;
703
704 csrow = input_addr_to_csrow(mci, sys_addr_to_input_addr(mci, sys_addr));
705
706 if (csrow == -1)
707 amd64_mc_err(mci, "Failed to translate InputAddr to csrow for "
708 "address 0x%lx\n", (unsigned long)sys_addr);
709 return csrow;
710}
711
712static int get_channel_from_ecc_syndrome(struct mem_ctl_info *, u16);
713
714/*
715 * Determine if the DIMMs have ECC enabled. ECC is enabled ONLY if all the DIMMs
716 * are ECC capable.
717 */
718static unsigned long determine_edac_cap(struct amd64_pvt *pvt)
719{
720 unsigned long edac_cap = EDAC_FLAG_NONE;
721 u8 bit;
722
723 if (pvt->umc) {
724 u8 i, umc_en_mask = 0, dimm_ecc_en_mask = 0;
725
726 for_each_umc(i) {
727 if (!(pvt->umc[i].sdp_ctrl & UMC_SDP_INIT))
728 continue;
729
730 umc_en_mask |= BIT(i);
731
732 /* UMC Configuration bit 12 (DimmEccEn) */
733 if (pvt->umc[i].umc_cfg & BIT(12))
734 dimm_ecc_en_mask |= BIT(i);
735 }
736
737 if (umc_en_mask == dimm_ecc_en_mask)
738 edac_cap = EDAC_FLAG_SECDED;
739 } else {
740 bit = (pvt->fam > 0xf || pvt->ext_model >= K8_REV_F)
741 ? 19
742 : 17;
743
744 if (pvt->dclr0 & BIT(bit))
745 edac_cap = EDAC_FLAG_SECDED;
746 }
747
748 return edac_cap;
749}
750
751static void debug_display_dimm_sizes(struct amd64_pvt *, u8);
752
753static void debug_dump_dramcfg_low(struct amd64_pvt *pvt, u32 dclr, int chan)
754{
755 edac_dbg(1, "F2x%d90 (DRAM Cfg Low): 0x%08x\n", chan, dclr);
756
757 if (pvt->dram_type == MEM_LRDDR3) {
758 u32 dcsm = pvt->csels[chan].csmasks[0];
759 /*
760 * It's assumed all LRDIMMs in a DCT are going to be of
761 * same 'type' until proven otherwise. So, use a cs
762 * value of '0' here to get dcsm value.
763 */
764 edac_dbg(1, " LRDIMM %dx rank multiply\n", (dcsm & 0x3));
765 }
766
767 edac_dbg(1, "All DIMMs support ECC:%s\n",
768 (dclr & BIT(19)) ? "yes" : "no");
769
770
771 edac_dbg(1, " PAR/ERR parity: %s\n",
772 (dclr & BIT(8)) ? "enabled" : "disabled");
773
774 if (pvt->fam == 0x10)
775 edac_dbg(1, " DCT 128bit mode width: %s\n",
776 (dclr & BIT(11)) ? "128b" : "64b");
777
778 edac_dbg(1, " x4 logical DIMMs present: L0: %s L1: %s L2: %s L3: %s\n",
779 (dclr & BIT(12)) ? "yes" : "no",
780 (dclr & BIT(13)) ? "yes" : "no",
781 (dclr & BIT(14)) ? "yes" : "no",
782 (dclr & BIT(15)) ? "yes" : "no");
783}
784
785#define CS_EVEN_PRIMARY BIT(0)
786#define CS_ODD_PRIMARY BIT(1)
787#define CS_EVEN_SECONDARY BIT(2)
788#define CS_ODD_SECONDARY BIT(3)
789
790#define CS_EVEN (CS_EVEN_PRIMARY | CS_EVEN_SECONDARY)
791#define CS_ODD (CS_ODD_PRIMARY | CS_ODD_SECONDARY)
792
793static int f17_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt)
794{
795 int cs_mode = 0;
796
797 if (csrow_enabled(2 * dimm, ctrl, pvt))
798 cs_mode |= CS_EVEN_PRIMARY;
799
800 if (csrow_enabled(2 * dimm + 1, ctrl, pvt))
801 cs_mode |= CS_ODD_PRIMARY;
802
803 /* Asymmetric dual-rank DIMM support. */
804 if (csrow_sec_enabled(2 * dimm + 1, ctrl, pvt))
805 cs_mode |= CS_ODD_SECONDARY;
806
807 return cs_mode;
808}
809
810static void debug_display_dimm_sizes_df(struct amd64_pvt *pvt, u8 ctrl)
811{
812 int dimm, size0, size1, cs0, cs1, cs_mode;
813
814 edac_printk(KERN_DEBUG, EDAC_MC, "UMC%d chip selects:\n", ctrl);
815
816 for (dimm = 0; dimm < 2; dimm++) {
817 cs0 = dimm * 2;
818 cs1 = dimm * 2 + 1;
819
820 cs_mode = f17_get_cs_mode(dimm, ctrl, pvt);
821
822 size0 = pvt->ops->dbam_to_cs(pvt, ctrl, cs_mode, cs0);
823 size1 = pvt->ops->dbam_to_cs(pvt, ctrl, cs_mode, cs1);
824
825 amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
826 cs0, size0,
827 cs1, size1);
828 }
829}
830
831static void __dump_misc_regs_df(struct amd64_pvt *pvt)
832{
833 struct amd64_umc *umc;
834 u32 i, tmp, umc_base;
835
836 for_each_umc(i) {
837 umc_base = get_umc_base(i);
838 umc = &pvt->umc[i];
839
840 edac_dbg(1, "UMC%d DIMM cfg: 0x%x\n", i, umc->dimm_cfg);
841 edac_dbg(1, "UMC%d UMC cfg: 0x%x\n", i, umc->umc_cfg);
842 edac_dbg(1, "UMC%d SDP ctrl: 0x%x\n", i, umc->sdp_ctrl);
843 edac_dbg(1, "UMC%d ECC ctrl: 0x%x\n", i, umc->ecc_ctrl);
844
845 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_ECC_BAD_SYMBOL, &tmp);
846 edac_dbg(1, "UMC%d ECC bad symbol: 0x%x\n", i, tmp);
847
848 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_UMC_CAP, &tmp);
849 edac_dbg(1, "UMC%d UMC cap: 0x%x\n", i, tmp);
850 edac_dbg(1, "UMC%d UMC cap high: 0x%x\n", i, umc->umc_cap_hi);
851
852 edac_dbg(1, "UMC%d ECC capable: %s, ChipKill ECC capable: %s\n",
853 i, (umc->umc_cap_hi & BIT(30)) ? "yes" : "no",
854 (umc->umc_cap_hi & BIT(31)) ? "yes" : "no");
855 edac_dbg(1, "UMC%d All DIMMs support ECC: %s\n",
856 i, (umc->umc_cfg & BIT(12)) ? "yes" : "no");
857 edac_dbg(1, "UMC%d x4 DIMMs present: %s\n",
858 i, (umc->dimm_cfg & BIT(6)) ? "yes" : "no");
859 edac_dbg(1, "UMC%d x16 DIMMs present: %s\n",
860 i, (umc->dimm_cfg & BIT(7)) ? "yes" : "no");
861
862 if (pvt->dram_type == MEM_LRDDR4) {
863 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_ADDR_CFG, &tmp);
864 edac_dbg(1, "UMC%d LRDIMM %dx rank multiply\n",
865 i, 1 << ((tmp >> 4) & 0x3));
866 }
867
868 debug_display_dimm_sizes_df(pvt, i);
869 }
870
871 edac_dbg(1, "F0x104 (DRAM Hole Address): 0x%08x, base: 0x%08x\n",
872 pvt->dhar, dhar_base(pvt));
873}
874
875/* Display and decode various NB registers for debug purposes. */
876static void __dump_misc_regs(struct amd64_pvt *pvt)
877{
878 edac_dbg(1, "F3xE8 (NB Cap): 0x%08x\n", pvt->nbcap);
879
880 edac_dbg(1, " NB two channel DRAM capable: %s\n",
881 (pvt->nbcap & NBCAP_DCT_DUAL) ? "yes" : "no");
882
883 edac_dbg(1, " ECC capable: %s, ChipKill ECC capable: %s\n",
884 (pvt->nbcap & NBCAP_SECDED) ? "yes" : "no",
885 (pvt->nbcap & NBCAP_CHIPKILL) ? "yes" : "no");
886
887 debug_dump_dramcfg_low(pvt, pvt->dclr0, 0);
888
889 edac_dbg(1, "F3xB0 (Online Spare): 0x%08x\n", pvt->online_spare);
890
891 edac_dbg(1, "F1xF0 (DRAM Hole Address): 0x%08x, base: 0x%08x, offset: 0x%08x\n",
892 pvt->dhar, dhar_base(pvt),
893 (pvt->fam == 0xf) ? k8_dhar_offset(pvt)
894 : f10_dhar_offset(pvt));
895
896 debug_display_dimm_sizes(pvt, 0);
897
898 /* everything below this point is Fam10h and above */
899 if (pvt->fam == 0xf)
900 return;
901
902 debug_display_dimm_sizes(pvt, 1);
903
904 /* Only if NOT ganged does dclr1 have valid info */
905 if (!dct_ganging_enabled(pvt))
906 debug_dump_dramcfg_low(pvt, pvt->dclr1, 1);
907}
908
909/* Display and decode various NB registers for debug purposes. */
910static void dump_misc_regs(struct amd64_pvt *pvt)
911{
912 if (pvt->umc)
913 __dump_misc_regs_df(pvt);
914 else
915 __dump_misc_regs(pvt);
916
917 edac_dbg(1, " DramHoleValid: %s\n", dhar_valid(pvt) ? "yes" : "no");
918
919 amd64_info("using x%u syndromes.\n", pvt->ecc_sym_sz);
920}
921
922/*
923 * See BKDG, F2x[1,0][5C:40], F2[1,0][6C:60]
924 */
925static void prep_chip_selects(struct amd64_pvt *pvt)
926{
927 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
928 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
929 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 8;
930 } else if (pvt->fam == 0x15 && pvt->model == 0x30) {
931 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 4;
932 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 2;
933 } else if (pvt->fam >= 0x17) {
934 int umc;
935
936 for_each_umc(umc) {
937 pvt->csels[umc].b_cnt = 4;
938 pvt->csels[umc].m_cnt = 2;
939 }
940
941 } else {
942 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
943 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 4;
944 }
945}
946
947static void read_umc_base_mask(struct amd64_pvt *pvt)
948{
949 u32 umc_base_reg, umc_base_reg_sec;
950 u32 umc_mask_reg, umc_mask_reg_sec;
951 u32 base_reg, base_reg_sec;
952 u32 mask_reg, mask_reg_sec;
953 u32 *base, *base_sec;
954 u32 *mask, *mask_sec;
955 int cs, umc;
956
957 for_each_umc(umc) {
958 umc_base_reg = get_umc_base(umc) + UMCCH_BASE_ADDR;
959 umc_base_reg_sec = get_umc_base(umc) + UMCCH_BASE_ADDR_SEC;
960
961 for_each_chip_select(cs, umc, pvt) {
962 base = &pvt->csels[umc].csbases[cs];
963 base_sec = &pvt->csels[umc].csbases_sec[cs];
964
965 base_reg = umc_base_reg + (cs * 4);
966 base_reg_sec = umc_base_reg_sec + (cs * 4);
967
968 if (!amd_smn_read(pvt->mc_node_id, base_reg, base))
969 edac_dbg(0, " DCSB%d[%d]=0x%08x reg: 0x%x\n",
970 umc, cs, *base, base_reg);
971
972 if (!amd_smn_read(pvt->mc_node_id, base_reg_sec, base_sec))
973 edac_dbg(0, " DCSB_SEC%d[%d]=0x%08x reg: 0x%x\n",
974 umc, cs, *base_sec, base_reg_sec);
975 }
976
977 umc_mask_reg = get_umc_base(umc) + UMCCH_ADDR_MASK;
978 umc_mask_reg_sec = get_umc_base(umc) + UMCCH_ADDR_MASK_SEC;
979
980 for_each_chip_select_mask(cs, umc, pvt) {
981 mask = &pvt->csels[umc].csmasks[cs];
982 mask_sec = &pvt->csels[umc].csmasks_sec[cs];
983
984 mask_reg = umc_mask_reg + (cs * 4);
985 mask_reg_sec = umc_mask_reg_sec + (cs * 4);
986
987 if (!amd_smn_read(pvt->mc_node_id, mask_reg, mask))
988 edac_dbg(0, " DCSM%d[%d]=0x%08x reg: 0x%x\n",
989 umc, cs, *mask, mask_reg);
990
991 if (!amd_smn_read(pvt->mc_node_id, mask_reg_sec, mask_sec))
992 edac_dbg(0, " DCSM_SEC%d[%d]=0x%08x reg: 0x%x\n",
993 umc, cs, *mask_sec, mask_reg_sec);
994 }
995 }
996}
997
998/*
999 * Function 2 Offset F10_DCSB0; read in the DCS Base and DCS Mask registers
1000 */
1001static void read_dct_base_mask(struct amd64_pvt *pvt)
1002{
1003 int cs;
1004
1005 prep_chip_selects(pvt);
1006
1007 if (pvt->umc)
1008 return read_umc_base_mask(pvt);
1009
1010 for_each_chip_select(cs, 0, pvt) {
1011 int reg0 = DCSB0 + (cs * 4);
1012 int reg1 = DCSB1 + (cs * 4);
1013 u32 *base0 = &pvt->csels[0].csbases[cs];
1014 u32 *base1 = &pvt->csels[1].csbases[cs];
1015
1016 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0))
1017 edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n",
1018 cs, *base0, reg0);
1019
1020 if (pvt->fam == 0xf)
1021 continue;
1022
1023 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1))
1024 edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n",
1025 cs, *base1, (pvt->fam == 0x10) ? reg1
1026 : reg0);
1027 }
1028
1029 for_each_chip_select_mask(cs, 0, pvt) {
1030 int reg0 = DCSM0 + (cs * 4);
1031 int reg1 = DCSM1 + (cs * 4);
1032 u32 *mask0 = &pvt->csels[0].csmasks[cs];
1033 u32 *mask1 = &pvt->csels[1].csmasks[cs];
1034
1035 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0))
1036 edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n",
1037 cs, *mask0, reg0);
1038
1039 if (pvt->fam == 0xf)
1040 continue;
1041
1042 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1))
1043 edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n",
1044 cs, *mask1, (pvt->fam == 0x10) ? reg1
1045 : reg0);
1046 }
1047}
1048
1049static void determine_memory_type(struct amd64_pvt *pvt)
1050{
1051 u32 dram_ctrl, dcsm;
1052
1053 if (pvt->umc) {
1054 if ((pvt->umc[0].dimm_cfg | pvt->umc[1].dimm_cfg) & BIT(5))
1055 pvt->dram_type = MEM_LRDDR4;
1056 else if ((pvt->umc[0].dimm_cfg | pvt->umc[1].dimm_cfg) & BIT(4))
1057 pvt->dram_type = MEM_RDDR4;
1058 else
1059 pvt->dram_type = MEM_DDR4;
1060 return;
1061 }
1062
1063 switch (pvt->fam) {
1064 case 0xf:
1065 if (pvt->ext_model >= K8_REV_F)
1066 goto ddr3;
1067
1068 pvt->dram_type = (pvt->dclr0 & BIT(18)) ? MEM_DDR : MEM_RDDR;
1069 return;
1070
1071 case 0x10:
1072 if (pvt->dchr0 & DDR3_MODE)
1073 goto ddr3;
1074
1075 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR2 : MEM_RDDR2;
1076 return;
1077
1078 case 0x15:
1079 if (pvt->model < 0x60)
1080 goto ddr3;
1081
1082 /*
1083 * Model 0x60h needs special handling:
1084 *
1085 * We use a Chip Select value of '0' to obtain dcsm.
1086 * Theoretically, it is possible to populate LRDIMMs of different
1087 * 'Rank' value on a DCT. But this is not the common case. So,
1088 * it's reasonable to assume all DIMMs are going to be of same
1089 * 'type' until proven otherwise.
1090 */
1091 amd64_read_dct_pci_cfg(pvt, 0, DRAM_CONTROL, &dram_ctrl);
1092 dcsm = pvt->csels[0].csmasks[0];
1093
1094 if (((dram_ctrl >> 8) & 0x7) == 0x2)
1095 pvt->dram_type = MEM_DDR4;
1096 else if (pvt->dclr0 & BIT(16))
1097 pvt->dram_type = MEM_DDR3;
1098 else if (dcsm & 0x3)
1099 pvt->dram_type = MEM_LRDDR3;
1100 else
1101 pvt->dram_type = MEM_RDDR3;
1102
1103 return;
1104
1105 case 0x16:
1106 goto ddr3;
1107
1108 default:
1109 WARN(1, KERN_ERR "%s: Family??? 0x%x\n", __func__, pvt->fam);
1110 pvt->dram_type = MEM_EMPTY;
1111 }
1112 return;
1113
1114ddr3:
1115 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR3 : MEM_RDDR3;
1116}
1117
1118/* Get the number of DCT channels the memory controller is using. */
1119static int k8_early_channel_count(struct amd64_pvt *pvt)
1120{
1121 int flag;
1122
1123 if (pvt->ext_model >= K8_REV_F)
1124 /* RevF (NPT) and later */
1125 flag = pvt->dclr0 & WIDTH_128;
1126 else
1127 /* RevE and earlier */
1128 flag = pvt->dclr0 & REVE_WIDTH_128;
1129
1130 /* not used */
1131 pvt->dclr1 = 0;
1132
1133 return (flag) ? 2 : 1;
1134}
1135
1136/* On F10h and later ErrAddr is MC4_ADDR[47:1] */
1137static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m)
1138{
1139 u16 mce_nid = topology_die_id(m->extcpu);
1140 struct mem_ctl_info *mci;
1141 u8 start_bit = 1;
1142 u8 end_bit = 47;
1143 u64 addr;
1144
1145 mci = edac_mc_find(mce_nid);
1146 if (!mci)
1147 return 0;
1148
1149 pvt = mci->pvt_info;
1150
1151 if (pvt->fam == 0xf) {
1152 start_bit = 3;
1153 end_bit = 39;
1154 }
1155
1156 addr = m->addr & GENMASK_ULL(end_bit, start_bit);
1157
1158 /*
1159 * Erratum 637 workaround
1160 */
1161 if (pvt->fam == 0x15) {
1162 u64 cc6_base, tmp_addr;
1163 u32 tmp;
1164 u8 intlv_en;
1165
1166 if ((addr & GENMASK_ULL(47, 24)) >> 24 != 0x00fdf7)
1167 return addr;
1168
1169
1170 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_LIM, &tmp);
1171 intlv_en = tmp >> 21 & 0x7;
1172
1173 /* add [47:27] + 3 trailing bits */
1174 cc6_base = (tmp & GENMASK_ULL(20, 0)) << 3;
1175
1176 /* reverse and add DramIntlvEn */
1177 cc6_base |= intlv_en ^ 0x7;
1178
1179 /* pin at [47:24] */
1180 cc6_base <<= 24;
1181
1182 if (!intlv_en)
1183 return cc6_base | (addr & GENMASK_ULL(23, 0));
1184
1185 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_BASE, &tmp);
1186
1187 /* faster log2 */
1188 tmp_addr = (addr & GENMASK_ULL(23, 12)) << __fls(intlv_en + 1);
1189
1190 /* OR DramIntlvSel into bits [14:12] */
1191 tmp_addr |= (tmp & GENMASK_ULL(23, 21)) >> 9;
1192
1193 /* add remaining [11:0] bits from original MC4_ADDR */
1194 tmp_addr |= addr & GENMASK_ULL(11, 0);
1195
1196 return cc6_base | tmp_addr;
1197 }
1198
1199 return addr;
1200}
1201
1202static struct pci_dev *pci_get_related_function(unsigned int vendor,
1203 unsigned int device,
1204 struct pci_dev *related)
1205{
1206 struct pci_dev *dev = NULL;
1207
1208 while ((dev = pci_get_device(vendor, device, dev))) {
1209 if (pci_domain_nr(dev->bus) == pci_domain_nr(related->bus) &&
1210 (dev->bus->number == related->bus->number) &&
1211 (PCI_SLOT(dev->devfn) == PCI_SLOT(related->devfn)))
1212 break;
1213 }
1214
1215 return dev;
1216}
1217
1218static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range)
1219{
1220 struct amd_northbridge *nb;
1221 struct pci_dev *f1 = NULL;
1222 unsigned int pci_func;
1223 int off = range << 3;
1224 u32 llim;
1225
1226 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_LO + off, &pvt->ranges[range].base.lo);
1227 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_LO + off, &pvt->ranges[range].lim.lo);
1228
1229 if (pvt->fam == 0xf)
1230 return;
1231
1232 if (!dram_rw(pvt, range))
1233 return;
1234
1235 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_HI + off, &pvt->ranges[range].base.hi);
1236 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi);
1237
1238 /* F15h: factor in CC6 save area by reading dst node's limit reg */
1239 if (pvt->fam != 0x15)
1240 return;
1241
1242 nb = node_to_amd_nb(dram_dst_node(pvt, range));
1243 if (WARN_ON(!nb))
1244 return;
1245
1246 if (pvt->model == 0x60)
1247 pci_func = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1;
1248 else if (pvt->model == 0x30)
1249 pci_func = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1;
1250 else
1251 pci_func = PCI_DEVICE_ID_AMD_15H_NB_F1;
1252
1253 f1 = pci_get_related_function(nb->misc->vendor, pci_func, nb->misc);
1254 if (WARN_ON(!f1))
1255 return;
1256
1257 amd64_read_pci_cfg(f1, DRAM_LOCAL_NODE_LIM, &llim);
1258
1259 pvt->ranges[range].lim.lo &= GENMASK_ULL(15, 0);
1260
1261 /* {[39:27],111b} */
1262 pvt->ranges[range].lim.lo |= ((llim & 0x1fff) << 3 | 0x7) << 16;
1263
1264 pvt->ranges[range].lim.hi &= GENMASK_ULL(7, 0);
1265
1266 /* [47:40] */
1267 pvt->ranges[range].lim.hi |= llim >> 13;
1268
1269 pci_dev_put(f1);
1270}
1271
1272static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1273 struct err_info *err)
1274{
1275 struct amd64_pvt *pvt = mci->pvt_info;
1276
1277 error_address_to_page_and_offset(sys_addr, err);
1278
1279 /*
1280 * Find out which node the error address belongs to. This may be
1281 * different from the node that detected the error.
1282 */
1283 err->src_mci = find_mc_by_sys_addr(mci, sys_addr);
1284 if (!err->src_mci) {
1285 amd64_mc_err(mci, "failed to map error addr 0x%lx to a node\n",
1286 (unsigned long)sys_addr);
1287 err->err_code = ERR_NODE;
1288 return;
1289 }
1290
1291 /* Now map the sys_addr to a CSROW */
1292 err->csrow = sys_addr_to_csrow(err->src_mci, sys_addr);
1293 if (err->csrow < 0) {
1294 err->err_code = ERR_CSROW;
1295 return;
1296 }
1297
1298 /* CHIPKILL enabled */
1299 if (pvt->nbcfg & NBCFG_CHIPKILL) {
1300 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
1301 if (err->channel < 0) {
1302 /*
1303 * Syndrome didn't map, so we don't know which of the
1304 * 2 DIMMs is in error. So we need to ID 'both' of them
1305 * as suspect.
1306 */
1307 amd64_mc_warn(err->src_mci, "unknown syndrome 0x%04x - "
1308 "possible error reporting race\n",
1309 err->syndrome);
1310 err->err_code = ERR_CHANNEL;
1311 return;
1312 }
1313 } else {
1314 /*
1315 * non-chipkill ecc mode
1316 *
1317 * The k8 documentation is unclear about how to determine the
1318 * channel number when using non-chipkill memory. This method
1319 * was obtained from email communication with someone at AMD.
1320 * (Wish the email was placed in this comment - norsk)
1321 */
1322 err->channel = ((sys_addr & BIT(3)) != 0);
1323 }
1324}
1325
1326static int ddr2_cs_size(unsigned i, bool dct_width)
1327{
1328 unsigned shift = 0;
1329
1330 if (i <= 2)
1331 shift = i;
1332 else if (!(i & 0x1))
1333 shift = i >> 1;
1334 else
1335 shift = (i + 1) >> 1;
1336
1337 return 128 << (shift + !!dct_width);
1338}
1339
1340static int k8_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1341 unsigned cs_mode, int cs_mask_nr)
1342{
1343 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1344
1345 if (pvt->ext_model >= K8_REV_F) {
1346 WARN_ON(cs_mode > 11);
1347 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1348 }
1349 else if (pvt->ext_model >= K8_REV_D) {
1350 unsigned diff;
1351 WARN_ON(cs_mode > 10);
1352
1353 /*
1354 * the below calculation, besides trying to win an obfuscated C
1355 * contest, maps cs_mode values to DIMM chip select sizes. The
1356 * mappings are:
1357 *
1358 * cs_mode CS size (mb)
1359 * ======= ============
1360 * 0 32
1361 * 1 64
1362 * 2 128
1363 * 3 128
1364 * 4 256
1365 * 5 512
1366 * 6 256
1367 * 7 512
1368 * 8 1024
1369 * 9 1024
1370 * 10 2048
1371 *
1372 * Basically, it calculates a value with which to shift the
1373 * smallest CS size of 32MB.
1374 *
1375 * ddr[23]_cs_size have a similar purpose.
1376 */
1377 diff = cs_mode/3 + (unsigned)(cs_mode > 5);
1378
1379 return 32 << (cs_mode - diff);
1380 }
1381 else {
1382 WARN_ON(cs_mode > 6);
1383 return 32 << cs_mode;
1384 }
1385}
1386
1387/*
1388 * Get the number of DCT channels in use.
1389 *
1390 * Return:
1391 * number of Memory Channels in operation
1392 * Pass back:
1393 * contents of the DCL0_LOW register
1394 */
1395static int f1x_early_channel_count(struct amd64_pvt *pvt)
1396{
1397 int i, j, channels = 0;
1398
1399 /* On F10h, if we are in 128 bit mode, then we are using 2 channels */
1400 if (pvt->fam == 0x10 && (pvt->dclr0 & WIDTH_128))
1401 return 2;
1402
1403 /*
1404 * Need to check if in unganged mode: In such, there are 2 channels,
1405 * but they are not in 128 bit mode and thus the above 'dclr0' status
1406 * bit will be OFF.
1407 *
1408 * Need to check DCT0[0] and DCT1[0] to see if only one of them has
1409 * their CSEnable bit on. If so, then SINGLE DIMM case.
1410 */
1411 edac_dbg(0, "Data width is not 128 bits - need more decoding\n");
1412
1413 /*
1414 * Check DRAM Bank Address Mapping values for each DIMM to see if there
1415 * is more than just one DIMM present in unganged mode. Need to check
1416 * both controllers since DIMMs can be placed in either one.
1417 */
1418 for (i = 0; i < 2; i++) {
1419 u32 dbam = (i ? pvt->dbam1 : pvt->dbam0);
1420
1421 for (j = 0; j < 4; j++) {
1422 if (DBAM_DIMM(j, dbam) > 0) {
1423 channels++;
1424 break;
1425 }
1426 }
1427 }
1428
1429 if (channels > 2)
1430 channels = 2;
1431
1432 amd64_info("MCT channel count: %d\n", channels);
1433
1434 return channels;
1435}
1436
1437static int f17_early_channel_count(struct amd64_pvt *pvt)
1438{
1439 int i, channels = 0;
1440
1441 /* SDP Control bit 31 (SdpInit) is clear for unused UMC channels */
1442 for_each_umc(i)
1443 channels += !!(pvt->umc[i].sdp_ctrl & UMC_SDP_INIT);
1444
1445 amd64_info("MCT channel count: %d\n", channels);
1446
1447 return channels;
1448}
1449
1450static int ddr3_cs_size(unsigned i, bool dct_width)
1451{
1452 unsigned shift = 0;
1453 int cs_size = 0;
1454
1455 if (i == 0 || i == 3 || i == 4)
1456 cs_size = -1;
1457 else if (i <= 2)
1458 shift = i;
1459 else if (i == 12)
1460 shift = 7;
1461 else if (!(i & 0x1))
1462 shift = i >> 1;
1463 else
1464 shift = (i + 1) >> 1;
1465
1466 if (cs_size != -1)
1467 cs_size = (128 * (1 << !!dct_width)) << shift;
1468
1469 return cs_size;
1470}
1471
1472static int ddr3_lrdimm_cs_size(unsigned i, unsigned rank_multiply)
1473{
1474 unsigned shift = 0;
1475 int cs_size = 0;
1476
1477 if (i < 4 || i == 6)
1478 cs_size = -1;
1479 else if (i == 12)
1480 shift = 7;
1481 else if (!(i & 0x1))
1482 shift = i >> 1;
1483 else
1484 shift = (i + 1) >> 1;
1485
1486 if (cs_size != -1)
1487 cs_size = rank_multiply * (128 << shift);
1488
1489 return cs_size;
1490}
1491
1492static int ddr4_cs_size(unsigned i)
1493{
1494 int cs_size = 0;
1495
1496 if (i == 0)
1497 cs_size = -1;
1498 else if (i == 1)
1499 cs_size = 1024;
1500 else
1501 /* Min cs_size = 1G */
1502 cs_size = 1024 * (1 << (i >> 1));
1503
1504 return cs_size;
1505}
1506
1507static int f10_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1508 unsigned cs_mode, int cs_mask_nr)
1509{
1510 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1511
1512 WARN_ON(cs_mode > 11);
1513
1514 if (pvt->dchr0 & DDR3_MODE || pvt->dchr1 & DDR3_MODE)
1515 return ddr3_cs_size(cs_mode, dclr & WIDTH_128);
1516 else
1517 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1518}
1519
1520/*
1521 * F15h supports only 64bit DCT interfaces
1522 */
1523static int f15_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1524 unsigned cs_mode, int cs_mask_nr)
1525{
1526 WARN_ON(cs_mode > 12);
1527
1528 return ddr3_cs_size(cs_mode, false);
1529}
1530
1531/* F15h M60h supports DDR4 mapping as well.. */
1532static int f15_m60h_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1533 unsigned cs_mode, int cs_mask_nr)
1534{
1535 int cs_size;
1536 u32 dcsm = pvt->csels[dct].csmasks[cs_mask_nr];
1537
1538 WARN_ON(cs_mode > 12);
1539
1540 if (pvt->dram_type == MEM_DDR4) {
1541 if (cs_mode > 9)
1542 return -1;
1543
1544 cs_size = ddr4_cs_size(cs_mode);
1545 } else if (pvt->dram_type == MEM_LRDDR3) {
1546 unsigned rank_multiply = dcsm & 0xf;
1547
1548 if (rank_multiply == 3)
1549 rank_multiply = 4;
1550 cs_size = ddr3_lrdimm_cs_size(cs_mode, rank_multiply);
1551 } else {
1552 /* Minimum cs size is 512mb for F15hM60h*/
1553 if (cs_mode == 0x1)
1554 return -1;
1555
1556 cs_size = ddr3_cs_size(cs_mode, false);
1557 }
1558
1559 return cs_size;
1560}
1561
1562/*
1563 * F16h and F15h model 30h have only limited cs_modes.
1564 */
1565static int f16_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1566 unsigned cs_mode, int cs_mask_nr)
1567{
1568 WARN_ON(cs_mode > 12);
1569
1570 if (cs_mode == 6 || cs_mode == 8 ||
1571 cs_mode == 9 || cs_mode == 12)
1572 return -1;
1573 else
1574 return ddr3_cs_size(cs_mode, false);
1575}
1576
1577static int f17_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc,
1578 unsigned int cs_mode, int csrow_nr)
1579{
1580 u32 addr_mask_orig, addr_mask_deinterleaved;
1581 u32 msb, weight, num_zero_bits;
1582 int dimm, size = 0;
1583
1584 /* No Chip Selects are enabled. */
1585 if (!cs_mode)
1586 return size;
1587
1588 /* Requested size of an even CS but none are enabled. */
1589 if (!(cs_mode & CS_EVEN) && !(csrow_nr & 1))
1590 return size;
1591
1592 /* Requested size of an odd CS but none are enabled. */
1593 if (!(cs_mode & CS_ODD) && (csrow_nr & 1))
1594 return size;
1595
1596 /*
1597 * There is one mask per DIMM, and two Chip Selects per DIMM.
1598 * CS0 and CS1 -> DIMM0
1599 * CS2 and CS3 -> DIMM1
1600 */
1601 dimm = csrow_nr >> 1;
1602
1603 /* Asymmetric dual-rank DIMM support. */
1604 if ((csrow_nr & 1) && (cs_mode & CS_ODD_SECONDARY))
1605 addr_mask_orig = pvt->csels[umc].csmasks_sec[dimm];
1606 else
1607 addr_mask_orig = pvt->csels[umc].csmasks[dimm];
1608
1609 /*
1610 * The number of zero bits in the mask is equal to the number of bits
1611 * in a full mask minus the number of bits in the current mask.
1612 *
1613 * The MSB is the number of bits in the full mask because BIT[0] is
1614 * always 0.
1615 */
1616 msb = fls(addr_mask_orig) - 1;
1617 weight = hweight_long(addr_mask_orig);
1618 num_zero_bits = msb - weight;
1619
1620 /* Take the number of zero bits off from the top of the mask. */
1621 addr_mask_deinterleaved = GENMASK_ULL(msb - num_zero_bits, 1);
1622
1623 edac_dbg(1, "CS%d DIMM%d AddrMasks:\n", csrow_nr, dimm);
1624 edac_dbg(1, " Original AddrMask: 0x%x\n", addr_mask_orig);
1625 edac_dbg(1, " Deinterleaved AddrMask: 0x%x\n", addr_mask_deinterleaved);
1626
1627 /* Register [31:1] = Address [39:9]. Size is in kBs here. */
1628 size = (addr_mask_deinterleaved >> 2) + 1;
1629
1630 /* Return size in MBs. */
1631 return size >> 10;
1632}
1633
1634static void read_dram_ctl_register(struct amd64_pvt *pvt)
1635{
1636
1637 if (pvt->fam == 0xf)
1638 return;
1639
1640 if (!amd64_read_pci_cfg(pvt->F2, DCT_SEL_LO, &pvt->dct_sel_lo)) {
1641 edac_dbg(0, "F2x110 (DCTSelLow): 0x%08x, High range addrs at: 0x%x\n",
1642 pvt->dct_sel_lo, dct_sel_baseaddr(pvt));
1643
1644 edac_dbg(0, " DCTs operate in %s mode\n",
1645 (dct_ganging_enabled(pvt) ? "ganged" : "unganged"));
1646
1647 if (!dct_ganging_enabled(pvt))
1648 edac_dbg(0, " Address range split per DCT: %s\n",
1649 (dct_high_range_enabled(pvt) ? "yes" : "no"));
1650
1651 edac_dbg(0, " data interleave for ECC: %s, DRAM cleared since last warm reset: %s\n",
1652 (dct_data_intlv_enabled(pvt) ? "enabled" : "disabled"),
1653 (dct_memory_cleared(pvt) ? "yes" : "no"));
1654
1655 edac_dbg(0, " channel interleave: %s, "
1656 "interleave bits selector: 0x%x\n",
1657 (dct_interleave_enabled(pvt) ? "enabled" : "disabled"),
1658 dct_sel_interleave_addr(pvt));
1659 }
1660
1661 amd64_read_pci_cfg(pvt->F2, DCT_SEL_HI, &pvt->dct_sel_hi);
1662}
1663
1664/*
1665 * Determine channel (DCT) based on the interleaving mode (see F15h M30h BKDG,
1666 * 2.10.12 Memory Interleaving Modes).
1667 */
1668static u8 f15_m30h_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
1669 u8 intlv_en, int num_dcts_intlv,
1670 u32 dct_sel)
1671{
1672 u8 channel = 0;
1673 u8 select;
1674
1675 if (!(intlv_en))
1676 return (u8)(dct_sel);
1677
1678 if (num_dcts_intlv == 2) {
1679 select = (sys_addr >> 8) & 0x3;
1680 channel = select ? 0x3 : 0;
1681 } else if (num_dcts_intlv == 4) {
1682 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1683 switch (intlv_addr) {
1684 case 0x4:
1685 channel = (sys_addr >> 8) & 0x3;
1686 break;
1687 case 0x5:
1688 channel = (sys_addr >> 9) & 0x3;
1689 break;
1690 }
1691 }
1692 return channel;
1693}
1694
1695/*
1696 * Determine channel (DCT) based on the interleaving mode: F10h BKDG, 2.8.9 Memory
1697 * Interleaving Modes.
1698 */
1699static u8 f1x_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
1700 bool hi_range_sel, u8 intlv_en)
1701{
1702 u8 dct_sel_high = (pvt->dct_sel_lo >> 1) & 1;
1703
1704 if (dct_ganging_enabled(pvt))
1705 return 0;
1706
1707 if (hi_range_sel)
1708 return dct_sel_high;
1709
1710 /*
1711 * see F2x110[DctSelIntLvAddr] - channel interleave mode
1712 */
1713 if (dct_interleave_enabled(pvt)) {
1714 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1715
1716 /* return DCT select function: 0=DCT0, 1=DCT1 */
1717 if (!intlv_addr)
1718 return sys_addr >> 6 & 1;
1719
1720 if (intlv_addr & 0x2) {
1721 u8 shift = intlv_addr & 0x1 ? 9 : 6;
1722 u32 temp = hweight_long((u32) ((sys_addr >> 16) & 0x1F)) & 1;
1723
1724 return ((sys_addr >> shift) & 1) ^ temp;
1725 }
1726
1727 if (intlv_addr & 0x4) {
1728 u8 shift = intlv_addr & 0x1 ? 9 : 8;
1729
1730 return (sys_addr >> shift) & 1;
1731 }
1732
1733 return (sys_addr >> (12 + hweight8(intlv_en))) & 1;
1734 }
1735
1736 if (dct_high_range_enabled(pvt))
1737 return ~dct_sel_high & 1;
1738
1739 return 0;
1740}
1741
1742/* Convert the sys_addr to the normalized DCT address */
1743static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, u8 range,
1744 u64 sys_addr, bool hi_rng,
1745 u32 dct_sel_base_addr)
1746{
1747 u64 chan_off;
1748 u64 dram_base = get_dram_base(pvt, range);
1749 u64 hole_off = f10_dhar_offset(pvt);
1750 u64 dct_sel_base_off = (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16;
1751
1752 if (hi_rng) {
1753 /*
1754 * if
1755 * base address of high range is below 4Gb
1756 * (bits [47:27] at [31:11])
1757 * DRAM address space on this DCT is hoisted above 4Gb &&
1758 * sys_addr > 4Gb
1759 *
1760 * remove hole offset from sys_addr
1761 * else
1762 * remove high range offset from sys_addr
1763 */
1764 if ((!(dct_sel_base_addr >> 16) ||
1765 dct_sel_base_addr < dhar_base(pvt)) &&
1766 dhar_valid(pvt) &&
1767 (sys_addr >= BIT_64(32)))
1768 chan_off = hole_off;
1769 else
1770 chan_off = dct_sel_base_off;
1771 } else {
1772 /*
1773 * if
1774 * we have a valid hole &&
1775 * sys_addr > 4Gb
1776 *
1777 * remove hole
1778 * else
1779 * remove dram base to normalize to DCT address
1780 */
1781 if (dhar_valid(pvt) && (sys_addr >= BIT_64(32)))
1782 chan_off = hole_off;
1783 else
1784 chan_off = dram_base;
1785 }
1786
1787 return (sys_addr & GENMASK_ULL(47,6)) - (chan_off & GENMASK_ULL(47,23));
1788}
1789
1790/*
1791 * checks if the csrow passed in is marked as SPARED, if so returns the new
1792 * spare row
1793 */
1794static int f10_process_possible_spare(struct amd64_pvt *pvt, u8 dct, int csrow)
1795{
1796 int tmp_cs;
1797
1798 if (online_spare_swap_done(pvt, dct) &&
1799 csrow == online_spare_bad_dramcs(pvt, dct)) {
1800
1801 for_each_chip_select(tmp_cs, dct, pvt) {
1802 if (chip_select_base(tmp_cs, dct, pvt) & 0x2) {
1803 csrow = tmp_cs;
1804 break;
1805 }
1806 }
1807 }
1808 return csrow;
1809}
1810
1811/*
1812 * Iterate over the DRAM DCT "base" and "mask" registers looking for a
1813 * SystemAddr match on the specified 'ChannelSelect' and 'NodeID'
1814 *
1815 * Return:
1816 * -EINVAL: NOT FOUND
1817 * 0..csrow = Chip-Select Row
1818 */
1819static int f1x_lookup_addr_in_dct(u64 in_addr, u8 nid, u8 dct)
1820{
1821 struct mem_ctl_info *mci;
1822 struct amd64_pvt *pvt;
1823 u64 cs_base, cs_mask;
1824 int cs_found = -EINVAL;
1825 int csrow;
1826
1827 mci = edac_mc_find(nid);
1828 if (!mci)
1829 return cs_found;
1830
1831 pvt = mci->pvt_info;
1832
1833 edac_dbg(1, "input addr: 0x%llx, DCT: %d\n", in_addr, dct);
1834
1835 for_each_chip_select(csrow, dct, pvt) {
1836 if (!csrow_enabled(csrow, dct, pvt))
1837 continue;
1838
1839 get_cs_base_and_mask(pvt, csrow, dct, &cs_base, &cs_mask);
1840
1841 edac_dbg(1, " CSROW=%d CSBase=0x%llx CSMask=0x%llx\n",
1842 csrow, cs_base, cs_mask);
1843
1844 cs_mask = ~cs_mask;
1845
1846 edac_dbg(1, " (InputAddr & ~CSMask)=0x%llx (CSBase & ~CSMask)=0x%llx\n",
1847 (in_addr & cs_mask), (cs_base & cs_mask));
1848
1849 if ((in_addr & cs_mask) == (cs_base & cs_mask)) {
1850 if (pvt->fam == 0x15 && pvt->model >= 0x30) {
1851 cs_found = csrow;
1852 break;
1853 }
1854 cs_found = f10_process_possible_spare(pvt, dct, csrow);
1855
1856 edac_dbg(1, " MATCH csrow=%d\n", cs_found);
1857 break;
1858 }
1859 }
1860 return cs_found;
1861}
1862
1863/*
1864 * See F2x10C. Non-interleaved graphics framebuffer memory under the 16G is
1865 * swapped with a region located at the bottom of memory so that the GPU can use
1866 * the interleaved region and thus two channels.
1867 */
1868static u64 f1x_swap_interleaved_region(struct amd64_pvt *pvt, u64 sys_addr)
1869{
1870 u32 swap_reg, swap_base, swap_limit, rgn_size, tmp_addr;
1871
1872 if (pvt->fam == 0x10) {
1873 /* only revC3 and revE have that feature */
1874 if (pvt->model < 4 || (pvt->model < 0xa && pvt->stepping < 3))
1875 return sys_addr;
1876 }
1877
1878 amd64_read_pci_cfg(pvt->F2, SWAP_INTLV_REG, &swap_reg);
1879
1880 if (!(swap_reg & 0x1))
1881 return sys_addr;
1882
1883 swap_base = (swap_reg >> 3) & 0x7f;
1884 swap_limit = (swap_reg >> 11) & 0x7f;
1885 rgn_size = (swap_reg >> 20) & 0x7f;
1886 tmp_addr = sys_addr >> 27;
1887
1888 if (!(sys_addr >> 34) &&
1889 (((tmp_addr >= swap_base) &&
1890 (tmp_addr <= swap_limit)) ||
1891 (tmp_addr < rgn_size)))
1892 return sys_addr ^ (u64)swap_base << 27;
1893
1894 return sys_addr;
1895}
1896
1897/* For a given @dram_range, check if @sys_addr falls within it. */
1898static int f1x_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
1899 u64 sys_addr, int *chan_sel)
1900{
1901 int cs_found = -EINVAL;
1902 u64 chan_addr;
1903 u32 dct_sel_base;
1904 u8 channel;
1905 bool high_range = false;
1906
1907 u8 node_id = dram_dst_node(pvt, range);
1908 u8 intlv_en = dram_intlv_en(pvt, range);
1909 u32 intlv_sel = dram_intlv_sel(pvt, range);
1910
1911 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
1912 range, sys_addr, get_dram_limit(pvt, range));
1913
1914 if (dhar_valid(pvt) &&
1915 dhar_base(pvt) <= sys_addr &&
1916 sys_addr < BIT_64(32)) {
1917 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
1918 sys_addr);
1919 return -EINVAL;
1920 }
1921
1922 if (intlv_en && (intlv_sel != ((sys_addr >> 12) & intlv_en)))
1923 return -EINVAL;
1924
1925 sys_addr = f1x_swap_interleaved_region(pvt, sys_addr);
1926
1927 dct_sel_base = dct_sel_baseaddr(pvt);
1928
1929 /*
1930 * check whether addresses >= DctSelBaseAddr[47:27] are to be used to
1931 * select between DCT0 and DCT1.
1932 */
1933 if (dct_high_range_enabled(pvt) &&
1934 !dct_ganging_enabled(pvt) &&
1935 ((sys_addr >> 27) >= (dct_sel_base >> 11)))
1936 high_range = true;
1937
1938 channel = f1x_determine_channel(pvt, sys_addr, high_range, intlv_en);
1939
1940 chan_addr = f1x_get_norm_dct_addr(pvt, range, sys_addr,
1941 high_range, dct_sel_base);
1942
1943 /* Remove node interleaving, see F1x120 */
1944 if (intlv_en)
1945 chan_addr = ((chan_addr >> (12 + hweight8(intlv_en))) << 12) |
1946 (chan_addr & 0xfff);
1947
1948 /* remove channel interleave */
1949 if (dct_interleave_enabled(pvt) &&
1950 !dct_high_range_enabled(pvt) &&
1951 !dct_ganging_enabled(pvt)) {
1952
1953 if (dct_sel_interleave_addr(pvt) != 1) {
1954 if (dct_sel_interleave_addr(pvt) == 0x3)
1955 /* hash 9 */
1956 chan_addr = ((chan_addr >> 10) << 9) |
1957 (chan_addr & 0x1ff);
1958 else
1959 /* A[6] or hash 6 */
1960 chan_addr = ((chan_addr >> 7) << 6) |
1961 (chan_addr & 0x3f);
1962 } else
1963 /* A[12] */
1964 chan_addr = ((chan_addr >> 13) << 12) |
1965 (chan_addr & 0xfff);
1966 }
1967
1968 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
1969
1970 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, channel);
1971
1972 if (cs_found >= 0)
1973 *chan_sel = channel;
1974
1975 return cs_found;
1976}
1977
1978static int f15_m30h_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
1979 u64 sys_addr, int *chan_sel)
1980{
1981 int cs_found = -EINVAL;
1982 int num_dcts_intlv = 0;
1983 u64 chan_addr, chan_offset;
1984 u64 dct_base, dct_limit;
1985 u32 dct_cont_base_reg, dct_cont_limit_reg, tmp;
1986 u8 channel, alias_channel, leg_mmio_hole, dct_sel, dct_offset_en;
1987
1988 u64 dhar_offset = f10_dhar_offset(pvt);
1989 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1990 u8 node_id = dram_dst_node(pvt, range);
1991 u8 intlv_en = dram_intlv_en(pvt, range);
1992
1993 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_BASE, &dct_cont_base_reg);
1994 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_LIMIT, &dct_cont_limit_reg);
1995
1996 dct_offset_en = (u8) ((dct_cont_base_reg >> 3) & BIT(0));
1997 dct_sel = (u8) ((dct_cont_base_reg >> 4) & 0x7);
1998
1999 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
2000 range, sys_addr, get_dram_limit(pvt, range));
2001
2002 if (!(get_dram_base(pvt, range) <= sys_addr) &&
2003 !(get_dram_limit(pvt, range) >= sys_addr))
2004 return -EINVAL;
2005
2006 if (dhar_valid(pvt) &&
2007 dhar_base(pvt) <= sys_addr &&
2008 sys_addr < BIT_64(32)) {
2009 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2010 sys_addr);
2011 return -EINVAL;
2012 }
2013
2014 /* Verify sys_addr is within DCT Range. */
2015 dct_base = (u64) dct_sel_baseaddr(pvt);
2016 dct_limit = (dct_cont_limit_reg >> 11) & 0x1FFF;
2017
2018 if (!(dct_cont_base_reg & BIT(0)) &&
2019 !(dct_base <= (sys_addr >> 27) &&
2020 dct_limit >= (sys_addr >> 27)))
2021 return -EINVAL;
2022
2023 /* Verify number of dct's that participate in channel interleaving. */
2024 num_dcts_intlv = (int) hweight8(intlv_en);
2025
2026 if (!(num_dcts_intlv % 2 == 0) || (num_dcts_intlv > 4))
2027 return -EINVAL;
2028
2029 if (pvt->model >= 0x60)
2030 channel = f1x_determine_channel(pvt, sys_addr, false, intlv_en);
2031 else
2032 channel = f15_m30h_determine_channel(pvt, sys_addr, intlv_en,
2033 num_dcts_intlv, dct_sel);
2034
2035 /* Verify we stay within the MAX number of channels allowed */
2036 if (channel > 3)
2037 return -EINVAL;
2038
2039 leg_mmio_hole = (u8) (dct_cont_base_reg >> 1 & BIT(0));
2040
2041 /* Get normalized DCT addr */
2042 if (leg_mmio_hole && (sys_addr >= BIT_64(32)))
2043 chan_offset = dhar_offset;
2044 else
2045 chan_offset = dct_base << 27;
2046
2047 chan_addr = sys_addr - chan_offset;
2048
2049 /* remove channel interleave */
2050 if (num_dcts_intlv == 2) {
2051 if (intlv_addr == 0x4)
2052 chan_addr = ((chan_addr >> 9) << 8) |
2053 (chan_addr & 0xff);
2054 else if (intlv_addr == 0x5)
2055 chan_addr = ((chan_addr >> 10) << 9) |
2056 (chan_addr & 0x1ff);
2057 else
2058 return -EINVAL;
2059
2060 } else if (num_dcts_intlv == 4) {
2061 if (intlv_addr == 0x4)
2062 chan_addr = ((chan_addr >> 10) << 8) |
2063 (chan_addr & 0xff);
2064 else if (intlv_addr == 0x5)
2065 chan_addr = ((chan_addr >> 11) << 9) |
2066 (chan_addr & 0x1ff);
2067 else
2068 return -EINVAL;
2069 }
2070
2071 if (dct_offset_en) {
2072 amd64_read_pci_cfg(pvt->F1,
2073 DRAM_CONT_HIGH_OFF + (int) channel * 4,
2074 &tmp);
2075 chan_addr += (u64) ((tmp >> 11) & 0xfff) << 27;
2076 }
2077
2078 f15h_select_dct(pvt, channel);
2079
2080 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
2081
2082 /*
2083 * Find Chip select:
2084 * if channel = 3, then alias it to 1. This is because, in F15 M30h,
2085 * there is support for 4 DCT's, but only 2 are currently functional.
2086 * They are DCT0 and DCT3. But we have read all registers of DCT3 into
2087 * pvt->csels[1]. So we need to use '1' here to get correct info.
2088 * Refer F15 M30h BKDG Section 2.10 and 2.10.3 for clarifications.
2089 */
2090 alias_channel = (channel == 3) ? 1 : channel;
2091
2092 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, alias_channel);
2093
2094 if (cs_found >= 0)
2095 *chan_sel = alias_channel;
2096
2097 return cs_found;
2098}
2099
2100static int f1x_translate_sysaddr_to_cs(struct amd64_pvt *pvt,
2101 u64 sys_addr,
2102 int *chan_sel)
2103{
2104 int cs_found = -EINVAL;
2105 unsigned range;
2106
2107 for (range = 0; range < DRAM_RANGES; range++) {
2108 if (!dram_rw(pvt, range))
2109 continue;
2110
2111 if (pvt->fam == 0x15 && pvt->model >= 0x30)
2112 cs_found = f15_m30h_match_to_this_node(pvt, range,
2113 sys_addr,
2114 chan_sel);
2115
2116 else if ((get_dram_base(pvt, range) <= sys_addr) &&
2117 (get_dram_limit(pvt, range) >= sys_addr)) {
2118 cs_found = f1x_match_to_this_node(pvt, range,
2119 sys_addr, chan_sel);
2120 if (cs_found >= 0)
2121 break;
2122 }
2123 }
2124 return cs_found;
2125}
2126
2127/*
2128 * For reference see "2.8.5 Routing DRAM Requests" in F10 BKDG. This code maps
2129 * a @sys_addr to NodeID, DCT (channel) and chip select (CSROW).
2130 *
2131 * The @sys_addr is usually an error address received from the hardware
2132 * (MCX_ADDR).
2133 */
2134static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
2135 struct err_info *err)
2136{
2137 struct amd64_pvt *pvt = mci->pvt_info;
2138
2139 error_address_to_page_and_offset(sys_addr, err);
2140
2141 err->csrow = f1x_translate_sysaddr_to_cs(pvt, sys_addr, &err->channel);
2142 if (err->csrow < 0) {
2143 err->err_code = ERR_CSROW;
2144 return;
2145 }
2146
2147 /*
2148 * We need the syndromes for channel detection only when we're
2149 * ganged. Otherwise @chan should already contain the channel at
2150 * this point.
2151 */
2152 if (dct_ganging_enabled(pvt))
2153 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
2154}
2155
2156/*
2157 * debug routine to display the memory sizes of all logical DIMMs and its
2158 * CSROWs
2159 */
2160static void debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
2161{
2162 int dimm, size0, size1;
2163 u32 *dcsb = ctrl ? pvt->csels[1].csbases : pvt->csels[0].csbases;
2164 u32 dbam = ctrl ? pvt->dbam1 : pvt->dbam0;
2165
2166 if (pvt->fam == 0xf) {
2167 /* K8 families < revF not supported yet */
2168 if (pvt->ext_model < K8_REV_F)
2169 return;
2170 else
2171 WARN_ON(ctrl != 0);
2172 }
2173
2174 if (pvt->fam == 0x10) {
2175 dbam = (ctrl && !dct_ganging_enabled(pvt)) ? pvt->dbam1
2176 : pvt->dbam0;
2177 dcsb = (ctrl && !dct_ganging_enabled(pvt)) ?
2178 pvt->csels[1].csbases :
2179 pvt->csels[0].csbases;
2180 } else if (ctrl) {
2181 dbam = pvt->dbam0;
2182 dcsb = pvt->csels[1].csbases;
2183 }
2184 edac_dbg(1, "F2x%d80 (DRAM Bank Address Mapping): 0x%08x\n",
2185 ctrl, dbam);
2186
2187 edac_printk(KERN_DEBUG, EDAC_MC, "DCT%d chip selects:\n", ctrl);
2188
2189 /* Dump memory sizes for DIMM and its CSROWs */
2190 for (dimm = 0; dimm < 4; dimm++) {
2191
2192 size0 = 0;
2193 if (dcsb[dimm*2] & DCSB_CS_ENABLE)
2194 /*
2195 * For F15m60h, we need multiplier for LRDIMM cs_size
2196 * calculation. We pass dimm value to the dbam_to_cs
2197 * mapper so we can find the multiplier from the
2198 * corresponding DCSM.
2199 */
2200 size0 = pvt->ops->dbam_to_cs(pvt, ctrl,
2201 DBAM_DIMM(dimm, dbam),
2202 dimm);
2203
2204 size1 = 0;
2205 if (dcsb[dimm*2 + 1] & DCSB_CS_ENABLE)
2206 size1 = pvt->ops->dbam_to_cs(pvt, ctrl,
2207 DBAM_DIMM(dimm, dbam),
2208 dimm);
2209
2210 amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
2211 dimm * 2, size0,
2212 dimm * 2 + 1, size1);
2213 }
2214}
2215
2216static struct amd64_family_type family_types[] = {
2217 [K8_CPUS] = {
2218 .ctl_name = "K8",
2219 .f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP,
2220 .f2_id = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL,
2221 .max_mcs = 2,
2222 .ops = {
2223 .early_channel_count = k8_early_channel_count,
2224 .map_sysaddr_to_csrow = k8_map_sysaddr_to_csrow,
2225 .dbam_to_cs = k8_dbam_to_chip_select,
2226 }
2227 },
2228 [F10_CPUS] = {
2229 .ctl_name = "F10h",
2230 .f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP,
2231 .f2_id = PCI_DEVICE_ID_AMD_10H_NB_DRAM,
2232 .max_mcs = 2,
2233 .ops = {
2234 .early_channel_count = f1x_early_channel_count,
2235 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2236 .dbam_to_cs = f10_dbam_to_chip_select,
2237 }
2238 },
2239 [F15_CPUS] = {
2240 .ctl_name = "F15h",
2241 .f1_id = PCI_DEVICE_ID_AMD_15H_NB_F1,
2242 .f2_id = PCI_DEVICE_ID_AMD_15H_NB_F2,
2243 .max_mcs = 2,
2244 .ops = {
2245 .early_channel_count = f1x_early_channel_count,
2246 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2247 .dbam_to_cs = f15_dbam_to_chip_select,
2248 }
2249 },
2250 [F15_M30H_CPUS] = {
2251 .ctl_name = "F15h_M30h",
2252 .f1_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1,
2253 .f2_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F2,
2254 .max_mcs = 2,
2255 .ops = {
2256 .early_channel_count = f1x_early_channel_count,
2257 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2258 .dbam_to_cs = f16_dbam_to_chip_select,
2259 }
2260 },
2261 [F15_M60H_CPUS] = {
2262 .ctl_name = "F15h_M60h",
2263 .f1_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1,
2264 .f2_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F2,
2265 .max_mcs = 2,
2266 .ops = {
2267 .early_channel_count = f1x_early_channel_count,
2268 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2269 .dbam_to_cs = f15_m60h_dbam_to_chip_select,
2270 }
2271 },
2272 [F16_CPUS] = {
2273 .ctl_name = "F16h",
2274 .f1_id = PCI_DEVICE_ID_AMD_16H_NB_F1,
2275 .f2_id = PCI_DEVICE_ID_AMD_16H_NB_F2,
2276 .max_mcs = 2,
2277 .ops = {
2278 .early_channel_count = f1x_early_channel_count,
2279 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2280 .dbam_to_cs = f16_dbam_to_chip_select,
2281 }
2282 },
2283 [F16_M30H_CPUS] = {
2284 .ctl_name = "F16h_M30h",
2285 .f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1,
2286 .f2_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F2,
2287 .max_mcs = 2,
2288 .ops = {
2289 .early_channel_count = f1x_early_channel_count,
2290 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2291 .dbam_to_cs = f16_dbam_to_chip_select,
2292 }
2293 },
2294 [F17_CPUS] = {
2295 .ctl_name = "F17h",
2296 .f0_id = PCI_DEVICE_ID_AMD_17H_DF_F0,
2297 .f6_id = PCI_DEVICE_ID_AMD_17H_DF_F6,
2298 .max_mcs = 2,
2299 .ops = {
2300 .early_channel_count = f17_early_channel_count,
2301 .dbam_to_cs = f17_addr_mask_to_cs_size,
2302 }
2303 },
2304 [F17_M10H_CPUS] = {
2305 .ctl_name = "F17h_M10h",
2306 .f0_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F0,
2307 .f6_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F6,
2308 .max_mcs = 2,
2309 .ops = {
2310 .early_channel_count = f17_early_channel_count,
2311 .dbam_to_cs = f17_addr_mask_to_cs_size,
2312 }
2313 },
2314 [F17_M30H_CPUS] = {
2315 .ctl_name = "F17h_M30h",
2316 .f0_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F0,
2317 .f6_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F6,
2318 .max_mcs = 8,
2319 .ops = {
2320 .early_channel_count = f17_early_channel_count,
2321 .dbam_to_cs = f17_addr_mask_to_cs_size,
2322 }
2323 },
2324 [F17_M60H_CPUS] = {
2325 .ctl_name = "F17h_M60h",
2326 .f0_id = PCI_DEVICE_ID_AMD_17H_M60H_DF_F0,
2327 .f6_id = PCI_DEVICE_ID_AMD_17H_M60H_DF_F6,
2328 .max_mcs = 2,
2329 .ops = {
2330 .early_channel_count = f17_early_channel_count,
2331 .dbam_to_cs = f17_addr_mask_to_cs_size,
2332 }
2333 },
2334 [F17_M70H_CPUS] = {
2335 .ctl_name = "F17h_M70h",
2336 .f0_id = PCI_DEVICE_ID_AMD_17H_M70H_DF_F0,
2337 .f6_id = PCI_DEVICE_ID_AMD_17H_M70H_DF_F6,
2338 .max_mcs = 2,
2339 .ops = {
2340 .early_channel_count = f17_early_channel_count,
2341 .dbam_to_cs = f17_addr_mask_to_cs_size,
2342 }
2343 },
2344 [F19_CPUS] = {
2345 .ctl_name = "F19h",
2346 .f0_id = PCI_DEVICE_ID_AMD_19H_DF_F0,
2347 .f6_id = PCI_DEVICE_ID_AMD_19H_DF_F6,
2348 .max_mcs = 8,
2349 .ops = {
2350 .early_channel_count = f17_early_channel_count,
2351 .dbam_to_cs = f17_addr_mask_to_cs_size,
2352 }
2353 },
2354};
2355
2356/*
2357 * These are tables of eigenvectors (one per line) which can be used for the
2358 * construction of the syndrome tables. The modified syndrome search algorithm
2359 * uses those to find the symbol in error and thus the DIMM.
2360 *
2361 * Algorithm courtesy of Ross LaFetra from AMD.
2362 */
2363static const u16 x4_vectors[] = {
2364 0x2f57, 0x1afe, 0x66cc, 0xdd88,
2365 0x11eb, 0x3396, 0x7f4c, 0xeac8,
2366 0x0001, 0x0002, 0x0004, 0x0008,
2367 0x1013, 0x3032, 0x4044, 0x8088,
2368 0x106b, 0x30d6, 0x70fc, 0xe0a8,
2369 0x4857, 0xc4fe, 0x13cc, 0x3288,
2370 0x1ac5, 0x2f4a, 0x5394, 0xa1e8,
2371 0x1f39, 0x251e, 0xbd6c, 0x6bd8,
2372 0x15c1, 0x2a42, 0x89ac, 0x4758,
2373 0x2b03, 0x1602, 0x4f0c, 0xca08,
2374 0x1f07, 0x3a0e, 0x6b04, 0xbd08,
2375 0x8ba7, 0x465e, 0x244c, 0x1cc8,
2376 0x2b87, 0x164e, 0x642c, 0xdc18,
2377 0x40b9, 0x80de, 0x1094, 0x20e8,
2378 0x27db, 0x1eb6, 0x9dac, 0x7b58,
2379 0x11c1, 0x2242, 0x84ac, 0x4c58,
2380 0x1be5, 0x2d7a, 0x5e34, 0xa718,
2381 0x4b39, 0x8d1e, 0x14b4, 0x28d8,
2382 0x4c97, 0xc87e, 0x11fc, 0x33a8,
2383 0x8e97, 0x497e, 0x2ffc, 0x1aa8,
2384 0x16b3, 0x3d62, 0x4f34, 0x8518,
2385 0x1e2f, 0x391a, 0x5cac, 0xf858,
2386 0x1d9f, 0x3b7a, 0x572c, 0xfe18,
2387 0x15f5, 0x2a5a, 0x5264, 0xa3b8,
2388 0x1dbb, 0x3b66, 0x715c, 0xe3f8,
2389 0x4397, 0xc27e, 0x17fc, 0x3ea8,
2390 0x1617, 0x3d3e, 0x6464, 0xb8b8,
2391 0x23ff, 0x12aa, 0xab6c, 0x56d8,
2392 0x2dfb, 0x1ba6, 0x913c, 0x7328,
2393 0x185d, 0x2ca6, 0x7914, 0x9e28,
2394 0x171b, 0x3e36, 0x7d7c, 0xebe8,
2395 0x4199, 0x82ee, 0x19f4, 0x2e58,
2396 0x4807, 0xc40e, 0x130c, 0x3208,
2397 0x1905, 0x2e0a, 0x5804, 0xac08,
2398 0x213f, 0x132a, 0xadfc, 0x5ba8,
2399 0x19a9, 0x2efe, 0xb5cc, 0x6f88,
2400};
2401
2402static const u16 x8_vectors[] = {
2403 0x0145, 0x028a, 0x2374, 0x43c8, 0xa1f0, 0x0520, 0x0a40, 0x1480,
2404 0x0211, 0x0422, 0x0844, 0x1088, 0x01b0, 0x44e0, 0x23c0, 0xed80,
2405 0x1011, 0x0116, 0x022c, 0x0458, 0x08b0, 0x8c60, 0x2740, 0x4e80,
2406 0x0411, 0x0822, 0x1044, 0x0158, 0x02b0, 0x2360, 0x46c0, 0xab80,
2407 0x0811, 0x1022, 0x012c, 0x0258, 0x04b0, 0x4660, 0x8cc0, 0x2780,
2408 0x2071, 0x40e2, 0xa0c4, 0x0108, 0x0210, 0x0420, 0x0840, 0x1080,
2409 0x4071, 0x80e2, 0x0104, 0x0208, 0x0410, 0x0820, 0x1040, 0x2080,
2410 0x8071, 0x0102, 0x0204, 0x0408, 0x0810, 0x1020, 0x2040, 0x4080,
2411 0x019d, 0x03d6, 0x136c, 0x2198, 0x50b0, 0xb2e0, 0x0740, 0x0e80,
2412 0x0189, 0x03ea, 0x072c, 0x0e58, 0x1cb0, 0x56e0, 0x37c0, 0xf580,
2413 0x01fd, 0x0376, 0x06ec, 0x0bb8, 0x1110, 0x2220, 0x4440, 0x8880,
2414 0x0163, 0x02c6, 0x1104, 0x0758, 0x0eb0, 0x2be0, 0x6140, 0xc280,
2415 0x02fd, 0x01c6, 0x0b5c, 0x1108, 0x07b0, 0x25a0, 0x8840, 0x6180,
2416 0x0801, 0x012e, 0x025c, 0x04b8, 0x1370, 0x26e0, 0x57c0, 0xb580,
2417 0x0401, 0x0802, 0x015c, 0x02b8, 0x22b0, 0x13e0, 0x7140, 0xe280,
2418 0x0201, 0x0402, 0x0804, 0x01b8, 0x11b0, 0x31a0, 0x8040, 0x7180,
2419 0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
2420 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
2421 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
2422};
2423
2424static int decode_syndrome(u16 syndrome, const u16 *vectors, unsigned num_vecs,
2425 unsigned v_dim)
2426{
2427 unsigned int i, err_sym;
2428
2429 for (err_sym = 0; err_sym < num_vecs / v_dim; err_sym++) {
2430 u16 s = syndrome;
2431 unsigned v_idx = err_sym * v_dim;
2432 unsigned v_end = (err_sym + 1) * v_dim;
2433
2434 /* walk over all 16 bits of the syndrome */
2435 for (i = 1; i < (1U << 16); i <<= 1) {
2436
2437 /* if bit is set in that eigenvector... */
2438 if (v_idx < v_end && vectors[v_idx] & i) {
2439 u16 ev_comp = vectors[v_idx++];
2440
2441 /* ... and bit set in the modified syndrome, */
2442 if (s & i) {
2443 /* remove it. */
2444 s ^= ev_comp;
2445
2446 if (!s)
2447 return err_sym;
2448 }
2449
2450 } else if (s & i)
2451 /* can't get to zero, move to next symbol */
2452 break;
2453 }
2454 }
2455
2456 edac_dbg(0, "syndrome(%x) not found\n", syndrome);
2457 return -1;
2458}
2459
2460static int map_err_sym_to_channel(int err_sym, int sym_size)
2461{
2462 if (sym_size == 4)
2463 switch (err_sym) {
2464 case 0x20:
2465 case 0x21:
2466 return 0;
2467 case 0x22:
2468 case 0x23:
2469 return 1;
2470 default:
2471 return err_sym >> 4;
2472 }
2473 /* x8 symbols */
2474 else
2475 switch (err_sym) {
2476 /* imaginary bits not in a DIMM */
2477 case 0x10:
2478 WARN(1, KERN_ERR "Invalid error symbol: 0x%x\n",
2479 err_sym);
2480 return -1;
2481 case 0x11:
2482 return 0;
2483 case 0x12:
2484 return 1;
2485 default:
2486 return err_sym >> 3;
2487 }
2488 return -1;
2489}
2490
2491static int get_channel_from_ecc_syndrome(struct mem_ctl_info *mci, u16 syndrome)
2492{
2493 struct amd64_pvt *pvt = mci->pvt_info;
2494 int err_sym = -1;
2495
2496 if (pvt->ecc_sym_sz == 8)
2497 err_sym = decode_syndrome(syndrome, x8_vectors,
2498 ARRAY_SIZE(x8_vectors),
2499 pvt->ecc_sym_sz);
2500 else if (pvt->ecc_sym_sz == 4)
2501 err_sym = decode_syndrome(syndrome, x4_vectors,
2502 ARRAY_SIZE(x4_vectors),
2503 pvt->ecc_sym_sz);
2504 else {
2505 amd64_warn("Illegal syndrome type: %u\n", pvt->ecc_sym_sz);
2506 return err_sym;
2507 }
2508
2509 return map_err_sym_to_channel(err_sym, pvt->ecc_sym_sz);
2510}
2511
2512static void __log_ecc_error(struct mem_ctl_info *mci, struct err_info *err,
2513 u8 ecc_type)
2514{
2515 enum hw_event_mc_err_type err_type;
2516 const char *string;
2517
2518 if (ecc_type == 2)
2519 err_type = HW_EVENT_ERR_CORRECTED;
2520 else if (ecc_type == 1)
2521 err_type = HW_EVENT_ERR_UNCORRECTED;
2522 else if (ecc_type == 3)
2523 err_type = HW_EVENT_ERR_DEFERRED;
2524 else {
2525 WARN(1, "Something is rotten in the state of Denmark.\n");
2526 return;
2527 }
2528
2529 switch (err->err_code) {
2530 case DECODE_OK:
2531 string = "";
2532 break;
2533 case ERR_NODE:
2534 string = "Failed to map error addr to a node";
2535 break;
2536 case ERR_CSROW:
2537 string = "Failed to map error addr to a csrow";
2538 break;
2539 case ERR_CHANNEL:
2540 string = "Unknown syndrome - possible error reporting race";
2541 break;
2542 case ERR_SYND:
2543 string = "MCA_SYND not valid - unknown syndrome and csrow";
2544 break;
2545 case ERR_NORM_ADDR:
2546 string = "Cannot decode normalized address";
2547 break;
2548 default:
2549 string = "WTF error";
2550 break;
2551 }
2552
2553 edac_mc_handle_error(err_type, mci, 1,
2554 err->page, err->offset, err->syndrome,
2555 err->csrow, err->channel, -1,
2556 string, "");
2557}
2558
2559static inline void decode_bus_error(int node_id, struct mce *m)
2560{
2561 struct mem_ctl_info *mci;
2562 struct amd64_pvt *pvt;
2563 u8 ecc_type = (m->status >> 45) & 0x3;
2564 u8 xec = XEC(m->status, 0x1f);
2565 u16 ec = EC(m->status);
2566 u64 sys_addr;
2567 struct err_info err;
2568
2569 mci = edac_mc_find(node_id);
2570 if (!mci)
2571 return;
2572
2573 pvt = mci->pvt_info;
2574
2575 /* Bail out early if this was an 'observed' error */
2576 if (PP(ec) == NBSL_PP_OBS)
2577 return;
2578
2579 /* Do only ECC errors */
2580 if (xec && xec != F10_NBSL_EXT_ERR_ECC)
2581 return;
2582
2583 memset(&err, 0, sizeof(err));
2584
2585 sys_addr = get_error_address(pvt, m);
2586
2587 if (ecc_type == 2)
2588 err.syndrome = extract_syndrome(m->status);
2589
2590 pvt->ops->map_sysaddr_to_csrow(mci, sys_addr, &err);
2591
2592 __log_ecc_error(mci, &err, ecc_type);
2593}
2594
2595/*
2596 * To find the UMC channel represented by this bank we need to match on its
2597 * instance_id. The instance_id of a bank is held in the lower 32 bits of its
2598 * IPID.
2599 *
2600 * Currently, we can derive the channel number by looking at the 6th nibble in
2601 * the instance_id. For example, instance_id=0xYXXXXX where Y is the channel
2602 * number.
2603 */
2604static int find_umc_channel(struct mce *m)
2605{
2606 return (m->ipid & GENMASK(31, 0)) >> 20;
2607}
2608
2609static void decode_umc_error(int node_id, struct mce *m)
2610{
2611 u8 ecc_type = (m->status >> 45) & 0x3;
2612 struct mem_ctl_info *mci;
2613 struct amd64_pvt *pvt;
2614 struct err_info err;
2615 u64 sys_addr;
2616
2617 mci = edac_mc_find(node_id);
2618 if (!mci)
2619 return;
2620
2621 pvt = mci->pvt_info;
2622
2623 memset(&err, 0, sizeof(err));
2624
2625 if (m->status & MCI_STATUS_DEFERRED)
2626 ecc_type = 3;
2627
2628 err.channel = find_umc_channel(m);
2629
2630 if (!(m->status & MCI_STATUS_SYNDV)) {
2631 err.err_code = ERR_SYND;
2632 goto log_error;
2633 }
2634
2635 if (ecc_type == 2) {
2636 u8 length = (m->synd >> 18) & 0x3f;
2637
2638 if (length)
2639 err.syndrome = (m->synd >> 32) & GENMASK(length - 1, 0);
2640 else
2641 err.err_code = ERR_CHANNEL;
2642 }
2643
2644 err.csrow = m->synd & 0x7;
2645
2646 if (umc_normaddr_to_sysaddr(m->addr, pvt->mc_node_id, err.channel, &sys_addr)) {
2647 err.err_code = ERR_NORM_ADDR;
2648 goto log_error;
2649 }
2650
2651 error_address_to_page_and_offset(sys_addr, &err);
2652
2653log_error:
2654 __log_ecc_error(mci, &err, ecc_type);
2655}
2656
2657/*
2658 * Use pvt->F3 which contains the F3 CPU PCI device to get the related
2659 * F1 (AddrMap) and F2 (Dct) devices. Return negative value on error.
2660 * Reserve F0 and F6 on systems with a UMC.
2661 */
2662static int
2663reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 pci_id1, u16 pci_id2)
2664{
2665 if (pvt->umc) {
2666 pvt->F0 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
2667 if (!pvt->F0) {
2668 amd64_err("F0 not found, device 0x%x (broken BIOS?)\n", pci_id1);
2669 return -ENODEV;
2670 }
2671
2672 pvt->F6 = pci_get_related_function(pvt->F3->vendor, pci_id2, pvt->F3);
2673 if (!pvt->F6) {
2674 pci_dev_put(pvt->F0);
2675 pvt->F0 = NULL;
2676
2677 amd64_err("F6 not found: device 0x%x (broken BIOS?)\n", pci_id2);
2678 return -ENODEV;
2679 }
2680
2681 if (!pci_ctl_dev)
2682 pci_ctl_dev = &pvt->F0->dev;
2683
2684 edac_dbg(1, "F0: %s\n", pci_name(pvt->F0));
2685 edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
2686 edac_dbg(1, "F6: %s\n", pci_name(pvt->F6));
2687
2688 return 0;
2689 }
2690
2691 /* Reserve the ADDRESS MAP Device */
2692 pvt->F1 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
2693 if (!pvt->F1) {
2694 amd64_err("F1 not found: device 0x%x (broken BIOS?)\n", pci_id1);
2695 return -ENODEV;
2696 }
2697
2698 /* Reserve the DCT Device */
2699 pvt->F2 = pci_get_related_function(pvt->F3->vendor, pci_id2, pvt->F3);
2700 if (!pvt->F2) {
2701 pci_dev_put(pvt->F1);
2702 pvt->F1 = NULL;
2703
2704 amd64_err("F2 not found: device 0x%x (broken BIOS?)\n", pci_id2);
2705 return -ENODEV;
2706 }
2707
2708 if (!pci_ctl_dev)
2709 pci_ctl_dev = &pvt->F2->dev;
2710
2711 edac_dbg(1, "F1: %s\n", pci_name(pvt->F1));
2712 edac_dbg(1, "F2: %s\n", pci_name(pvt->F2));
2713 edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
2714
2715 return 0;
2716}
2717
2718static void free_mc_sibling_devs(struct amd64_pvt *pvt)
2719{
2720 if (pvt->umc) {
2721 pci_dev_put(pvt->F0);
2722 pci_dev_put(pvt->F6);
2723 } else {
2724 pci_dev_put(pvt->F1);
2725 pci_dev_put(pvt->F2);
2726 }
2727}
2728
2729static void determine_ecc_sym_sz(struct amd64_pvt *pvt)
2730{
2731 pvt->ecc_sym_sz = 4;
2732
2733 if (pvt->umc) {
2734 u8 i;
2735
2736 for_each_umc(i) {
2737 /* Check enabled channels only: */
2738 if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
2739 if (pvt->umc[i].ecc_ctrl & BIT(9)) {
2740 pvt->ecc_sym_sz = 16;
2741 return;
2742 } else if (pvt->umc[i].ecc_ctrl & BIT(7)) {
2743 pvt->ecc_sym_sz = 8;
2744 return;
2745 }
2746 }
2747 }
2748 } else if (pvt->fam >= 0x10) {
2749 u32 tmp;
2750
2751 amd64_read_pci_cfg(pvt->F3, EXT_NB_MCA_CFG, &tmp);
2752 /* F16h has only DCT0, so no need to read dbam1. */
2753 if (pvt->fam != 0x16)
2754 amd64_read_dct_pci_cfg(pvt, 1, DBAM0, &pvt->dbam1);
2755
2756 /* F10h, revD and later can do x8 ECC too. */
2757 if ((pvt->fam > 0x10 || pvt->model > 7) && tmp & BIT(25))
2758 pvt->ecc_sym_sz = 8;
2759 }
2760}
2761
2762/*
2763 * Retrieve the hardware registers of the memory controller.
2764 */
2765static void __read_mc_regs_df(struct amd64_pvt *pvt)
2766{
2767 u8 nid = pvt->mc_node_id;
2768 struct amd64_umc *umc;
2769 u32 i, umc_base;
2770
2771 /* Read registers from each UMC */
2772 for_each_umc(i) {
2773
2774 umc_base = get_umc_base(i);
2775 umc = &pvt->umc[i];
2776
2777 amd_smn_read(nid, umc_base + UMCCH_DIMM_CFG, &umc->dimm_cfg);
2778 amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &umc->umc_cfg);
2779 amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &umc->sdp_ctrl);
2780 amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &umc->ecc_ctrl);
2781 amd_smn_read(nid, umc_base + UMCCH_UMC_CAP_HI, &umc->umc_cap_hi);
2782 }
2783}
2784
2785/*
2786 * Retrieve the hardware registers of the memory controller (this includes the
2787 * 'Address Map' and 'Misc' device regs)
2788 */
2789static void read_mc_regs(struct amd64_pvt *pvt)
2790{
2791 unsigned int range;
2792 u64 msr_val;
2793
2794 /*
2795 * Retrieve TOP_MEM and TOP_MEM2; no masking off of reserved bits since
2796 * those are Read-As-Zero.
2797 */
2798 rdmsrl(MSR_K8_TOP_MEM1, pvt->top_mem);
2799 edac_dbg(0, " TOP_MEM: 0x%016llx\n", pvt->top_mem);
2800
2801 /* Check first whether TOP_MEM2 is enabled: */
2802 rdmsrl(MSR_K8_SYSCFG, msr_val);
2803 if (msr_val & BIT(21)) {
2804 rdmsrl(MSR_K8_TOP_MEM2, pvt->top_mem2);
2805 edac_dbg(0, " TOP_MEM2: 0x%016llx\n", pvt->top_mem2);
2806 } else {
2807 edac_dbg(0, " TOP_MEM2 disabled\n");
2808 }
2809
2810 if (pvt->umc) {
2811 __read_mc_regs_df(pvt);
2812 amd64_read_pci_cfg(pvt->F0, DF_DHAR, &pvt->dhar);
2813
2814 goto skip;
2815 }
2816
2817 amd64_read_pci_cfg(pvt->F3, NBCAP, &pvt->nbcap);
2818
2819 read_dram_ctl_register(pvt);
2820
2821 for (range = 0; range < DRAM_RANGES; range++) {
2822 u8 rw;
2823
2824 /* read settings for this DRAM range */
2825 read_dram_base_limit_regs(pvt, range);
2826
2827 rw = dram_rw(pvt, range);
2828 if (!rw)
2829 continue;
2830
2831 edac_dbg(1, " DRAM range[%d], base: 0x%016llx; limit: 0x%016llx\n",
2832 range,
2833 get_dram_base(pvt, range),
2834 get_dram_limit(pvt, range));
2835
2836 edac_dbg(1, " IntlvEn=%s; Range access: %s%s IntlvSel=%d DstNode=%d\n",
2837 dram_intlv_en(pvt, range) ? "Enabled" : "Disabled",
2838 (rw & 0x1) ? "R" : "-",
2839 (rw & 0x2) ? "W" : "-",
2840 dram_intlv_sel(pvt, range),
2841 dram_dst_node(pvt, range));
2842 }
2843
2844 amd64_read_pci_cfg(pvt->F1, DHAR, &pvt->dhar);
2845 amd64_read_dct_pci_cfg(pvt, 0, DBAM0, &pvt->dbam0);
2846
2847 amd64_read_pci_cfg(pvt->F3, F10_ONLINE_SPARE, &pvt->online_spare);
2848
2849 amd64_read_dct_pci_cfg(pvt, 0, DCLR0, &pvt->dclr0);
2850 amd64_read_dct_pci_cfg(pvt, 0, DCHR0, &pvt->dchr0);
2851
2852 if (!dct_ganging_enabled(pvt)) {
2853 amd64_read_dct_pci_cfg(pvt, 1, DCLR0, &pvt->dclr1);
2854 amd64_read_dct_pci_cfg(pvt, 1, DCHR0, &pvt->dchr1);
2855 }
2856
2857skip:
2858 read_dct_base_mask(pvt);
2859
2860 determine_memory_type(pvt);
2861 edac_dbg(1, " DIMM type: %s\n", edac_mem_types[pvt->dram_type]);
2862
2863 determine_ecc_sym_sz(pvt);
2864}
2865
2866/*
2867 * NOTE: CPU Revision Dependent code
2868 *
2869 * Input:
2870 * @csrow_nr ChipSelect Row Number (0..NUM_CHIPSELECTS-1)
2871 * k8 private pointer to -->
2872 * DRAM Bank Address mapping register
2873 * node_id
2874 * DCL register where dual_channel_active is
2875 *
2876 * The DBAM register consists of 4 sets of 4 bits each definitions:
2877 *
2878 * Bits: CSROWs
2879 * 0-3 CSROWs 0 and 1
2880 * 4-7 CSROWs 2 and 3
2881 * 8-11 CSROWs 4 and 5
2882 * 12-15 CSROWs 6 and 7
2883 *
2884 * Values range from: 0 to 15
2885 * The meaning of the values depends on CPU revision and dual-channel state,
2886 * see relevant BKDG more info.
2887 *
2888 * The memory controller provides for total of only 8 CSROWs in its current
2889 * architecture. Each "pair" of CSROWs normally represents just one DIMM in
2890 * single channel or two (2) DIMMs in dual channel mode.
2891 *
2892 * The following code logic collapses the various tables for CSROW based on CPU
2893 * revision.
2894 *
2895 * Returns:
2896 * The number of PAGE_SIZE pages on the specified CSROW number it
2897 * encompasses
2898 *
2899 */
2900static u32 get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr_orig)
2901{
2902 u32 dbam = dct ? pvt->dbam1 : pvt->dbam0;
2903 int csrow_nr = csrow_nr_orig;
2904 u32 cs_mode, nr_pages;
2905
2906 if (!pvt->umc) {
2907 csrow_nr >>= 1;
2908 cs_mode = DBAM_DIMM(csrow_nr, dbam);
2909 } else {
2910 cs_mode = f17_get_cs_mode(csrow_nr >> 1, dct, pvt);
2911 }
2912
2913 nr_pages = pvt->ops->dbam_to_cs(pvt, dct, cs_mode, csrow_nr);
2914 nr_pages <<= 20 - PAGE_SHIFT;
2915
2916 edac_dbg(0, "csrow: %d, channel: %d, DBAM idx: %d\n",
2917 csrow_nr_orig, dct, cs_mode);
2918 edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
2919
2920 return nr_pages;
2921}
2922
2923static int init_csrows_df(struct mem_ctl_info *mci)
2924{
2925 struct amd64_pvt *pvt = mci->pvt_info;
2926 enum edac_type edac_mode = EDAC_NONE;
2927 enum dev_type dev_type = DEV_UNKNOWN;
2928 struct dimm_info *dimm;
2929 int empty = 1;
2930 u8 umc, cs;
2931
2932 if (mci->edac_ctl_cap & EDAC_FLAG_S16ECD16ED) {
2933 edac_mode = EDAC_S16ECD16ED;
2934 dev_type = DEV_X16;
2935 } else if (mci->edac_ctl_cap & EDAC_FLAG_S8ECD8ED) {
2936 edac_mode = EDAC_S8ECD8ED;
2937 dev_type = DEV_X8;
2938 } else if (mci->edac_ctl_cap & EDAC_FLAG_S4ECD4ED) {
2939 edac_mode = EDAC_S4ECD4ED;
2940 dev_type = DEV_X4;
2941 } else if (mci->edac_ctl_cap & EDAC_FLAG_SECDED) {
2942 edac_mode = EDAC_SECDED;
2943 }
2944
2945 for_each_umc(umc) {
2946 for_each_chip_select(cs, umc, pvt) {
2947 if (!csrow_enabled(cs, umc, pvt))
2948 continue;
2949
2950 empty = 0;
2951 dimm = mci->csrows[cs]->channels[umc]->dimm;
2952
2953 edac_dbg(1, "MC node: %d, csrow: %d\n",
2954 pvt->mc_node_id, cs);
2955
2956 dimm->nr_pages = get_csrow_nr_pages(pvt, umc, cs);
2957 dimm->mtype = pvt->dram_type;
2958 dimm->edac_mode = edac_mode;
2959 dimm->dtype = dev_type;
2960 dimm->grain = 64;
2961 }
2962 }
2963
2964 return empty;
2965}
2966
2967/*
2968 * Initialize the array of csrow attribute instances, based on the values
2969 * from pci config hardware registers.
2970 */
2971static int init_csrows(struct mem_ctl_info *mci)
2972{
2973 struct amd64_pvt *pvt = mci->pvt_info;
2974 enum edac_type edac_mode = EDAC_NONE;
2975 struct csrow_info *csrow;
2976 struct dimm_info *dimm;
2977 int i, j, empty = 1;
2978 int nr_pages = 0;
2979 u32 val;
2980
2981 if (pvt->umc)
2982 return init_csrows_df(mci);
2983
2984 amd64_read_pci_cfg(pvt->F3, NBCFG, &val);
2985
2986 pvt->nbcfg = val;
2987
2988 edac_dbg(0, "node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
2989 pvt->mc_node_id, val,
2990 !!(val & NBCFG_CHIPKILL), !!(val & NBCFG_ECC_ENABLE));
2991
2992 /*
2993 * We iterate over DCT0 here but we look at DCT1 in parallel, if needed.
2994 */
2995 for_each_chip_select(i, 0, pvt) {
2996 bool row_dct0 = !!csrow_enabled(i, 0, pvt);
2997 bool row_dct1 = false;
2998
2999 if (pvt->fam != 0xf)
3000 row_dct1 = !!csrow_enabled(i, 1, pvt);
3001
3002 if (!row_dct0 && !row_dct1)
3003 continue;
3004
3005 csrow = mci->csrows[i];
3006 empty = 0;
3007
3008 edac_dbg(1, "MC node: %d, csrow: %d\n",
3009 pvt->mc_node_id, i);
3010
3011 if (row_dct0) {
3012 nr_pages = get_csrow_nr_pages(pvt, 0, i);
3013 csrow->channels[0]->dimm->nr_pages = nr_pages;
3014 }
3015
3016 /* K8 has only one DCT */
3017 if (pvt->fam != 0xf && row_dct1) {
3018 int row_dct1_pages = get_csrow_nr_pages(pvt, 1, i);
3019
3020 csrow->channels[1]->dimm->nr_pages = row_dct1_pages;
3021 nr_pages += row_dct1_pages;
3022 }
3023
3024 edac_dbg(1, "Total csrow%d pages: %u\n", i, nr_pages);
3025
3026 /* Determine DIMM ECC mode: */
3027 if (pvt->nbcfg & NBCFG_ECC_ENABLE) {
3028 edac_mode = (pvt->nbcfg & NBCFG_CHIPKILL)
3029 ? EDAC_S4ECD4ED
3030 : EDAC_SECDED;
3031 }
3032
3033 for (j = 0; j < pvt->channel_count; j++) {
3034 dimm = csrow->channels[j]->dimm;
3035 dimm->mtype = pvt->dram_type;
3036 dimm->edac_mode = edac_mode;
3037 dimm->grain = 64;
3038 }
3039 }
3040
3041 return empty;
3042}
3043
3044/* get all cores on this DCT */
3045static void get_cpus_on_this_dct_cpumask(struct cpumask *mask, u16 nid)
3046{
3047 int cpu;
3048
3049 for_each_online_cpu(cpu)
3050 if (topology_die_id(cpu) == nid)
3051 cpumask_set_cpu(cpu, mask);
3052}
3053
3054/* check MCG_CTL on all the cpus on this node */
3055static bool nb_mce_bank_enabled_on_node(u16 nid)
3056{
3057 cpumask_var_t mask;
3058 int cpu, nbe;
3059 bool ret = false;
3060
3061 if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) {
3062 amd64_warn("%s: Error allocating mask\n", __func__);
3063 return false;
3064 }
3065
3066 get_cpus_on_this_dct_cpumask(mask, nid);
3067
3068 rdmsr_on_cpus(mask, MSR_IA32_MCG_CTL, msrs);
3069
3070 for_each_cpu(cpu, mask) {
3071 struct msr *reg = per_cpu_ptr(msrs, cpu);
3072 nbe = reg->l & MSR_MCGCTL_NBE;
3073
3074 edac_dbg(0, "core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
3075 cpu, reg->q,
3076 (nbe ? "enabled" : "disabled"));
3077
3078 if (!nbe)
3079 goto out;
3080 }
3081 ret = true;
3082
3083out:
3084 free_cpumask_var(mask);
3085 return ret;
3086}
3087
3088static int toggle_ecc_err_reporting(struct ecc_settings *s, u16 nid, bool on)
3089{
3090 cpumask_var_t cmask;
3091 int cpu;
3092
3093 if (!zalloc_cpumask_var(&cmask, GFP_KERNEL)) {
3094 amd64_warn("%s: error allocating mask\n", __func__);
3095 return -ENOMEM;
3096 }
3097
3098 get_cpus_on_this_dct_cpumask(cmask, nid);
3099
3100 rdmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3101
3102 for_each_cpu(cpu, cmask) {
3103
3104 struct msr *reg = per_cpu_ptr(msrs, cpu);
3105
3106 if (on) {
3107 if (reg->l & MSR_MCGCTL_NBE)
3108 s->flags.nb_mce_enable = 1;
3109
3110 reg->l |= MSR_MCGCTL_NBE;
3111 } else {
3112 /*
3113 * Turn off NB MCE reporting only when it was off before
3114 */
3115 if (!s->flags.nb_mce_enable)
3116 reg->l &= ~MSR_MCGCTL_NBE;
3117 }
3118 }
3119 wrmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3120
3121 free_cpumask_var(cmask);
3122
3123 return 0;
3124}
3125
3126static bool enable_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3127 struct pci_dev *F3)
3128{
3129 bool ret = true;
3130 u32 value, mask = 0x3; /* UECC/CECC enable */
3131
3132 if (toggle_ecc_err_reporting(s, nid, ON)) {
3133 amd64_warn("Error enabling ECC reporting over MCGCTL!\n");
3134 return false;
3135 }
3136
3137 amd64_read_pci_cfg(F3, NBCTL, &value);
3138
3139 s->old_nbctl = value & mask;
3140 s->nbctl_valid = true;
3141
3142 value |= mask;
3143 amd64_write_pci_cfg(F3, NBCTL, value);
3144
3145 amd64_read_pci_cfg(F3, NBCFG, &value);
3146
3147 edac_dbg(0, "1: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3148 nid, value, !!(value & NBCFG_ECC_ENABLE));
3149
3150 if (!(value & NBCFG_ECC_ENABLE)) {
3151 amd64_warn("DRAM ECC disabled on this node, enabling...\n");
3152
3153 s->flags.nb_ecc_prev = 0;
3154
3155 /* Attempt to turn on DRAM ECC Enable */
3156 value |= NBCFG_ECC_ENABLE;
3157 amd64_write_pci_cfg(F3, NBCFG, value);
3158
3159 amd64_read_pci_cfg(F3, NBCFG, &value);
3160
3161 if (!(value & NBCFG_ECC_ENABLE)) {
3162 amd64_warn("Hardware rejected DRAM ECC enable,"
3163 "check memory DIMM configuration.\n");
3164 ret = false;
3165 } else {
3166 amd64_info("Hardware accepted DRAM ECC Enable\n");
3167 }
3168 } else {
3169 s->flags.nb_ecc_prev = 1;
3170 }
3171
3172 edac_dbg(0, "2: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3173 nid, value, !!(value & NBCFG_ECC_ENABLE));
3174
3175 return ret;
3176}
3177
3178static void restore_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3179 struct pci_dev *F3)
3180{
3181 u32 value, mask = 0x3; /* UECC/CECC enable */
3182
3183 if (!s->nbctl_valid)
3184 return;
3185
3186 amd64_read_pci_cfg(F3, NBCTL, &value);
3187 value &= ~mask;
3188 value |= s->old_nbctl;
3189
3190 amd64_write_pci_cfg(F3, NBCTL, value);
3191
3192 /* restore previous BIOS DRAM ECC "off" setting we force-enabled */
3193 if (!s->flags.nb_ecc_prev) {
3194 amd64_read_pci_cfg(F3, NBCFG, &value);
3195 value &= ~NBCFG_ECC_ENABLE;
3196 amd64_write_pci_cfg(F3, NBCFG, value);
3197 }
3198
3199 /* restore the NB Enable MCGCTL bit */
3200 if (toggle_ecc_err_reporting(s, nid, OFF))
3201 amd64_warn("Error restoring NB MCGCTL settings!\n");
3202}
3203
3204static bool ecc_enabled(struct amd64_pvt *pvt)
3205{
3206 u16 nid = pvt->mc_node_id;
3207 bool nb_mce_en = false;
3208 u8 ecc_en = 0, i;
3209 u32 value;
3210
3211 if (boot_cpu_data.x86 >= 0x17) {
3212 u8 umc_en_mask = 0, ecc_en_mask = 0;
3213 struct amd64_umc *umc;
3214
3215 for_each_umc(i) {
3216 umc = &pvt->umc[i];
3217
3218 /* Only check enabled UMCs. */
3219 if (!(umc->sdp_ctrl & UMC_SDP_INIT))
3220 continue;
3221
3222 umc_en_mask |= BIT(i);
3223
3224 if (umc->umc_cap_hi & UMC_ECC_ENABLED)
3225 ecc_en_mask |= BIT(i);
3226 }
3227
3228 /* Check whether at least one UMC is enabled: */
3229 if (umc_en_mask)
3230 ecc_en = umc_en_mask == ecc_en_mask;
3231 else
3232 edac_dbg(0, "Node %d: No enabled UMCs.\n", nid);
3233
3234 /* Assume UMC MCA banks are enabled. */
3235 nb_mce_en = true;
3236 } else {
3237 amd64_read_pci_cfg(pvt->F3, NBCFG, &value);
3238
3239 ecc_en = !!(value & NBCFG_ECC_ENABLE);
3240
3241 nb_mce_en = nb_mce_bank_enabled_on_node(nid);
3242 if (!nb_mce_en)
3243 edac_dbg(0, "NB MCE bank disabled, set MSR 0x%08x[4] on node %d to enable.\n",
3244 MSR_IA32_MCG_CTL, nid);
3245 }
3246
3247 amd64_info("Node %d: DRAM ECC %s.\n",
3248 nid, (ecc_en ? "enabled" : "disabled"));
3249
3250 if (!ecc_en || !nb_mce_en)
3251 return false;
3252 else
3253 return true;
3254}
3255
3256static inline void
3257f17h_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)
3258{
3259 u8 i, ecc_en = 1, cpk_en = 1, dev_x4 = 1, dev_x16 = 1;
3260
3261 for_each_umc(i) {
3262 if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
3263 ecc_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_ENABLED);
3264 cpk_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_CHIPKILL_CAP);
3265
3266 dev_x4 &= !!(pvt->umc[i].dimm_cfg & BIT(6));
3267 dev_x16 &= !!(pvt->umc[i].dimm_cfg & BIT(7));
3268 }
3269 }
3270
3271 /* Set chipkill only if ECC is enabled: */
3272 if (ecc_en) {
3273 mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3274
3275 if (!cpk_en)
3276 return;
3277
3278 if (dev_x4)
3279 mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3280 else if (dev_x16)
3281 mci->edac_ctl_cap |= EDAC_FLAG_S16ECD16ED;
3282 else
3283 mci->edac_ctl_cap |= EDAC_FLAG_S8ECD8ED;
3284 }
3285}
3286
3287static void setup_mci_misc_attrs(struct mem_ctl_info *mci)
3288{
3289 struct amd64_pvt *pvt = mci->pvt_info;
3290
3291 mci->mtype_cap = MEM_FLAG_DDR2 | MEM_FLAG_RDDR2;
3292 mci->edac_ctl_cap = EDAC_FLAG_NONE;
3293
3294 if (pvt->umc) {
3295 f17h_determine_edac_ctl_cap(mci, pvt);
3296 } else {
3297 if (pvt->nbcap & NBCAP_SECDED)
3298 mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3299
3300 if (pvt->nbcap & NBCAP_CHIPKILL)
3301 mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3302 }
3303
3304 mci->edac_cap = determine_edac_cap(pvt);
3305 mci->mod_name = EDAC_MOD_STR;
3306 mci->ctl_name = fam_type->ctl_name;
3307 mci->dev_name = pci_name(pvt->F3);
3308 mci->ctl_page_to_phys = NULL;
3309
3310 /* memory scrubber interface */
3311 mci->set_sdram_scrub_rate = set_scrub_rate;
3312 mci->get_sdram_scrub_rate = get_scrub_rate;
3313}
3314
3315/*
3316 * returns a pointer to the family descriptor on success, NULL otherwise.
3317 */
3318static struct amd64_family_type *per_family_init(struct amd64_pvt *pvt)
3319{
3320 pvt->ext_model = boot_cpu_data.x86_model >> 4;
3321 pvt->stepping = boot_cpu_data.x86_stepping;
3322 pvt->model = boot_cpu_data.x86_model;
3323 pvt->fam = boot_cpu_data.x86;
3324
3325 switch (pvt->fam) {
3326 case 0xf:
3327 fam_type = &family_types[K8_CPUS];
3328 pvt->ops = &family_types[K8_CPUS].ops;
3329 break;
3330
3331 case 0x10:
3332 fam_type = &family_types[F10_CPUS];
3333 pvt->ops = &family_types[F10_CPUS].ops;
3334 break;
3335
3336 case 0x15:
3337 if (pvt->model == 0x30) {
3338 fam_type = &family_types[F15_M30H_CPUS];
3339 pvt->ops = &family_types[F15_M30H_CPUS].ops;
3340 break;
3341 } else if (pvt->model == 0x60) {
3342 fam_type = &family_types[F15_M60H_CPUS];
3343 pvt->ops = &family_types[F15_M60H_CPUS].ops;
3344 break;
3345 }
3346
3347 fam_type = &family_types[F15_CPUS];
3348 pvt->ops = &family_types[F15_CPUS].ops;
3349 break;
3350
3351 case 0x16:
3352 if (pvt->model == 0x30) {
3353 fam_type = &family_types[F16_M30H_CPUS];
3354 pvt->ops = &family_types[F16_M30H_CPUS].ops;
3355 break;
3356 }
3357 fam_type = &family_types[F16_CPUS];
3358 pvt->ops = &family_types[F16_CPUS].ops;
3359 break;
3360
3361 case 0x17:
3362 if (pvt->model >= 0x10 && pvt->model <= 0x2f) {
3363 fam_type = &family_types[F17_M10H_CPUS];
3364 pvt->ops = &family_types[F17_M10H_CPUS].ops;
3365 break;
3366 } else if (pvt->model >= 0x30 && pvt->model <= 0x3f) {
3367 fam_type = &family_types[F17_M30H_CPUS];
3368 pvt->ops = &family_types[F17_M30H_CPUS].ops;
3369 break;
3370 } else if (pvt->model >= 0x60 && pvt->model <= 0x6f) {
3371 fam_type = &family_types[F17_M60H_CPUS];
3372 pvt->ops = &family_types[F17_M60H_CPUS].ops;
3373 break;
3374 } else if (pvt->model >= 0x70 && pvt->model <= 0x7f) {
3375 fam_type = &family_types[F17_M70H_CPUS];
3376 pvt->ops = &family_types[F17_M70H_CPUS].ops;
3377 break;
3378 }
3379 fallthrough;
3380 case 0x18:
3381 fam_type = &family_types[F17_CPUS];
3382 pvt->ops = &family_types[F17_CPUS].ops;
3383
3384 if (pvt->fam == 0x18)
3385 family_types[F17_CPUS].ctl_name = "F18h";
3386 break;
3387
3388 case 0x19:
3389 if (pvt->model >= 0x20 && pvt->model <= 0x2f) {
3390 fam_type = &family_types[F17_M70H_CPUS];
3391 pvt->ops = &family_types[F17_M70H_CPUS].ops;
3392 fam_type->ctl_name = "F19h_M20h";
3393 break;
3394 }
3395 fam_type = &family_types[F19_CPUS];
3396 pvt->ops = &family_types[F19_CPUS].ops;
3397 family_types[F19_CPUS].ctl_name = "F19h";
3398 break;
3399
3400 default:
3401 amd64_err("Unsupported family!\n");
3402 return NULL;
3403 }
3404
3405 amd64_info("%s %sdetected (node %d).\n", fam_type->ctl_name,
3406 (pvt->fam == 0xf ?
3407 (pvt->ext_model >= K8_REV_F ? "revF or later "
3408 : "revE or earlier ")
3409 : ""), pvt->mc_node_id);
3410 return fam_type;
3411}
3412
3413static const struct attribute_group *amd64_edac_attr_groups[] = {
3414#ifdef CONFIG_EDAC_DEBUG
3415 &amd64_edac_dbg_group,
3416#endif
3417#ifdef CONFIG_EDAC_AMD64_ERROR_INJECTION
3418 &amd64_edac_inj_group,
3419#endif
3420 NULL
3421};
3422
3423static int hw_info_get(struct amd64_pvt *pvt)
3424{
3425 u16 pci_id1, pci_id2;
3426 int ret;
3427
3428 if (pvt->fam >= 0x17) {
3429 pvt->umc = kcalloc(fam_type->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
3430 if (!pvt->umc)
3431 return -ENOMEM;
3432
3433 pci_id1 = fam_type->f0_id;
3434 pci_id2 = fam_type->f6_id;
3435 } else {
3436 pci_id1 = fam_type->f1_id;
3437 pci_id2 = fam_type->f2_id;
3438 }
3439
3440 ret = reserve_mc_sibling_devs(pvt, pci_id1, pci_id2);
3441 if (ret)
3442 return ret;
3443
3444 read_mc_regs(pvt);
3445
3446 return 0;
3447}
3448
3449static void hw_info_put(struct amd64_pvt *pvt)
3450{
3451 if (pvt->F0 || pvt->F1)
3452 free_mc_sibling_devs(pvt);
3453
3454 kfree(pvt->umc);
3455}
3456
3457static int init_one_instance(struct amd64_pvt *pvt)
3458{
3459 struct mem_ctl_info *mci = NULL;
3460 struct edac_mc_layer layers[2];
3461 int ret = -EINVAL;
3462
3463 /*
3464 * We need to determine how many memory channels there are. Then use
3465 * that information for calculating the size of the dynamic instance
3466 * tables in the 'mci' structure.
3467 */
3468 pvt->channel_count = pvt->ops->early_channel_count(pvt);
3469 if (pvt->channel_count < 0)
3470 return ret;
3471
3472 ret = -ENOMEM;
3473 layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
3474 layers[0].size = pvt->csels[0].b_cnt;
3475 layers[0].is_virt_csrow = true;
3476 layers[1].type = EDAC_MC_LAYER_CHANNEL;
3477
3478 /*
3479 * Always allocate two channels since we can have setups with DIMMs on
3480 * only one channel. Also, this simplifies handling later for the price
3481 * of a couple of KBs tops.
3482 */
3483 layers[1].size = fam_type->max_mcs;
3484 layers[1].is_virt_csrow = false;
3485
3486 mci = edac_mc_alloc(pvt->mc_node_id, ARRAY_SIZE(layers), layers, 0);
3487 if (!mci)
3488 return ret;
3489
3490 mci->pvt_info = pvt;
3491 mci->pdev = &pvt->F3->dev;
3492
3493 setup_mci_misc_attrs(mci);
3494
3495 if (init_csrows(mci))
3496 mci->edac_cap = EDAC_FLAG_NONE;
3497
3498 ret = -ENODEV;
3499 if (edac_mc_add_mc_with_groups(mci, amd64_edac_attr_groups)) {
3500 edac_dbg(1, "failed edac_mc_add_mc()\n");
3501 edac_mc_free(mci);
3502 return ret;
3503 }
3504
3505 return 0;
3506}
3507
3508static bool instance_has_memory(struct amd64_pvt *pvt)
3509{
3510 bool cs_enabled = false;
3511 int cs = 0, dct = 0;
3512
3513 for (dct = 0; dct < fam_type->max_mcs; dct++) {
3514 for_each_chip_select(cs, dct, pvt)
3515 cs_enabled |= csrow_enabled(cs, dct, pvt);
3516 }
3517
3518 return cs_enabled;
3519}
3520
3521static int probe_one_instance(unsigned int nid)
3522{
3523 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
3524 struct amd64_pvt *pvt = NULL;
3525 struct ecc_settings *s;
3526 int ret;
3527
3528 ret = -ENOMEM;
3529 s = kzalloc(sizeof(struct ecc_settings), GFP_KERNEL);
3530 if (!s)
3531 goto err_out;
3532
3533 ecc_stngs[nid] = s;
3534
3535 pvt = kzalloc(sizeof(struct amd64_pvt), GFP_KERNEL);
3536 if (!pvt)
3537 goto err_settings;
3538
3539 pvt->mc_node_id = nid;
3540 pvt->F3 = F3;
3541
3542 fam_type = per_family_init(pvt);
3543 if (!fam_type)
3544 goto err_enable;
3545
3546 ret = hw_info_get(pvt);
3547 if (ret < 0)
3548 goto err_enable;
3549
3550 ret = 0;
3551 if (!instance_has_memory(pvt)) {
3552 amd64_info("Node %d: No DIMMs detected.\n", nid);
3553 goto err_enable;
3554 }
3555
3556 if (!ecc_enabled(pvt)) {
3557 ret = -ENODEV;
3558
3559 if (!ecc_enable_override)
3560 goto err_enable;
3561
3562 if (boot_cpu_data.x86 >= 0x17) {
3563 amd64_warn("Forcing ECC on is not recommended on newer systems. Please enable ECC in BIOS.");
3564 goto err_enable;
3565 } else
3566 amd64_warn("Forcing ECC on!\n");
3567
3568 if (!enable_ecc_error_reporting(s, nid, F3))
3569 goto err_enable;
3570 }
3571
3572 ret = init_one_instance(pvt);
3573 if (ret < 0) {
3574 amd64_err("Error probing instance: %d\n", nid);
3575
3576 if (boot_cpu_data.x86 < 0x17)
3577 restore_ecc_error_reporting(s, nid, F3);
3578
3579 goto err_enable;
3580 }
3581
3582 dump_misc_regs(pvt);
3583
3584 return ret;
3585
3586err_enable:
3587 hw_info_put(pvt);
3588 kfree(pvt);
3589
3590err_settings:
3591 kfree(s);
3592 ecc_stngs[nid] = NULL;
3593
3594err_out:
3595 return ret;
3596}
3597
3598static void remove_one_instance(unsigned int nid)
3599{
3600 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
3601 struct ecc_settings *s = ecc_stngs[nid];
3602 struct mem_ctl_info *mci;
3603 struct amd64_pvt *pvt;
3604
3605 /* Remove from EDAC CORE tracking list */
3606 mci = edac_mc_del_mc(&F3->dev);
3607 if (!mci)
3608 return;
3609
3610 pvt = mci->pvt_info;
3611
3612 restore_ecc_error_reporting(s, nid, F3);
3613
3614 kfree(ecc_stngs[nid]);
3615 ecc_stngs[nid] = NULL;
3616
3617 /* Free the EDAC CORE resources */
3618 mci->pvt_info = NULL;
3619
3620 hw_info_put(pvt);
3621 kfree(pvt);
3622 edac_mc_free(mci);
3623}
3624
3625static void setup_pci_device(void)
3626{
3627 if (pci_ctl)
3628 return;
3629
3630 pci_ctl = edac_pci_create_generic_ctl(pci_ctl_dev, EDAC_MOD_STR);
3631 if (!pci_ctl) {
3632 pr_warn("%s(): Unable to create PCI control\n", __func__);
3633 pr_warn("%s(): PCI error report via EDAC not set\n", __func__);
3634 }
3635}
3636
3637static const struct x86_cpu_id amd64_cpuids[] = {
3638 X86_MATCH_VENDOR_FAM(AMD, 0x0F, NULL),
3639 X86_MATCH_VENDOR_FAM(AMD, 0x10, NULL),
3640 X86_MATCH_VENDOR_FAM(AMD, 0x15, NULL),
3641 X86_MATCH_VENDOR_FAM(AMD, 0x16, NULL),
3642 X86_MATCH_VENDOR_FAM(AMD, 0x17, NULL),
3643 X86_MATCH_VENDOR_FAM(HYGON, 0x18, NULL),
3644 X86_MATCH_VENDOR_FAM(AMD, 0x19, NULL),
3645 { }
3646};
3647MODULE_DEVICE_TABLE(x86cpu, amd64_cpuids);
3648
3649static int __init amd64_edac_init(void)
3650{
3651 const char *owner;
3652 int err = -ENODEV;
3653 int i;
3654
3655 owner = edac_get_owner();
3656 if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
3657 return -EBUSY;
3658
3659 if (!x86_match_cpu(amd64_cpuids))
3660 return -ENODEV;
3661
3662 if (amd_cache_northbridges() < 0)
3663 return -ENODEV;
3664
3665 opstate_init();
3666
3667 err = -ENOMEM;
3668 ecc_stngs = kcalloc(amd_nb_num(), sizeof(ecc_stngs[0]), GFP_KERNEL);
3669 if (!ecc_stngs)
3670 goto err_free;
3671
3672 msrs = msrs_alloc();
3673 if (!msrs)
3674 goto err_free;
3675
3676 for (i = 0; i < amd_nb_num(); i++) {
3677 err = probe_one_instance(i);
3678 if (err) {
3679 /* unwind properly */
3680 while (--i >= 0)
3681 remove_one_instance(i);
3682
3683 goto err_pci;
3684 }
3685 }
3686
3687 if (!edac_has_mcs()) {
3688 err = -ENODEV;
3689 goto err_pci;
3690 }
3691
3692 /* register stuff with EDAC MCE */
3693 if (boot_cpu_data.x86 >= 0x17)
3694 amd_register_ecc_decoder(decode_umc_error);
3695 else
3696 amd_register_ecc_decoder(decode_bus_error);
3697
3698 setup_pci_device();
3699
3700#ifdef CONFIG_X86_32
3701 amd64_err("%s on 32-bit is unsupported. USE AT YOUR OWN RISK!\n", EDAC_MOD_STR);
3702#endif
3703
3704 printk(KERN_INFO "AMD64 EDAC driver v%s\n", EDAC_AMD64_VERSION);
3705
3706 return 0;
3707
3708err_pci:
3709 pci_ctl_dev = NULL;
3710
3711 msrs_free(msrs);
3712 msrs = NULL;
3713
3714err_free:
3715 kfree(ecc_stngs);
3716 ecc_stngs = NULL;
3717
3718 return err;
3719}
3720
3721static void __exit amd64_edac_exit(void)
3722{
3723 int i;
3724
3725 if (pci_ctl)
3726 edac_pci_release_generic_ctl(pci_ctl);
3727
3728 /* unregister from EDAC MCE */
3729 if (boot_cpu_data.x86 >= 0x17)
3730 amd_unregister_ecc_decoder(decode_umc_error);
3731 else
3732 amd_unregister_ecc_decoder(decode_bus_error);
3733
3734 for (i = 0; i < amd_nb_num(); i++)
3735 remove_one_instance(i);
3736
3737 kfree(ecc_stngs);
3738 ecc_stngs = NULL;
3739
3740 pci_ctl_dev = NULL;
3741
3742 msrs_free(msrs);
3743 msrs = NULL;
3744}
3745
3746module_init(amd64_edac_init);
3747module_exit(amd64_edac_exit);
3748
3749MODULE_LICENSE("GPL");
3750MODULE_AUTHOR("SoftwareBitMaker: Doug Thompson, "
3751 "Dave Peterson, Thayne Harbaugh");
3752MODULE_DESCRIPTION("MC support for AMD64 memory controllers - "
3753 EDAC_AMD64_VERSION);
3754
3755module_param(edac_op_state, int, 0444);
3756MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");