gpio: rcar: Fix runtime PM imbalance on error
[linux/fpc-iii.git] / drivers / edac / amd64_edac.c
blobf91f3bc1e0b28b1095977ce3b27621e6fc08616f
1 // SPDX-License-Identifier: GPL-2.0-only
2 #include "amd64_edac.h"
3 #include <asm/amd_nb.h>
5 static struct edac_pci_ctl_info *pci_ctl;
7 static int report_gart_errors;
8 module_param(report_gart_errors, int, 0644);
11 * Set by command line parameter. If BIOS has enabled the ECC, this override is
12 * cleared to prevent re-enabling the hardware by this driver.
14 static int ecc_enable_override;
15 module_param(ecc_enable_override, int, 0644);
17 static struct msr __percpu *msrs;
19 static struct amd64_family_type *fam_type;
21 /* Per-node stuff */
22 static struct ecc_settings **ecc_stngs;
25 * Valid scrub rates for the K8 hardware memory scrubber. We map the scrubbing
26 * bandwidth to a valid bit pattern. The 'set' operation finds the 'matching-
27 * or higher value'.
29 *FIXME: Produce a better mapping/linearisation.
31 static const struct scrubrate {
32 u32 scrubval; /* bit pattern for scrub rate */
33 u32 bandwidth; /* bandwidth consumed (bytes/sec) */
34 } scrubrates[] = {
35 { 0x01, 1600000000UL},
36 { 0x02, 800000000UL},
37 { 0x03, 400000000UL},
38 { 0x04, 200000000UL},
39 { 0x05, 100000000UL},
40 { 0x06, 50000000UL},
41 { 0x07, 25000000UL},
42 { 0x08, 12284069UL},
43 { 0x09, 6274509UL},
44 { 0x0A, 3121951UL},
45 { 0x0B, 1560975UL},
46 { 0x0C, 781440UL},
47 { 0x0D, 390720UL},
48 { 0x0E, 195300UL},
49 { 0x0F, 97650UL},
50 { 0x10, 48854UL},
51 { 0x11, 24427UL},
52 { 0x12, 12213UL},
53 { 0x13, 6101UL},
54 { 0x14, 3051UL},
55 { 0x15, 1523UL},
56 { 0x16, 761UL},
57 { 0x00, 0UL}, /* scrubbing off */
60 int __amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset,
61 u32 *val, const char *func)
63 int err = 0;
65 err = pci_read_config_dword(pdev, offset, val);
66 if (err)
67 amd64_warn("%s: error reading F%dx%03x.\n",
68 func, PCI_FUNC(pdev->devfn), offset);
70 return err;
73 int __amd64_write_pci_cfg_dword(struct pci_dev *pdev, int offset,
74 u32 val, const char *func)
76 int err = 0;
78 err = pci_write_config_dword(pdev, offset, val);
79 if (err)
80 amd64_warn("%s: error writing to F%dx%03x.\n",
81 func, PCI_FUNC(pdev->devfn), offset);
83 return err;
87 * Select DCT to which PCI cfg accesses are routed
89 static void f15h_select_dct(struct amd64_pvt *pvt, u8 dct)
91 u32 reg = 0;
93 amd64_read_pci_cfg(pvt->F1, DCT_CFG_SEL, &reg);
94 reg &= (pvt->model == 0x30) ? ~3 : ~1;
95 reg |= dct;
96 amd64_write_pci_cfg(pvt->F1, DCT_CFG_SEL, reg);
101 * Depending on the family, F2 DCT reads need special handling:
103 * K8: has a single DCT only and no address offsets >= 0x100
105 * F10h: each DCT has its own set of regs
106 * DCT0 -> F2x040..
107 * DCT1 -> F2x140..
109 * F16h: has only 1 DCT
111 * F15h: we select which DCT we access using F1x10C[DctCfgSel]
113 static inline int amd64_read_dct_pci_cfg(struct amd64_pvt *pvt, u8 dct,
114 int offset, u32 *val)
116 switch (pvt->fam) {
117 case 0xf:
118 if (dct || offset >= 0x100)
119 return -EINVAL;
120 break;
122 case 0x10:
123 if (dct) {
125 * Note: If ganging is enabled, barring the regs
126 * F2x[1,0]98 and F2x[1,0]9C; reads reads to F2x1xx
127 * return 0. (cf. Section 2.8.1 F10h BKDG)
129 if (dct_ganging_enabled(pvt))
130 return 0;
132 offset += 0x100;
134 break;
136 case 0x15:
138 * F15h: F2x1xx addresses do not map explicitly to DCT1.
139 * We should select which DCT we access using F1x10C[DctCfgSel]
141 dct = (dct && pvt->model == 0x30) ? 3 : dct;
142 f15h_select_dct(pvt, dct);
143 break;
145 case 0x16:
146 if (dct)
147 return -EINVAL;
148 break;
150 default:
151 break;
153 return amd64_read_pci_cfg(pvt->F2, offset, val);
157 * Memory scrubber control interface. For K8, memory scrubbing is handled by
158 * hardware and can involve L2 cache, dcache as well as the main memory. With
159 * F10, this is extended to L3 cache scrubbing on CPU models sporting that
160 * functionality.
162 * This causes the "units" for the scrubbing speed to vary from 64 byte blocks
163 * (dram) over to cache lines. This is nasty, so we will use bandwidth in
164 * bytes/sec for the setting.
166 * Currently, we only do dram scrubbing. If the scrubbing is done in software on
167 * other archs, we might not have access to the caches directly.
170 static inline void __f17h_set_scrubval(struct amd64_pvt *pvt, u32 scrubval)
173 * Fam17h supports scrub values between 0x5 and 0x14. Also, the values
174 * are shifted down by 0x5, so scrubval 0x5 is written to the register
175 * as 0x0, scrubval 0x6 as 0x1, etc.
177 if (scrubval >= 0x5 && scrubval <= 0x14) {
178 scrubval -= 0x5;
179 pci_write_bits32(pvt->F6, F17H_SCR_LIMIT_ADDR, scrubval, 0xF);
180 pci_write_bits32(pvt->F6, F17H_SCR_BASE_ADDR, 1, 0x1);
181 } else {
182 pci_write_bits32(pvt->F6, F17H_SCR_BASE_ADDR, 0, 0x1);
186 * Scan the scrub rate mapping table for a close or matching bandwidth value to
187 * issue. If requested is too big, then use last maximum value found.
189 static int __set_scrub_rate(struct amd64_pvt *pvt, u32 new_bw, u32 min_rate)
191 u32 scrubval;
192 int i;
195 * map the configured rate (new_bw) to a value specific to the AMD64
196 * memory controller and apply to register. Search for the first
197 * bandwidth entry that is greater or equal than the setting requested
198 * and program that. If at last entry, turn off DRAM scrubbing.
200 * If no suitable bandwidth is found, turn off DRAM scrubbing entirely
201 * by falling back to the last element in scrubrates[].
203 for (i = 0; i < ARRAY_SIZE(scrubrates) - 1; i++) {
205 * skip scrub rates which aren't recommended
206 * (see F10 BKDG, F3x58)
208 if (scrubrates[i].scrubval < min_rate)
209 continue;
211 if (scrubrates[i].bandwidth <= new_bw)
212 break;
215 scrubval = scrubrates[i].scrubval;
217 if (pvt->umc) {
218 __f17h_set_scrubval(pvt, scrubval);
219 } else if (pvt->fam == 0x15 && pvt->model == 0x60) {
220 f15h_select_dct(pvt, 0);
221 pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
222 f15h_select_dct(pvt, 1);
223 pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
224 } else {
225 pci_write_bits32(pvt->F3, SCRCTRL, scrubval, 0x001F);
228 if (scrubval)
229 return scrubrates[i].bandwidth;
231 return 0;
234 static int set_scrub_rate(struct mem_ctl_info *mci, u32 bw)
236 struct amd64_pvt *pvt = mci->pvt_info;
237 u32 min_scrubrate = 0x5;
239 if (pvt->fam == 0xf)
240 min_scrubrate = 0x0;
242 if (pvt->fam == 0x15) {
243 /* Erratum #505 */
244 if (pvt->model < 0x10)
245 f15h_select_dct(pvt, 0);
247 if (pvt->model == 0x60)
248 min_scrubrate = 0x6;
250 return __set_scrub_rate(pvt, bw, min_scrubrate);
253 static int get_scrub_rate(struct mem_ctl_info *mci)
255 struct amd64_pvt *pvt = mci->pvt_info;
256 int i, retval = -EINVAL;
257 u32 scrubval = 0;
259 if (pvt->umc) {
260 amd64_read_pci_cfg(pvt->F6, F17H_SCR_BASE_ADDR, &scrubval);
261 if (scrubval & BIT(0)) {
262 amd64_read_pci_cfg(pvt->F6, F17H_SCR_LIMIT_ADDR, &scrubval);
263 scrubval &= 0xF;
264 scrubval += 0x5;
265 } else {
266 scrubval = 0;
268 } else if (pvt->fam == 0x15) {
269 /* Erratum #505 */
270 if (pvt->model < 0x10)
271 f15h_select_dct(pvt, 0);
273 if (pvt->model == 0x60)
274 amd64_read_pci_cfg(pvt->F2, F15H_M60H_SCRCTRL, &scrubval);
275 } else {
276 amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
279 scrubval = scrubval & 0x001F;
281 for (i = 0; i < ARRAY_SIZE(scrubrates); i++) {
282 if (scrubrates[i].scrubval == scrubval) {
283 retval = scrubrates[i].bandwidth;
284 break;
287 return retval;
291 * returns true if the SysAddr given by sys_addr matches the
292 * DRAM base/limit associated with node_id
294 static bool base_limit_match(struct amd64_pvt *pvt, u64 sys_addr, u8 nid)
296 u64 addr;
298 /* The K8 treats this as a 40-bit value. However, bits 63-40 will be
299 * all ones if the most significant implemented address bit is 1.
300 * Here we discard bits 63-40. See section 3.4.2 of AMD publication
301 * 24592: AMD x86-64 Architecture Programmer's Manual Volume 1
302 * Application Programming.
304 addr = sys_addr & 0x000000ffffffffffull;
306 return ((addr >= get_dram_base(pvt, nid)) &&
307 (addr <= get_dram_limit(pvt, nid)));
311 * Attempt to map a SysAddr to a node. On success, return a pointer to the
312 * mem_ctl_info structure for the node that the SysAddr maps to.
314 * On failure, return NULL.
316 static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci,
317 u64 sys_addr)
319 struct amd64_pvt *pvt;
320 u8 node_id;
321 u32 intlv_en, bits;
324 * Here we use the DRAM Base (section 3.4.4.1) and DRAM Limit (section
325 * 3.4.4.2) registers to map the SysAddr to a node ID.
327 pvt = mci->pvt_info;
330 * The value of this field should be the same for all DRAM Base
331 * registers. Therefore we arbitrarily choose to read it from the
332 * register for node 0.
334 intlv_en = dram_intlv_en(pvt, 0);
336 if (intlv_en == 0) {
337 for (node_id = 0; node_id < DRAM_RANGES; node_id++) {
338 if (base_limit_match(pvt, sys_addr, node_id))
339 goto found;
341 goto err_no_match;
344 if (unlikely((intlv_en != 0x01) &&
345 (intlv_en != 0x03) &&
346 (intlv_en != 0x07))) {
347 amd64_warn("DRAM Base[IntlvEn] junk value: 0x%x, BIOS bug?\n", intlv_en);
348 return NULL;
351 bits = (((u32) sys_addr) >> 12) & intlv_en;
353 for (node_id = 0; ; ) {
354 if ((dram_intlv_sel(pvt, node_id) & intlv_en) == bits)
355 break; /* intlv_sel field matches */
357 if (++node_id >= DRAM_RANGES)
358 goto err_no_match;
361 /* sanity test for sys_addr */
362 if (unlikely(!base_limit_match(pvt, sys_addr, node_id))) {
363 amd64_warn("%s: sys_addr 0x%llx falls outside base/limit address"
364 "range for node %d with node interleaving enabled.\n",
365 __func__, sys_addr, node_id);
366 return NULL;
369 found:
370 return edac_mc_find((int)node_id);
372 err_no_match:
373 edac_dbg(2, "sys_addr 0x%lx doesn't match any node\n",
374 (unsigned long)sys_addr);
376 return NULL;
380 * compute the CS base address of the @csrow on the DRAM controller @dct.
381 * For details see F2x[5C:40] in the processor's BKDG
383 static void get_cs_base_and_mask(struct amd64_pvt *pvt, int csrow, u8 dct,
384 u64 *base, u64 *mask)
386 u64 csbase, csmask, base_bits, mask_bits;
387 u8 addr_shift;
389 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
390 csbase = pvt->csels[dct].csbases[csrow];
391 csmask = pvt->csels[dct].csmasks[csrow];
392 base_bits = GENMASK_ULL(31, 21) | GENMASK_ULL(15, 9);
393 mask_bits = GENMASK_ULL(29, 21) | GENMASK_ULL(15, 9);
394 addr_shift = 4;
397 * F16h and F15h, models 30h and later need two addr_shift values:
398 * 8 for high and 6 for low (cf. F16h BKDG).
400 } else if (pvt->fam == 0x16 ||
401 (pvt->fam == 0x15 && pvt->model >= 0x30)) {
402 csbase = pvt->csels[dct].csbases[csrow];
403 csmask = pvt->csels[dct].csmasks[csrow >> 1];
405 *base = (csbase & GENMASK_ULL(15, 5)) << 6;
406 *base |= (csbase & GENMASK_ULL(30, 19)) << 8;
408 *mask = ~0ULL;
409 /* poke holes for the csmask */
410 *mask &= ~((GENMASK_ULL(15, 5) << 6) |
411 (GENMASK_ULL(30, 19) << 8));
413 *mask |= (csmask & GENMASK_ULL(15, 5)) << 6;
414 *mask |= (csmask & GENMASK_ULL(30, 19)) << 8;
416 return;
417 } else {
418 csbase = pvt->csels[dct].csbases[csrow];
419 csmask = pvt->csels[dct].csmasks[csrow >> 1];
420 addr_shift = 8;
422 if (pvt->fam == 0x15)
423 base_bits = mask_bits =
424 GENMASK_ULL(30,19) | GENMASK_ULL(13,5);
425 else
426 base_bits = mask_bits =
427 GENMASK_ULL(28,19) | GENMASK_ULL(13,5);
430 *base = (csbase & base_bits) << addr_shift;
432 *mask = ~0ULL;
433 /* poke holes for the csmask */
434 *mask &= ~(mask_bits << addr_shift);
435 /* OR them in */
436 *mask |= (csmask & mask_bits) << addr_shift;
439 #define for_each_chip_select(i, dct, pvt) \
440 for (i = 0; i < pvt->csels[dct].b_cnt; i++)
442 #define chip_select_base(i, dct, pvt) \
443 pvt->csels[dct].csbases[i]
445 #define for_each_chip_select_mask(i, dct, pvt) \
446 for (i = 0; i < pvt->csels[dct].m_cnt; i++)
448 #define for_each_umc(i) \
449 for (i = 0; i < fam_type->max_mcs; i++)
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).
455 static int input_addr_to_csrow(struct mem_ctl_info *mci, u64 input_addr)
457 struct amd64_pvt *pvt;
458 int csrow;
459 u64 base, mask;
461 pvt = mci->pvt_info;
463 for_each_chip_select(csrow, 0, pvt) {
464 if (!csrow_enabled(csrow, 0, pvt))
465 continue;
467 get_cs_base_and_mask(pvt, csrow, 0, &base, &mask);
469 mask = ~mask;
471 if ((input_addr & mask) == (base & mask)) {
472 edac_dbg(2, "InputAddr 0x%lx matches csrow %d (node %d)\n",
473 (unsigned long)input_addr, csrow,
474 pvt->mc_node_id);
476 return csrow;
479 edac_dbg(2, "no matching csrow for InputAddr 0x%lx (MC node %d)\n",
480 (unsigned long)input_addr, pvt->mc_node_id);
482 return -1;
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:
491 * - The revision of the node is not E or greater. In this case, the DRAM Hole
492 * Address Register does not exist.
494 * - The DramHoleValid bit is cleared in the DRAM Hole Address Register,
495 * indicating that its contents are not valid.
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.
501 int amd64_get_dram_hole_info(struct mem_ctl_info *mci, u64 *hole_base,
502 u64 *hole_offset, u64 *hole_size)
504 struct amd64_pvt *pvt = mci->pvt_info;
506 /* only revE and later have the DRAM Hole Address Register */
507 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_E) {
508 edac_dbg(1, " revision %d for node %d does not support DHAR\n",
509 pvt->ext_model, pvt->mc_node_id);
510 return 1;
513 /* valid for Fam10h and above */
514 if (pvt->fam >= 0x10 && !dhar_mem_hoist_valid(pvt)) {
515 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this system\n");
516 return 1;
519 if (!dhar_valid(pvt)) {
520 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this node %d\n",
521 pvt->mc_node_id);
522 return 1;
525 /* This node has Memory Hoisting */
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 * +------------------+--------------------+--------------------+-----
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.
543 *hole_base = dhar_base(pvt);
544 *hole_size = (1ULL << 32) - *hole_base;
546 *hole_offset = (pvt->fam > 0xf) ? f10_dhar_offset(pvt)
547 : k8_dhar_offset(pvt);
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);
553 return 0;
555 EXPORT_SYMBOL_GPL(amd64_get_dram_hole_info);
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.
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:
568 * When node n receives a SysAddr, it processes the SysAddr as follows:
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.
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.
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).
586 static u64 sys_addr_to_dram_addr(struct mem_ctl_info *mci, u64 sys_addr)
588 struct amd64_pvt *pvt = mci->pvt_info;
589 u64 dram_base, hole_base, hole_offset, hole_size, dram_addr;
590 int ret;
592 dram_base = get_dram_base(pvt, pvt->mc_node_id);
594 ret = amd64_get_dram_hole_info(mci, &hole_base, &hole_offset,
595 &hole_size);
596 if (!ret) {
597 if ((sys_addr >= (1ULL << 32)) &&
598 (sys_addr < ((1ULL << 32) + hole_size))) {
599 /* use DHAR to translate SysAddr to DramAddr */
600 dram_addr = sys_addr - hole_offset;
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);
606 return dram_addr;
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.
619 dram_addr = (sys_addr & GENMASK_ULL(39, 0)) - dram_base;
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);
623 return dram_addr;
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.
631 static int num_node_interleave_bits(unsigned intlv_en)
633 static const int intlv_shift_table[] = { 0, 1, 0, 2, 0, 0, 0, 3 };
634 int n;
636 BUG_ON(intlv_en > 7);
637 n = intlv_shift_table[intlv_en];
638 return n;
641 /* Translate the DramAddr given by @dram_addr to an InputAddr. */
642 static u64 dram_addr_to_input_addr(struct mem_ctl_info *mci, u64 dram_addr)
644 struct amd64_pvt *pvt;
645 int intlv_shift;
646 u64 input_addr;
648 pvt = mci->pvt_info;
651 * See the start of section 3.4.4 (p. 70, BKDG #26094, K8, revA-E)
652 * concerning translating a DramAddr to an InputAddr.
654 intlv_shift = num_node_interleave_bits(dram_intlv_en(pvt, 0));
655 input_addr = ((dram_addr >> intlv_shift) & GENMASK_ULL(35, 12)) +
656 (dram_addr & 0xfff);
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);
662 return input_addr;
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.
669 static u64 sys_addr_to_input_addr(struct mem_ctl_info *mci, u64 sys_addr)
671 u64 input_addr;
673 input_addr =
674 dram_addr_to_input_addr(mci, sys_addr_to_dram_addr(mci, sys_addr));
676 edac_dbg(2, "SysAddr 0x%lx translates to InputAddr 0x%lx\n",
677 (unsigned long)sys_addr, (unsigned long)input_addr);
679 return input_addr;
682 /* Map the Error address to a PAGE and PAGE OFFSET. */
683 static inline void error_address_to_page_and_offset(u64 error_address,
684 struct err_info *err)
686 err->page = (u32) (error_address >> PAGE_SHIFT);
687 err->offset = ((u32) error_address) & ~PAGE_MASK;
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.
698 static int sys_addr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr)
700 int csrow;
702 csrow = input_addr_to_csrow(mci, sys_addr_to_input_addr(mci, sys_addr));
704 if (csrow == -1)
705 amd64_mc_err(mci, "Failed to translate InputAddr to csrow for "
706 "address 0x%lx\n", (unsigned long)sys_addr);
707 return csrow;
710 static int get_channel_from_ecc_syndrome(struct mem_ctl_info *, u16);
713 * Determine if the DIMMs have ECC enabled. ECC is enabled ONLY if all the DIMMs
714 * are ECC capable.
716 static unsigned long determine_edac_cap(struct amd64_pvt *pvt)
718 unsigned long edac_cap = EDAC_FLAG_NONE;
719 u8 bit;
721 if (pvt->umc) {
722 u8 i, umc_en_mask = 0, dimm_ecc_en_mask = 0;
724 for_each_umc(i) {
725 if (!(pvt->umc[i].sdp_ctrl & UMC_SDP_INIT))
726 continue;
728 umc_en_mask |= BIT(i);
730 /* UMC Configuration bit 12 (DimmEccEn) */
731 if (pvt->umc[i].umc_cfg & BIT(12))
732 dimm_ecc_en_mask |= BIT(i);
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;
742 if (pvt->dclr0 & BIT(bit))
743 edac_cap = EDAC_FLAG_SECDED;
746 return edac_cap;
749 static void debug_display_dimm_sizes(struct amd64_pvt *, u8);
751 static void debug_dump_dramcfg_low(struct amd64_pvt *pvt, u32 dclr, int chan)
753 edac_dbg(1, "F2x%d90 (DRAM Cfg Low): 0x%08x\n", chan, dclr);
755 if (pvt->dram_type == MEM_LRDDR3) {
756 u32 dcsm = pvt->csels[chan].csmasks[0];
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.
762 edac_dbg(1, " LRDIMM %dx rank multiply\n", (dcsm & 0x3));
765 edac_dbg(1, "All DIMMs support ECC:%s\n",
766 (dclr & BIT(19)) ? "yes" : "no");
769 edac_dbg(1, " PAR/ERR parity: %s\n",
770 (dclr & BIT(8)) ? "enabled" : "disabled");
772 if (pvt->fam == 0x10)
773 edac_dbg(1, " DCT 128bit mode width: %s\n",
774 (dclr & BIT(11)) ? "128b" : "64b");
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");
783 #define CS_EVEN_PRIMARY BIT(0)
784 #define CS_ODD_PRIMARY BIT(1)
785 #define CS_EVEN_SECONDARY BIT(2)
786 #define CS_ODD_SECONDARY BIT(3)
788 #define CS_EVEN (CS_EVEN_PRIMARY | CS_EVEN_SECONDARY)
789 #define CS_ODD (CS_ODD_PRIMARY | CS_ODD_SECONDARY)
791 static int f17_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt)
793 int cs_mode = 0;
795 if (csrow_enabled(2 * dimm, ctrl, pvt))
796 cs_mode |= CS_EVEN_PRIMARY;
798 if (csrow_enabled(2 * dimm + 1, ctrl, pvt))
799 cs_mode |= CS_ODD_PRIMARY;
801 /* Asymmetric dual-rank DIMM support. */
802 if (csrow_sec_enabled(2 * dimm + 1, ctrl, pvt))
803 cs_mode |= CS_ODD_SECONDARY;
805 return cs_mode;
808 static void debug_display_dimm_sizes_df(struct amd64_pvt *pvt, u8 ctrl)
810 int dimm, size0, size1, cs0, cs1, cs_mode;
812 edac_printk(KERN_DEBUG, EDAC_MC, "UMC%d chip selects:\n", ctrl);
814 for (dimm = 0; dimm < 2; dimm++) {
815 cs0 = dimm * 2;
816 cs1 = dimm * 2 + 1;
818 cs_mode = f17_get_cs_mode(dimm, ctrl, pvt);
820 size0 = pvt->ops->dbam_to_cs(pvt, ctrl, cs_mode, cs0);
821 size1 = pvt->ops->dbam_to_cs(pvt, ctrl, cs_mode, cs1);
823 amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
824 cs0, size0,
825 cs1, size1);
829 static void __dump_misc_regs_df(struct amd64_pvt *pvt)
831 struct amd64_umc *umc;
832 u32 i, tmp, umc_base;
834 for_each_umc(i) {
835 umc_base = get_umc_base(i);
836 umc = &pvt->umc[i];
838 edac_dbg(1, "UMC%d DIMM cfg: 0x%x\n", i, umc->dimm_cfg);
839 edac_dbg(1, "UMC%d UMC cfg: 0x%x\n", i, umc->umc_cfg);
840 edac_dbg(1, "UMC%d SDP ctrl: 0x%x\n", i, umc->sdp_ctrl);
841 edac_dbg(1, "UMC%d ECC ctrl: 0x%x\n", i, umc->ecc_ctrl);
843 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_ECC_BAD_SYMBOL, &tmp);
844 edac_dbg(1, "UMC%d ECC bad symbol: 0x%x\n", i, tmp);
846 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_UMC_CAP, &tmp);
847 edac_dbg(1, "UMC%d UMC cap: 0x%x\n", i, tmp);
848 edac_dbg(1, "UMC%d UMC cap high: 0x%x\n", i, umc->umc_cap_hi);
850 edac_dbg(1, "UMC%d ECC capable: %s, ChipKill ECC capable: %s\n",
851 i, (umc->umc_cap_hi & BIT(30)) ? "yes" : "no",
852 (umc->umc_cap_hi & BIT(31)) ? "yes" : "no");
853 edac_dbg(1, "UMC%d All DIMMs support ECC: %s\n",
854 i, (umc->umc_cfg & BIT(12)) ? "yes" : "no");
855 edac_dbg(1, "UMC%d x4 DIMMs present: %s\n",
856 i, (umc->dimm_cfg & BIT(6)) ? "yes" : "no");
857 edac_dbg(1, "UMC%d x16 DIMMs present: %s\n",
858 i, (umc->dimm_cfg & BIT(7)) ? "yes" : "no");
860 if (pvt->dram_type == MEM_LRDDR4) {
861 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_ADDR_CFG, &tmp);
862 edac_dbg(1, "UMC%d LRDIMM %dx rank multiply\n",
863 i, 1 << ((tmp >> 4) & 0x3));
866 debug_display_dimm_sizes_df(pvt, i);
869 edac_dbg(1, "F0x104 (DRAM Hole Address): 0x%08x, base: 0x%08x\n",
870 pvt->dhar, dhar_base(pvt));
873 /* Display and decode various NB registers for debug purposes. */
874 static void __dump_misc_regs(struct amd64_pvt *pvt)
876 edac_dbg(1, "F3xE8 (NB Cap): 0x%08x\n", pvt->nbcap);
878 edac_dbg(1, " NB two channel DRAM capable: %s\n",
879 (pvt->nbcap & NBCAP_DCT_DUAL) ? "yes" : "no");
881 edac_dbg(1, " ECC capable: %s, ChipKill ECC capable: %s\n",
882 (pvt->nbcap & NBCAP_SECDED) ? "yes" : "no",
883 (pvt->nbcap & NBCAP_CHIPKILL) ? "yes" : "no");
885 debug_dump_dramcfg_low(pvt, pvt->dclr0, 0);
887 edac_dbg(1, "F3xB0 (Online Spare): 0x%08x\n", pvt->online_spare);
889 edac_dbg(1, "F1xF0 (DRAM Hole Address): 0x%08x, base: 0x%08x, offset: 0x%08x\n",
890 pvt->dhar, dhar_base(pvt),
891 (pvt->fam == 0xf) ? k8_dhar_offset(pvt)
892 : f10_dhar_offset(pvt));
894 debug_display_dimm_sizes(pvt, 0);
896 /* everything below this point is Fam10h and above */
897 if (pvt->fam == 0xf)
898 return;
900 debug_display_dimm_sizes(pvt, 1);
902 /* Only if NOT ganged does dclr1 have valid info */
903 if (!dct_ganging_enabled(pvt))
904 debug_dump_dramcfg_low(pvt, pvt->dclr1, 1);
907 /* Display and decode various NB registers for debug purposes. */
908 static void dump_misc_regs(struct amd64_pvt *pvt)
910 if (pvt->umc)
911 __dump_misc_regs_df(pvt);
912 else
913 __dump_misc_regs(pvt);
915 edac_dbg(1, " DramHoleValid: %s\n", dhar_valid(pvt) ? "yes" : "no");
917 amd64_info("using x%u syndromes.\n", pvt->ecc_sym_sz);
921 * See BKDG, F2x[1,0][5C:40], F2[1,0][6C:60]
923 static void prep_chip_selects(struct amd64_pvt *pvt)
925 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
926 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
927 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 8;
928 } else if (pvt->fam == 0x15 && pvt->model == 0x30) {
929 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 4;
930 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 2;
931 } else if (pvt->fam >= 0x17) {
932 int umc;
934 for_each_umc(umc) {
935 pvt->csels[umc].b_cnt = 4;
936 pvt->csels[umc].m_cnt = 2;
939 } else {
940 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
941 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 4;
945 static void read_umc_base_mask(struct amd64_pvt *pvt)
947 u32 umc_base_reg, umc_base_reg_sec;
948 u32 umc_mask_reg, umc_mask_reg_sec;
949 u32 base_reg, base_reg_sec;
950 u32 mask_reg, mask_reg_sec;
951 u32 *base, *base_sec;
952 u32 *mask, *mask_sec;
953 int cs, umc;
955 for_each_umc(umc) {
956 umc_base_reg = get_umc_base(umc) + UMCCH_BASE_ADDR;
957 umc_base_reg_sec = get_umc_base(umc) + UMCCH_BASE_ADDR_SEC;
959 for_each_chip_select(cs, umc, pvt) {
960 base = &pvt->csels[umc].csbases[cs];
961 base_sec = &pvt->csels[umc].csbases_sec[cs];
963 base_reg = umc_base_reg + (cs * 4);
964 base_reg_sec = umc_base_reg_sec + (cs * 4);
966 if (!amd_smn_read(pvt->mc_node_id, base_reg, base))
967 edac_dbg(0, " DCSB%d[%d]=0x%08x reg: 0x%x\n",
968 umc, cs, *base, base_reg);
970 if (!amd_smn_read(pvt->mc_node_id, base_reg_sec, base_sec))
971 edac_dbg(0, " DCSB_SEC%d[%d]=0x%08x reg: 0x%x\n",
972 umc, cs, *base_sec, base_reg_sec);
975 umc_mask_reg = get_umc_base(umc) + UMCCH_ADDR_MASK;
976 umc_mask_reg_sec = get_umc_base(umc) + UMCCH_ADDR_MASK_SEC;
978 for_each_chip_select_mask(cs, umc, pvt) {
979 mask = &pvt->csels[umc].csmasks[cs];
980 mask_sec = &pvt->csels[umc].csmasks_sec[cs];
982 mask_reg = umc_mask_reg + (cs * 4);
983 mask_reg_sec = umc_mask_reg_sec + (cs * 4);
985 if (!amd_smn_read(pvt->mc_node_id, mask_reg, mask))
986 edac_dbg(0, " DCSM%d[%d]=0x%08x reg: 0x%x\n",
987 umc, cs, *mask, mask_reg);
989 if (!amd_smn_read(pvt->mc_node_id, mask_reg_sec, mask_sec))
990 edac_dbg(0, " DCSM_SEC%d[%d]=0x%08x reg: 0x%x\n",
991 umc, cs, *mask_sec, mask_reg_sec);
997 * Function 2 Offset F10_DCSB0; read in the DCS Base and DCS Mask registers
999 static void read_dct_base_mask(struct amd64_pvt *pvt)
1001 int cs;
1003 prep_chip_selects(pvt);
1005 if (pvt->umc)
1006 return read_umc_base_mask(pvt);
1008 for_each_chip_select(cs, 0, pvt) {
1009 int reg0 = DCSB0 + (cs * 4);
1010 int reg1 = DCSB1 + (cs * 4);
1011 u32 *base0 = &pvt->csels[0].csbases[cs];
1012 u32 *base1 = &pvt->csels[1].csbases[cs];
1014 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0))
1015 edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n",
1016 cs, *base0, reg0);
1018 if (pvt->fam == 0xf)
1019 continue;
1021 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1))
1022 edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n",
1023 cs, *base1, (pvt->fam == 0x10) ? reg1
1024 : reg0);
1027 for_each_chip_select_mask(cs, 0, pvt) {
1028 int reg0 = DCSM0 + (cs * 4);
1029 int reg1 = DCSM1 + (cs * 4);
1030 u32 *mask0 = &pvt->csels[0].csmasks[cs];
1031 u32 *mask1 = &pvt->csels[1].csmasks[cs];
1033 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0))
1034 edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n",
1035 cs, *mask0, reg0);
1037 if (pvt->fam == 0xf)
1038 continue;
1040 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1))
1041 edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n",
1042 cs, *mask1, (pvt->fam == 0x10) ? reg1
1043 : reg0);
1047 static void determine_memory_type(struct amd64_pvt *pvt)
1049 u32 dram_ctrl, dcsm;
1051 if (pvt->umc) {
1052 if ((pvt->umc[0].dimm_cfg | pvt->umc[1].dimm_cfg) & BIT(5))
1053 pvt->dram_type = MEM_LRDDR4;
1054 else if ((pvt->umc[0].dimm_cfg | pvt->umc[1].dimm_cfg) & BIT(4))
1055 pvt->dram_type = MEM_RDDR4;
1056 else
1057 pvt->dram_type = MEM_DDR4;
1058 return;
1061 switch (pvt->fam) {
1062 case 0xf:
1063 if (pvt->ext_model >= K8_REV_F)
1064 goto ddr3;
1066 pvt->dram_type = (pvt->dclr0 & BIT(18)) ? MEM_DDR : MEM_RDDR;
1067 return;
1069 case 0x10:
1070 if (pvt->dchr0 & DDR3_MODE)
1071 goto ddr3;
1073 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR2 : MEM_RDDR2;
1074 return;
1076 case 0x15:
1077 if (pvt->model < 0x60)
1078 goto ddr3;
1081 * Model 0x60h needs special handling:
1083 * We use a Chip Select value of '0' to obtain dcsm.
1084 * Theoretically, it is possible to populate LRDIMMs of different
1085 * 'Rank' value on a DCT. But this is not the common case. So,
1086 * it's reasonable to assume all DIMMs are going to be of same
1087 * 'type' until proven otherwise.
1089 amd64_read_dct_pci_cfg(pvt, 0, DRAM_CONTROL, &dram_ctrl);
1090 dcsm = pvt->csels[0].csmasks[0];
1092 if (((dram_ctrl >> 8) & 0x7) == 0x2)
1093 pvt->dram_type = MEM_DDR4;
1094 else if (pvt->dclr0 & BIT(16))
1095 pvt->dram_type = MEM_DDR3;
1096 else if (dcsm & 0x3)
1097 pvt->dram_type = MEM_LRDDR3;
1098 else
1099 pvt->dram_type = MEM_RDDR3;
1101 return;
1103 case 0x16:
1104 goto ddr3;
1106 default:
1107 WARN(1, KERN_ERR "%s: Family??? 0x%x\n", __func__, pvt->fam);
1108 pvt->dram_type = MEM_EMPTY;
1110 return;
1112 ddr3:
1113 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR3 : MEM_RDDR3;
1116 /* Get the number of DCT channels the memory controller is using. */
1117 static int k8_early_channel_count(struct amd64_pvt *pvt)
1119 int flag;
1121 if (pvt->ext_model >= K8_REV_F)
1122 /* RevF (NPT) and later */
1123 flag = pvt->dclr0 & WIDTH_128;
1124 else
1125 /* RevE and earlier */
1126 flag = pvt->dclr0 & REVE_WIDTH_128;
1128 /* not used */
1129 pvt->dclr1 = 0;
1131 return (flag) ? 2 : 1;
1134 /* On F10h and later ErrAddr is MC4_ADDR[47:1] */
1135 static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m)
1137 u16 mce_nid = amd_get_nb_id(m->extcpu);
1138 struct mem_ctl_info *mci;
1139 u8 start_bit = 1;
1140 u8 end_bit = 47;
1141 u64 addr;
1143 mci = edac_mc_find(mce_nid);
1144 if (!mci)
1145 return 0;
1147 pvt = mci->pvt_info;
1149 if (pvt->fam == 0xf) {
1150 start_bit = 3;
1151 end_bit = 39;
1154 addr = m->addr & GENMASK_ULL(end_bit, start_bit);
1157 * Erratum 637 workaround
1159 if (pvt->fam == 0x15) {
1160 u64 cc6_base, tmp_addr;
1161 u32 tmp;
1162 u8 intlv_en;
1164 if ((addr & GENMASK_ULL(47, 24)) >> 24 != 0x00fdf7)
1165 return addr;
1168 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_LIM, &tmp);
1169 intlv_en = tmp >> 21 & 0x7;
1171 /* add [47:27] + 3 trailing bits */
1172 cc6_base = (tmp & GENMASK_ULL(20, 0)) << 3;
1174 /* reverse and add DramIntlvEn */
1175 cc6_base |= intlv_en ^ 0x7;
1177 /* pin at [47:24] */
1178 cc6_base <<= 24;
1180 if (!intlv_en)
1181 return cc6_base | (addr & GENMASK_ULL(23, 0));
1183 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_BASE, &tmp);
1185 /* faster log2 */
1186 tmp_addr = (addr & GENMASK_ULL(23, 12)) << __fls(intlv_en + 1);
1188 /* OR DramIntlvSel into bits [14:12] */
1189 tmp_addr |= (tmp & GENMASK_ULL(23, 21)) >> 9;
1191 /* add remaining [11:0] bits from original MC4_ADDR */
1192 tmp_addr |= addr & GENMASK_ULL(11, 0);
1194 return cc6_base | tmp_addr;
1197 return addr;
1200 static struct pci_dev *pci_get_related_function(unsigned int vendor,
1201 unsigned int device,
1202 struct pci_dev *related)
1204 struct pci_dev *dev = NULL;
1206 while ((dev = pci_get_device(vendor, device, dev))) {
1207 if (pci_domain_nr(dev->bus) == pci_domain_nr(related->bus) &&
1208 (dev->bus->number == related->bus->number) &&
1209 (PCI_SLOT(dev->devfn) == PCI_SLOT(related->devfn)))
1210 break;
1213 return dev;
1216 static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range)
1218 struct amd_northbridge *nb;
1219 struct pci_dev *f1 = NULL;
1220 unsigned int pci_func;
1221 int off = range << 3;
1222 u32 llim;
1224 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_LO + off, &pvt->ranges[range].base.lo);
1225 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_LO + off, &pvt->ranges[range].lim.lo);
1227 if (pvt->fam == 0xf)
1228 return;
1230 if (!dram_rw(pvt, range))
1231 return;
1233 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_HI + off, &pvt->ranges[range].base.hi);
1234 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi);
1236 /* F15h: factor in CC6 save area by reading dst node's limit reg */
1237 if (pvt->fam != 0x15)
1238 return;
1240 nb = node_to_amd_nb(dram_dst_node(pvt, range));
1241 if (WARN_ON(!nb))
1242 return;
1244 if (pvt->model == 0x60)
1245 pci_func = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1;
1246 else if (pvt->model == 0x30)
1247 pci_func = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1;
1248 else
1249 pci_func = PCI_DEVICE_ID_AMD_15H_NB_F1;
1251 f1 = pci_get_related_function(nb->misc->vendor, pci_func, nb->misc);
1252 if (WARN_ON(!f1))
1253 return;
1255 amd64_read_pci_cfg(f1, DRAM_LOCAL_NODE_LIM, &llim);
1257 pvt->ranges[range].lim.lo &= GENMASK_ULL(15, 0);
1259 /* {[39:27],111b} */
1260 pvt->ranges[range].lim.lo |= ((llim & 0x1fff) << 3 | 0x7) << 16;
1262 pvt->ranges[range].lim.hi &= GENMASK_ULL(7, 0);
1264 /* [47:40] */
1265 pvt->ranges[range].lim.hi |= llim >> 13;
1267 pci_dev_put(f1);
1270 static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1271 struct err_info *err)
1273 struct amd64_pvt *pvt = mci->pvt_info;
1275 error_address_to_page_and_offset(sys_addr, err);
1278 * Find out which node the error address belongs to. This may be
1279 * different from the node that detected the error.
1281 err->src_mci = find_mc_by_sys_addr(mci, sys_addr);
1282 if (!err->src_mci) {
1283 amd64_mc_err(mci, "failed to map error addr 0x%lx to a node\n",
1284 (unsigned long)sys_addr);
1285 err->err_code = ERR_NODE;
1286 return;
1289 /* Now map the sys_addr to a CSROW */
1290 err->csrow = sys_addr_to_csrow(err->src_mci, sys_addr);
1291 if (err->csrow < 0) {
1292 err->err_code = ERR_CSROW;
1293 return;
1296 /* CHIPKILL enabled */
1297 if (pvt->nbcfg & NBCFG_CHIPKILL) {
1298 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
1299 if (err->channel < 0) {
1301 * Syndrome didn't map, so we don't know which of the
1302 * 2 DIMMs is in error. So we need to ID 'both' of them
1303 * as suspect.
1305 amd64_mc_warn(err->src_mci, "unknown syndrome 0x%04x - "
1306 "possible error reporting race\n",
1307 err->syndrome);
1308 err->err_code = ERR_CHANNEL;
1309 return;
1311 } else {
1313 * non-chipkill ecc mode
1315 * The k8 documentation is unclear about how to determine the
1316 * channel number when using non-chipkill memory. This method
1317 * was obtained from email communication with someone at AMD.
1318 * (Wish the email was placed in this comment - norsk)
1320 err->channel = ((sys_addr & BIT(3)) != 0);
1324 static int ddr2_cs_size(unsigned i, bool dct_width)
1326 unsigned shift = 0;
1328 if (i <= 2)
1329 shift = i;
1330 else if (!(i & 0x1))
1331 shift = i >> 1;
1332 else
1333 shift = (i + 1) >> 1;
1335 return 128 << (shift + !!dct_width);
1338 static int k8_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1339 unsigned cs_mode, int cs_mask_nr)
1341 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1343 if (pvt->ext_model >= K8_REV_F) {
1344 WARN_ON(cs_mode > 11);
1345 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1347 else if (pvt->ext_model >= K8_REV_D) {
1348 unsigned diff;
1349 WARN_ON(cs_mode > 10);
1352 * the below calculation, besides trying to win an obfuscated C
1353 * contest, maps cs_mode values to DIMM chip select sizes. The
1354 * mappings are:
1356 * cs_mode CS size (mb)
1357 * ======= ============
1358 * 0 32
1359 * 1 64
1360 * 2 128
1361 * 3 128
1362 * 4 256
1363 * 5 512
1364 * 6 256
1365 * 7 512
1366 * 8 1024
1367 * 9 1024
1368 * 10 2048
1370 * Basically, it calculates a value with which to shift the
1371 * smallest CS size of 32MB.
1373 * ddr[23]_cs_size have a similar purpose.
1375 diff = cs_mode/3 + (unsigned)(cs_mode > 5);
1377 return 32 << (cs_mode - diff);
1379 else {
1380 WARN_ON(cs_mode > 6);
1381 return 32 << cs_mode;
1386 * Get the number of DCT channels in use.
1388 * Return:
1389 * number of Memory Channels in operation
1390 * Pass back:
1391 * contents of the DCL0_LOW register
1393 static int f1x_early_channel_count(struct amd64_pvt *pvt)
1395 int i, j, channels = 0;
1397 /* On F10h, if we are in 128 bit mode, then we are using 2 channels */
1398 if (pvt->fam == 0x10 && (pvt->dclr0 & WIDTH_128))
1399 return 2;
1402 * Need to check if in unganged mode: In such, there are 2 channels,
1403 * but they are not in 128 bit mode and thus the above 'dclr0' status
1404 * bit will be OFF.
1406 * Need to check DCT0[0] and DCT1[0] to see if only one of them has
1407 * their CSEnable bit on. If so, then SINGLE DIMM case.
1409 edac_dbg(0, "Data width is not 128 bits - need more decoding\n");
1412 * Check DRAM Bank Address Mapping values for each DIMM to see if there
1413 * is more than just one DIMM present in unganged mode. Need to check
1414 * both controllers since DIMMs can be placed in either one.
1416 for (i = 0; i < 2; i++) {
1417 u32 dbam = (i ? pvt->dbam1 : pvt->dbam0);
1419 for (j = 0; j < 4; j++) {
1420 if (DBAM_DIMM(j, dbam) > 0) {
1421 channels++;
1422 break;
1427 if (channels > 2)
1428 channels = 2;
1430 amd64_info("MCT channel count: %d\n", channels);
1432 return channels;
1435 static int f17_early_channel_count(struct amd64_pvt *pvt)
1437 int i, channels = 0;
1439 /* SDP Control bit 31 (SdpInit) is clear for unused UMC channels */
1440 for_each_umc(i)
1441 channels += !!(pvt->umc[i].sdp_ctrl & UMC_SDP_INIT);
1443 amd64_info("MCT channel count: %d\n", channels);
1445 return channels;
1448 static int ddr3_cs_size(unsigned i, bool dct_width)
1450 unsigned shift = 0;
1451 int cs_size = 0;
1453 if (i == 0 || i == 3 || i == 4)
1454 cs_size = -1;
1455 else if (i <= 2)
1456 shift = i;
1457 else if (i == 12)
1458 shift = 7;
1459 else if (!(i & 0x1))
1460 shift = i >> 1;
1461 else
1462 shift = (i + 1) >> 1;
1464 if (cs_size != -1)
1465 cs_size = (128 * (1 << !!dct_width)) << shift;
1467 return cs_size;
1470 static int ddr3_lrdimm_cs_size(unsigned i, unsigned rank_multiply)
1472 unsigned shift = 0;
1473 int cs_size = 0;
1475 if (i < 4 || i == 6)
1476 cs_size = -1;
1477 else if (i == 12)
1478 shift = 7;
1479 else if (!(i & 0x1))
1480 shift = i >> 1;
1481 else
1482 shift = (i + 1) >> 1;
1484 if (cs_size != -1)
1485 cs_size = rank_multiply * (128 << shift);
1487 return cs_size;
1490 static int ddr4_cs_size(unsigned i)
1492 int cs_size = 0;
1494 if (i == 0)
1495 cs_size = -1;
1496 else if (i == 1)
1497 cs_size = 1024;
1498 else
1499 /* Min cs_size = 1G */
1500 cs_size = 1024 * (1 << (i >> 1));
1502 return cs_size;
1505 static int f10_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1506 unsigned cs_mode, int cs_mask_nr)
1508 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1510 WARN_ON(cs_mode > 11);
1512 if (pvt->dchr0 & DDR3_MODE || pvt->dchr1 & DDR3_MODE)
1513 return ddr3_cs_size(cs_mode, dclr & WIDTH_128);
1514 else
1515 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1519 * F15h supports only 64bit DCT interfaces
1521 static int f15_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1522 unsigned cs_mode, int cs_mask_nr)
1524 WARN_ON(cs_mode > 12);
1526 return ddr3_cs_size(cs_mode, false);
1529 /* F15h M60h supports DDR4 mapping as well.. */
1530 static int f15_m60h_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1531 unsigned cs_mode, int cs_mask_nr)
1533 int cs_size;
1534 u32 dcsm = pvt->csels[dct].csmasks[cs_mask_nr];
1536 WARN_ON(cs_mode > 12);
1538 if (pvt->dram_type == MEM_DDR4) {
1539 if (cs_mode > 9)
1540 return -1;
1542 cs_size = ddr4_cs_size(cs_mode);
1543 } else if (pvt->dram_type == MEM_LRDDR3) {
1544 unsigned rank_multiply = dcsm & 0xf;
1546 if (rank_multiply == 3)
1547 rank_multiply = 4;
1548 cs_size = ddr3_lrdimm_cs_size(cs_mode, rank_multiply);
1549 } else {
1550 /* Minimum cs size is 512mb for F15hM60h*/
1551 if (cs_mode == 0x1)
1552 return -1;
1554 cs_size = ddr3_cs_size(cs_mode, false);
1557 return cs_size;
1561 * F16h and F15h model 30h have only limited cs_modes.
1563 static int f16_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1564 unsigned cs_mode, int cs_mask_nr)
1566 WARN_ON(cs_mode > 12);
1568 if (cs_mode == 6 || cs_mode == 8 ||
1569 cs_mode == 9 || cs_mode == 12)
1570 return -1;
1571 else
1572 return ddr3_cs_size(cs_mode, false);
1575 static int f17_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc,
1576 unsigned int cs_mode, int csrow_nr)
1578 u32 addr_mask_orig, addr_mask_deinterleaved;
1579 u32 msb, weight, num_zero_bits;
1580 int dimm, size = 0;
1582 /* No Chip Selects are enabled. */
1583 if (!cs_mode)
1584 return size;
1586 /* Requested size of an even CS but none are enabled. */
1587 if (!(cs_mode & CS_EVEN) && !(csrow_nr & 1))
1588 return size;
1590 /* Requested size of an odd CS but none are enabled. */
1591 if (!(cs_mode & CS_ODD) && (csrow_nr & 1))
1592 return size;
1595 * There is one mask per DIMM, and two Chip Selects per DIMM.
1596 * CS0 and CS1 -> DIMM0
1597 * CS2 and CS3 -> DIMM1
1599 dimm = csrow_nr >> 1;
1601 /* Asymmetric dual-rank DIMM support. */
1602 if ((csrow_nr & 1) && (cs_mode & CS_ODD_SECONDARY))
1603 addr_mask_orig = pvt->csels[umc].csmasks_sec[dimm];
1604 else
1605 addr_mask_orig = pvt->csels[umc].csmasks[dimm];
1608 * The number of zero bits in the mask is equal to the number of bits
1609 * in a full mask minus the number of bits in the current mask.
1611 * The MSB is the number of bits in the full mask because BIT[0] is
1612 * always 0.
1614 msb = fls(addr_mask_orig) - 1;
1615 weight = hweight_long(addr_mask_orig);
1616 num_zero_bits = msb - weight;
1618 /* Take the number of zero bits off from the top of the mask. */
1619 addr_mask_deinterleaved = GENMASK_ULL(msb - num_zero_bits, 1);
1621 edac_dbg(1, "CS%d DIMM%d AddrMasks:\n", csrow_nr, dimm);
1622 edac_dbg(1, " Original AddrMask: 0x%x\n", addr_mask_orig);
1623 edac_dbg(1, " Deinterleaved AddrMask: 0x%x\n", addr_mask_deinterleaved);
1625 /* Register [31:1] = Address [39:9]. Size is in kBs here. */
1626 size = (addr_mask_deinterleaved >> 2) + 1;
1628 /* Return size in MBs. */
1629 return size >> 10;
1632 static void read_dram_ctl_register(struct amd64_pvt *pvt)
1635 if (pvt->fam == 0xf)
1636 return;
1638 if (!amd64_read_pci_cfg(pvt->F2, DCT_SEL_LO, &pvt->dct_sel_lo)) {
1639 edac_dbg(0, "F2x110 (DCTSelLow): 0x%08x, High range addrs at: 0x%x\n",
1640 pvt->dct_sel_lo, dct_sel_baseaddr(pvt));
1642 edac_dbg(0, " DCTs operate in %s mode\n",
1643 (dct_ganging_enabled(pvt) ? "ganged" : "unganged"));
1645 if (!dct_ganging_enabled(pvt))
1646 edac_dbg(0, " Address range split per DCT: %s\n",
1647 (dct_high_range_enabled(pvt) ? "yes" : "no"));
1649 edac_dbg(0, " data interleave for ECC: %s, DRAM cleared since last warm reset: %s\n",
1650 (dct_data_intlv_enabled(pvt) ? "enabled" : "disabled"),
1651 (dct_memory_cleared(pvt) ? "yes" : "no"));
1653 edac_dbg(0, " channel interleave: %s, "
1654 "interleave bits selector: 0x%x\n",
1655 (dct_interleave_enabled(pvt) ? "enabled" : "disabled"),
1656 dct_sel_interleave_addr(pvt));
1659 amd64_read_pci_cfg(pvt->F2, DCT_SEL_HI, &pvt->dct_sel_hi);
1663 * Determine channel (DCT) based on the interleaving mode (see F15h M30h BKDG,
1664 * 2.10.12 Memory Interleaving Modes).
1666 static u8 f15_m30h_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
1667 u8 intlv_en, int num_dcts_intlv,
1668 u32 dct_sel)
1670 u8 channel = 0;
1671 u8 select;
1673 if (!(intlv_en))
1674 return (u8)(dct_sel);
1676 if (num_dcts_intlv == 2) {
1677 select = (sys_addr >> 8) & 0x3;
1678 channel = select ? 0x3 : 0;
1679 } else if (num_dcts_intlv == 4) {
1680 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1681 switch (intlv_addr) {
1682 case 0x4:
1683 channel = (sys_addr >> 8) & 0x3;
1684 break;
1685 case 0x5:
1686 channel = (sys_addr >> 9) & 0x3;
1687 break;
1690 return channel;
1694 * Determine channel (DCT) based on the interleaving mode: F10h BKDG, 2.8.9 Memory
1695 * Interleaving Modes.
1697 static u8 f1x_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
1698 bool hi_range_sel, u8 intlv_en)
1700 u8 dct_sel_high = (pvt->dct_sel_lo >> 1) & 1;
1702 if (dct_ganging_enabled(pvt))
1703 return 0;
1705 if (hi_range_sel)
1706 return dct_sel_high;
1709 * see F2x110[DctSelIntLvAddr] - channel interleave mode
1711 if (dct_interleave_enabled(pvt)) {
1712 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1714 /* return DCT select function: 0=DCT0, 1=DCT1 */
1715 if (!intlv_addr)
1716 return sys_addr >> 6 & 1;
1718 if (intlv_addr & 0x2) {
1719 u8 shift = intlv_addr & 0x1 ? 9 : 6;
1720 u32 temp = hweight_long((u32) ((sys_addr >> 16) & 0x1F)) & 1;
1722 return ((sys_addr >> shift) & 1) ^ temp;
1725 if (intlv_addr & 0x4) {
1726 u8 shift = intlv_addr & 0x1 ? 9 : 8;
1728 return (sys_addr >> shift) & 1;
1731 return (sys_addr >> (12 + hweight8(intlv_en))) & 1;
1734 if (dct_high_range_enabled(pvt))
1735 return ~dct_sel_high & 1;
1737 return 0;
1740 /* Convert the sys_addr to the normalized DCT address */
1741 static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, u8 range,
1742 u64 sys_addr, bool hi_rng,
1743 u32 dct_sel_base_addr)
1745 u64 chan_off;
1746 u64 dram_base = get_dram_base(pvt, range);
1747 u64 hole_off = f10_dhar_offset(pvt);
1748 u64 dct_sel_base_off = (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16;
1750 if (hi_rng) {
1752 * if
1753 * base address of high range is below 4Gb
1754 * (bits [47:27] at [31:11])
1755 * DRAM address space on this DCT is hoisted above 4Gb &&
1756 * sys_addr > 4Gb
1758 * remove hole offset from sys_addr
1759 * else
1760 * remove high range offset from sys_addr
1762 if ((!(dct_sel_base_addr >> 16) ||
1763 dct_sel_base_addr < dhar_base(pvt)) &&
1764 dhar_valid(pvt) &&
1765 (sys_addr >= BIT_64(32)))
1766 chan_off = hole_off;
1767 else
1768 chan_off = dct_sel_base_off;
1769 } else {
1771 * if
1772 * we have a valid hole &&
1773 * sys_addr > 4Gb
1775 * remove hole
1776 * else
1777 * remove dram base to normalize to DCT address
1779 if (dhar_valid(pvt) && (sys_addr >= BIT_64(32)))
1780 chan_off = hole_off;
1781 else
1782 chan_off = dram_base;
1785 return (sys_addr & GENMASK_ULL(47,6)) - (chan_off & GENMASK_ULL(47,23));
1789 * checks if the csrow passed in is marked as SPARED, if so returns the new
1790 * spare row
1792 static int f10_process_possible_spare(struct amd64_pvt *pvt, u8 dct, int csrow)
1794 int tmp_cs;
1796 if (online_spare_swap_done(pvt, dct) &&
1797 csrow == online_spare_bad_dramcs(pvt, dct)) {
1799 for_each_chip_select(tmp_cs, dct, pvt) {
1800 if (chip_select_base(tmp_cs, dct, pvt) & 0x2) {
1801 csrow = tmp_cs;
1802 break;
1806 return csrow;
1810 * Iterate over the DRAM DCT "base" and "mask" registers looking for a
1811 * SystemAddr match on the specified 'ChannelSelect' and 'NodeID'
1813 * Return:
1814 * -EINVAL: NOT FOUND
1815 * 0..csrow = Chip-Select Row
1817 static int f1x_lookup_addr_in_dct(u64 in_addr, u8 nid, u8 dct)
1819 struct mem_ctl_info *mci;
1820 struct amd64_pvt *pvt;
1821 u64 cs_base, cs_mask;
1822 int cs_found = -EINVAL;
1823 int csrow;
1825 mci = edac_mc_find(nid);
1826 if (!mci)
1827 return cs_found;
1829 pvt = mci->pvt_info;
1831 edac_dbg(1, "input addr: 0x%llx, DCT: %d\n", in_addr, dct);
1833 for_each_chip_select(csrow, dct, pvt) {
1834 if (!csrow_enabled(csrow, dct, pvt))
1835 continue;
1837 get_cs_base_and_mask(pvt, csrow, dct, &cs_base, &cs_mask);
1839 edac_dbg(1, " CSROW=%d CSBase=0x%llx CSMask=0x%llx\n",
1840 csrow, cs_base, cs_mask);
1842 cs_mask = ~cs_mask;
1844 edac_dbg(1, " (InputAddr & ~CSMask)=0x%llx (CSBase & ~CSMask)=0x%llx\n",
1845 (in_addr & cs_mask), (cs_base & cs_mask));
1847 if ((in_addr & cs_mask) == (cs_base & cs_mask)) {
1848 if (pvt->fam == 0x15 && pvt->model >= 0x30) {
1849 cs_found = csrow;
1850 break;
1852 cs_found = f10_process_possible_spare(pvt, dct, csrow);
1854 edac_dbg(1, " MATCH csrow=%d\n", cs_found);
1855 break;
1858 return cs_found;
1862 * See F2x10C. Non-interleaved graphics framebuffer memory under the 16G is
1863 * swapped with a region located at the bottom of memory so that the GPU can use
1864 * the interleaved region and thus two channels.
1866 static u64 f1x_swap_interleaved_region(struct amd64_pvt *pvt, u64 sys_addr)
1868 u32 swap_reg, swap_base, swap_limit, rgn_size, tmp_addr;
1870 if (pvt->fam == 0x10) {
1871 /* only revC3 and revE have that feature */
1872 if (pvt->model < 4 || (pvt->model < 0xa && pvt->stepping < 3))
1873 return sys_addr;
1876 amd64_read_pci_cfg(pvt->F2, SWAP_INTLV_REG, &swap_reg);
1878 if (!(swap_reg & 0x1))
1879 return sys_addr;
1881 swap_base = (swap_reg >> 3) & 0x7f;
1882 swap_limit = (swap_reg >> 11) & 0x7f;
1883 rgn_size = (swap_reg >> 20) & 0x7f;
1884 tmp_addr = sys_addr >> 27;
1886 if (!(sys_addr >> 34) &&
1887 (((tmp_addr >= swap_base) &&
1888 (tmp_addr <= swap_limit)) ||
1889 (tmp_addr < rgn_size)))
1890 return sys_addr ^ (u64)swap_base << 27;
1892 return sys_addr;
1895 /* For a given @dram_range, check if @sys_addr falls within it. */
1896 static int f1x_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
1897 u64 sys_addr, int *chan_sel)
1899 int cs_found = -EINVAL;
1900 u64 chan_addr;
1901 u32 dct_sel_base;
1902 u8 channel;
1903 bool high_range = false;
1905 u8 node_id = dram_dst_node(pvt, range);
1906 u8 intlv_en = dram_intlv_en(pvt, range);
1907 u32 intlv_sel = dram_intlv_sel(pvt, range);
1909 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
1910 range, sys_addr, get_dram_limit(pvt, range));
1912 if (dhar_valid(pvt) &&
1913 dhar_base(pvt) <= sys_addr &&
1914 sys_addr < BIT_64(32)) {
1915 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
1916 sys_addr);
1917 return -EINVAL;
1920 if (intlv_en && (intlv_sel != ((sys_addr >> 12) & intlv_en)))
1921 return -EINVAL;
1923 sys_addr = f1x_swap_interleaved_region(pvt, sys_addr);
1925 dct_sel_base = dct_sel_baseaddr(pvt);
1928 * check whether addresses >= DctSelBaseAddr[47:27] are to be used to
1929 * select between DCT0 and DCT1.
1931 if (dct_high_range_enabled(pvt) &&
1932 !dct_ganging_enabled(pvt) &&
1933 ((sys_addr >> 27) >= (dct_sel_base >> 11)))
1934 high_range = true;
1936 channel = f1x_determine_channel(pvt, sys_addr, high_range, intlv_en);
1938 chan_addr = f1x_get_norm_dct_addr(pvt, range, sys_addr,
1939 high_range, dct_sel_base);
1941 /* Remove node interleaving, see F1x120 */
1942 if (intlv_en)
1943 chan_addr = ((chan_addr >> (12 + hweight8(intlv_en))) << 12) |
1944 (chan_addr & 0xfff);
1946 /* remove channel interleave */
1947 if (dct_interleave_enabled(pvt) &&
1948 !dct_high_range_enabled(pvt) &&
1949 !dct_ganging_enabled(pvt)) {
1951 if (dct_sel_interleave_addr(pvt) != 1) {
1952 if (dct_sel_interleave_addr(pvt) == 0x3)
1953 /* hash 9 */
1954 chan_addr = ((chan_addr >> 10) << 9) |
1955 (chan_addr & 0x1ff);
1956 else
1957 /* A[6] or hash 6 */
1958 chan_addr = ((chan_addr >> 7) << 6) |
1959 (chan_addr & 0x3f);
1960 } else
1961 /* A[12] */
1962 chan_addr = ((chan_addr >> 13) << 12) |
1963 (chan_addr & 0xfff);
1966 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
1968 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, channel);
1970 if (cs_found >= 0)
1971 *chan_sel = channel;
1973 return cs_found;
1976 static int f15_m30h_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
1977 u64 sys_addr, int *chan_sel)
1979 int cs_found = -EINVAL;
1980 int num_dcts_intlv = 0;
1981 u64 chan_addr, chan_offset;
1982 u64 dct_base, dct_limit;
1983 u32 dct_cont_base_reg, dct_cont_limit_reg, tmp;
1984 u8 channel, alias_channel, leg_mmio_hole, dct_sel, dct_offset_en;
1986 u64 dhar_offset = f10_dhar_offset(pvt);
1987 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1988 u8 node_id = dram_dst_node(pvt, range);
1989 u8 intlv_en = dram_intlv_en(pvt, range);
1991 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_BASE, &dct_cont_base_reg);
1992 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_LIMIT, &dct_cont_limit_reg);
1994 dct_offset_en = (u8) ((dct_cont_base_reg >> 3) & BIT(0));
1995 dct_sel = (u8) ((dct_cont_base_reg >> 4) & 0x7);
1997 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
1998 range, sys_addr, get_dram_limit(pvt, range));
2000 if (!(get_dram_base(pvt, range) <= sys_addr) &&
2001 !(get_dram_limit(pvt, range) >= sys_addr))
2002 return -EINVAL;
2004 if (dhar_valid(pvt) &&
2005 dhar_base(pvt) <= sys_addr &&
2006 sys_addr < BIT_64(32)) {
2007 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2008 sys_addr);
2009 return -EINVAL;
2012 /* Verify sys_addr is within DCT Range. */
2013 dct_base = (u64) dct_sel_baseaddr(pvt);
2014 dct_limit = (dct_cont_limit_reg >> 11) & 0x1FFF;
2016 if (!(dct_cont_base_reg & BIT(0)) &&
2017 !(dct_base <= (sys_addr >> 27) &&
2018 dct_limit >= (sys_addr >> 27)))
2019 return -EINVAL;
2021 /* Verify number of dct's that participate in channel interleaving. */
2022 num_dcts_intlv = (int) hweight8(intlv_en);
2024 if (!(num_dcts_intlv % 2 == 0) || (num_dcts_intlv > 4))
2025 return -EINVAL;
2027 if (pvt->model >= 0x60)
2028 channel = f1x_determine_channel(pvt, sys_addr, false, intlv_en);
2029 else
2030 channel = f15_m30h_determine_channel(pvt, sys_addr, intlv_en,
2031 num_dcts_intlv, dct_sel);
2033 /* Verify we stay within the MAX number of channels allowed */
2034 if (channel > 3)
2035 return -EINVAL;
2037 leg_mmio_hole = (u8) (dct_cont_base_reg >> 1 & BIT(0));
2039 /* Get normalized DCT addr */
2040 if (leg_mmio_hole && (sys_addr >= BIT_64(32)))
2041 chan_offset = dhar_offset;
2042 else
2043 chan_offset = dct_base << 27;
2045 chan_addr = sys_addr - chan_offset;
2047 /* remove channel interleave */
2048 if (num_dcts_intlv == 2) {
2049 if (intlv_addr == 0x4)
2050 chan_addr = ((chan_addr >> 9) << 8) |
2051 (chan_addr & 0xff);
2052 else if (intlv_addr == 0x5)
2053 chan_addr = ((chan_addr >> 10) << 9) |
2054 (chan_addr & 0x1ff);
2055 else
2056 return -EINVAL;
2058 } else if (num_dcts_intlv == 4) {
2059 if (intlv_addr == 0x4)
2060 chan_addr = ((chan_addr >> 10) << 8) |
2061 (chan_addr & 0xff);
2062 else if (intlv_addr == 0x5)
2063 chan_addr = ((chan_addr >> 11) << 9) |
2064 (chan_addr & 0x1ff);
2065 else
2066 return -EINVAL;
2069 if (dct_offset_en) {
2070 amd64_read_pci_cfg(pvt->F1,
2071 DRAM_CONT_HIGH_OFF + (int) channel * 4,
2072 &tmp);
2073 chan_addr += (u64) ((tmp >> 11) & 0xfff) << 27;
2076 f15h_select_dct(pvt, channel);
2078 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
2081 * Find Chip select:
2082 * if channel = 3, then alias it to 1. This is because, in F15 M30h,
2083 * there is support for 4 DCT's, but only 2 are currently functional.
2084 * They are DCT0 and DCT3. But we have read all registers of DCT3 into
2085 * pvt->csels[1]. So we need to use '1' here to get correct info.
2086 * Refer F15 M30h BKDG Section 2.10 and 2.10.3 for clarifications.
2088 alias_channel = (channel == 3) ? 1 : channel;
2090 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, alias_channel);
2092 if (cs_found >= 0)
2093 *chan_sel = alias_channel;
2095 return cs_found;
2098 static int f1x_translate_sysaddr_to_cs(struct amd64_pvt *pvt,
2099 u64 sys_addr,
2100 int *chan_sel)
2102 int cs_found = -EINVAL;
2103 unsigned range;
2105 for (range = 0; range < DRAM_RANGES; range++) {
2106 if (!dram_rw(pvt, range))
2107 continue;
2109 if (pvt->fam == 0x15 && pvt->model >= 0x30)
2110 cs_found = f15_m30h_match_to_this_node(pvt, range,
2111 sys_addr,
2112 chan_sel);
2114 else if ((get_dram_base(pvt, range) <= sys_addr) &&
2115 (get_dram_limit(pvt, range) >= sys_addr)) {
2116 cs_found = f1x_match_to_this_node(pvt, range,
2117 sys_addr, chan_sel);
2118 if (cs_found >= 0)
2119 break;
2122 return cs_found;
2126 * For reference see "2.8.5 Routing DRAM Requests" in F10 BKDG. This code maps
2127 * a @sys_addr to NodeID, DCT (channel) and chip select (CSROW).
2129 * The @sys_addr is usually an error address received from the hardware
2130 * (MCX_ADDR).
2132 static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
2133 struct err_info *err)
2135 struct amd64_pvt *pvt = mci->pvt_info;
2137 error_address_to_page_and_offset(sys_addr, err);
2139 err->csrow = f1x_translate_sysaddr_to_cs(pvt, sys_addr, &err->channel);
2140 if (err->csrow < 0) {
2141 err->err_code = ERR_CSROW;
2142 return;
2146 * We need the syndromes for channel detection only when we're
2147 * ganged. Otherwise @chan should already contain the channel at
2148 * this point.
2150 if (dct_ganging_enabled(pvt))
2151 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
2155 * debug routine to display the memory sizes of all logical DIMMs and its
2156 * CSROWs
2158 static void debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
2160 int dimm, size0, size1;
2161 u32 *dcsb = ctrl ? pvt->csels[1].csbases : pvt->csels[0].csbases;
2162 u32 dbam = ctrl ? pvt->dbam1 : pvt->dbam0;
2164 if (pvt->fam == 0xf) {
2165 /* K8 families < revF not supported yet */
2166 if (pvt->ext_model < K8_REV_F)
2167 return;
2168 else
2169 WARN_ON(ctrl != 0);
2172 if (pvt->fam == 0x10) {
2173 dbam = (ctrl && !dct_ganging_enabled(pvt)) ? pvt->dbam1
2174 : pvt->dbam0;
2175 dcsb = (ctrl && !dct_ganging_enabled(pvt)) ?
2176 pvt->csels[1].csbases :
2177 pvt->csels[0].csbases;
2178 } else if (ctrl) {
2179 dbam = pvt->dbam0;
2180 dcsb = pvt->csels[1].csbases;
2182 edac_dbg(1, "F2x%d80 (DRAM Bank Address Mapping): 0x%08x\n",
2183 ctrl, dbam);
2185 edac_printk(KERN_DEBUG, EDAC_MC, "DCT%d chip selects:\n", ctrl);
2187 /* Dump memory sizes for DIMM and its CSROWs */
2188 for (dimm = 0; dimm < 4; dimm++) {
2190 size0 = 0;
2191 if (dcsb[dimm*2] & DCSB_CS_ENABLE)
2193 * For F15m60h, we need multiplier for LRDIMM cs_size
2194 * calculation. We pass dimm value to the dbam_to_cs
2195 * mapper so we can find the multiplier from the
2196 * corresponding DCSM.
2198 size0 = pvt->ops->dbam_to_cs(pvt, ctrl,
2199 DBAM_DIMM(dimm, dbam),
2200 dimm);
2202 size1 = 0;
2203 if (dcsb[dimm*2 + 1] & DCSB_CS_ENABLE)
2204 size1 = pvt->ops->dbam_to_cs(pvt, ctrl,
2205 DBAM_DIMM(dimm, dbam),
2206 dimm);
2208 amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
2209 dimm * 2, size0,
2210 dimm * 2 + 1, size1);
2214 static struct amd64_family_type family_types[] = {
2215 [K8_CPUS] = {
2216 .ctl_name = "K8",
2217 .f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP,
2218 .f2_id = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL,
2219 .max_mcs = 2,
2220 .ops = {
2221 .early_channel_count = k8_early_channel_count,
2222 .map_sysaddr_to_csrow = k8_map_sysaddr_to_csrow,
2223 .dbam_to_cs = k8_dbam_to_chip_select,
2226 [F10_CPUS] = {
2227 .ctl_name = "F10h",
2228 .f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP,
2229 .f2_id = PCI_DEVICE_ID_AMD_10H_NB_DRAM,
2230 .max_mcs = 2,
2231 .ops = {
2232 .early_channel_count = f1x_early_channel_count,
2233 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2234 .dbam_to_cs = f10_dbam_to_chip_select,
2237 [F15_CPUS] = {
2238 .ctl_name = "F15h",
2239 .f1_id = PCI_DEVICE_ID_AMD_15H_NB_F1,
2240 .f2_id = PCI_DEVICE_ID_AMD_15H_NB_F2,
2241 .max_mcs = 2,
2242 .ops = {
2243 .early_channel_count = f1x_early_channel_count,
2244 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2245 .dbam_to_cs = f15_dbam_to_chip_select,
2248 [F15_M30H_CPUS] = {
2249 .ctl_name = "F15h_M30h",
2250 .f1_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1,
2251 .f2_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F2,
2252 .max_mcs = 2,
2253 .ops = {
2254 .early_channel_count = f1x_early_channel_count,
2255 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2256 .dbam_to_cs = f16_dbam_to_chip_select,
2259 [F15_M60H_CPUS] = {
2260 .ctl_name = "F15h_M60h",
2261 .f1_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1,
2262 .f2_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F2,
2263 .max_mcs = 2,
2264 .ops = {
2265 .early_channel_count = f1x_early_channel_count,
2266 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2267 .dbam_to_cs = f15_m60h_dbam_to_chip_select,
2270 [F16_CPUS] = {
2271 .ctl_name = "F16h",
2272 .f1_id = PCI_DEVICE_ID_AMD_16H_NB_F1,
2273 .f2_id = PCI_DEVICE_ID_AMD_16H_NB_F2,
2274 .max_mcs = 2,
2275 .ops = {
2276 .early_channel_count = f1x_early_channel_count,
2277 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2278 .dbam_to_cs = f16_dbam_to_chip_select,
2281 [F16_M30H_CPUS] = {
2282 .ctl_name = "F16h_M30h",
2283 .f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1,
2284 .f2_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F2,
2285 .max_mcs = 2,
2286 .ops = {
2287 .early_channel_count = f1x_early_channel_count,
2288 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2289 .dbam_to_cs = f16_dbam_to_chip_select,
2292 [F17_CPUS] = {
2293 .ctl_name = "F17h",
2294 .f0_id = PCI_DEVICE_ID_AMD_17H_DF_F0,
2295 .f6_id = PCI_DEVICE_ID_AMD_17H_DF_F6,
2296 .max_mcs = 2,
2297 .ops = {
2298 .early_channel_count = f17_early_channel_count,
2299 .dbam_to_cs = f17_addr_mask_to_cs_size,
2302 [F17_M10H_CPUS] = {
2303 .ctl_name = "F17h_M10h",
2304 .f0_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F0,
2305 .f6_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F6,
2306 .max_mcs = 2,
2307 .ops = {
2308 .early_channel_count = f17_early_channel_count,
2309 .dbam_to_cs = f17_addr_mask_to_cs_size,
2312 [F17_M30H_CPUS] = {
2313 .ctl_name = "F17h_M30h",
2314 .f0_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F0,
2315 .f6_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F6,
2316 .max_mcs = 8,
2317 .ops = {
2318 .early_channel_count = f17_early_channel_count,
2319 .dbam_to_cs = f17_addr_mask_to_cs_size,
2322 [F17_M70H_CPUS] = {
2323 .ctl_name = "F17h_M70h",
2324 .f0_id = PCI_DEVICE_ID_AMD_17H_M70H_DF_F0,
2325 .f6_id = PCI_DEVICE_ID_AMD_17H_M70H_DF_F6,
2326 .max_mcs = 2,
2327 .ops = {
2328 .early_channel_count = f17_early_channel_count,
2329 .dbam_to_cs = f17_addr_mask_to_cs_size,
2332 [F19_CPUS] = {
2333 .ctl_name = "F19h",
2334 .f0_id = PCI_DEVICE_ID_AMD_19H_DF_F0,
2335 .f6_id = PCI_DEVICE_ID_AMD_19H_DF_F6,
2336 .max_mcs = 8,
2337 .ops = {
2338 .early_channel_count = f17_early_channel_count,
2339 .dbam_to_cs = f17_addr_mask_to_cs_size,
2345 * These are tables of eigenvectors (one per line) which can be used for the
2346 * construction of the syndrome tables. The modified syndrome search algorithm
2347 * uses those to find the symbol in error and thus the DIMM.
2349 * Algorithm courtesy of Ross LaFetra from AMD.
2351 static const u16 x4_vectors[] = {
2352 0x2f57, 0x1afe, 0x66cc, 0xdd88,
2353 0x11eb, 0x3396, 0x7f4c, 0xeac8,
2354 0x0001, 0x0002, 0x0004, 0x0008,
2355 0x1013, 0x3032, 0x4044, 0x8088,
2356 0x106b, 0x30d6, 0x70fc, 0xe0a8,
2357 0x4857, 0xc4fe, 0x13cc, 0x3288,
2358 0x1ac5, 0x2f4a, 0x5394, 0xa1e8,
2359 0x1f39, 0x251e, 0xbd6c, 0x6bd8,
2360 0x15c1, 0x2a42, 0x89ac, 0x4758,
2361 0x2b03, 0x1602, 0x4f0c, 0xca08,
2362 0x1f07, 0x3a0e, 0x6b04, 0xbd08,
2363 0x8ba7, 0x465e, 0x244c, 0x1cc8,
2364 0x2b87, 0x164e, 0x642c, 0xdc18,
2365 0x40b9, 0x80de, 0x1094, 0x20e8,
2366 0x27db, 0x1eb6, 0x9dac, 0x7b58,
2367 0x11c1, 0x2242, 0x84ac, 0x4c58,
2368 0x1be5, 0x2d7a, 0x5e34, 0xa718,
2369 0x4b39, 0x8d1e, 0x14b4, 0x28d8,
2370 0x4c97, 0xc87e, 0x11fc, 0x33a8,
2371 0x8e97, 0x497e, 0x2ffc, 0x1aa8,
2372 0x16b3, 0x3d62, 0x4f34, 0x8518,
2373 0x1e2f, 0x391a, 0x5cac, 0xf858,
2374 0x1d9f, 0x3b7a, 0x572c, 0xfe18,
2375 0x15f5, 0x2a5a, 0x5264, 0xa3b8,
2376 0x1dbb, 0x3b66, 0x715c, 0xe3f8,
2377 0x4397, 0xc27e, 0x17fc, 0x3ea8,
2378 0x1617, 0x3d3e, 0x6464, 0xb8b8,
2379 0x23ff, 0x12aa, 0xab6c, 0x56d8,
2380 0x2dfb, 0x1ba6, 0x913c, 0x7328,
2381 0x185d, 0x2ca6, 0x7914, 0x9e28,
2382 0x171b, 0x3e36, 0x7d7c, 0xebe8,
2383 0x4199, 0x82ee, 0x19f4, 0x2e58,
2384 0x4807, 0xc40e, 0x130c, 0x3208,
2385 0x1905, 0x2e0a, 0x5804, 0xac08,
2386 0x213f, 0x132a, 0xadfc, 0x5ba8,
2387 0x19a9, 0x2efe, 0xb5cc, 0x6f88,
2390 static const u16 x8_vectors[] = {
2391 0x0145, 0x028a, 0x2374, 0x43c8, 0xa1f0, 0x0520, 0x0a40, 0x1480,
2392 0x0211, 0x0422, 0x0844, 0x1088, 0x01b0, 0x44e0, 0x23c0, 0xed80,
2393 0x1011, 0x0116, 0x022c, 0x0458, 0x08b0, 0x8c60, 0x2740, 0x4e80,
2394 0x0411, 0x0822, 0x1044, 0x0158, 0x02b0, 0x2360, 0x46c0, 0xab80,
2395 0x0811, 0x1022, 0x012c, 0x0258, 0x04b0, 0x4660, 0x8cc0, 0x2780,
2396 0x2071, 0x40e2, 0xa0c4, 0x0108, 0x0210, 0x0420, 0x0840, 0x1080,
2397 0x4071, 0x80e2, 0x0104, 0x0208, 0x0410, 0x0820, 0x1040, 0x2080,
2398 0x8071, 0x0102, 0x0204, 0x0408, 0x0810, 0x1020, 0x2040, 0x4080,
2399 0x019d, 0x03d6, 0x136c, 0x2198, 0x50b0, 0xb2e0, 0x0740, 0x0e80,
2400 0x0189, 0x03ea, 0x072c, 0x0e58, 0x1cb0, 0x56e0, 0x37c0, 0xf580,
2401 0x01fd, 0x0376, 0x06ec, 0x0bb8, 0x1110, 0x2220, 0x4440, 0x8880,
2402 0x0163, 0x02c6, 0x1104, 0x0758, 0x0eb0, 0x2be0, 0x6140, 0xc280,
2403 0x02fd, 0x01c6, 0x0b5c, 0x1108, 0x07b0, 0x25a0, 0x8840, 0x6180,
2404 0x0801, 0x012e, 0x025c, 0x04b8, 0x1370, 0x26e0, 0x57c0, 0xb580,
2405 0x0401, 0x0802, 0x015c, 0x02b8, 0x22b0, 0x13e0, 0x7140, 0xe280,
2406 0x0201, 0x0402, 0x0804, 0x01b8, 0x11b0, 0x31a0, 0x8040, 0x7180,
2407 0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
2408 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
2409 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
2412 static int decode_syndrome(u16 syndrome, const u16 *vectors, unsigned num_vecs,
2413 unsigned v_dim)
2415 unsigned int i, err_sym;
2417 for (err_sym = 0; err_sym < num_vecs / v_dim; err_sym++) {
2418 u16 s = syndrome;
2419 unsigned v_idx = err_sym * v_dim;
2420 unsigned v_end = (err_sym + 1) * v_dim;
2422 /* walk over all 16 bits of the syndrome */
2423 for (i = 1; i < (1U << 16); i <<= 1) {
2425 /* if bit is set in that eigenvector... */
2426 if (v_idx < v_end && vectors[v_idx] & i) {
2427 u16 ev_comp = vectors[v_idx++];
2429 /* ... and bit set in the modified syndrome, */
2430 if (s & i) {
2431 /* remove it. */
2432 s ^= ev_comp;
2434 if (!s)
2435 return err_sym;
2438 } else if (s & i)
2439 /* can't get to zero, move to next symbol */
2440 break;
2444 edac_dbg(0, "syndrome(%x) not found\n", syndrome);
2445 return -1;
2448 static int map_err_sym_to_channel(int err_sym, int sym_size)
2450 if (sym_size == 4)
2451 switch (err_sym) {
2452 case 0x20:
2453 case 0x21:
2454 return 0;
2455 break;
2456 case 0x22:
2457 case 0x23:
2458 return 1;
2459 break;
2460 default:
2461 return err_sym >> 4;
2462 break;
2464 /* x8 symbols */
2465 else
2466 switch (err_sym) {
2467 /* imaginary bits not in a DIMM */
2468 case 0x10:
2469 WARN(1, KERN_ERR "Invalid error symbol: 0x%x\n",
2470 err_sym);
2471 return -1;
2472 break;
2474 case 0x11:
2475 return 0;
2476 break;
2477 case 0x12:
2478 return 1;
2479 break;
2480 default:
2481 return err_sym >> 3;
2482 break;
2484 return -1;
2487 static int get_channel_from_ecc_syndrome(struct mem_ctl_info *mci, u16 syndrome)
2489 struct amd64_pvt *pvt = mci->pvt_info;
2490 int err_sym = -1;
2492 if (pvt->ecc_sym_sz == 8)
2493 err_sym = decode_syndrome(syndrome, x8_vectors,
2494 ARRAY_SIZE(x8_vectors),
2495 pvt->ecc_sym_sz);
2496 else if (pvt->ecc_sym_sz == 4)
2497 err_sym = decode_syndrome(syndrome, x4_vectors,
2498 ARRAY_SIZE(x4_vectors),
2499 pvt->ecc_sym_sz);
2500 else {
2501 amd64_warn("Illegal syndrome type: %u\n", pvt->ecc_sym_sz);
2502 return err_sym;
2505 return map_err_sym_to_channel(err_sym, pvt->ecc_sym_sz);
2508 static void __log_ecc_error(struct mem_ctl_info *mci, struct err_info *err,
2509 u8 ecc_type)
2511 enum hw_event_mc_err_type err_type;
2512 const char *string;
2514 if (ecc_type == 2)
2515 err_type = HW_EVENT_ERR_CORRECTED;
2516 else if (ecc_type == 1)
2517 err_type = HW_EVENT_ERR_UNCORRECTED;
2518 else if (ecc_type == 3)
2519 err_type = HW_EVENT_ERR_DEFERRED;
2520 else {
2521 WARN(1, "Something is rotten in the state of Denmark.\n");
2522 return;
2525 switch (err->err_code) {
2526 case DECODE_OK:
2527 string = "";
2528 break;
2529 case ERR_NODE:
2530 string = "Failed to map error addr to a node";
2531 break;
2532 case ERR_CSROW:
2533 string = "Failed to map error addr to a csrow";
2534 break;
2535 case ERR_CHANNEL:
2536 string = "Unknown syndrome - possible error reporting race";
2537 break;
2538 case ERR_SYND:
2539 string = "MCA_SYND not valid - unknown syndrome and csrow";
2540 break;
2541 case ERR_NORM_ADDR:
2542 string = "Cannot decode normalized address";
2543 break;
2544 default:
2545 string = "WTF error";
2546 break;
2549 edac_mc_handle_error(err_type, mci, 1,
2550 err->page, err->offset, err->syndrome,
2551 err->csrow, err->channel, -1,
2552 string, "");
2555 static inline void decode_bus_error(int node_id, struct mce *m)
2557 struct mem_ctl_info *mci;
2558 struct amd64_pvt *pvt;
2559 u8 ecc_type = (m->status >> 45) & 0x3;
2560 u8 xec = XEC(m->status, 0x1f);
2561 u16 ec = EC(m->status);
2562 u64 sys_addr;
2563 struct err_info err;
2565 mci = edac_mc_find(node_id);
2566 if (!mci)
2567 return;
2569 pvt = mci->pvt_info;
2571 /* Bail out early if this was an 'observed' error */
2572 if (PP(ec) == NBSL_PP_OBS)
2573 return;
2575 /* Do only ECC errors */
2576 if (xec && xec != F10_NBSL_EXT_ERR_ECC)
2577 return;
2579 memset(&err, 0, sizeof(err));
2581 sys_addr = get_error_address(pvt, m);
2583 if (ecc_type == 2)
2584 err.syndrome = extract_syndrome(m->status);
2586 pvt->ops->map_sysaddr_to_csrow(mci, sys_addr, &err);
2588 __log_ecc_error(mci, &err, ecc_type);
2592 * To find the UMC channel represented by this bank we need to match on its
2593 * instance_id. The instance_id of a bank is held in the lower 32 bits of its
2594 * IPID.
2596 * Currently, we can derive the channel number by looking at the 6th nibble in
2597 * the instance_id. For example, instance_id=0xYXXXXX where Y is the channel
2598 * number.
2600 static int find_umc_channel(struct mce *m)
2602 return (m->ipid & GENMASK(31, 0)) >> 20;
2605 static void decode_umc_error(int node_id, struct mce *m)
2607 u8 ecc_type = (m->status >> 45) & 0x3;
2608 struct mem_ctl_info *mci;
2609 struct amd64_pvt *pvt;
2610 struct err_info err;
2611 u64 sys_addr;
2613 mci = edac_mc_find(node_id);
2614 if (!mci)
2615 return;
2617 pvt = mci->pvt_info;
2619 memset(&err, 0, sizeof(err));
2621 if (m->status & MCI_STATUS_DEFERRED)
2622 ecc_type = 3;
2624 err.channel = find_umc_channel(m);
2626 if (!(m->status & MCI_STATUS_SYNDV)) {
2627 err.err_code = ERR_SYND;
2628 goto log_error;
2631 if (ecc_type == 2) {
2632 u8 length = (m->synd >> 18) & 0x3f;
2634 if (length)
2635 err.syndrome = (m->synd >> 32) & GENMASK(length - 1, 0);
2636 else
2637 err.err_code = ERR_CHANNEL;
2640 err.csrow = m->synd & 0x7;
2642 if (umc_normaddr_to_sysaddr(m->addr, pvt->mc_node_id, err.channel, &sys_addr)) {
2643 err.err_code = ERR_NORM_ADDR;
2644 goto log_error;
2647 error_address_to_page_and_offset(sys_addr, &err);
2649 log_error:
2650 __log_ecc_error(mci, &err, ecc_type);
2654 * Use pvt->F3 which contains the F3 CPU PCI device to get the related
2655 * F1 (AddrMap) and F2 (Dct) devices. Return negative value on error.
2656 * Reserve F0 and F6 on systems with a UMC.
2658 static int
2659 reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 pci_id1, u16 pci_id2)
2661 if (pvt->umc) {
2662 pvt->F0 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
2663 if (!pvt->F0) {
2664 amd64_err("F0 not found, device 0x%x (broken BIOS?)\n", pci_id1);
2665 return -ENODEV;
2668 pvt->F6 = pci_get_related_function(pvt->F3->vendor, pci_id2, pvt->F3);
2669 if (!pvt->F6) {
2670 pci_dev_put(pvt->F0);
2671 pvt->F0 = NULL;
2673 amd64_err("F6 not found: device 0x%x (broken BIOS?)\n", pci_id2);
2674 return -ENODEV;
2677 edac_dbg(1, "F0: %s\n", pci_name(pvt->F0));
2678 edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
2679 edac_dbg(1, "F6: %s\n", pci_name(pvt->F6));
2681 return 0;
2684 /* Reserve the ADDRESS MAP Device */
2685 pvt->F1 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
2686 if (!pvt->F1) {
2687 amd64_err("F1 not found: device 0x%x (broken BIOS?)\n", pci_id1);
2688 return -ENODEV;
2691 /* Reserve the DCT Device */
2692 pvt->F2 = pci_get_related_function(pvt->F3->vendor, pci_id2, pvt->F3);
2693 if (!pvt->F2) {
2694 pci_dev_put(pvt->F1);
2695 pvt->F1 = NULL;
2697 amd64_err("F2 not found: device 0x%x (broken BIOS?)\n", pci_id2);
2698 return -ENODEV;
2701 edac_dbg(1, "F1: %s\n", pci_name(pvt->F1));
2702 edac_dbg(1, "F2: %s\n", pci_name(pvt->F2));
2703 edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
2705 return 0;
2708 static void free_mc_sibling_devs(struct amd64_pvt *pvt)
2710 if (pvt->umc) {
2711 pci_dev_put(pvt->F0);
2712 pci_dev_put(pvt->F6);
2713 } else {
2714 pci_dev_put(pvt->F1);
2715 pci_dev_put(pvt->F2);
2719 static void determine_ecc_sym_sz(struct amd64_pvt *pvt)
2721 pvt->ecc_sym_sz = 4;
2723 if (pvt->umc) {
2724 u8 i;
2726 for_each_umc(i) {
2727 /* Check enabled channels only: */
2728 if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
2729 if (pvt->umc[i].ecc_ctrl & BIT(9)) {
2730 pvt->ecc_sym_sz = 16;
2731 return;
2732 } else if (pvt->umc[i].ecc_ctrl & BIT(7)) {
2733 pvt->ecc_sym_sz = 8;
2734 return;
2738 } else if (pvt->fam >= 0x10) {
2739 u32 tmp;
2741 amd64_read_pci_cfg(pvt->F3, EXT_NB_MCA_CFG, &tmp);
2742 /* F16h has only DCT0, so no need to read dbam1. */
2743 if (pvt->fam != 0x16)
2744 amd64_read_dct_pci_cfg(pvt, 1, DBAM0, &pvt->dbam1);
2746 /* F10h, revD and later can do x8 ECC too. */
2747 if ((pvt->fam > 0x10 || pvt->model > 7) && tmp & BIT(25))
2748 pvt->ecc_sym_sz = 8;
2753 * Retrieve the hardware registers of the memory controller.
2755 static void __read_mc_regs_df(struct amd64_pvt *pvt)
2757 u8 nid = pvt->mc_node_id;
2758 struct amd64_umc *umc;
2759 u32 i, umc_base;
2761 /* Read registers from each UMC */
2762 for_each_umc(i) {
2764 umc_base = get_umc_base(i);
2765 umc = &pvt->umc[i];
2767 amd_smn_read(nid, umc_base + UMCCH_DIMM_CFG, &umc->dimm_cfg);
2768 amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &umc->umc_cfg);
2769 amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &umc->sdp_ctrl);
2770 amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &umc->ecc_ctrl);
2771 amd_smn_read(nid, umc_base + UMCCH_UMC_CAP_HI, &umc->umc_cap_hi);
2776 * Retrieve the hardware registers of the memory controller (this includes the
2777 * 'Address Map' and 'Misc' device regs)
2779 static void read_mc_regs(struct amd64_pvt *pvt)
2781 unsigned int range;
2782 u64 msr_val;
2785 * Retrieve TOP_MEM and TOP_MEM2; no masking off of reserved bits since
2786 * those are Read-As-Zero.
2788 rdmsrl(MSR_K8_TOP_MEM1, pvt->top_mem);
2789 edac_dbg(0, " TOP_MEM: 0x%016llx\n", pvt->top_mem);
2791 /* Check first whether TOP_MEM2 is enabled: */
2792 rdmsrl(MSR_K8_SYSCFG, msr_val);
2793 if (msr_val & BIT(21)) {
2794 rdmsrl(MSR_K8_TOP_MEM2, pvt->top_mem2);
2795 edac_dbg(0, " TOP_MEM2: 0x%016llx\n", pvt->top_mem2);
2796 } else {
2797 edac_dbg(0, " TOP_MEM2 disabled\n");
2800 if (pvt->umc) {
2801 __read_mc_regs_df(pvt);
2802 amd64_read_pci_cfg(pvt->F0, DF_DHAR, &pvt->dhar);
2804 goto skip;
2807 amd64_read_pci_cfg(pvt->F3, NBCAP, &pvt->nbcap);
2809 read_dram_ctl_register(pvt);
2811 for (range = 0; range < DRAM_RANGES; range++) {
2812 u8 rw;
2814 /* read settings for this DRAM range */
2815 read_dram_base_limit_regs(pvt, range);
2817 rw = dram_rw(pvt, range);
2818 if (!rw)
2819 continue;
2821 edac_dbg(1, " DRAM range[%d], base: 0x%016llx; limit: 0x%016llx\n",
2822 range,
2823 get_dram_base(pvt, range),
2824 get_dram_limit(pvt, range));
2826 edac_dbg(1, " IntlvEn=%s; Range access: %s%s IntlvSel=%d DstNode=%d\n",
2827 dram_intlv_en(pvt, range) ? "Enabled" : "Disabled",
2828 (rw & 0x1) ? "R" : "-",
2829 (rw & 0x2) ? "W" : "-",
2830 dram_intlv_sel(pvt, range),
2831 dram_dst_node(pvt, range));
2834 amd64_read_pci_cfg(pvt->F1, DHAR, &pvt->dhar);
2835 amd64_read_dct_pci_cfg(pvt, 0, DBAM0, &pvt->dbam0);
2837 amd64_read_pci_cfg(pvt->F3, F10_ONLINE_SPARE, &pvt->online_spare);
2839 amd64_read_dct_pci_cfg(pvt, 0, DCLR0, &pvt->dclr0);
2840 amd64_read_dct_pci_cfg(pvt, 0, DCHR0, &pvt->dchr0);
2842 if (!dct_ganging_enabled(pvt)) {
2843 amd64_read_dct_pci_cfg(pvt, 1, DCLR0, &pvt->dclr1);
2844 amd64_read_dct_pci_cfg(pvt, 1, DCHR0, &pvt->dchr1);
2847 skip:
2848 read_dct_base_mask(pvt);
2850 determine_memory_type(pvt);
2851 edac_dbg(1, " DIMM type: %s\n", edac_mem_types[pvt->dram_type]);
2853 determine_ecc_sym_sz(pvt);
2857 * NOTE: CPU Revision Dependent code
2859 * Input:
2860 * @csrow_nr ChipSelect Row Number (0..NUM_CHIPSELECTS-1)
2861 * k8 private pointer to -->
2862 * DRAM Bank Address mapping register
2863 * node_id
2864 * DCL register where dual_channel_active is
2866 * The DBAM register consists of 4 sets of 4 bits each definitions:
2868 * Bits: CSROWs
2869 * 0-3 CSROWs 0 and 1
2870 * 4-7 CSROWs 2 and 3
2871 * 8-11 CSROWs 4 and 5
2872 * 12-15 CSROWs 6 and 7
2874 * Values range from: 0 to 15
2875 * The meaning of the values depends on CPU revision and dual-channel state,
2876 * see relevant BKDG more info.
2878 * The memory controller provides for total of only 8 CSROWs in its current
2879 * architecture. Each "pair" of CSROWs normally represents just one DIMM in
2880 * single channel or two (2) DIMMs in dual channel mode.
2882 * The following code logic collapses the various tables for CSROW based on CPU
2883 * revision.
2885 * Returns:
2886 * The number of PAGE_SIZE pages on the specified CSROW number it
2887 * encompasses
2890 static u32 get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr_orig)
2892 u32 dbam = dct ? pvt->dbam1 : pvt->dbam0;
2893 int csrow_nr = csrow_nr_orig;
2894 u32 cs_mode, nr_pages;
2896 if (!pvt->umc) {
2897 csrow_nr >>= 1;
2898 cs_mode = DBAM_DIMM(csrow_nr, dbam);
2899 } else {
2900 cs_mode = f17_get_cs_mode(csrow_nr >> 1, dct, pvt);
2903 nr_pages = pvt->ops->dbam_to_cs(pvt, dct, cs_mode, csrow_nr);
2904 nr_pages <<= 20 - PAGE_SHIFT;
2906 edac_dbg(0, "csrow: %d, channel: %d, DBAM idx: %d\n",
2907 csrow_nr_orig, dct, cs_mode);
2908 edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
2910 return nr_pages;
2913 static int init_csrows_df(struct mem_ctl_info *mci)
2915 struct amd64_pvt *pvt = mci->pvt_info;
2916 enum edac_type edac_mode = EDAC_NONE;
2917 enum dev_type dev_type = DEV_UNKNOWN;
2918 struct dimm_info *dimm;
2919 int empty = 1;
2920 u8 umc, cs;
2922 if (mci->edac_ctl_cap & EDAC_FLAG_S16ECD16ED) {
2923 edac_mode = EDAC_S16ECD16ED;
2924 dev_type = DEV_X16;
2925 } else if (mci->edac_ctl_cap & EDAC_FLAG_S8ECD8ED) {
2926 edac_mode = EDAC_S8ECD8ED;
2927 dev_type = DEV_X8;
2928 } else if (mci->edac_ctl_cap & EDAC_FLAG_S4ECD4ED) {
2929 edac_mode = EDAC_S4ECD4ED;
2930 dev_type = DEV_X4;
2931 } else if (mci->edac_ctl_cap & EDAC_FLAG_SECDED) {
2932 edac_mode = EDAC_SECDED;
2935 for_each_umc(umc) {
2936 for_each_chip_select(cs, umc, pvt) {
2937 if (!csrow_enabled(cs, umc, pvt))
2938 continue;
2940 empty = 0;
2941 dimm = mci->csrows[cs]->channels[umc]->dimm;
2943 edac_dbg(1, "MC node: %d, csrow: %d\n",
2944 pvt->mc_node_id, cs);
2946 dimm->nr_pages = get_csrow_nr_pages(pvt, umc, cs);
2947 dimm->mtype = pvt->dram_type;
2948 dimm->edac_mode = edac_mode;
2949 dimm->dtype = dev_type;
2950 dimm->grain = 64;
2954 return empty;
2958 * Initialize the array of csrow attribute instances, based on the values
2959 * from pci config hardware registers.
2961 static int init_csrows(struct mem_ctl_info *mci)
2963 struct amd64_pvt *pvt = mci->pvt_info;
2964 enum edac_type edac_mode = EDAC_NONE;
2965 struct csrow_info *csrow;
2966 struct dimm_info *dimm;
2967 int i, j, empty = 1;
2968 int nr_pages = 0;
2969 u32 val;
2971 if (pvt->umc)
2972 return init_csrows_df(mci);
2974 amd64_read_pci_cfg(pvt->F3, NBCFG, &val);
2976 pvt->nbcfg = val;
2978 edac_dbg(0, "node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
2979 pvt->mc_node_id, val,
2980 !!(val & NBCFG_CHIPKILL), !!(val & NBCFG_ECC_ENABLE));
2983 * We iterate over DCT0 here but we look at DCT1 in parallel, if needed.
2985 for_each_chip_select(i, 0, pvt) {
2986 bool row_dct0 = !!csrow_enabled(i, 0, pvt);
2987 bool row_dct1 = false;
2989 if (pvt->fam != 0xf)
2990 row_dct1 = !!csrow_enabled(i, 1, pvt);
2992 if (!row_dct0 && !row_dct1)
2993 continue;
2995 csrow = mci->csrows[i];
2996 empty = 0;
2998 edac_dbg(1, "MC node: %d, csrow: %d\n",
2999 pvt->mc_node_id, i);
3001 if (row_dct0) {
3002 nr_pages = get_csrow_nr_pages(pvt, 0, i);
3003 csrow->channels[0]->dimm->nr_pages = nr_pages;
3006 /* K8 has only one DCT */
3007 if (pvt->fam != 0xf && row_dct1) {
3008 int row_dct1_pages = get_csrow_nr_pages(pvt, 1, i);
3010 csrow->channels[1]->dimm->nr_pages = row_dct1_pages;
3011 nr_pages += row_dct1_pages;
3014 edac_dbg(1, "Total csrow%d pages: %u\n", i, nr_pages);
3016 /* Determine DIMM ECC mode: */
3017 if (pvt->nbcfg & NBCFG_ECC_ENABLE) {
3018 edac_mode = (pvt->nbcfg & NBCFG_CHIPKILL)
3019 ? EDAC_S4ECD4ED
3020 : EDAC_SECDED;
3023 for (j = 0; j < pvt->channel_count; j++) {
3024 dimm = csrow->channels[j]->dimm;
3025 dimm->mtype = pvt->dram_type;
3026 dimm->edac_mode = edac_mode;
3027 dimm->grain = 64;
3031 return empty;
3034 /* get all cores on this DCT */
3035 static void get_cpus_on_this_dct_cpumask(struct cpumask *mask, u16 nid)
3037 int cpu;
3039 for_each_online_cpu(cpu)
3040 if (amd_get_nb_id(cpu) == nid)
3041 cpumask_set_cpu(cpu, mask);
3044 /* check MCG_CTL on all the cpus on this node */
3045 static bool nb_mce_bank_enabled_on_node(u16 nid)
3047 cpumask_var_t mask;
3048 int cpu, nbe;
3049 bool ret = false;
3051 if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) {
3052 amd64_warn("%s: Error allocating mask\n", __func__);
3053 return false;
3056 get_cpus_on_this_dct_cpumask(mask, nid);
3058 rdmsr_on_cpus(mask, MSR_IA32_MCG_CTL, msrs);
3060 for_each_cpu(cpu, mask) {
3061 struct msr *reg = per_cpu_ptr(msrs, cpu);
3062 nbe = reg->l & MSR_MCGCTL_NBE;
3064 edac_dbg(0, "core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
3065 cpu, reg->q,
3066 (nbe ? "enabled" : "disabled"));
3068 if (!nbe)
3069 goto out;
3071 ret = true;
3073 out:
3074 free_cpumask_var(mask);
3075 return ret;
3078 static int toggle_ecc_err_reporting(struct ecc_settings *s, u16 nid, bool on)
3080 cpumask_var_t cmask;
3081 int cpu;
3083 if (!zalloc_cpumask_var(&cmask, GFP_KERNEL)) {
3084 amd64_warn("%s: error allocating mask\n", __func__);
3085 return -ENOMEM;
3088 get_cpus_on_this_dct_cpumask(cmask, nid);
3090 rdmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3092 for_each_cpu(cpu, cmask) {
3094 struct msr *reg = per_cpu_ptr(msrs, cpu);
3096 if (on) {
3097 if (reg->l & MSR_MCGCTL_NBE)
3098 s->flags.nb_mce_enable = 1;
3100 reg->l |= MSR_MCGCTL_NBE;
3101 } else {
3103 * Turn off NB MCE reporting only when it was off before
3105 if (!s->flags.nb_mce_enable)
3106 reg->l &= ~MSR_MCGCTL_NBE;
3109 wrmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3111 free_cpumask_var(cmask);
3113 return 0;
3116 static bool enable_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3117 struct pci_dev *F3)
3119 bool ret = true;
3120 u32 value, mask = 0x3; /* UECC/CECC enable */
3122 if (toggle_ecc_err_reporting(s, nid, ON)) {
3123 amd64_warn("Error enabling ECC reporting over MCGCTL!\n");
3124 return false;
3127 amd64_read_pci_cfg(F3, NBCTL, &value);
3129 s->old_nbctl = value & mask;
3130 s->nbctl_valid = true;
3132 value |= mask;
3133 amd64_write_pci_cfg(F3, NBCTL, value);
3135 amd64_read_pci_cfg(F3, NBCFG, &value);
3137 edac_dbg(0, "1: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3138 nid, value, !!(value & NBCFG_ECC_ENABLE));
3140 if (!(value & NBCFG_ECC_ENABLE)) {
3141 amd64_warn("DRAM ECC disabled on this node, enabling...\n");
3143 s->flags.nb_ecc_prev = 0;
3145 /* Attempt to turn on DRAM ECC Enable */
3146 value |= NBCFG_ECC_ENABLE;
3147 amd64_write_pci_cfg(F3, NBCFG, value);
3149 amd64_read_pci_cfg(F3, NBCFG, &value);
3151 if (!(value & NBCFG_ECC_ENABLE)) {
3152 amd64_warn("Hardware rejected DRAM ECC enable,"
3153 "check memory DIMM configuration.\n");
3154 ret = false;
3155 } else {
3156 amd64_info("Hardware accepted DRAM ECC Enable\n");
3158 } else {
3159 s->flags.nb_ecc_prev = 1;
3162 edac_dbg(0, "2: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3163 nid, value, !!(value & NBCFG_ECC_ENABLE));
3165 return ret;
3168 static void restore_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3169 struct pci_dev *F3)
3171 u32 value, mask = 0x3; /* UECC/CECC enable */
3173 if (!s->nbctl_valid)
3174 return;
3176 amd64_read_pci_cfg(F3, NBCTL, &value);
3177 value &= ~mask;
3178 value |= s->old_nbctl;
3180 amd64_write_pci_cfg(F3, NBCTL, value);
3182 /* restore previous BIOS DRAM ECC "off" setting we force-enabled */
3183 if (!s->flags.nb_ecc_prev) {
3184 amd64_read_pci_cfg(F3, NBCFG, &value);
3185 value &= ~NBCFG_ECC_ENABLE;
3186 amd64_write_pci_cfg(F3, NBCFG, value);
3189 /* restore the NB Enable MCGCTL bit */
3190 if (toggle_ecc_err_reporting(s, nid, OFF))
3191 amd64_warn("Error restoring NB MCGCTL settings!\n");
3194 static bool ecc_enabled(struct amd64_pvt *pvt)
3196 u16 nid = pvt->mc_node_id;
3197 bool nb_mce_en = false;
3198 u8 ecc_en = 0, i;
3199 u32 value;
3201 if (boot_cpu_data.x86 >= 0x17) {
3202 u8 umc_en_mask = 0, ecc_en_mask = 0;
3203 struct amd64_umc *umc;
3205 for_each_umc(i) {
3206 umc = &pvt->umc[i];
3208 /* Only check enabled UMCs. */
3209 if (!(umc->sdp_ctrl & UMC_SDP_INIT))
3210 continue;
3212 umc_en_mask |= BIT(i);
3214 if (umc->umc_cap_hi & UMC_ECC_ENABLED)
3215 ecc_en_mask |= BIT(i);
3218 /* Check whether at least one UMC is enabled: */
3219 if (umc_en_mask)
3220 ecc_en = umc_en_mask == ecc_en_mask;
3221 else
3222 edac_dbg(0, "Node %d: No enabled UMCs.\n", nid);
3224 /* Assume UMC MCA banks are enabled. */
3225 nb_mce_en = true;
3226 } else {
3227 amd64_read_pci_cfg(pvt->F3, NBCFG, &value);
3229 ecc_en = !!(value & NBCFG_ECC_ENABLE);
3231 nb_mce_en = nb_mce_bank_enabled_on_node(nid);
3232 if (!nb_mce_en)
3233 edac_dbg(0, "NB MCE bank disabled, set MSR 0x%08x[4] on node %d to enable.\n",
3234 MSR_IA32_MCG_CTL, nid);
3237 amd64_info("Node %d: DRAM ECC %s.\n",
3238 nid, (ecc_en ? "enabled" : "disabled"));
3240 if (!ecc_en || !nb_mce_en)
3241 return false;
3242 else
3243 return true;
3246 static inline void
3247 f17h_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)
3249 u8 i, ecc_en = 1, cpk_en = 1, dev_x4 = 1, dev_x16 = 1;
3251 for_each_umc(i) {
3252 if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
3253 ecc_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_ENABLED);
3254 cpk_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_CHIPKILL_CAP);
3256 dev_x4 &= !!(pvt->umc[i].dimm_cfg & BIT(6));
3257 dev_x16 &= !!(pvt->umc[i].dimm_cfg & BIT(7));
3261 /* Set chipkill only if ECC is enabled: */
3262 if (ecc_en) {
3263 mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3265 if (!cpk_en)
3266 return;
3268 if (dev_x4)
3269 mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3270 else if (dev_x16)
3271 mci->edac_ctl_cap |= EDAC_FLAG_S16ECD16ED;
3272 else
3273 mci->edac_ctl_cap |= EDAC_FLAG_S8ECD8ED;
3277 static void setup_mci_misc_attrs(struct mem_ctl_info *mci)
3279 struct amd64_pvt *pvt = mci->pvt_info;
3281 mci->mtype_cap = MEM_FLAG_DDR2 | MEM_FLAG_RDDR2;
3282 mci->edac_ctl_cap = EDAC_FLAG_NONE;
3284 if (pvt->umc) {
3285 f17h_determine_edac_ctl_cap(mci, pvt);
3286 } else {
3287 if (pvt->nbcap & NBCAP_SECDED)
3288 mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3290 if (pvt->nbcap & NBCAP_CHIPKILL)
3291 mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3294 mci->edac_cap = determine_edac_cap(pvt);
3295 mci->mod_name = EDAC_MOD_STR;
3296 mci->ctl_name = fam_type->ctl_name;
3297 mci->dev_name = pci_name(pvt->F3);
3298 mci->ctl_page_to_phys = NULL;
3300 /* memory scrubber interface */
3301 mci->set_sdram_scrub_rate = set_scrub_rate;
3302 mci->get_sdram_scrub_rate = get_scrub_rate;
3306 * returns a pointer to the family descriptor on success, NULL otherwise.
3308 static struct amd64_family_type *per_family_init(struct amd64_pvt *pvt)
3310 pvt->ext_model = boot_cpu_data.x86_model >> 4;
3311 pvt->stepping = boot_cpu_data.x86_stepping;
3312 pvt->model = boot_cpu_data.x86_model;
3313 pvt->fam = boot_cpu_data.x86;
3315 switch (pvt->fam) {
3316 case 0xf:
3317 fam_type = &family_types[K8_CPUS];
3318 pvt->ops = &family_types[K8_CPUS].ops;
3319 break;
3321 case 0x10:
3322 fam_type = &family_types[F10_CPUS];
3323 pvt->ops = &family_types[F10_CPUS].ops;
3324 break;
3326 case 0x15:
3327 if (pvt->model == 0x30) {
3328 fam_type = &family_types[F15_M30H_CPUS];
3329 pvt->ops = &family_types[F15_M30H_CPUS].ops;
3330 break;
3331 } else if (pvt->model == 0x60) {
3332 fam_type = &family_types[F15_M60H_CPUS];
3333 pvt->ops = &family_types[F15_M60H_CPUS].ops;
3334 break;
3337 fam_type = &family_types[F15_CPUS];
3338 pvt->ops = &family_types[F15_CPUS].ops;
3339 break;
3341 case 0x16:
3342 if (pvt->model == 0x30) {
3343 fam_type = &family_types[F16_M30H_CPUS];
3344 pvt->ops = &family_types[F16_M30H_CPUS].ops;
3345 break;
3347 fam_type = &family_types[F16_CPUS];
3348 pvt->ops = &family_types[F16_CPUS].ops;
3349 break;
3351 case 0x17:
3352 if (pvt->model >= 0x10 && pvt->model <= 0x2f) {
3353 fam_type = &family_types[F17_M10H_CPUS];
3354 pvt->ops = &family_types[F17_M10H_CPUS].ops;
3355 break;
3356 } else if (pvt->model >= 0x30 && pvt->model <= 0x3f) {
3357 fam_type = &family_types[F17_M30H_CPUS];
3358 pvt->ops = &family_types[F17_M30H_CPUS].ops;
3359 break;
3360 } else if (pvt->model >= 0x70 && pvt->model <= 0x7f) {
3361 fam_type = &family_types[F17_M70H_CPUS];
3362 pvt->ops = &family_types[F17_M70H_CPUS].ops;
3363 break;
3365 /* fall through */
3366 case 0x18:
3367 fam_type = &family_types[F17_CPUS];
3368 pvt->ops = &family_types[F17_CPUS].ops;
3370 if (pvt->fam == 0x18)
3371 family_types[F17_CPUS].ctl_name = "F18h";
3372 break;
3374 case 0x19:
3375 fam_type = &family_types[F19_CPUS];
3376 pvt->ops = &family_types[F19_CPUS].ops;
3377 family_types[F19_CPUS].ctl_name = "F19h";
3378 break;
3380 default:
3381 amd64_err("Unsupported family!\n");
3382 return NULL;
3385 amd64_info("%s %sdetected (node %d).\n", fam_type->ctl_name,
3386 (pvt->fam == 0xf ?
3387 (pvt->ext_model >= K8_REV_F ? "revF or later "
3388 : "revE or earlier ")
3389 : ""), pvt->mc_node_id);
3390 return fam_type;
3393 static const struct attribute_group *amd64_edac_attr_groups[] = {
3394 #ifdef CONFIG_EDAC_DEBUG
3395 &amd64_edac_dbg_group,
3396 #endif
3397 #ifdef CONFIG_EDAC_AMD64_ERROR_INJECTION
3398 &amd64_edac_inj_group,
3399 #endif
3400 NULL
3403 static int hw_info_get(struct amd64_pvt *pvt)
3405 u16 pci_id1, pci_id2;
3406 int ret = -EINVAL;
3408 if (pvt->fam >= 0x17) {
3409 pvt->umc = kcalloc(fam_type->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
3410 if (!pvt->umc)
3411 return -ENOMEM;
3413 pci_id1 = fam_type->f0_id;
3414 pci_id2 = fam_type->f6_id;
3415 } else {
3416 pci_id1 = fam_type->f1_id;
3417 pci_id2 = fam_type->f2_id;
3420 ret = reserve_mc_sibling_devs(pvt, pci_id1, pci_id2);
3421 if (ret)
3422 return ret;
3424 read_mc_regs(pvt);
3426 return 0;
3429 static void hw_info_put(struct amd64_pvt *pvt)
3431 if (pvt->F0 || pvt->F1)
3432 free_mc_sibling_devs(pvt);
3434 kfree(pvt->umc);
3437 static int init_one_instance(struct amd64_pvt *pvt)
3439 struct mem_ctl_info *mci = NULL;
3440 struct edac_mc_layer layers[2];
3441 int ret = -EINVAL;
3444 * We need to determine how many memory channels there are. Then use
3445 * that information for calculating the size of the dynamic instance
3446 * tables in the 'mci' structure.
3448 pvt->channel_count = pvt->ops->early_channel_count(pvt);
3449 if (pvt->channel_count < 0)
3450 return ret;
3452 ret = -ENOMEM;
3453 layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
3454 layers[0].size = pvt->csels[0].b_cnt;
3455 layers[0].is_virt_csrow = true;
3456 layers[1].type = EDAC_MC_LAYER_CHANNEL;
3459 * Always allocate two channels since we can have setups with DIMMs on
3460 * only one channel. Also, this simplifies handling later for the price
3461 * of a couple of KBs tops.
3463 layers[1].size = fam_type->max_mcs;
3464 layers[1].is_virt_csrow = false;
3466 mci = edac_mc_alloc(pvt->mc_node_id, ARRAY_SIZE(layers), layers, 0);
3467 if (!mci)
3468 return ret;
3470 mci->pvt_info = pvt;
3471 mci->pdev = &pvt->F3->dev;
3473 setup_mci_misc_attrs(mci);
3475 if (init_csrows(mci))
3476 mci->edac_cap = EDAC_FLAG_NONE;
3478 ret = -ENODEV;
3479 if (edac_mc_add_mc_with_groups(mci, amd64_edac_attr_groups)) {
3480 edac_dbg(1, "failed edac_mc_add_mc()\n");
3481 edac_mc_free(mci);
3482 return ret;
3485 return 0;
3488 static bool instance_has_memory(struct amd64_pvt *pvt)
3490 bool cs_enabled = false;
3491 int cs = 0, dct = 0;
3493 for (dct = 0; dct < fam_type->max_mcs; dct++) {
3494 for_each_chip_select(cs, dct, pvt)
3495 cs_enabled |= csrow_enabled(cs, dct, pvt);
3498 return cs_enabled;
3501 static int probe_one_instance(unsigned int nid)
3503 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
3504 struct amd64_pvt *pvt = NULL;
3505 struct ecc_settings *s;
3506 int ret;
3508 ret = -ENOMEM;
3509 s = kzalloc(sizeof(struct ecc_settings), GFP_KERNEL);
3510 if (!s)
3511 goto err_out;
3513 ecc_stngs[nid] = s;
3515 pvt = kzalloc(sizeof(struct amd64_pvt), GFP_KERNEL);
3516 if (!pvt)
3517 goto err_settings;
3519 pvt->mc_node_id = nid;
3520 pvt->F3 = F3;
3522 fam_type = per_family_init(pvt);
3523 if (!fam_type)
3524 goto err_enable;
3526 ret = hw_info_get(pvt);
3527 if (ret < 0)
3528 goto err_enable;
3530 ret = 0;
3531 if (!instance_has_memory(pvt)) {
3532 amd64_info("Node %d: No DIMMs detected.\n", nid);
3533 goto err_enable;
3536 if (!ecc_enabled(pvt)) {
3537 ret = -ENODEV;
3539 if (!ecc_enable_override)
3540 goto err_enable;
3542 if (boot_cpu_data.x86 >= 0x17) {
3543 amd64_warn("Forcing ECC on is not recommended on newer systems. Please enable ECC in BIOS.");
3544 goto err_enable;
3545 } else
3546 amd64_warn("Forcing ECC on!\n");
3548 if (!enable_ecc_error_reporting(s, nid, F3))
3549 goto err_enable;
3552 ret = init_one_instance(pvt);
3553 if (ret < 0) {
3554 amd64_err("Error probing instance: %d\n", nid);
3556 if (boot_cpu_data.x86 < 0x17)
3557 restore_ecc_error_reporting(s, nid, F3);
3559 goto err_enable;
3562 dump_misc_regs(pvt);
3564 return ret;
3566 err_enable:
3567 hw_info_put(pvt);
3568 kfree(pvt);
3570 err_settings:
3571 kfree(s);
3572 ecc_stngs[nid] = NULL;
3574 err_out:
3575 return ret;
3578 static void remove_one_instance(unsigned int nid)
3580 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
3581 struct ecc_settings *s = ecc_stngs[nid];
3582 struct mem_ctl_info *mci;
3583 struct amd64_pvt *pvt;
3585 /* Remove from EDAC CORE tracking list */
3586 mci = edac_mc_del_mc(&F3->dev);
3587 if (!mci)
3588 return;
3590 pvt = mci->pvt_info;
3592 restore_ecc_error_reporting(s, nid, F3);
3594 kfree(ecc_stngs[nid]);
3595 ecc_stngs[nid] = NULL;
3597 /* Free the EDAC CORE resources */
3598 mci->pvt_info = NULL;
3600 hw_info_put(pvt);
3601 kfree(pvt);
3602 edac_mc_free(mci);
3605 static void setup_pci_device(void)
3607 struct mem_ctl_info *mci;
3608 struct amd64_pvt *pvt;
3610 if (pci_ctl)
3611 return;
3613 mci = edac_mc_find(0);
3614 if (!mci)
3615 return;
3617 pvt = mci->pvt_info;
3618 if (pvt->umc)
3619 pci_ctl = edac_pci_create_generic_ctl(&pvt->F0->dev, EDAC_MOD_STR);
3620 else
3621 pci_ctl = edac_pci_create_generic_ctl(&pvt->F2->dev, EDAC_MOD_STR);
3622 if (!pci_ctl) {
3623 pr_warn("%s(): Unable to create PCI control\n", __func__);
3624 pr_warn("%s(): PCI error report via EDAC not set\n", __func__);
3628 static const struct x86_cpu_id amd64_cpuids[] = {
3629 X86_MATCH_VENDOR_FAM(AMD, 0x0F, NULL),
3630 X86_MATCH_VENDOR_FAM(AMD, 0x10, NULL),
3631 X86_MATCH_VENDOR_FAM(AMD, 0x15, NULL),
3632 X86_MATCH_VENDOR_FAM(AMD, 0x16, NULL),
3633 X86_MATCH_VENDOR_FAM(AMD, 0x17, NULL),
3634 X86_MATCH_VENDOR_FAM(HYGON, 0x18, NULL),
3635 X86_MATCH_VENDOR_FAM(AMD, 0x19, NULL),
3638 MODULE_DEVICE_TABLE(x86cpu, amd64_cpuids);
3640 static int __init amd64_edac_init(void)
3642 const char *owner;
3643 int err = -ENODEV;
3644 int i;
3646 owner = edac_get_owner();
3647 if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
3648 return -EBUSY;
3650 if (!x86_match_cpu(amd64_cpuids))
3651 return -ENODEV;
3653 if (amd_cache_northbridges() < 0)
3654 return -ENODEV;
3656 opstate_init();
3658 err = -ENOMEM;
3659 ecc_stngs = kcalloc(amd_nb_num(), sizeof(ecc_stngs[0]), GFP_KERNEL);
3660 if (!ecc_stngs)
3661 goto err_free;
3663 msrs = msrs_alloc();
3664 if (!msrs)
3665 goto err_free;
3667 for (i = 0; i < amd_nb_num(); i++) {
3668 err = probe_one_instance(i);
3669 if (err) {
3670 /* unwind properly */
3671 while (--i >= 0)
3672 remove_one_instance(i);
3674 goto err_pci;
3678 if (!edac_has_mcs()) {
3679 err = -ENODEV;
3680 goto err_pci;
3683 /* register stuff with EDAC MCE */
3684 if (report_gart_errors)
3685 amd_report_gart_errors(true);
3687 if (boot_cpu_data.x86 >= 0x17)
3688 amd_register_ecc_decoder(decode_umc_error);
3689 else
3690 amd_register_ecc_decoder(decode_bus_error);
3692 setup_pci_device();
3694 #ifdef CONFIG_X86_32
3695 amd64_err("%s on 32-bit is unsupported. USE AT YOUR OWN RISK!\n", EDAC_MOD_STR);
3696 #endif
3698 printk(KERN_INFO "AMD64 EDAC driver v%s\n", EDAC_AMD64_VERSION);
3700 return 0;
3702 err_pci:
3703 msrs_free(msrs);
3704 msrs = NULL;
3706 err_free:
3707 kfree(ecc_stngs);
3708 ecc_stngs = NULL;
3710 return err;
3713 static void __exit amd64_edac_exit(void)
3715 int i;
3717 if (pci_ctl)
3718 edac_pci_release_generic_ctl(pci_ctl);
3720 /* unregister from EDAC MCE */
3721 amd_report_gart_errors(false);
3723 if (boot_cpu_data.x86 >= 0x17)
3724 amd_unregister_ecc_decoder(decode_umc_error);
3725 else
3726 amd_unregister_ecc_decoder(decode_bus_error);
3728 for (i = 0; i < amd_nb_num(); i++)
3729 remove_one_instance(i);
3731 kfree(ecc_stngs);
3732 ecc_stngs = NULL;
3734 msrs_free(msrs);
3735 msrs = NULL;
3738 module_init(amd64_edac_init);
3739 module_exit(amd64_edac_exit);
3741 MODULE_LICENSE("GPL");
3742 MODULE_AUTHOR("SoftwareBitMaker: Doug Thompson, "
3743 "Dave Peterson, Thayne Harbaugh");
3744 MODULE_DESCRIPTION("MC support for AMD64 memory controllers - "
3745 EDAC_AMD64_VERSION);
3747 module_param(edac_op_state, int, 0444);
3748 MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");