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