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