Merge tag 'trace-v5.11-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[linux/fpc-iii.git] / drivers / edac / amd64_edac.c
blobf7087ddddb902109b3124d64fb0698a36a8ce5f6
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 /*
8 * Set by command line parameter. If BIOS has enabled the ECC, this override is
9 * cleared to prevent re-enabling the hardware by this driver.
11 static int ecc_enable_override;
12 module_param(ecc_enable_override, int, 0644);
14 static struct msr __percpu *msrs;
16 static struct amd64_family_type *fam_type;
18 /* Per-node stuff */
19 static struct ecc_settings **ecc_stngs;
21 /* Device for the PCI component */
22 static struct device *pci_ctl_dev;
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);
277 } else {
278 amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
281 scrubval = scrubval & 0x001F;
283 for (i = 0; i < ARRAY_SIZE(scrubrates); i++) {
284 if (scrubrates[i].scrubval == scrubval) {
285 retval = scrubrates[i].bandwidth;
286 break;
289 return retval;
293 * returns true if the SysAddr given by sys_addr matches the
294 * DRAM base/limit associated with node_id
296 static bool base_limit_match(struct amd64_pvt *pvt, u64 sys_addr, u8 nid)
298 u64 addr;
300 /* The K8 treats this as a 40-bit value. However, bits 63-40 will be
301 * all ones if the most significant implemented address bit is 1.
302 * Here we discard bits 63-40. See section 3.4.2 of AMD publication
303 * 24592: AMD x86-64 Architecture Programmer's Manual Volume 1
304 * Application Programming.
306 addr = sys_addr & 0x000000ffffffffffull;
308 return ((addr >= get_dram_base(pvt, nid)) &&
309 (addr <= get_dram_limit(pvt, nid)));
313 * Attempt to map a SysAddr to a node. On success, return a pointer to the
314 * mem_ctl_info structure for the node that the SysAddr maps to.
316 * On failure, return NULL.
318 static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci,
319 u64 sys_addr)
321 struct amd64_pvt *pvt;
322 u8 node_id;
323 u32 intlv_en, bits;
326 * Here we use the DRAM Base (section 3.4.4.1) and DRAM Limit (section
327 * 3.4.4.2) registers to map the SysAddr to a node ID.
329 pvt = mci->pvt_info;
332 * The value of this field should be the same for all DRAM Base
333 * registers. Therefore we arbitrarily choose to read it from the
334 * register for node 0.
336 intlv_en = dram_intlv_en(pvt, 0);
338 if (intlv_en == 0) {
339 for (node_id = 0; node_id < DRAM_RANGES; node_id++) {
340 if (base_limit_match(pvt, sys_addr, node_id))
341 goto found;
343 goto err_no_match;
346 if (unlikely((intlv_en != 0x01) &&
347 (intlv_en != 0x03) &&
348 (intlv_en != 0x07))) {
349 amd64_warn("DRAM Base[IntlvEn] junk value: 0x%x, BIOS bug?\n", intlv_en);
350 return NULL;
353 bits = (((u32) sys_addr) >> 12) & intlv_en;
355 for (node_id = 0; ; ) {
356 if ((dram_intlv_sel(pvt, node_id) & intlv_en) == bits)
357 break; /* intlv_sel field matches */
359 if (++node_id >= DRAM_RANGES)
360 goto err_no_match;
363 /* sanity test for sys_addr */
364 if (unlikely(!base_limit_match(pvt, sys_addr, node_id))) {
365 amd64_warn("%s: sys_addr 0x%llx falls outside base/limit address"
366 "range for node %d with node interleaving enabled.\n",
367 __func__, sys_addr, node_id);
368 return NULL;
371 found:
372 return edac_mc_find((int)node_id);
374 err_no_match:
375 edac_dbg(2, "sys_addr 0x%lx doesn't match any node\n",
376 (unsigned long)sys_addr);
378 return NULL;
382 * compute the CS base address of the @csrow on the DRAM controller @dct.
383 * For details see F2x[5C:40] in the processor's BKDG
385 static void get_cs_base_and_mask(struct amd64_pvt *pvt, int csrow, u8 dct,
386 u64 *base, u64 *mask)
388 u64 csbase, csmask, base_bits, mask_bits;
389 u8 addr_shift;
391 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
392 csbase = pvt->csels[dct].csbases[csrow];
393 csmask = pvt->csels[dct].csmasks[csrow];
394 base_bits = GENMASK_ULL(31, 21) | GENMASK_ULL(15, 9);
395 mask_bits = GENMASK_ULL(29, 21) | GENMASK_ULL(15, 9);
396 addr_shift = 4;
399 * F16h and F15h, models 30h and later need two addr_shift values:
400 * 8 for high and 6 for low (cf. F16h BKDG).
402 } else if (pvt->fam == 0x16 ||
403 (pvt->fam == 0x15 && pvt->model >= 0x30)) {
404 csbase = pvt->csels[dct].csbases[csrow];
405 csmask = pvt->csels[dct].csmasks[csrow >> 1];
407 *base = (csbase & GENMASK_ULL(15, 5)) << 6;
408 *base |= (csbase & GENMASK_ULL(30, 19)) << 8;
410 *mask = ~0ULL;
411 /* poke holes for the csmask */
412 *mask &= ~((GENMASK_ULL(15, 5) << 6) |
413 (GENMASK_ULL(30, 19) << 8));
415 *mask |= (csmask & GENMASK_ULL(15, 5)) << 6;
416 *mask |= (csmask & GENMASK_ULL(30, 19)) << 8;
418 return;
419 } else {
420 csbase = pvt->csels[dct].csbases[csrow];
421 csmask = pvt->csels[dct].csmasks[csrow >> 1];
422 addr_shift = 8;
424 if (pvt->fam == 0x15)
425 base_bits = mask_bits =
426 GENMASK_ULL(30,19) | GENMASK_ULL(13,5);
427 else
428 base_bits = mask_bits =
429 GENMASK_ULL(28,19) | GENMASK_ULL(13,5);
432 *base = (csbase & base_bits) << addr_shift;
434 *mask = ~0ULL;
435 /* poke holes for the csmask */
436 *mask &= ~(mask_bits << addr_shift);
437 /* OR them in */
438 *mask |= (csmask & mask_bits) << addr_shift;
441 #define for_each_chip_select(i, dct, pvt) \
442 for (i = 0; i < pvt->csels[dct].b_cnt; i++)
444 #define chip_select_base(i, dct, pvt) \
445 pvt->csels[dct].csbases[i]
447 #define for_each_chip_select_mask(i, dct, pvt) \
448 for (i = 0; i < pvt->csels[dct].m_cnt; i++)
450 #define for_each_umc(i) \
451 for (i = 0; i < fam_type->max_mcs; i++)
454 * @input_addr is an InputAddr associated with the node given by mci. Return the
455 * csrow that input_addr maps to, or -1 on failure (no csrow claims input_addr).
457 static int input_addr_to_csrow(struct mem_ctl_info *mci, u64 input_addr)
459 struct amd64_pvt *pvt;
460 int csrow;
461 u64 base, mask;
463 pvt = mci->pvt_info;
465 for_each_chip_select(csrow, 0, pvt) {
466 if (!csrow_enabled(csrow, 0, pvt))
467 continue;
469 get_cs_base_and_mask(pvt, csrow, 0, &base, &mask);
471 mask = ~mask;
473 if ((input_addr & mask) == (base & mask)) {
474 edac_dbg(2, "InputAddr 0x%lx matches csrow %d (node %d)\n",
475 (unsigned long)input_addr, csrow,
476 pvt->mc_node_id);
478 return csrow;
481 edac_dbg(2, "no matching csrow for InputAddr 0x%lx (MC node %d)\n",
482 (unsigned long)input_addr, pvt->mc_node_id);
484 return -1;
488 * Obtain info from the DRAM Hole Address Register (section 3.4.8, pub #26094)
489 * for the node represented by mci. Info is passed back in *hole_base,
490 * *hole_offset, and *hole_size. Function returns 0 if info is valid or 1 if
491 * info is invalid. Info may be invalid for either of the following reasons:
493 * - The revision of the node is not E or greater. In this case, the DRAM Hole
494 * Address Register does not exist.
496 * - The DramHoleValid bit is cleared in the DRAM Hole Address Register,
497 * indicating that its contents are not valid.
499 * The values passed back in *hole_base, *hole_offset, and *hole_size are
500 * complete 32-bit values despite the fact that the bitfields in the DHAR
501 * only represent bits 31-24 of the base and offset values.
503 int amd64_get_dram_hole_info(struct mem_ctl_info *mci, u64 *hole_base,
504 u64 *hole_offset, u64 *hole_size)
506 struct amd64_pvt *pvt = mci->pvt_info;
508 /* only revE and later have the DRAM Hole Address Register */
509 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_E) {
510 edac_dbg(1, " revision %d for node %d does not support DHAR\n",
511 pvt->ext_model, pvt->mc_node_id);
512 return 1;
515 /* valid for Fam10h and above */
516 if (pvt->fam >= 0x10 && !dhar_mem_hoist_valid(pvt)) {
517 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this system\n");
518 return 1;
521 if (!dhar_valid(pvt)) {
522 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this node %d\n",
523 pvt->mc_node_id);
524 return 1;
527 /* This node has Memory Hoisting */
529 /* +------------------+--------------------+--------------------+-----
530 * | memory | DRAM hole | relocated |
531 * | [0, (x - 1)] | [x, 0xffffffff] | addresses from |
532 * | | | DRAM hole |
533 * | | | [0x100000000, |
534 * | | | (0x100000000+ |
535 * | | | (0xffffffff-x))] |
536 * +------------------+--------------------+--------------------+-----
538 * Above is a diagram of physical memory showing the DRAM hole and the
539 * relocated addresses from the DRAM hole. As shown, the DRAM hole
540 * starts at address x (the base address) and extends through address
541 * 0xffffffff. The DRAM Hole Address Register (DHAR) relocates the
542 * addresses in the hole so that they start at 0x100000000.
545 *hole_base = dhar_base(pvt);
546 *hole_size = (1ULL << 32) - *hole_base;
548 *hole_offset = (pvt->fam > 0xf) ? f10_dhar_offset(pvt)
549 : k8_dhar_offset(pvt);
551 edac_dbg(1, " DHAR info for node %d base 0x%lx offset 0x%lx size 0x%lx\n",
552 pvt->mc_node_id, (unsigned long)*hole_base,
553 (unsigned long)*hole_offset, (unsigned long)*hole_size);
555 return 0;
557 EXPORT_SYMBOL_GPL(amd64_get_dram_hole_info);
560 * Return the DramAddr that the SysAddr given by @sys_addr maps to. It is
561 * assumed that sys_addr maps to the node given by mci.
563 * The first part of section 3.4.4 (p. 70) shows how the DRAM Base (section
564 * 3.4.4.1) and DRAM Limit (section 3.4.4.2) registers are used to translate a
565 * SysAddr to a DramAddr. If the DRAM Hole Address Register (DHAR) is enabled,
566 * then it is also involved in translating a SysAddr to a DramAddr. Sections
567 * 3.4.8 and 3.5.8.2 describe the DHAR and how it is used for memory hoisting.
568 * These parts of the documentation are unclear. I interpret them as follows:
570 * When node n receives a SysAddr, it processes the SysAddr as follows:
572 * 1. It extracts the DRAMBase and DRAMLimit values from the DRAM Base and DRAM
573 * Limit registers for node n. If the SysAddr is not within the range
574 * specified by the base and limit values, then node n ignores the Sysaddr
575 * (since it does not map to node n). Otherwise continue to step 2 below.
577 * 2. If the DramHoleValid bit of the DHAR for node n is clear, the DHAR is
578 * disabled so skip to step 3 below. Otherwise see if the SysAddr is within
579 * the range of relocated addresses (starting at 0x100000000) from the DRAM
580 * hole. If not, skip to step 3 below. Else get the value of the
581 * DramHoleOffset field from the DHAR. To obtain the DramAddr, subtract the
582 * offset defined by this value from the SysAddr.
584 * 3. Obtain the base address for node n from the DRAMBase field of the DRAM
585 * Base register for node n. To obtain the DramAddr, subtract the base
586 * address from the SysAddr, as shown near the start of section 3.4.4 (p.70).
588 static u64 sys_addr_to_dram_addr(struct mem_ctl_info *mci, u64 sys_addr)
590 struct amd64_pvt *pvt = mci->pvt_info;
591 u64 dram_base, hole_base, hole_offset, hole_size, dram_addr;
592 int ret;
594 dram_base = get_dram_base(pvt, pvt->mc_node_id);
596 ret = amd64_get_dram_hole_info(mci, &hole_base, &hole_offset,
597 &hole_size);
598 if (!ret) {
599 if ((sys_addr >= (1ULL << 32)) &&
600 (sys_addr < ((1ULL << 32) + hole_size))) {
601 /* use DHAR to translate SysAddr to DramAddr */
602 dram_addr = sys_addr - hole_offset;
604 edac_dbg(2, "using DHAR to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
605 (unsigned long)sys_addr,
606 (unsigned long)dram_addr);
608 return dram_addr;
613 * Translate the SysAddr to a DramAddr as shown near the start of
614 * section 3.4.4 (p. 70). Although sys_addr is a 64-bit value, the k8
615 * only deals with 40-bit values. Therefore we discard bits 63-40 of
616 * sys_addr below. If bit 39 of sys_addr is 1 then the bits we
617 * discard are all 1s. Otherwise the bits we discard are all 0s. See
618 * section 3.4.2 of AMD publication 24592: AMD x86-64 Architecture
619 * Programmer's Manual Volume 1 Application Programming.
621 dram_addr = (sys_addr & GENMASK_ULL(39, 0)) - dram_base;
623 edac_dbg(2, "using DRAM Base register to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
624 (unsigned long)sys_addr, (unsigned long)dram_addr);
625 return dram_addr;
629 * @intlv_en is the value of the IntlvEn field from a DRAM Base register
630 * (section 3.4.4.1). Return the number of bits from a SysAddr that are used
631 * for node interleaving.
633 static int num_node_interleave_bits(unsigned intlv_en)
635 static const int intlv_shift_table[] = { 0, 1, 0, 2, 0, 0, 0, 3 };
636 int n;
638 BUG_ON(intlv_en > 7);
639 n = intlv_shift_table[intlv_en];
640 return n;
643 /* Translate the DramAddr given by @dram_addr to an InputAddr. */
644 static u64 dram_addr_to_input_addr(struct mem_ctl_info *mci, u64 dram_addr)
646 struct amd64_pvt *pvt;
647 int intlv_shift;
648 u64 input_addr;
650 pvt = mci->pvt_info;
653 * See the start of section 3.4.4 (p. 70, BKDG #26094, K8, revA-E)
654 * concerning translating a DramAddr to an InputAddr.
656 intlv_shift = num_node_interleave_bits(dram_intlv_en(pvt, 0));
657 input_addr = ((dram_addr >> intlv_shift) & GENMASK_ULL(35, 12)) +
658 (dram_addr & 0xfff);
660 edac_dbg(2, " Intlv Shift=%d DramAddr=0x%lx maps to InputAddr=0x%lx\n",
661 intlv_shift, (unsigned long)dram_addr,
662 (unsigned long)input_addr);
664 return input_addr;
668 * Translate the SysAddr represented by @sys_addr to an InputAddr. It is
669 * assumed that @sys_addr maps to the node given by mci.
671 static u64 sys_addr_to_input_addr(struct mem_ctl_info *mci, u64 sys_addr)
673 u64 input_addr;
675 input_addr =
676 dram_addr_to_input_addr(mci, sys_addr_to_dram_addr(mci, sys_addr));
678 edac_dbg(2, "SysAddr 0x%lx translates to InputAddr 0x%lx\n",
679 (unsigned long)sys_addr, (unsigned long)input_addr);
681 return input_addr;
684 /* Map the Error address to a PAGE and PAGE OFFSET. */
685 static inline void error_address_to_page_and_offset(u64 error_address,
686 struct err_info *err)
688 err->page = (u32) (error_address >> PAGE_SHIFT);
689 err->offset = ((u32) error_address) & ~PAGE_MASK;
693 * @sys_addr is an error address (a SysAddr) extracted from the MCA NB Address
694 * Low (section 3.6.4.5) and MCA NB Address High (section 3.6.4.6) registers
695 * of a node that detected an ECC memory error. mci represents the node that
696 * the error address maps to (possibly different from the node that detected
697 * the error). Return the number of the csrow that sys_addr maps to, or -1 on
698 * error.
700 static int sys_addr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr)
702 int csrow;
704 csrow = input_addr_to_csrow(mci, sys_addr_to_input_addr(mci, sys_addr));
706 if (csrow == -1)
707 amd64_mc_err(mci, "Failed to translate InputAddr to csrow for "
708 "address 0x%lx\n", (unsigned long)sys_addr);
709 return csrow;
712 static int get_channel_from_ecc_syndrome(struct mem_ctl_info *, u16);
715 * Determine if the DIMMs have ECC enabled. ECC is enabled ONLY if all the DIMMs
716 * are ECC capable.
718 static unsigned long determine_edac_cap(struct amd64_pvt *pvt)
720 unsigned long edac_cap = EDAC_FLAG_NONE;
721 u8 bit;
723 if (pvt->umc) {
724 u8 i, umc_en_mask = 0, dimm_ecc_en_mask = 0;
726 for_each_umc(i) {
727 if (!(pvt->umc[i].sdp_ctrl & UMC_SDP_INIT))
728 continue;
730 umc_en_mask |= BIT(i);
732 /* UMC Configuration bit 12 (DimmEccEn) */
733 if (pvt->umc[i].umc_cfg & BIT(12))
734 dimm_ecc_en_mask |= BIT(i);
737 if (umc_en_mask == dimm_ecc_en_mask)
738 edac_cap = EDAC_FLAG_SECDED;
739 } else {
740 bit = (pvt->fam > 0xf || pvt->ext_model >= K8_REV_F)
741 ? 19
742 : 17;
744 if (pvt->dclr0 & BIT(bit))
745 edac_cap = EDAC_FLAG_SECDED;
748 return edac_cap;
751 static void debug_display_dimm_sizes(struct amd64_pvt *, u8);
753 static void debug_dump_dramcfg_low(struct amd64_pvt *pvt, u32 dclr, int chan)
755 edac_dbg(1, "F2x%d90 (DRAM Cfg Low): 0x%08x\n", chan, dclr);
757 if (pvt->dram_type == MEM_LRDDR3) {
758 u32 dcsm = pvt->csels[chan].csmasks[0];
760 * It's assumed all LRDIMMs in a DCT are going to be of
761 * same 'type' until proven otherwise. So, use a cs
762 * value of '0' here to get dcsm value.
764 edac_dbg(1, " LRDIMM %dx rank multiply\n", (dcsm & 0x3));
767 edac_dbg(1, "All DIMMs support ECC:%s\n",
768 (dclr & BIT(19)) ? "yes" : "no");
771 edac_dbg(1, " PAR/ERR parity: %s\n",
772 (dclr & BIT(8)) ? "enabled" : "disabled");
774 if (pvt->fam == 0x10)
775 edac_dbg(1, " DCT 128bit mode width: %s\n",
776 (dclr & BIT(11)) ? "128b" : "64b");
778 edac_dbg(1, " x4 logical DIMMs present: L0: %s L1: %s L2: %s L3: %s\n",
779 (dclr & BIT(12)) ? "yes" : "no",
780 (dclr & BIT(13)) ? "yes" : "no",
781 (dclr & BIT(14)) ? "yes" : "no",
782 (dclr & BIT(15)) ? "yes" : "no");
785 #define CS_EVEN_PRIMARY BIT(0)
786 #define CS_ODD_PRIMARY BIT(1)
787 #define CS_EVEN_SECONDARY BIT(2)
788 #define CS_ODD_SECONDARY BIT(3)
790 #define CS_EVEN (CS_EVEN_PRIMARY | CS_EVEN_SECONDARY)
791 #define CS_ODD (CS_ODD_PRIMARY | CS_ODD_SECONDARY)
793 static int f17_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt)
795 int cs_mode = 0;
797 if (csrow_enabled(2 * dimm, ctrl, pvt))
798 cs_mode |= CS_EVEN_PRIMARY;
800 if (csrow_enabled(2 * dimm + 1, ctrl, pvt))
801 cs_mode |= CS_ODD_PRIMARY;
803 /* Asymmetric dual-rank DIMM support. */
804 if (csrow_sec_enabled(2 * dimm + 1, ctrl, pvt))
805 cs_mode |= CS_ODD_SECONDARY;
807 return cs_mode;
810 static void debug_display_dimm_sizes_df(struct amd64_pvt *pvt, u8 ctrl)
812 int dimm, size0, size1, cs0, cs1, cs_mode;
814 edac_printk(KERN_DEBUG, EDAC_MC, "UMC%d chip selects:\n", ctrl);
816 for (dimm = 0; dimm < 2; dimm++) {
817 cs0 = dimm * 2;
818 cs1 = dimm * 2 + 1;
820 cs_mode = f17_get_cs_mode(dimm, ctrl, pvt);
822 size0 = pvt->ops->dbam_to_cs(pvt, ctrl, cs_mode, cs0);
823 size1 = pvt->ops->dbam_to_cs(pvt, ctrl, cs_mode, cs1);
825 amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
826 cs0, size0,
827 cs1, size1);
831 static void __dump_misc_regs_df(struct amd64_pvt *pvt)
833 struct amd64_umc *umc;
834 u32 i, tmp, umc_base;
836 for_each_umc(i) {
837 umc_base = get_umc_base(i);
838 umc = &pvt->umc[i];
840 edac_dbg(1, "UMC%d DIMM cfg: 0x%x\n", i, umc->dimm_cfg);
841 edac_dbg(1, "UMC%d UMC cfg: 0x%x\n", i, umc->umc_cfg);
842 edac_dbg(1, "UMC%d SDP ctrl: 0x%x\n", i, umc->sdp_ctrl);
843 edac_dbg(1, "UMC%d ECC ctrl: 0x%x\n", i, umc->ecc_ctrl);
845 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_ECC_BAD_SYMBOL, &tmp);
846 edac_dbg(1, "UMC%d ECC bad symbol: 0x%x\n", i, tmp);
848 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_UMC_CAP, &tmp);
849 edac_dbg(1, "UMC%d UMC cap: 0x%x\n", i, tmp);
850 edac_dbg(1, "UMC%d UMC cap high: 0x%x\n", i, umc->umc_cap_hi);
852 edac_dbg(1, "UMC%d ECC capable: %s, ChipKill ECC capable: %s\n",
853 i, (umc->umc_cap_hi & BIT(30)) ? "yes" : "no",
854 (umc->umc_cap_hi & BIT(31)) ? "yes" : "no");
855 edac_dbg(1, "UMC%d All DIMMs support ECC: %s\n",
856 i, (umc->umc_cfg & BIT(12)) ? "yes" : "no");
857 edac_dbg(1, "UMC%d x4 DIMMs present: %s\n",
858 i, (umc->dimm_cfg & BIT(6)) ? "yes" : "no");
859 edac_dbg(1, "UMC%d x16 DIMMs present: %s\n",
860 i, (umc->dimm_cfg & BIT(7)) ? "yes" : "no");
862 if (pvt->dram_type == MEM_LRDDR4) {
863 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_ADDR_CFG, &tmp);
864 edac_dbg(1, "UMC%d LRDIMM %dx rank multiply\n",
865 i, 1 << ((tmp >> 4) & 0x3));
868 debug_display_dimm_sizes_df(pvt, i);
871 edac_dbg(1, "F0x104 (DRAM Hole Address): 0x%08x, base: 0x%08x\n",
872 pvt->dhar, dhar_base(pvt));
875 /* Display and decode various NB registers for debug purposes. */
876 static void __dump_misc_regs(struct amd64_pvt *pvt)
878 edac_dbg(1, "F3xE8 (NB Cap): 0x%08x\n", pvt->nbcap);
880 edac_dbg(1, " NB two channel DRAM capable: %s\n",
881 (pvt->nbcap & NBCAP_DCT_DUAL) ? "yes" : "no");
883 edac_dbg(1, " ECC capable: %s, ChipKill ECC capable: %s\n",
884 (pvt->nbcap & NBCAP_SECDED) ? "yes" : "no",
885 (pvt->nbcap & NBCAP_CHIPKILL) ? "yes" : "no");
887 debug_dump_dramcfg_low(pvt, pvt->dclr0, 0);
889 edac_dbg(1, "F3xB0 (Online Spare): 0x%08x\n", pvt->online_spare);
891 edac_dbg(1, "F1xF0 (DRAM Hole Address): 0x%08x, base: 0x%08x, offset: 0x%08x\n",
892 pvt->dhar, dhar_base(pvt),
893 (pvt->fam == 0xf) ? k8_dhar_offset(pvt)
894 : f10_dhar_offset(pvt));
896 debug_display_dimm_sizes(pvt, 0);
898 /* everything below this point is Fam10h and above */
899 if (pvt->fam == 0xf)
900 return;
902 debug_display_dimm_sizes(pvt, 1);
904 /* Only if NOT ganged does dclr1 have valid info */
905 if (!dct_ganging_enabled(pvt))
906 debug_dump_dramcfg_low(pvt, pvt->dclr1, 1);
909 /* Display and decode various NB registers for debug purposes. */
910 static void dump_misc_regs(struct amd64_pvt *pvt)
912 if (pvt->umc)
913 __dump_misc_regs_df(pvt);
914 else
915 __dump_misc_regs(pvt);
917 edac_dbg(1, " DramHoleValid: %s\n", dhar_valid(pvt) ? "yes" : "no");
919 amd64_info("using x%u syndromes.\n", pvt->ecc_sym_sz);
923 * See BKDG, F2x[1,0][5C:40], F2[1,0][6C:60]
925 static void prep_chip_selects(struct amd64_pvt *pvt)
927 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
928 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
929 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 8;
930 } else if (pvt->fam == 0x15 && pvt->model == 0x30) {
931 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 4;
932 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 2;
933 } else if (pvt->fam >= 0x17) {
934 int umc;
936 for_each_umc(umc) {
937 pvt->csels[umc].b_cnt = 4;
938 pvt->csels[umc].m_cnt = 2;
941 } else {
942 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
943 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 4;
947 static void read_umc_base_mask(struct amd64_pvt *pvt)
949 u32 umc_base_reg, umc_base_reg_sec;
950 u32 umc_mask_reg, umc_mask_reg_sec;
951 u32 base_reg, base_reg_sec;
952 u32 mask_reg, mask_reg_sec;
953 u32 *base, *base_sec;
954 u32 *mask, *mask_sec;
955 int cs, umc;
957 for_each_umc(umc) {
958 umc_base_reg = get_umc_base(umc) + UMCCH_BASE_ADDR;
959 umc_base_reg_sec = get_umc_base(umc) + UMCCH_BASE_ADDR_SEC;
961 for_each_chip_select(cs, umc, pvt) {
962 base = &pvt->csels[umc].csbases[cs];
963 base_sec = &pvt->csels[umc].csbases_sec[cs];
965 base_reg = umc_base_reg + (cs * 4);
966 base_reg_sec = umc_base_reg_sec + (cs * 4);
968 if (!amd_smn_read(pvt->mc_node_id, base_reg, base))
969 edac_dbg(0, " DCSB%d[%d]=0x%08x reg: 0x%x\n",
970 umc, cs, *base, base_reg);
972 if (!amd_smn_read(pvt->mc_node_id, base_reg_sec, base_sec))
973 edac_dbg(0, " DCSB_SEC%d[%d]=0x%08x reg: 0x%x\n",
974 umc, cs, *base_sec, base_reg_sec);
977 umc_mask_reg = get_umc_base(umc) + UMCCH_ADDR_MASK;
978 umc_mask_reg_sec = get_umc_base(umc) + UMCCH_ADDR_MASK_SEC;
980 for_each_chip_select_mask(cs, umc, pvt) {
981 mask = &pvt->csels[umc].csmasks[cs];
982 mask_sec = &pvt->csels[umc].csmasks_sec[cs];
984 mask_reg = umc_mask_reg + (cs * 4);
985 mask_reg_sec = umc_mask_reg_sec + (cs * 4);
987 if (!amd_smn_read(pvt->mc_node_id, mask_reg, mask))
988 edac_dbg(0, " DCSM%d[%d]=0x%08x reg: 0x%x\n",
989 umc, cs, *mask, mask_reg);
991 if (!amd_smn_read(pvt->mc_node_id, mask_reg_sec, mask_sec))
992 edac_dbg(0, " DCSM_SEC%d[%d]=0x%08x reg: 0x%x\n",
993 umc, cs, *mask_sec, mask_reg_sec);
999 * Function 2 Offset F10_DCSB0; read in the DCS Base and DCS Mask registers
1001 static void read_dct_base_mask(struct amd64_pvt *pvt)
1003 int cs;
1005 prep_chip_selects(pvt);
1007 if (pvt->umc)
1008 return read_umc_base_mask(pvt);
1010 for_each_chip_select(cs, 0, pvt) {
1011 int reg0 = DCSB0 + (cs * 4);
1012 int reg1 = DCSB1 + (cs * 4);
1013 u32 *base0 = &pvt->csels[0].csbases[cs];
1014 u32 *base1 = &pvt->csels[1].csbases[cs];
1016 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0))
1017 edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n",
1018 cs, *base0, reg0);
1020 if (pvt->fam == 0xf)
1021 continue;
1023 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1))
1024 edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n",
1025 cs, *base1, (pvt->fam == 0x10) ? reg1
1026 : reg0);
1029 for_each_chip_select_mask(cs, 0, pvt) {
1030 int reg0 = DCSM0 + (cs * 4);
1031 int reg1 = DCSM1 + (cs * 4);
1032 u32 *mask0 = &pvt->csels[0].csmasks[cs];
1033 u32 *mask1 = &pvt->csels[1].csmasks[cs];
1035 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0))
1036 edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n",
1037 cs, *mask0, reg0);
1039 if (pvt->fam == 0xf)
1040 continue;
1042 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1))
1043 edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n",
1044 cs, *mask1, (pvt->fam == 0x10) ? reg1
1045 : reg0);
1049 static void determine_memory_type(struct amd64_pvt *pvt)
1051 u32 dram_ctrl, dcsm;
1053 if (pvt->umc) {
1054 if ((pvt->umc[0].dimm_cfg | pvt->umc[1].dimm_cfg) & BIT(5))
1055 pvt->dram_type = MEM_LRDDR4;
1056 else if ((pvt->umc[0].dimm_cfg | pvt->umc[1].dimm_cfg) & BIT(4))
1057 pvt->dram_type = MEM_RDDR4;
1058 else
1059 pvt->dram_type = MEM_DDR4;
1060 return;
1063 switch (pvt->fam) {
1064 case 0xf:
1065 if (pvt->ext_model >= K8_REV_F)
1066 goto ddr3;
1068 pvt->dram_type = (pvt->dclr0 & BIT(18)) ? MEM_DDR : MEM_RDDR;
1069 return;
1071 case 0x10:
1072 if (pvt->dchr0 & DDR3_MODE)
1073 goto ddr3;
1075 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR2 : MEM_RDDR2;
1076 return;
1078 case 0x15:
1079 if (pvt->model < 0x60)
1080 goto ddr3;
1083 * Model 0x60h needs special handling:
1085 * We use a Chip Select value of '0' to obtain dcsm.
1086 * Theoretically, it is possible to populate LRDIMMs of different
1087 * 'Rank' value on a DCT. But this is not the common case. So,
1088 * it's reasonable to assume all DIMMs are going to be of same
1089 * 'type' until proven otherwise.
1091 amd64_read_dct_pci_cfg(pvt, 0, DRAM_CONTROL, &dram_ctrl);
1092 dcsm = pvt->csels[0].csmasks[0];
1094 if (((dram_ctrl >> 8) & 0x7) == 0x2)
1095 pvt->dram_type = MEM_DDR4;
1096 else if (pvt->dclr0 & BIT(16))
1097 pvt->dram_type = MEM_DDR3;
1098 else if (dcsm & 0x3)
1099 pvt->dram_type = MEM_LRDDR3;
1100 else
1101 pvt->dram_type = MEM_RDDR3;
1103 return;
1105 case 0x16:
1106 goto ddr3;
1108 default:
1109 WARN(1, KERN_ERR "%s: Family??? 0x%x\n", __func__, pvt->fam);
1110 pvt->dram_type = MEM_EMPTY;
1112 return;
1114 ddr3:
1115 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR3 : MEM_RDDR3;
1118 /* Get the number of DCT channels the memory controller is using. */
1119 static int k8_early_channel_count(struct amd64_pvt *pvt)
1121 int flag;
1123 if (pvt->ext_model >= K8_REV_F)
1124 /* RevF (NPT) and later */
1125 flag = pvt->dclr0 & WIDTH_128;
1126 else
1127 /* RevE and earlier */
1128 flag = pvt->dclr0 & REVE_WIDTH_128;
1130 /* not used */
1131 pvt->dclr1 = 0;
1133 return (flag) ? 2 : 1;
1136 /* On F10h and later ErrAddr is MC4_ADDR[47:1] */
1137 static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m)
1139 u16 mce_nid = topology_die_id(m->extcpu);
1140 struct mem_ctl_info *mci;
1141 u8 start_bit = 1;
1142 u8 end_bit = 47;
1143 u64 addr;
1145 mci = edac_mc_find(mce_nid);
1146 if (!mci)
1147 return 0;
1149 pvt = mci->pvt_info;
1151 if (pvt->fam == 0xf) {
1152 start_bit = 3;
1153 end_bit = 39;
1156 addr = m->addr & GENMASK_ULL(end_bit, start_bit);
1159 * Erratum 637 workaround
1161 if (pvt->fam == 0x15) {
1162 u64 cc6_base, tmp_addr;
1163 u32 tmp;
1164 u8 intlv_en;
1166 if ((addr & GENMASK_ULL(47, 24)) >> 24 != 0x00fdf7)
1167 return addr;
1170 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_LIM, &tmp);
1171 intlv_en = tmp >> 21 & 0x7;
1173 /* add [47:27] + 3 trailing bits */
1174 cc6_base = (tmp & GENMASK_ULL(20, 0)) << 3;
1176 /* reverse and add DramIntlvEn */
1177 cc6_base |= intlv_en ^ 0x7;
1179 /* pin at [47:24] */
1180 cc6_base <<= 24;
1182 if (!intlv_en)
1183 return cc6_base | (addr & GENMASK_ULL(23, 0));
1185 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_BASE, &tmp);
1187 /* faster log2 */
1188 tmp_addr = (addr & GENMASK_ULL(23, 12)) << __fls(intlv_en + 1);
1190 /* OR DramIntlvSel into bits [14:12] */
1191 tmp_addr |= (tmp & GENMASK_ULL(23, 21)) >> 9;
1193 /* add remaining [11:0] bits from original MC4_ADDR */
1194 tmp_addr |= addr & GENMASK_ULL(11, 0);
1196 return cc6_base | tmp_addr;
1199 return addr;
1202 static struct pci_dev *pci_get_related_function(unsigned int vendor,
1203 unsigned int device,
1204 struct pci_dev *related)
1206 struct pci_dev *dev = NULL;
1208 while ((dev = pci_get_device(vendor, device, dev))) {
1209 if (pci_domain_nr(dev->bus) == pci_domain_nr(related->bus) &&
1210 (dev->bus->number == related->bus->number) &&
1211 (PCI_SLOT(dev->devfn) == PCI_SLOT(related->devfn)))
1212 break;
1215 return dev;
1218 static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range)
1220 struct amd_northbridge *nb;
1221 struct pci_dev *f1 = NULL;
1222 unsigned int pci_func;
1223 int off = range << 3;
1224 u32 llim;
1226 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_LO + off, &pvt->ranges[range].base.lo);
1227 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_LO + off, &pvt->ranges[range].lim.lo);
1229 if (pvt->fam == 0xf)
1230 return;
1232 if (!dram_rw(pvt, range))
1233 return;
1235 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_HI + off, &pvt->ranges[range].base.hi);
1236 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi);
1238 /* F15h: factor in CC6 save area by reading dst node's limit reg */
1239 if (pvt->fam != 0x15)
1240 return;
1242 nb = node_to_amd_nb(dram_dst_node(pvt, range));
1243 if (WARN_ON(!nb))
1244 return;
1246 if (pvt->model == 0x60)
1247 pci_func = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1;
1248 else if (pvt->model == 0x30)
1249 pci_func = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1;
1250 else
1251 pci_func = PCI_DEVICE_ID_AMD_15H_NB_F1;
1253 f1 = pci_get_related_function(nb->misc->vendor, pci_func, nb->misc);
1254 if (WARN_ON(!f1))
1255 return;
1257 amd64_read_pci_cfg(f1, DRAM_LOCAL_NODE_LIM, &llim);
1259 pvt->ranges[range].lim.lo &= GENMASK_ULL(15, 0);
1261 /* {[39:27],111b} */
1262 pvt->ranges[range].lim.lo |= ((llim & 0x1fff) << 3 | 0x7) << 16;
1264 pvt->ranges[range].lim.hi &= GENMASK_ULL(7, 0);
1266 /* [47:40] */
1267 pvt->ranges[range].lim.hi |= llim >> 13;
1269 pci_dev_put(f1);
1272 static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1273 struct err_info *err)
1275 struct amd64_pvt *pvt = mci->pvt_info;
1277 error_address_to_page_and_offset(sys_addr, err);
1280 * Find out which node the error address belongs to. This may be
1281 * different from the node that detected the error.
1283 err->src_mci = find_mc_by_sys_addr(mci, sys_addr);
1284 if (!err->src_mci) {
1285 amd64_mc_err(mci, "failed to map error addr 0x%lx to a node\n",
1286 (unsigned long)sys_addr);
1287 err->err_code = ERR_NODE;
1288 return;
1291 /* Now map the sys_addr to a CSROW */
1292 err->csrow = sys_addr_to_csrow(err->src_mci, sys_addr);
1293 if (err->csrow < 0) {
1294 err->err_code = ERR_CSROW;
1295 return;
1298 /* CHIPKILL enabled */
1299 if (pvt->nbcfg & NBCFG_CHIPKILL) {
1300 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
1301 if (err->channel < 0) {
1303 * Syndrome didn't map, so we don't know which of the
1304 * 2 DIMMs is in error. So we need to ID 'both' of them
1305 * as suspect.
1307 amd64_mc_warn(err->src_mci, "unknown syndrome 0x%04x - "
1308 "possible error reporting race\n",
1309 err->syndrome);
1310 err->err_code = ERR_CHANNEL;
1311 return;
1313 } else {
1315 * non-chipkill ecc mode
1317 * The k8 documentation is unclear about how to determine the
1318 * channel number when using non-chipkill memory. This method
1319 * was obtained from email communication with someone at AMD.
1320 * (Wish the email was placed in this comment - norsk)
1322 err->channel = ((sys_addr & BIT(3)) != 0);
1326 static int ddr2_cs_size(unsigned i, bool dct_width)
1328 unsigned shift = 0;
1330 if (i <= 2)
1331 shift = i;
1332 else if (!(i & 0x1))
1333 shift = i >> 1;
1334 else
1335 shift = (i + 1) >> 1;
1337 return 128 << (shift + !!dct_width);
1340 static int k8_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1341 unsigned cs_mode, int cs_mask_nr)
1343 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1345 if (pvt->ext_model >= K8_REV_F) {
1346 WARN_ON(cs_mode > 11);
1347 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1349 else if (pvt->ext_model >= K8_REV_D) {
1350 unsigned diff;
1351 WARN_ON(cs_mode > 10);
1354 * the below calculation, besides trying to win an obfuscated C
1355 * contest, maps cs_mode values to DIMM chip select sizes. The
1356 * mappings are:
1358 * cs_mode CS size (mb)
1359 * ======= ============
1360 * 0 32
1361 * 1 64
1362 * 2 128
1363 * 3 128
1364 * 4 256
1365 * 5 512
1366 * 6 256
1367 * 7 512
1368 * 8 1024
1369 * 9 1024
1370 * 10 2048
1372 * Basically, it calculates a value with which to shift the
1373 * smallest CS size of 32MB.
1375 * ddr[23]_cs_size have a similar purpose.
1377 diff = cs_mode/3 + (unsigned)(cs_mode > 5);
1379 return 32 << (cs_mode - diff);
1381 else {
1382 WARN_ON(cs_mode > 6);
1383 return 32 << cs_mode;
1388 * Get the number of DCT channels in use.
1390 * Return:
1391 * number of Memory Channels in operation
1392 * Pass back:
1393 * contents of the DCL0_LOW register
1395 static int f1x_early_channel_count(struct amd64_pvt *pvt)
1397 int i, j, channels = 0;
1399 /* On F10h, if we are in 128 bit mode, then we are using 2 channels */
1400 if (pvt->fam == 0x10 && (pvt->dclr0 & WIDTH_128))
1401 return 2;
1404 * Need to check if in unganged mode: In such, there are 2 channels,
1405 * but they are not in 128 bit mode and thus the above 'dclr0' status
1406 * bit will be OFF.
1408 * Need to check DCT0[0] and DCT1[0] to see if only one of them has
1409 * their CSEnable bit on. If so, then SINGLE DIMM case.
1411 edac_dbg(0, "Data width is not 128 bits - need more decoding\n");
1414 * Check DRAM Bank Address Mapping values for each DIMM to see if there
1415 * is more than just one DIMM present in unganged mode. Need to check
1416 * both controllers since DIMMs can be placed in either one.
1418 for (i = 0; i < 2; i++) {
1419 u32 dbam = (i ? pvt->dbam1 : pvt->dbam0);
1421 for (j = 0; j < 4; j++) {
1422 if (DBAM_DIMM(j, dbam) > 0) {
1423 channels++;
1424 break;
1429 if (channels > 2)
1430 channels = 2;
1432 amd64_info("MCT channel count: %d\n", channels);
1434 return channels;
1437 static int f17_early_channel_count(struct amd64_pvt *pvt)
1439 int i, channels = 0;
1441 /* SDP Control bit 31 (SdpInit) is clear for unused UMC channels */
1442 for_each_umc(i)
1443 channels += !!(pvt->umc[i].sdp_ctrl & UMC_SDP_INIT);
1445 amd64_info("MCT channel count: %d\n", channels);
1447 return channels;
1450 static int ddr3_cs_size(unsigned i, bool dct_width)
1452 unsigned shift = 0;
1453 int cs_size = 0;
1455 if (i == 0 || i == 3 || i == 4)
1456 cs_size = -1;
1457 else if (i <= 2)
1458 shift = i;
1459 else if (i == 12)
1460 shift = 7;
1461 else if (!(i & 0x1))
1462 shift = i >> 1;
1463 else
1464 shift = (i + 1) >> 1;
1466 if (cs_size != -1)
1467 cs_size = (128 * (1 << !!dct_width)) << shift;
1469 return cs_size;
1472 static int ddr3_lrdimm_cs_size(unsigned i, unsigned rank_multiply)
1474 unsigned shift = 0;
1475 int cs_size = 0;
1477 if (i < 4 || i == 6)
1478 cs_size = -1;
1479 else if (i == 12)
1480 shift = 7;
1481 else if (!(i & 0x1))
1482 shift = i >> 1;
1483 else
1484 shift = (i + 1) >> 1;
1486 if (cs_size != -1)
1487 cs_size = rank_multiply * (128 << shift);
1489 return cs_size;
1492 static int ddr4_cs_size(unsigned i)
1494 int cs_size = 0;
1496 if (i == 0)
1497 cs_size = -1;
1498 else if (i == 1)
1499 cs_size = 1024;
1500 else
1501 /* Min cs_size = 1G */
1502 cs_size = 1024 * (1 << (i >> 1));
1504 return cs_size;
1507 static int f10_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1508 unsigned cs_mode, int cs_mask_nr)
1510 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1512 WARN_ON(cs_mode > 11);
1514 if (pvt->dchr0 & DDR3_MODE || pvt->dchr1 & DDR3_MODE)
1515 return ddr3_cs_size(cs_mode, dclr & WIDTH_128);
1516 else
1517 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1521 * F15h supports only 64bit DCT interfaces
1523 static int f15_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1524 unsigned cs_mode, int cs_mask_nr)
1526 WARN_ON(cs_mode > 12);
1528 return ddr3_cs_size(cs_mode, false);
1531 /* F15h M60h supports DDR4 mapping as well.. */
1532 static int f15_m60h_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1533 unsigned cs_mode, int cs_mask_nr)
1535 int cs_size;
1536 u32 dcsm = pvt->csels[dct].csmasks[cs_mask_nr];
1538 WARN_ON(cs_mode > 12);
1540 if (pvt->dram_type == MEM_DDR4) {
1541 if (cs_mode > 9)
1542 return -1;
1544 cs_size = ddr4_cs_size(cs_mode);
1545 } else if (pvt->dram_type == MEM_LRDDR3) {
1546 unsigned rank_multiply = dcsm & 0xf;
1548 if (rank_multiply == 3)
1549 rank_multiply = 4;
1550 cs_size = ddr3_lrdimm_cs_size(cs_mode, rank_multiply);
1551 } else {
1552 /* Minimum cs size is 512mb for F15hM60h*/
1553 if (cs_mode == 0x1)
1554 return -1;
1556 cs_size = ddr3_cs_size(cs_mode, false);
1559 return cs_size;
1563 * F16h and F15h model 30h have only limited cs_modes.
1565 static int f16_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1566 unsigned cs_mode, int cs_mask_nr)
1568 WARN_ON(cs_mode > 12);
1570 if (cs_mode == 6 || cs_mode == 8 ||
1571 cs_mode == 9 || cs_mode == 12)
1572 return -1;
1573 else
1574 return ddr3_cs_size(cs_mode, false);
1577 static int f17_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc,
1578 unsigned int cs_mode, int csrow_nr)
1580 u32 addr_mask_orig, addr_mask_deinterleaved;
1581 u32 msb, weight, num_zero_bits;
1582 int dimm, size = 0;
1584 /* No Chip Selects are enabled. */
1585 if (!cs_mode)
1586 return size;
1588 /* Requested size of an even CS but none are enabled. */
1589 if (!(cs_mode & CS_EVEN) && !(csrow_nr & 1))
1590 return size;
1592 /* Requested size of an odd CS but none are enabled. */
1593 if (!(cs_mode & CS_ODD) && (csrow_nr & 1))
1594 return size;
1597 * There is one mask per DIMM, and two Chip Selects per DIMM.
1598 * CS0 and CS1 -> DIMM0
1599 * CS2 and CS3 -> DIMM1
1601 dimm = csrow_nr >> 1;
1603 /* Asymmetric dual-rank DIMM support. */
1604 if ((csrow_nr & 1) && (cs_mode & CS_ODD_SECONDARY))
1605 addr_mask_orig = pvt->csels[umc].csmasks_sec[dimm];
1606 else
1607 addr_mask_orig = pvt->csels[umc].csmasks[dimm];
1610 * The number of zero bits in the mask is equal to the number of bits
1611 * in a full mask minus the number of bits in the current mask.
1613 * The MSB is the number of bits in the full mask because BIT[0] is
1614 * always 0.
1616 msb = fls(addr_mask_orig) - 1;
1617 weight = hweight_long(addr_mask_orig);
1618 num_zero_bits = msb - weight;
1620 /* Take the number of zero bits off from the top of the mask. */
1621 addr_mask_deinterleaved = GENMASK_ULL(msb - num_zero_bits, 1);
1623 edac_dbg(1, "CS%d DIMM%d AddrMasks:\n", csrow_nr, dimm);
1624 edac_dbg(1, " Original AddrMask: 0x%x\n", addr_mask_orig);
1625 edac_dbg(1, " Deinterleaved AddrMask: 0x%x\n", addr_mask_deinterleaved);
1627 /* Register [31:1] = Address [39:9]. Size is in kBs here. */
1628 size = (addr_mask_deinterleaved >> 2) + 1;
1630 /* Return size in MBs. */
1631 return size >> 10;
1634 static void read_dram_ctl_register(struct amd64_pvt *pvt)
1637 if (pvt->fam == 0xf)
1638 return;
1640 if (!amd64_read_pci_cfg(pvt->F2, DCT_SEL_LO, &pvt->dct_sel_lo)) {
1641 edac_dbg(0, "F2x110 (DCTSelLow): 0x%08x, High range addrs at: 0x%x\n",
1642 pvt->dct_sel_lo, dct_sel_baseaddr(pvt));
1644 edac_dbg(0, " DCTs operate in %s mode\n",
1645 (dct_ganging_enabled(pvt) ? "ganged" : "unganged"));
1647 if (!dct_ganging_enabled(pvt))
1648 edac_dbg(0, " Address range split per DCT: %s\n",
1649 (dct_high_range_enabled(pvt) ? "yes" : "no"));
1651 edac_dbg(0, " data interleave for ECC: %s, DRAM cleared since last warm reset: %s\n",
1652 (dct_data_intlv_enabled(pvt) ? "enabled" : "disabled"),
1653 (dct_memory_cleared(pvt) ? "yes" : "no"));
1655 edac_dbg(0, " channel interleave: %s, "
1656 "interleave bits selector: 0x%x\n",
1657 (dct_interleave_enabled(pvt) ? "enabled" : "disabled"),
1658 dct_sel_interleave_addr(pvt));
1661 amd64_read_pci_cfg(pvt->F2, DCT_SEL_HI, &pvt->dct_sel_hi);
1665 * Determine channel (DCT) based on the interleaving mode (see F15h M30h BKDG,
1666 * 2.10.12 Memory Interleaving Modes).
1668 static u8 f15_m30h_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
1669 u8 intlv_en, int num_dcts_intlv,
1670 u32 dct_sel)
1672 u8 channel = 0;
1673 u8 select;
1675 if (!(intlv_en))
1676 return (u8)(dct_sel);
1678 if (num_dcts_intlv == 2) {
1679 select = (sys_addr >> 8) & 0x3;
1680 channel = select ? 0x3 : 0;
1681 } else if (num_dcts_intlv == 4) {
1682 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1683 switch (intlv_addr) {
1684 case 0x4:
1685 channel = (sys_addr >> 8) & 0x3;
1686 break;
1687 case 0x5:
1688 channel = (sys_addr >> 9) & 0x3;
1689 break;
1692 return channel;
1696 * Determine channel (DCT) based on the interleaving mode: F10h BKDG, 2.8.9 Memory
1697 * Interleaving Modes.
1699 static u8 f1x_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
1700 bool hi_range_sel, u8 intlv_en)
1702 u8 dct_sel_high = (pvt->dct_sel_lo >> 1) & 1;
1704 if (dct_ganging_enabled(pvt))
1705 return 0;
1707 if (hi_range_sel)
1708 return dct_sel_high;
1711 * see F2x110[DctSelIntLvAddr] - channel interleave mode
1713 if (dct_interleave_enabled(pvt)) {
1714 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1716 /* return DCT select function: 0=DCT0, 1=DCT1 */
1717 if (!intlv_addr)
1718 return sys_addr >> 6 & 1;
1720 if (intlv_addr & 0x2) {
1721 u8 shift = intlv_addr & 0x1 ? 9 : 6;
1722 u32 temp = hweight_long((u32) ((sys_addr >> 16) & 0x1F)) & 1;
1724 return ((sys_addr >> shift) & 1) ^ temp;
1727 if (intlv_addr & 0x4) {
1728 u8 shift = intlv_addr & 0x1 ? 9 : 8;
1730 return (sys_addr >> shift) & 1;
1733 return (sys_addr >> (12 + hweight8(intlv_en))) & 1;
1736 if (dct_high_range_enabled(pvt))
1737 return ~dct_sel_high & 1;
1739 return 0;
1742 /* Convert the sys_addr to the normalized DCT address */
1743 static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, u8 range,
1744 u64 sys_addr, bool hi_rng,
1745 u32 dct_sel_base_addr)
1747 u64 chan_off;
1748 u64 dram_base = get_dram_base(pvt, range);
1749 u64 hole_off = f10_dhar_offset(pvt);
1750 u64 dct_sel_base_off = (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16;
1752 if (hi_rng) {
1754 * if
1755 * base address of high range is below 4Gb
1756 * (bits [47:27] at [31:11])
1757 * DRAM address space on this DCT is hoisted above 4Gb &&
1758 * sys_addr > 4Gb
1760 * remove hole offset from sys_addr
1761 * else
1762 * remove high range offset from sys_addr
1764 if ((!(dct_sel_base_addr >> 16) ||
1765 dct_sel_base_addr < dhar_base(pvt)) &&
1766 dhar_valid(pvt) &&
1767 (sys_addr >= BIT_64(32)))
1768 chan_off = hole_off;
1769 else
1770 chan_off = dct_sel_base_off;
1771 } else {
1773 * if
1774 * we have a valid hole &&
1775 * sys_addr > 4Gb
1777 * remove hole
1778 * else
1779 * remove dram base to normalize to DCT address
1781 if (dhar_valid(pvt) && (sys_addr >= BIT_64(32)))
1782 chan_off = hole_off;
1783 else
1784 chan_off = dram_base;
1787 return (sys_addr & GENMASK_ULL(47,6)) - (chan_off & GENMASK_ULL(47,23));
1791 * checks if the csrow passed in is marked as SPARED, if so returns the new
1792 * spare row
1794 static int f10_process_possible_spare(struct amd64_pvt *pvt, u8 dct, int csrow)
1796 int tmp_cs;
1798 if (online_spare_swap_done(pvt, dct) &&
1799 csrow == online_spare_bad_dramcs(pvt, dct)) {
1801 for_each_chip_select(tmp_cs, dct, pvt) {
1802 if (chip_select_base(tmp_cs, dct, pvt) & 0x2) {
1803 csrow = tmp_cs;
1804 break;
1808 return csrow;
1812 * Iterate over the DRAM DCT "base" and "mask" registers looking for a
1813 * SystemAddr match on the specified 'ChannelSelect' and 'NodeID'
1815 * Return:
1816 * -EINVAL: NOT FOUND
1817 * 0..csrow = Chip-Select Row
1819 static int f1x_lookup_addr_in_dct(u64 in_addr, u8 nid, u8 dct)
1821 struct mem_ctl_info *mci;
1822 struct amd64_pvt *pvt;
1823 u64 cs_base, cs_mask;
1824 int cs_found = -EINVAL;
1825 int csrow;
1827 mci = edac_mc_find(nid);
1828 if (!mci)
1829 return cs_found;
1831 pvt = mci->pvt_info;
1833 edac_dbg(1, "input addr: 0x%llx, DCT: %d\n", in_addr, dct);
1835 for_each_chip_select(csrow, dct, pvt) {
1836 if (!csrow_enabled(csrow, dct, pvt))
1837 continue;
1839 get_cs_base_and_mask(pvt, csrow, dct, &cs_base, &cs_mask);
1841 edac_dbg(1, " CSROW=%d CSBase=0x%llx CSMask=0x%llx\n",
1842 csrow, cs_base, cs_mask);
1844 cs_mask = ~cs_mask;
1846 edac_dbg(1, " (InputAddr & ~CSMask)=0x%llx (CSBase & ~CSMask)=0x%llx\n",
1847 (in_addr & cs_mask), (cs_base & cs_mask));
1849 if ((in_addr & cs_mask) == (cs_base & cs_mask)) {
1850 if (pvt->fam == 0x15 && pvt->model >= 0x30) {
1851 cs_found = csrow;
1852 break;
1854 cs_found = f10_process_possible_spare(pvt, dct, csrow);
1856 edac_dbg(1, " MATCH csrow=%d\n", cs_found);
1857 break;
1860 return cs_found;
1864 * See F2x10C. Non-interleaved graphics framebuffer memory under the 16G is
1865 * swapped with a region located at the bottom of memory so that the GPU can use
1866 * the interleaved region and thus two channels.
1868 static u64 f1x_swap_interleaved_region(struct amd64_pvt *pvt, u64 sys_addr)
1870 u32 swap_reg, swap_base, swap_limit, rgn_size, tmp_addr;
1872 if (pvt->fam == 0x10) {
1873 /* only revC3 and revE have that feature */
1874 if (pvt->model < 4 || (pvt->model < 0xa && pvt->stepping < 3))
1875 return sys_addr;
1878 amd64_read_pci_cfg(pvt->F2, SWAP_INTLV_REG, &swap_reg);
1880 if (!(swap_reg & 0x1))
1881 return sys_addr;
1883 swap_base = (swap_reg >> 3) & 0x7f;
1884 swap_limit = (swap_reg >> 11) & 0x7f;
1885 rgn_size = (swap_reg >> 20) & 0x7f;
1886 tmp_addr = sys_addr >> 27;
1888 if (!(sys_addr >> 34) &&
1889 (((tmp_addr >= swap_base) &&
1890 (tmp_addr <= swap_limit)) ||
1891 (tmp_addr < rgn_size)))
1892 return sys_addr ^ (u64)swap_base << 27;
1894 return sys_addr;
1897 /* For a given @dram_range, check if @sys_addr falls within it. */
1898 static int f1x_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
1899 u64 sys_addr, int *chan_sel)
1901 int cs_found = -EINVAL;
1902 u64 chan_addr;
1903 u32 dct_sel_base;
1904 u8 channel;
1905 bool high_range = false;
1907 u8 node_id = dram_dst_node(pvt, range);
1908 u8 intlv_en = dram_intlv_en(pvt, range);
1909 u32 intlv_sel = dram_intlv_sel(pvt, range);
1911 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
1912 range, sys_addr, get_dram_limit(pvt, range));
1914 if (dhar_valid(pvt) &&
1915 dhar_base(pvt) <= sys_addr &&
1916 sys_addr < BIT_64(32)) {
1917 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
1918 sys_addr);
1919 return -EINVAL;
1922 if (intlv_en && (intlv_sel != ((sys_addr >> 12) & intlv_en)))
1923 return -EINVAL;
1925 sys_addr = f1x_swap_interleaved_region(pvt, sys_addr);
1927 dct_sel_base = dct_sel_baseaddr(pvt);
1930 * check whether addresses >= DctSelBaseAddr[47:27] are to be used to
1931 * select between DCT0 and DCT1.
1933 if (dct_high_range_enabled(pvt) &&
1934 !dct_ganging_enabled(pvt) &&
1935 ((sys_addr >> 27) >= (dct_sel_base >> 11)))
1936 high_range = true;
1938 channel = f1x_determine_channel(pvt, sys_addr, high_range, intlv_en);
1940 chan_addr = f1x_get_norm_dct_addr(pvt, range, sys_addr,
1941 high_range, dct_sel_base);
1943 /* Remove node interleaving, see F1x120 */
1944 if (intlv_en)
1945 chan_addr = ((chan_addr >> (12 + hweight8(intlv_en))) << 12) |
1946 (chan_addr & 0xfff);
1948 /* remove channel interleave */
1949 if (dct_interleave_enabled(pvt) &&
1950 !dct_high_range_enabled(pvt) &&
1951 !dct_ganging_enabled(pvt)) {
1953 if (dct_sel_interleave_addr(pvt) != 1) {
1954 if (dct_sel_interleave_addr(pvt) == 0x3)
1955 /* hash 9 */
1956 chan_addr = ((chan_addr >> 10) << 9) |
1957 (chan_addr & 0x1ff);
1958 else
1959 /* A[6] or hash 6 */
1960 chan_addr = ((chan_addr >> 7) << 6) |
1961 (chan_addr & 0x3f);
1962 } else
1963 /* A[12] */
1964 chan_addr = ((chan_addr >> 13) << 12) |
1965 (chan_addr & 0xfff);
1968 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
1970 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, channel);
1972 if (cs_found >= 0)
1973 *chan_sel = channel;
1975 return cs_found;
1978 static int f15_m30h_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
1979 u64 sys_addr, int *chan_sel)
1981 int cs_found = -EINVAL;
1982 int num_dcts_intlv = 0;
1983 u64 chan_addr, chan_offset;
1984 u64 dct_base, dct_limit;
1985 u32 dct_cont_base_reg, dct_cont_limit_reg, tmp;
1986 u8 channel, alias_channel, leg_mmio_hole, dct_sel, dct_offset_en;
1988 u64 dhar_offset = f10_dhar_offset(pvt);
1989 u8 intlv_addr = dct_sel_interleave_addr(pvt);
1990 u8 node_id = dram_dst_node(pvt, range);
1991 u8 intlv_en = dram_intlv_en(pvt, range);
1993 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_BASE, &dct_cont_base_reg);
1994 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_LIMIT, &dct_cont_limit_reg);
1996 dct_offset_en = (u8) ((dct_cont_base_reg >> 3) & BIT(0));
1997 dct_sel = (u8) ((dct_cont_base_reg >> 4) & 0x7);
1999 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
2000 range, sys_addr, get_dram_limit(pvt, range));
2002 if (!(get_dram_base(pvt, range) <= sys_addr) &&
2003 !(get_dram_limit(pvt, range) >= sys_addr))
2004 return -EINVAL;
2006 if (dhar_valid(pvt) &&
2007 dhar_base(pvt) <= sys_addr &&
2008 sys_addr < BIT_64(32)) {
2009 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2010 sys_addr);
2011 return -EINVAL;
2014 /* Verify sys_addr is within DCT Range. */
2015 dct_base = (u64) dct_sel_baseaddr(pvt);
2016 dct_limit = (dct_cont_limit_reg >> 11) & 0x1FFF;
2018 if (!(dct_cont_base_reg & BIT(0)) &&
2019 !(dct_base <= (sys_addr >> 27) &&
2020 dct_limit >= (sys_addr >> 27)))
2021 return -EINVAL;
2023 /* Verify number of dct's that participate in channel interleaving. */
2024 num_dcts_intlv = (int) hweight8(intlv_en);
2026 if (!(num_dcts_intlv % 2 == 0) || (num_dcts_intlv > 4))
2027 return -EINVAL;
2029 if (pvt->model >= 0x60)
2030 channel = f1x_determine_channel(pvt, sys_addr, false, intlv_en);
2031 else
2032 channel = f15_m30h_determine_channel(pvt, sys_addr, intlv_en,
2033 num_dcts_intlv, dct_sel);
2035 /* Verify we stay within the MAX number of channels allowed */
2036 if (channel > 3)
2037 return -EINVAL;
2039 leg_mmio_hole = (u8) (dct_cont_base_reg >> 1 & BIT(0));
2041 /* Get normalized DCT addr */
2042 if (leg_mmio_hole && (sys_addr >= BIT_64(32)))
2043 chan_offset = dhar_offset;
2044 else
2045 chan_offset = dct_base << 27;
2047 chan_addr = sys_addr - chan_offset;
2049 /* remove channel interleave */
2050 if (num_dcts_intlv == 2) {
2051 if (intlv_addr == 0x4)
2052 chan_addr = ((chan_addr >> 9) << 8) |
2053 (chan_addr & 0xff);
2054 else if (intlv_addr == 0x5)
2055 chan_addr = ((chan_addr >> 10) << 9) |
2056 (chan_addr & 0x1ff);
2057 else
2058 return -EINVAL;
2060 } else if (num_dcts_intlv == 4) {
2061 if (intlv_addr == 0x4)
2062 chan_addr = ((chan_addr >> 10) << 8) |
2063 (chan_addr & 0xff);
2064 else if (intlv_addr == 0x5)
2065 chan_addr = ((chan_addr >> 11) << 9) |
2066 (chan_addr & 0x1ff);
2067 else
2068 return -EINVAL;
2071 if (dct_offset_en) {
2072 amd64_read_pci_cfg(pvt->F1,
2073 DRAM_CONT_HIGH_OFF + (int) channel * 4,
2074 &tmp);
2075 chan_addr += (u64) ((tmp >> 11) & 0xfff) << 27;
2078 f15h_select_dct(pvt, channel);
2080 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
2083 * Find Chip select:
2084 * if channel = 3, then alias it to 1. This is because, in F15 M30h,
2085 * there is support for 4 DCT's, but only 2 are currently functional.
2086 * They are DCT0 and DCT3. But we have read all registers of DCT3 into
2087 * pvt->csels[1]. So we need to use '1' here to get correct info.
2088 * Refer F15 M30h BKDG Section 2.10 and 2.10.3 for clarifications.
2090 alias_channel = (channel == 3) ? 1 : channel;
2092 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, alias_channel);
2094 if (cs_found >= 0)
2095 *chan_sel = alias_channel;
2097 return cs_found;
2100 static int f1x_translate_sysaddr_to_cs(struct amd64_pvt *pvt,
2101 u64 sys_addr,
2102 int *chan_sel)
2104 int cs_found = -EINVAL;
2105 unsigned range;
2107 for (range = 0; range < DRAM_RANGES; range++) {
2108 if (!dram_rw(pvt, range))
2109 continue;
2111 if (pvt->fam == 0x15 && pvt->model >= 0x30)
2112 cs_found = f15_m30h_match_to_this_node(pvt, range,
2113 sys_addr,
2114 chan_sel);
2116 else if ((get_dram_base(pvt, range) <= sys_addr) &&
2117 (get_dram_limit(pvt, range) >= sys_addr)) {
2118 cs_found = f1x_match_to_this_node(pvt, range,
2119 sys_addr, chan_sel);
2120 if (cs_found >= 0)
2121 break;
2124 return cs_found;
2128 * For reference see "2.8.5 Routing DRAM Requests" in F10 BKDG. This code maps
2129 * a @sys_addr to NodeID, DCT (channel) and chip select (CSROW).
2131 * The @sys_addr is usually an error address received from the hardware
2132 * (MCX_ADDR).
2134 static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
2135 struct err_info *err)
2137 struct amd64_pvt *pvt = mci->pvt_info;
2139 error_address_to_page_and_offset(sys_addr, err);
2141 err->csrow = f1x_translate_sysaddr_to_cs(pvt, sys_addr, &err->channel);
2142 if (err->csrow < 0) {
2143 err->err_code = ERR_CSROW;
2144 return;
2148 * We need the syndromes for channel detection only when we're
2149 * ganged. Otherwise @chan should already contain the channel at
2150 * this point.
2152 if (dct_ganging_enabled(pvt))
2153 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
2157 * debug routine to display the memory sizes of all logical DIMMs and its
2158 * CSROWs
2160 static void debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
2162 int dimm, size0, size1;
2163 u32 *dcsb = ctrl ? pvt->csels[1].csbases : pvt->csels[0].csbases;
2164 u32 dbam = ctrl ? pvt->dbam1 : pvt->dbam0;
2166 if (pvt->fam == 0xf) {
2167 /* K8 families < revF not supported yet */
2168 if (pvt->ext_model < K8_REV_F)
2169 return;
2170 else
2171 WARN_ON(ctrl != 0);
2174 if (pvt->fam == 0x10) {
2175 dbam = (ctrl && !dct_ganging_enabled(pvt)) ? pvt->dbam1
2176 : pvt->dbam0;
2177 dcsb = (ctrl && !dct_ganging_enabled(pvt)) ?
2178 pvt->csels[1].csbases :
2179 pvt->csels[0].csbases;
2180 } else if (ctrl) {
2181 dbam = pvt->dbam0;
2182 dcsb = pvt->csels[1].csbases;
2184 edac_dbg(1, "F2x%d80 (DRAM Bank Address Mapping): 0x%08x\n",
2185 ctrl, dbam);
2187 edac_printk(KERN_DEBUG, EDAC_MC, "DCT%d chip selects:\n", ctrl);
2189 /* Dump memory sizes for DIMM and its CSROWs */
2190 for (dimm = 0; dimm < 4; dimm++) {
2192 size0 = 0;
2193 if (dcsb[dimm*2] & DCSB_CS_ENABLE)
2195 * For F15m60h, we need multiplier for LRDIMM cs_size
2196 * calculation. We pass dimm value to the dbam_to_cs
2197 * mapper so we can find the multiplier from the
2198 * corresponding DCSM.
2200 size0 = pvt->ops->dbam_to_cs(pvt, ctrl,
2201 DBAM_DIMM(dimm, dbam),
2202 dimm);
2204 size1 = 0;
2205 if (dcsb[dimm*2 + 1] & DCSB_CS_ENABLE)
2206 size1 = pvt->ops->dbam_to_cs(pvt, ctrl,
2207 DBAM_DIMM(dimm, dbam),
2208 dimm);
2210 amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
2211 dimm * 2, size0,
2212 dimm * 2 + 1, size1);
2216 static struct amd64_family_type family_types[] = {
2217 [K8_CPUS] = {
2218 .ctl_name = "K8",
2219 .f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP,
2220 .f2_id = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL,
2221 .max_mcs = 2,
2222 .ops = {
2223 .early_channel_count = k8_early_channel_count,
2224 .map_sysaddr_to_csrow = k8_map_sysaddr_to_csrow,
2225 .dbam_to_cs = k8_dbam_to_chip_select,
2228 [F10_CPUS] = {
2229 .ctl_name = "F10h",
2230 .f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP,
2231 .f2_id = PCI_DEVICE_ID_AMD_10H_NB_DRAM,
2232 .max_mcs = 2,
2233 .ops = {
2234 .early_channel_count = f1x_early_channel_count,
2235 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2236 .dbam_to_cs = f10_dbam_to_chip_select,
2239 [F15_CPUS] = {
2240 .ctl_name = "F15h",
2241 .f1_id = PCI_DEVICE_ID_AMD_15H_NB_F1,
2242 .f2_id = PCI_DEVICE_ID_AMD_15H_NB_F2,
2243 .max_mcs = 2,
2244 .ops = {
2245 .early_channel_count = f1x_early_channel_count,
2246 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2247 .dbam_to_cs = f15_dbam_to_chip_select,
2250 [F15_M30H_CPUS] = {
2251 .ctl_name = "F15h_M30h",
2252 .f1_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1,
2253 .f2_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F2,
2254 .max_mcs = 2,
2255 .ops = {
2256 .early_channel_count = f1x_early_channel_count,
2257 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2258 .dbam_to_cs = f16_dbam_to_chip_select,
2261 [F15_M60H_CPUS] = {
2262 .ctl_name = "F15h_M60h",
2263 .f1_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1,
2264 .f2_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F2,
2265 .max_mcs = 2,
2266 .ops = {
2267 .early_channel_count = f1x_early_channel_count,
2268 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2269 .dbam_to_cs = f15_m60h_dbam_to_chip_select,
2272 [F16_CPUS] = {
2273 .ctl_name = "F16h",
2274 .f1_id = PCI_DEVICE_ID_AMD_16H_NB_F1,
2275 .f2_id = PCI_DEVICE_ID_AMD_16H_NB_F2,
2276 .max_mcs = 2,
2277 .ops = {
2278 .early_channel_count = f1x_early_channel_count,
2279 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2280 .dbam_to_cs = f16_dbam_to_chip_select,
2283 [F16_M30H_CPUS] = {
2284 .ctl_name = "F16h_M30h",
2285 .f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1,
2286 .f2_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F2,
2287 .max_mcs = 2,
2288 .ops = {
2289 .early_channel_count = f1x_early_channel_count,
2290 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
2291 .dbam_to_cs = f16_dbam_to_chip_select,
2294 [F17_CPUS] = {
2295 .ctl_name = "F17h",
2296 .f0_id = PCI_DEVICE_ID_AMD_17H_DF_F0,
2297 .f6_id = PCI_DEVICE_ID_AMD_17H_DF_F6,
2298 .max_mcs = 2,
2299 .ops = {
2300 .early_channel_count = f17_early_channel_count,
2301 .dbam_to_cs = f17_addr_mask_to_cs_size,
2304 [F17_M10H_CPUS] = {
2305 .ctl_name = "F17h_M10h",
2306 .f0_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F0,
2307 .f6_id = PCI_DEVICE_ID_AMD_17H_M10H_DF_F6,
2308 .max_mcs = 2,
2309 .ops = {
2310 .early_channel_count = f17_early_channel_count,
2311 .dbam_to_cs = f17_addr_mask_to_cs_size,
2314 [F17_M30H_CPUS] = {
2315 .ctl_name = "F17h_M30h",
2316 .f0_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F0,
2317 .f6_id = PCI_DEVICE_ID_AMD_17H_M30H_DF_F6,
2318 .max_mcs = 8,
2319 .ops = {
2320 .early_channel_count = f17_early_channel_count,
2321 .dbam_to_cs = f17_addr_mask_to_cs_size,
2324 [F17_M60H_CPUS] = {
2325 .ctl_name = "F17h_M60h",
2326 .f0_id = PCI_DEVICE_ID_AMD_17H_M60H_DF_F0,
2327 .f6_id = PCI_DEVICE_ID_AMD_17H_M60H_DF_F6,
2328 .max_mcs = 2,
2329 .ops = {
2330 .early_channel_count = f17_early_channel_count,
2331 .dbam_to_cs = f17_addr_mask_to_cs_size,
2334 [F17_M70H_CPUS] = {
2335 .ctl_name = "F17h_M70h",
2336 .f0_id = PCI_DEVICE_ID_AMD_17H_M70H_DF_F0,
2337 .f6_id = PCI_DEVICE_ID_AMD_17H_M70H_DF_F6,
2338 .max_mcs = 2,
2339 .ops = {
2340 .early_channel_count = f17_early_channel_count,
2341 .dbam_to_cs = f17_addr_mask_to_cs_size,
2344 [F19_CPUS] = {
2345 .ctl_name = "F19h",
2346 .f0_id = PCI_DEVICE_ID_AMD_19H_DF_F0,
2347 .f6_id = PCI_DEVICE_ID_AMD_19H_DF_F6,
2348 .max_mcs = 8,
2349 .ops = {
2350 .early_channel_count = f17_early_channel_count,
2351 .dbam_to_cs = f17_addr_mask_to_cs_size,
2357 * These are tables of eigenvectors (one per line) which can be used for the
2358 * construction of the syndrome tables. The modified syndrome search algorithm
2359 * uses those to find the symbol in error and thus the DIMM.
2361 * Algorithm courtesy of Ross LaFetra from AMD.
2363 static const u16 x4_vectors[] = {
2364 0x2f57, 0x1afe, 0x66cc, 0xdd88,
2365 0x11eb, 0x3396, 0x7f4c, 0xeac8,
2366 0x0001, 0x0002, 0x0004, 0x0008,
2367 0x1013, 0x3032, 0x4044, 0x8088,
2368 0x106b, 0x30d6, 0x70fc, 0xe0a8,
2369 0x4857, 0xc4fe, 0x13cc, 0x3288,
2370 0x1ac5, 0x2f4a, 0x5394, 0xa1e8,
2371 0x1f39, 0x251e, 0xbd6c, 0x6bd8,
2372 0x15c1, 0x2a42, 0x89ac, 0x4758,
2373 0x2b03, 0x1602, 0x4f0c, 0xca08,
2374 0x1f07, 0x3a0e, 0x6b04, 0xbd08,
2375 0x8ba7, 0x465e, 0x244c, 0x1cc8,
2376 0x2b87, 0x164e, 0x642c, 0xdc18,
2377 0x40b9, 0x80de, 0x1094, 0x20e8,
2378 0x27db, 0x1eb6, 0x9dac, 0x7b58,
2379 0x11c1, 0x2242, 0x84ac, 0x4c58,
2380 0x1be5, 0x2d7a, 0x5e34, 0xa718,
2381 0x4b39, 0x8d1e, 0x14b4, 0x28d8,
2382 0x4c97, 0xc87e, 0x11fc, 0x33a8,
2383 0x8e97, 0x497e, 0x2ffc, 0x1aa8,
2384 0x16b3, 0x3d62, 0x4f34, 0x8518,
2385 0x1e2f, 0x391a, 0x5cac, 0xf858,
2386 0x1d9f, 0x3b7a, 0x572c, 0xfe18,
2387 0x15f5, 0x2a5a, 0x5264, 0xa3b8,
2388 0x1dbb, 0x3b66, 0x715c, 0xe3f8,
2389 0x4397, 0xc27e, 0x17fc, 0x3ea8,
2390 0x1617, 0x3d3e, 0x6464, 0xb8b8,
2391 0x23ff, 0x12aa, 0xab6c, 0x56d8,
2392 0x2dfb, 0x1ba6, 0x913c, 0x7328,
2393 0x185d, 0x2ca6, 0x7914, 0x9e28,
2394 0x171b, 0x3e36, 0x7d7c, 0xebe8,
2395 0x4199, 0x82ee, 0x19f4, 0x2e58,
2396 0x4807, 0xc40e, 0x130c, 0x3208,
2397 0x1905, 0x2e0a, 0x5804, 0xac08,
2398 0x213f, 0x132a, 0xadfc, 0x5ba8,
2399 0x19a9, 0x2efe, 0xb5cc, 0x6f88,
2402 static const u16 x8_vectors[] = {
2403 0x0145, 0x028a, 0x2374, 0x43c8, 0xa1f0, 0x0520, 0x0a40, 0x1480,
2404 0x0211, 0x0422, 0x0844, 0x1088, 0x01b0, 0x44e0, 0x23c0, 0xed80,
2405 0x1011, 0x0116, 0x022c, 0x0458, 0x08b0, 0x8c60, 0x2740, 0x4e80,
2406 0x0411, 0x0822, 0x1044, 0x0158, 0x02b0, 0x2360, 0x46c0, 0xab80,
2407 0x0811, 0x1022, 0x012c, 0x0258, 0x04b0, 0x4660, 0x8cc0, 0x2780,
2408 0x2071, 0x40e2, 0xa0c4, 0x0108, 0x0210, 0x0420, 0x0840, 0x1080,
2409 0x4071, 0x80e2, 0x0104, 0x0208, 0x0410, 0x0820, 0x1040, 0x2080,
2410 0x8071, 0x0102, 0x0204, 0x0408, 0x0810, 0x1020, 0x2040, 0x4080,
2411 0x019d, 0x03d6, 0x136c, 0x2198, 0x50b0, 0xb2e0, 0x0740, 0x0e80,
2412 0x0189, 0x03ea, 0x072c, 0x0e58, 0x1cb0, 0x56e0, 0x37c0, 0xf580,
2413 0x01fd, 0x0376, 0x06ec, 0x0bb8, 0x1110, 0x2220, 0x4440, 0x8880,
2414 0x0163, 0x02c6, 0x1104, 0x0758, 0x0eb0, 0x2be0, 0x6140, 0xc280,
2415 0x02fd, 0x01c6, 0x0b5c, 0x1108, 0x07b0, 0x25a0, 0x8840, 0x6180,
2416 0x0801, 0x012e, 0x025c, 0x04b8, 0x1370, 0x26e0, 0x57c0, 0xb580,
2417 0x0401, 0x0802, 0x015c, 0x02b8, 0x22b0, 0x13e0, 0x7140, 0xe280,
2418 0x0201, 0x0402, 0x0804, 0x01b8, 0x11b0, 0x31a0, 0x8040, 0x7180,
2419 0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
2420 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
2421 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
2424 static int decode_syndrome(u16 syndrome, const u16 *vectors, unsigned num_vecs,
2425 unsigned v_dim)
2427 unsigned int i, err_sym;
2429 for (err_sym = 0; err_sym < num_vecs / v_dim; err_sym++) {
2430 u16 s = syndrome;
2431 unsigned v_idx = err_sym * v_dim;
2432 unsigned v_end = (err_sym + 1) * v_dim;
2434 /* walk over all 16 bits of the syndrome */
2435 for (i = 1; i < (1U << 16); i <<= 1) {
2437 /* if bit is set in that eigenvector... */
2438 if (v_idx < v_end && vectors[v_idx] & i) {
2439 u16 ev_comp = vectors[v_idx++];
2441 /* ... and bit set in the modified syndrome, */
2442 if (s & i) {
2443 /* remove it. */
2444 s ^= ev_comp;
2446 if (!s)
2447 return err_sym;
2450 } else if (s & i)
2451 /* can't get to zero, move to next symbol */
2452 break;
2456 edac_dbg(0, "syndrome(%x) not found\n", syndrome);
2457 return -1;
2460 static int map_err_sym_to_channel(int err_sym, int sym_size)
2462 if (sym_size == 4)
2463 switch (err_sym) {
2464 case 0x20:
2465 case 0x21:
2466 return 0;
2467 case 0x22:
2468 case 0x23:
2469 return 1;
2470 default:
2471 return err_sym >> 4;
2473 /* x8 symbols */
2474 else
2475 switch (err_sym) {
2476 /* imaginary bits not in a DIMM */
2477 case 0x10:
2478 WARN(1, KERN_ERR "Invalid error symbol: 0x%x\n",
2479 err_sym);
2480 return -1;
2481 case 0x11:
2482 return 0;
2483 case 0x12:
2484 return 1;
2485 default:
2486 return err_sym >> 3;
2488 return -1;
2491 static int get_channel_from_ecc_syndrome(struct mem_ctl_info *mci, u16 syndrome)
2493 struct amd64_pvt *pvt = mci->pvt_info;
2494 int err_sym = -1;
2496 if (pvt->ecc_sym_sz == 8)
2497 err_sym = decode_syndrome(syndrome, x8_vectors,
2498 ARRAY_SIZE(x8_vectors),
2499 pvt->ecc_sym_sz);
2500 else if (pvt->ecc_sym_sz == 4)
2501 err_sym = decode_syndrome(syndrome, x4_vectors,
2502 ARRAY_SIZE(x4_vectors),
2503 pvt->ecc_sym_sz);
2504 else {
2505 amd64_warn("Illegal syndrome type: %u\n", pvt->ecc_sym_sz);
2506 return err_sym;
2509 return map_err_sym_to_channel(err_sym, pvt->ecc_sym_sz);
2512 static void __log_ecc_error(struct mem_ctl_info *mci, struct err_info *err,
2513 u8 ecc_type)
2515 enum hw_event_mc_err_type err_type;
2516 const char *string;
2518 if (ecc_type == 2)
2519 err_type = HW_EVENT_ERR_CORRECTED;
2520 else if (ecc_type == 1)
2521 err_type = HW_EVENT_ERR_UNCORRECTED;
2522 else if (ecc_type == 3)
2523 err_type = HW_EVENT_ERR_DEFERRED;
2524 else {
2525 WARN(1, "Something is rotten in the state of Denmark.\n");
2526 return;
2529 switch (err->err_code) {
2530 case DECODE_OK:
2531 string = "";
2532 break;
2533 case ERR_NODE:
2534 string = "Failed to map error addr to a node";
2535 break;
2536 case ERR_CSROW:
2537 string = "Failed to map error addr to a csrow";
2538 break;
2539 case ERR_CHANNEL:
2540 string = "Unknown syndrome - possible error reporting race";
2541 break;
2542 case ERR_SYND:
2543 string = "MCA_SYND not valid - unknown syndrome and csrow";
2544 break;
2545 case ERR_NORM_ADDR:
2546 string = "Cannot decode normalized address";
2547 break;
2548 default:
2549 string = "WTF error";
2550 break;
2553 edac_mc_handle_error(err_type, mci, 1,
2554 err->page, err->offset, err->syndrome,
2555 err->csrow, err->channel, -1,
2556 string, "");
2559 static inline void decode_bus_error(int node_id, struct mce *m)
2561 struct mem_ctl_info *mci;
2562 struct amd64_pvt *pvt;
2563 u8 ecc_type = (m->status >> 45) & 0x3;
2564 u8 xec = XEC(m->status, 0x1f);
2565 u16 ec = EC(m->status);
2566 u64 sys_addr;
2567 struct err_info err;
2569 mci = edac_mc_find(node_id);
2570 if (!mci)
2571 return;
2573 pvt = mci->pvt_info;
2575 /* Bail out early if this was an 'observed' error */
2576 if (PP(ec) == NBSL_PP_OBS)
2577 return;
2579 /* Do only ECC errors */
2580 if (xec && xec != F10_NBSL_EXT_ERR_ECC)
2581 return;
2583 memset(&err, 0, sizeof(err));
2585 sys_addr = get_error_address(pvt, m);
2587 if (ecc_type == 2)
2588 err.syndrome = extract_syndrome(m->status);
2590 pvt->ops->map_sysaddr_to_csrow(mci, sys_addr, &err);
2592 __log_ecc_error(mci, &err, ecc_type);
2596 * To find the UMC channel represented by this bank we need to match on its
2597 * instance_id. The instance_id of a bank is held in the lower 32 bits of its
2598 * IPID.
2600 * Currently, we can derive the channel number by looking at the 6th nibble in
2601 * the instance_id. For example, instance_id=0xYXXXXX where Y is the channel
2602 * number.
2604 static int find_umc_channel(struct mce *m)
2606 return (m->ipid & GENMASK(31, 0)) >> 20;
2609 static void decode_umc_error(int node_id, struct mce *m)
2611 u8 ecc_type = (m->status >> 45) & 0x3;
2612 struct mem_ctl_info *mci;
2613 struct amd64_pvt *pvt;
2614 struct err_info err;
2615 u64 sys_addr;
2617 mci = edac_mc_find(node_id);
2618 if (!mci)
2619 return;
2621 pvt = mci->pvt_info;
2623 memset(&err, 0, sizeof(err));
2625 if (m->status & MCI_STATUS_DEFERRED)
2626 ecc_type = 3;
2628 err.channel = find_umc_channel(m);
2630 if (!(m->status & MCI_STATUS_SYNDV)) {
2631 err.err_code = ERR_SYND;
2632 goto log_error;
2635 if (ecc_type == 2) {
2636 u8 length = (m->synd >> 18) & 0x3f;
2638 if (length)
2639 err.syndrome = (m->synd >> 32) & GENMASK(length - 1, 0);
2640 else
2641 err.err_code = ERR_CHANNEL;
2644 err.csrow = m->synd & 0x7;
2646 if (umc_normaddr_to_sysaddr(m->addr, pvt->mc_node_id, err.channel, &sys_addr)) {
2647 err.err_code = ERR_NORM_ADDR;
2648 goto log_error;
2651 error_address_to_page_and_offset(sys_addr, &err);
2653 log_error:
2654 __log_ecc_error(mci, &err, ecc_type);
2658 * Use pvt->F3 which contains the F3 CPU PCI device to get the related
2659 * F1 (AddrMap) and F2 (Dct) devices. Return negative value on error.
2660 * Reserve F0 and F6 on systems with a UMC.
2662 static int
2663 reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 pci_id1, u16 pci_id2)
2665 if (pvt->umc) {
2666 pvt->F0 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
2667 if (!pvt->F0) {
2668 amd64_err("F0 not found, device 0x%x (broken BIOS?)\n", pci_id1);
2669 return -ENODEV;
2672 pvt->F6 = pci_get_related_function(pvt->F3->vendor, pci_id2, pvt->F3);
2673 if (!pvt->F6) {
2674 pci_dev_put(pvt->F0);
2675 pvt->F0 = NULL;
2677 amd64_err("F6 not found: device 0x%x (broken BIOS?)\n", pci_id2);
2678 return -ENODEV;
2681 if (!pci_ctl_dev)
2682 pci_ctl_dev = &pvt->F0->dev;
2684 edac_dbg(1, "F0: %s\n", pci_name(pvt->F0));
2685 edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
2686 edac_dbg(1, "F6: %s\n", pci_name(pvt->F6));
2688 return 0;
2691 /* Reserve the ADDRESS MAP Device */
2692 pvt->F1 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
2693 if (!pvt->F1) {
2694 amd64_err("F1 not found: device 0x%x (broken BIOS?)\n", pci_id1);
2695 return -ENODEV;
2698 /* Reserve the DCT Device */
2699 pvt->F2 = pci_get_related_function(pvt->F3->vendor, pci_id2, pvt->F3);
2700 if (!pvt->F2) {
2701 pci_dev_put(pvt->F1);
2702 pvt->F1 = NULL;
2704 amd64_err("F2 not found: device 0x%x (broken BIOS?)\n", pci_id2);
2705 return -ENODEV;
2708 if (!pci_ctl_dev)
2709 pci_ctl_dev = &pvt->F2->dev;
2711 edac_dbg(1, "F1: %s\n", pci_name(pvt->F1));
2712 edac_dbg(1, "F2: %s\n", pci_name(pvt->F2));
2713 edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
2715 return 0;
2718 static void free_mc_sibling_devs(struct amd64_pvt *pvt)
2720 if (pvt->umc) {
2721 pci_dev_put(pvt->F0);
2722 pci_dev_put(pvt->F6);
2723 } else {
2724 pci_dev_put(pvt->F1);
2725 pci_dev_put(pvt->F2);
2729 static void determine_ecc_sym_sz(struct amd64_pvt *pvt)
2731 pvt->ecc_sym_sz = 4;
2733 if (pvt->umc) {
2734 u8 i;
2736 for_each_umc(i) {
2737 /* Check enabled channels only: */
2738 if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
2739 if (pvt->umc[i].ecc_ctrl & BIT(9)) {
2740 pvt->ecc_sym_sz = 16;
2741 return;
2742 } else if (pvt->umc[i].ecc_ctrl & BIT(7)) {
2743 pvt->ecc_sym_sz = 8;
2744 return;
2748 } else if (pvt->fam >= 0x10) {
2749 u32 tmp;
2751 amd64_read_pci_cfg(pvt->F3, EXT_NB_MCA_CFG, &tmp);
2752 /* F16h has only DCT0, so no need to read dbam1. */
2753 if (pvt->fam != 0x16)
2754 amd64_read_dct_pci_cfg(pvt, 1, DBAM0, &pvt->dbam1);
2756 /* F10h, revD and later can do x8 ECC too. */
2757 if ((pvt->fam > 0x10 || pvt->model > 7) && tmp & BIT(25))
2758 pvt->ecc_sym_sz = 8;
2763 * Retrieve the hardware registers of the memory controller.
2765 static void __read_mc_regs_df(struct amd64_pvt *pvt)
2767 u8 nid = pvt->mc_node_id;
2768 struct amd64_umc *umc;
2769 u32 i, umc_base;
2771 /* Read registers from each UMC */
2772 for_each_umc(i) {
2774 umc_base = get_umc_base(i);
2775 umc = &pvt->umc[i];
2777 amd_smn_read(nid, umc_base + UMCCH_DIMM_CFG, &umc->dimm_cfg);
2778 amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &umc->umc_cfg);
2779 amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &umc->sdp_ctrl);
2780 amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &umc->ecc_ctrl);
2781 amd_smn_read(nid, umc_base + UMCCH_UMC_CAP_HI, &umc->umc_cap_hi);
2786 * Retrieve the hardware registers of the memory controller (this includes the
2787 * 'Address Map' and 'Misc' device regs)
2789 static void read_mc_regs(struct amd64_pvt *pvt)
2791 unsigned int range;
2792 u64 msr_val;
2795 * Retrieve TOP_MEM and TOP_MEM2; no masking off of reserved bits since
2796 * those are Read-As-Zero.
2798 rdmsrl(MSR_K8_TOP_MEM1, pvt->top_mem);
2799 edac_dbg(0, " TOP_MEM: 0x%016llx\n", pvt->top_mem);
2801 /* Check first whether TOP_MEM2 is enabled: */
2802 rdmsrl(MSR_K8_SYSCFG, msr_val);
2803 if (msr_val & BIT(21)) {
2804 rdmsrl(MSR_K8_TOP_MEM2, pvt->top_mem2);
2805 edac_dbg(0, " TOP_MEM2: 0x%016llx\n", pvt->top_mem2);
2806 } else {
2807 edac_dbg(0, " TOP_MEM2 disabled\n");
2810 if (pvt->umc) {
2811 __read_mc_regs_df(pvt);
2812 amd64_read_pci_cfg(pvt->F0, DF_DHAR, &pvt->dhar);
2814 goto skip;
2817 amd64_read_pci_cfg(pvt->F3, NBCAP, &pvt->nbcap);
2819 read_dram_ctl_register(pvt);
2821 for (range = 0; range < DRAM_RANGES; range++) {
2822 u8 rw;
2824 /* read settings for this DRAM range */
2825 read_dram_base_limit_regs(pvt, range);
2827 rw = dram_rw(pvt, range);
2828 if (!rw)
2829 continue;
2831 edac_dbg(1, " DRAM range[%d], base: 0x%016llx; limit: 0x%016llx\n",
2832 range,
2833 get_dram_base(pvt, range),
2834 get_dram_limit(pvt, range));
2836 edac_dbg(1, " IntlvEn=%s; Range access: %s%s IntlvSel=%d DstNode=%d\n",
2837 dram_intlv_en(pvt, range) ? "Enabled" : "Disabled",
2838 (rw & 0x1) ? "R" : "-",
2839 (rw & 0x2) ? "W" : "-",
2840 dram_intlv_sel(pvt, range),
2841 dram_dst_node(pvt, range));
2844 amd64_read_pci_cfg(pvt->F1, DHAR, &pvt->dhar);
2845 amd64_read_dct_pci_cfg(pvt, 0, DBAM0, &pvt->dbam0);
2847 amd64_read_pci_cfg(pvt->F3, F10_ONLINE_SPARE, &pvt->online_spare);
2849 amd64_read_dct_pci_cfg(pvt, 0, DCLR0, &pvt->dclr0);
2850 amd64_read_dct_pci_cfg(pvt, 0, DCHR0, &pvt->dchr0);
2852 if (!dct_ganging_enabled(pvt)) {
2853 amd64_read_dct_pci_cfg(pvt, 1, DCLR0, &pvt->dclr1);
2854 amd64_read_dct_pci_cfg(pvt, 1, DCHR0, &pvt->dchr1);
2857 skip:
2858 read_dct_base_mask(pvt);
2860 determine_memory_type(pvt);
2861 edac_dbg(1, " DIMM type: %s\n", edac_mem_types[pvt->dram_type]);
2863 determine_ecc_sym_sz(pvt);
2867 * NOTE: CPU Revision Dependent code
2869 * Input:
2870 * @csrow_nr ChipSelect Row Number (0..NUM_CHIPSELECTS-1)
2871 * k8 private pointer to -->
2872 * DRAM Bank Address mapping register
2873 * node_id
2874 * DCL register where dual_channel_active is
2876 * The DBAM register consists of 4 sets of 4 bits each definitions:
2878 * Bits: CSROWs
2879 * 0-3 CSROWs 0 and 1
2880 * 4-7 CSROWs 2 and 3
2881 * 8-11 CSROWs 4 and 5
2882 * 12-15 CSROWs 6 and 7
2884 * Values range from: 0 to 15
2885 * The meaning of the values depends on CPU revision and dual-channel state,
2886 * see relevant BKDG more info.
2888 * The memory controller provides for total of only 8 CSROWs in its current
2889 * architecture. Each "pair" of CSROWs normally represents just one DIMM in
2890 * single channel or two (2) DIMMs in dual channel mode.
2892 * The following code logic collapses the various tables for CSROW based on CPU
2893 * revision.
2895 * Returns:
2896 * The number of PAGE_SIZE pages on the specified CSROW number it
2897 * encompasses
2900 static u32 get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr_orig)
2902 u32 dbam = dct ? pvt->dbam1 : pvt->dbam0;
2903 int csrow_nr = csrow_nr_orig;
2904 u32 cs_mode, nr_pages;
2906 if (!pvt->umc) {
2907 csrow_nr >>= 1;
2908 cs_mode = DBAM_DIMM(csrow_nr, dbam);
2909 } else {
2910 cs_mode = f17_get_cs_mode(csrow_nr >> 1, dct, pvt);
2913 nr_pages = pvt->ops->dbam_to_cs(pvt, dct, cs_mode, csrow_nr);
2914 nr_pages <<= 20 - PAGE_SHIFT;
2916 edac_dbg(0, "csrow: %d, channel: %d, DBAM idx: %d\n",
2917 csrow_nr_orig, dct, cs_mode);
2918 edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
2920 return nr_pages;
2923 static int init_csrows_df(struct mem_ctl_info *mci)
2925 struct amd64_pvt *pvt = mci->pvt_info;
2926 enum edac_type edac_mode = EDAC_NONE;
2927 enum dev_type dev_type = DEV_UNKNOWN;
2928 struct dimm_info *dimm;
2929 int empty = 1;
2930 u8 umc, cs;
2932 if (mci->edac_ctl_cap & EDAC_FLAG_S16ECD16ED) {
2933 edac_mode = EDAC_S16ECD16ED;
2934 dev_type = DEV_X16;
2935 } else if (mci->edac_ctl_cap & EDAC_FLAG_S8ECD8ED) {
2936 edac_mode = EDAC_S8ECD8ED;
2937 dev_type = DEV_X8;
2938 } else if (mci->edac_ctl_cap & EDAC_FLAG_S4ECD4ED) {
2939 edac_mode = EDAC_S4ECD4ED;
2940 dev_type = DEV_X4;
2941 } else if (mci->edac_ctl_cap & EDAC_FLAG_SECDED) {
2942 edac_mode = EDAC_SECDED;
2945 for_each_umc(umc) {
2946 for_each_chip_select(cs, umc, pvt) {
2947 if (!csrow_enabled(cs, umc, pvt))
2948 continue;
2950 empty = 0;
2951 dimm = mci->csrows[cs]->channels[umc]->dimm;
2953 edac_dbg(1, "MC node: %d, csrow: %d\n",
2954 pvt->mc_node_id, cs);
2956 dimm->nr_pages = get_csrow_nr_pages(pvt, umc, cs);
2957 dimm->mtype = pvt->dram_type;
2958 dimm->edac_mode = edac_mode;
2959 dimm->dtype = dev_type;
2960 dimm->grain = 64;
2964 return empty;
2968 * Initialize the array of csrow attribute instances, based on the values
2969 * from pci config hardware registers.
2971 static int init_csrows(struct mem_ctl_info *mci)
2973 struct amd64_pvt *pvt = mci->pvt_info;
2974 enum edac_type edac_mode = EDAC_NONE;
2975 struct csrow_info *csrow;
2976 struct dimm_info *dimm;
2977 int i, j, empty = 1;
2978 int nr_pages = 0;
2979 u32 val;
2981 if (pvt->umc)
2982 return init_csrows_df(mci);
2984 amd64_read_pci_cfg(pvt->F3, NBCFG, &val);
2986 pvt->nbcfg = val;
2988 edac_dbg(0, "node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
2989 pvt->mc_node_id, val,
2990 !!(val & NBCFG_CHIPKILL), !!(val & NBCFG_ECC_ENABLE));
2993 * We iterate over DCT0 here but we look at DCT1 in parallel, if needed.
2995 for_each_chip_select(i, 0, pvt) {
2996 bool row_dct0 = !!csrow_enabled(i, 0, pvt);
2997 bool row_dct1 = false;
2999 if (pvt->fam != 0xf)
3000 row_dct1 = !!csrow_enabled(i, 1, pvt);
3002 if (!row_dct0 && !row_dct1)
3003 continue;
3005 csrow = mci->csrows[i];
3006 empty = 0;
3008 edac_dbg(1, "MC node: %d, csrow: %d\n",
3009 pvt->mc_node_id, i);
3011 if (row_dct0) {
3012 nr_pages = get_csrow_nr_pages(pvt, 0, i);
3013 csrow->channels[0]->dimm->nr_pages = nr_pages;
3016 /* K8 has only one DCT */
3017 if (pvt->fam != 0xf && row_dct1) {
3018 int row_dct1_pages = get_csrow_nr_pages(pvt, 1, i);
3020 csrow->channels[1]->dimm->nr_pages = row_dct1_pages;
3021 nr_pages += row_dct1_pages;
3024 edac_dbg(1, "Total csrow%d pages: %u\n", i, nr_pages);
3026 /* Determine DIMM ECC mode: */
3027 if (pvt->nbcfg & NBCFG_ECC_ENABLE) {
3028 edac_mode = (pvt->nbcfg & NBCFG_CHIPKILL)
3029 ? EDAC_S4ECD4ED
3030 : EDAC_SECDED;
3033 for (j = 0; j < pvt->channel_count; j++) {
3034 dimm = csrow->channels[j]->dimm;
3035 dimm->mtype = pvt->dram_type;
3036 dimm->edac_mode = edac_mode;
3037 dimm->grain = 64;
3041 return empty;
3044 /* get all cores on this DCT */
3045 static void get_cpus_on_this_dct_cpumask(struct cpumask *mask, u16 nid)
3047 int cpu;
3049 for_each_online_cpu(cpu)
3050 if (topology_die_id(cpu) == nid)
3051 cpumask_set_cpu(cpu, mask);
3054 /* check MCG_CTL on all the cpus on this node */
3055 static bool nb_mce_bank_enabled_on_node(u16 nid)
3057 cpumask_var_t mask;
3058 int cpu, nbe;
3059 bool ret = false;
3061 if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) {
3062 amd64_warn("%s: Error allocating mask\n", __func__);
3063 return false;
3066 get_cpus_on_this_dct_cpumask(mask, nid);
3068 rdmsr_on_cpus(mask, MSR_IA32_MCG_CTL, msrs);
3070 for_each_cpu(cpu, mask) {
3071 struct msr *reg = per_cpu_ptr(msrs, cpu);
3072 nbe = reg->l & MSR_MCGCTL_NBE;
3074 edac_dbg(0, "core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
3075 cpu, reg->q,
3076 (nbe ? "enabled" : "disabled"));
3078 if (!nbe)
3079 goto out;
3081 ret = true;
3083 out:
3084 free_cpumask_var(mask);
3085 return ret;
3088 static int toggle_ecc_err_reporting(struct ecc_settings *s, u16 nid, bool on)
3090 cpumask_var_t cmask;
3091 int cpu;
3093 if (!zalloc_cpumask_var(&cmask, GFP_KERNEL)) {
3094 amd64_warn("%s: error allocating mask\n", __func__);
3095 return -ENOMEM;
3098 get_cpus_on_this_dct_cpumask(cmask, nid);
3100 rdmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3102 for_each_cpu(cpu, cmask) {
3104 struct msr *reg = per_cpu_ptr(msrs, cpu);
3106 if (on) {
3107 if (reg->l & MSR_MCGCTL_NBE)
3108 s->flags.nb_mce_enable = 1;
3110 reg->l |= MSR_MCGCTL_NBE;
3111 } else {
3113 * Turn off NB MCE reporting only when it was off before
3115 if (!s->flags.nb_mce_enable)
3116 reg->l &= ~MSR_MCGCTL_NBE;
3119 wrmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3121 free_cpumask_var(cmask);
3123 return 0;
3126 static bool enable_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3127 struct pci_dev *F3)
3129 bool ret = true;
3130 u32 value, mask = 0x3; /* UECC/CECC enable */
3132 if (toggle_ecc_err_reporting(s, nid, ON)) {
3133 amd64_warn("Error enabling ECC reporting over MCGCTL!\n");
3134 return false;
3137 amd64_read_pci_cfg(F3, NBCTL, &value);
3139 s->old_nbctl = value & mask;
3140 s->nbctl_valid = true;
3142 value |= mask;
3143 amd64_write_pci_cfg(F3, NBCTL, value);
3145 amd64_read_pci_cfg(F3, NBCFG, &value);
3147 edac_dbg(0, "1: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3148 nid, value, !!(value & NBCFG_ECC_ENABLE));
3150 if (!(value & NBCFG_ECC_ENABLE)) {
3151 amd64_warn("DRAM ECC disabled on this node, enabling...\n");
3153 s->flags.nb_ecc_prev = 0;
3155 /* Attempt to turn on DRAM ECC Enable */
3156 value |= NBCFG_ECC_ENABLE;
3157 amd64_write_pci_cfg(F3, NBCFG, value);
3159 amd64_read_pci_cfg(F3, NBCFG, &value);
3161 if (!(value & NBCFG_ECC_ENABLE)) {
3162 amd64_warn("Hardware rejected DRAM ECC enable,"
3163 "check memory DIMM configuration.\n");
3164 ret = false;
3165 } else {
3166 amd64_info("Hardware accepted DRAM ECC Enable\n");
3168 } else {
3169 s->flags.nb_ecc_prev = 1;
3172 edac_dbg(0, "2: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3173 nid, value, !!(value & NBCFG_ECC_ENABLE));
3175 return ret;
3178 static void restore_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3179 struct pci_dev *F3)
3181 u32 value, mask = 0x3; /* UECC/CECC enable */
3183 if (!s->nbctl_valid)
3184 return;
3186 amd64_read_pci_cfg(F3, NBCTL, &value);
3187 value &= ~mask;
3188 value |= s->old_nbctl;
3190 amd64_write_pci_cfg(F3, NBCTL, value);
3192 /* restore previous BIOS DRAM ECC "off" setting we force-enabled */
3193 if (!s->flags.nb_ecc_prev) {
3194 amd64_read_pci_cfg(F3, NBCFG, &value);
3195 value &= ~NBCFG_ECC_ENABLE;
3196 amd64_write_pci_cfg(F3, NBCFG, value);
3199 /* restore the NB Enable MCGCTL bit */
3200 if (toggle_ecc_err_reporting(s, nid, OFF))
3201 amd64_warn("Error restoring NB MCGCTL settings!\n");
3204 static bool ecc_enabled(struct amd64_pvt *pvt)
3206 u16 nid = pvt->mc_node_id;
3207 bool nb_mce_en = false;
3208 u8 ecc_en = 0, i;
3209 u32 value;
3211 if (boot_cpu_data.x86 >= 0x17) {
3212 u8 umc_en_mask = 0, ecc_en_mask = 0;
3213 struct amd64_umc *umc;
3215 for_each_umc(i) {
3216 umc = &pvt->umc[i];
3218 /* Only check enabled UMCs. */
3219 if (!(umc->sdp_ctrl & UMC_SDP_INIT))
3220 continue;
3222 umc_en_mask |= BIT(i);
3224 if (umc->umc_cap_hi & UMC_ECC_ENABLED)
3225 ecc_en_mask |= BIT(i);
3228 /* Check whether at least one UMC is enabled: */
3229 if (umc_en_mask)
3230 ecc_en = umc_en_mask == ecc_en_mask;
3231 else
3232 edac_dbg(0, "Node %d: No enabled UMCs.\n", nid);
3234 /* Assume UMC MCA banks are enabled. */
3235 nb_mce_en = true;
3236 } else {
3237 amd64_read_pci_cfg(pvt->F3, NBCFG, &value);
3239 ecc_en = !!(value & NBCFG_ECC_ENABLE);
3241 nb_mce_en = nb_mce_bank_enabled_on_node(nid);
3242 if (!nb_mce_en)
3243 edac_dbg(0, "NB MCE bank disabled, set MSR 0x%08x[4] on node %d to enable.\n",
3244 MSR_IA32_MCG_CTL, nid);
3247 amd64_info("Node %d: DRAM ECC %s.\n",
3248 nid, (ecc_en ? "enabled" : "disabled"));
3250 if (!ecc_en || !nb_mce_en)
3251 return false;
3252 else
3253 return true;
3256 static inline void
3257 f17h_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)
3259 u8 i, ecc_en = 1, cpk_en = 1, dev_x4 = 1, dev_x16 = 1;
3261 for_each_umc(i) {
3262 if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
3263 ecc_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_ENABLED);
3264 cpk_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_CHIPKILL_CAP);
3266 dev_x4 &= !!(pvt->umc[i].dimm_cfg & BIT(6));
3267 dev_x16 &= !!(pvt->umc[i].dimm_cfg & BIT(7));
3271 /* Set chipkill only if ECC is enabled: */
3272 if (ecc_en) {
3273 mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3275 if (!cpk_en)
3276 return;
3278 if (dev_x4)
3279 mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3280 else if (dev_x16)
3281 mci->edac_ctl_cap |= EDAC_FLAG_S16ECD16ED;
3282 else
3283 mci->edac_ctl_cap |= EDAC_FLAG_S8ECD8ED;
3287 static void setup_mci_misc_attrs(struct mem_ctl_info *mci)
3289 struct amd64_pvt *pvt = mci->pvt_info;
3291 mci->mtype_cap = MEM_FLAG_DDR2 | MEM_FLAG_RDDR2;
3292 mci->edac_ctl_cap = EDAC_FLAG_NONE;
3294 if (pvt->umc) {
3295 f17h_determine_edac_ctl_cap(mci, pvt);
3296 } else {
3297 if (pvt->nbcap & NBCAP_SECDED)
3298 mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3300 if (pvt->nbcap & NBCAP_CHIPKILL)
3301 mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3304 mci->edac_cap = determine_edac_cap(pvt);
3305 mci->mod_name = EDAC_MOD_STR;
3306 mci->ctl_name = fam_type->ctl_name;
3307 mci->dev_name = pci_name(pvt->F3);
3308 mci->ctl_page_to_phys = NULL;
3310 /* memory scrubber interface */
3311 mci->set_sdram_scrub_rate = set_scrub_rate;
3312 mci->get_sdram_scrub_rate = get_scrub_rate;
3316 * returns a pointer to the family descriptor on success, NULL otherwise.
3318 static struct amd64_family_type *per_family_init(struct amd64_pvt *pvt)
3320 pvt->ext_model = boot_cpu_data.x86_model >> 4;
3321 pvt->stepping = boot_cpu_data.x86_stepping;
3322 pvt->model = boot_cpu_data.x86_model;
3323 pvt->fam = boot_cpu_data.x86;
3325 switch (pvt->fam) {
3326 case 0xf:
3327 fam_type = &family_types[K8_CPUS];
3328 pvt->ops = &family_types[K8_CPUS].ops;
3329 break;
3331 case 0x10:
3332 fam_type = &family_types[F10_CPUS];
3333 pvt->ops = &family_types[F10_CPUS].ops;
3334 break;
3336 case 0x15:
3337 if (pvt->model == 0x30) {
3338 fam_type = &family_types[F15_M30H_CPUS];
3339 pvt->ops = &family_types[F15_M30H_CPUS].ops;
3340 break;
3341 } else if (pvt->model == 0x60) {
3342 fam_type = &family_types[F15_M60H_CPUS];
3343 pvt->ops = &family_types[F15_M60H_CPUS].ops;
3344 break;
3347 fam_type = &family_types[F15_CPUS];
3348 pvt->ops = &family_types[F15_CPUS].ops;
3349 break;
3351 case 0x16:
3352 if (pvt->model == 0x30) {
3353 fam_type = &family_types[F16_M30H_CPUS];
3354 pvt->ops = &family_types[F16_M30H_CPUS].ops;
3355 break;
3357 fam_type = &family_types[F16_CPUS];
3358 pvt->ops = &family_types[F16_CPUS].ops;
3359 break;
3361 case 0x17:
3362 if (pvt->model >= 0x10 && pvt->model <= 0x2f) {
3363 fam_type = &family_types[F17_M10H_CPUS];
3364 pvt->ops = &family_types[F17_M10H_CPUS].ops;
3365 break;
3366 } else if (pvt->model >= 0x30 && pvt->model <= 0x3f) {
3367 fam_type = &family_types[F17_M30H_CPUS];
3368 pvt->ops = &family_types[F17_M30H_CPUS].ops;
3369 break;
3370 } else if (pvt->model >= 0x60 && pvt->model <= 0x6f) {
3371 fam_type = &family_types[F17_M60H_CPUS];
3372 pvt->ops = &family_types[F17_M60H_CPUS].ops;
3373 break;
3374 } else if (pvt->model >= 0x70 && pvt->model <= 0x7f) {
3375 fam_type = &family_types[F17_M70H_CPUS];
3376 pvt->ops = &family_types[F17_M70H_CPUS].ops;
3377 break;
3379 fallthrough;
3380 case 0x18:
3381 fam_type = &family_types[F17_CPUS];
3382 pvt->ops = &family_types[F17_CPUS].ops;
3384 if (pvt->fam == 0x18)
3385 family_types[F17_CPUS].ctl_name = "F18h";
3386 break;
3388 case 0x19:
3389 if (pvt->model >= 0x20 && pvt->model <= 0x2f) {
3390 fam_type = &family_types[F17_M70H_CPUS];
3391 pvt->ops = &family_types[F17_M70H_CPUS].ops;
3392 fam_type->ctl_name = "F19h_M20h";
3393 break;
3395 fam_type = &family_types[F19_CPUS];
3396 pvt->ops = &family_types[F19_CPUS].ops;
3397 family_types[F19_CPUS].ctl_name = "F19h";
3398 break;
3400 default:
3401 amd64_err("Unsupported family!\n");
3402 return NULL;
3405 amd64_info("%s %sdetected (node %d).\n", fam_type->ctl_name,
3406 (pvt->fam == 0xf ?
3407 (pvt->ext_model >= K8_REV_F ? "revF or later "
3408 : "revE or earlier ")
3409 : ""), pvt->mc_node_id);
3410 return fam_type;
3413 static const struct attribute_group *amd64_edac_attr_groups[] = {
3414 #ifdef CONFIG_EDAC_DEBUG
3415 &amd64_edac_dbg_group,
3416 #endif
3417 #ifdef CONFIG_EDAC_AMD64_ERROR_INJECTION
3418 &amd64_edac_inj_group,
3419 #endif
3420 NULL
3423 static int hw_info_get(struct amd64_pvt *pvt)
3425 u16 pci_id1, pci_id2;
3426 int ret;
3428 if (pvt->fam >= 0x17) {
3429 pvt->umc = kcalloc(fam_type->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
3430 if (!pvt->umc)
3431 return -ENOMEM;
3433 pci_id1 = fam_type->f0_id;
3434 pci_id2 = fam_type->f6_id;
3435 } else {
3436 pci_id1 = fam_type->f1_id;
3437 pci_id2 = fam_type->f2_id;
3440 ret = reserve_mc_sibling_devs(pvt, pci_id1, pci_id2);
3441 if (ret)
3442 return ret;
3444 read_mc_regs(pvt);
3446 return 0;
3449 static void hw_info_put(struct amd64_pvt *pvt)
3451 if (pvt->F0 || pvt->F1)
3452 free_mc_sibling_devs(pvt);
3454 kfree(pvt->umc);
3457 static int init_one_instance(struct amd64_pvt *pvt)
3459 struct mem_ctl_info *mci = NULL;
3460 struct edac_mc_layer layers[2];
3461 int ret = -EINVAL;
3464 * We need to determine how many memory channels there are. Then use
3465 * that information for calculating the size of the dynamic instance
3466 * tables in the 'mci' structure.
3468 pvt->channel_count = pvt->ops->early_channel_count(pvt);
3469 if (pvt->channel_count < 0)
3470 return ret;
3472 ret = -ENOMEM;
3473 layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
3474 layers[0].size = pvt->csels[0].b_cnt;
3475 layers[0].is_virt_csrow = true;
3476 layers[1].type = EDAC_MC_LAYER_CHANNEL;
3479 * Always allocate two channels since we can have setups with DIMMs on
3480 * only one channel. Also, this simplifies handling later for the price
3481 * of a couple of KBs tops.
3483 layers[1].size = fam_type->max_mcs;
3484 layers[1].is_virt_csrow = false;
3486 mci = edac_mc_alloc(pvt->mc_node_id, ARRAY_SIZE(layers), layers, 0);
3487 if (!mci)
3488 return ret;
3490 mci->pvt_info = pvt;
3491 mci->pdev = &pvt->F3->dev;
3493 setup_mci_misc_attrs(mci);
3495 if (init_csrows(mci))
3496 mci->edac_cap = EDAC_FLAG_NONE;
3498 ret = -ENODEV;
3499 if (edac_mc_add_mc_with_groups(mci, amd64_edac_attr_groups)) {
3500 edac_dbg(1, "failed edac_mc_add_mc()\n");
3501 edac_mc_free(mci);
3502 return ret;
3505 return 0;
3508 static bool instance_has_memory(struct amd64_pvt *pvt)
3510 bool cs_enabled = false;
3511 int cs = 0, dct = 0;
3513 for (dct = 0; dct < fam_type->max_mcs; dct++) {
3514 for_each_chip_select(cs, dct, pvt)
3515 cs_enabled |= csrow_enabled(cs, dct, pvt);
3518 return cs_enabled;
3521 static int probe_one_instance(unsigned int nid)
3523 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
3524 struct amd64_pvt *pvt = NULL;
3525 struct ecc_settings *s;
3526 int ret;
3528 ret = -ENOMEM;
3529 s = kzalloc(sizeof(struct ecc_settings), GFP_KERNEL);
3530 if (!s)
3531 goto err_out;
3533 ecc_stngs[nid] = s;
3535 pvt = kzalloc(sizeof(struct amd64_pvt), GFP_KERNEL);
3536 if (!pvt)
3537 goto err_settings;
3539 pvt->mc_node_id = nid;
3540 pvt->F3 = F3;
3542 fam_type = per_family_init(pvt);
3543 if (!fam_type)
3544 goto err_enable;
3546 ret = hw_info_get(pvt);
3547 if (ret < 0)
3548 goto err_enable;
3550 ret = 0;
3551 if (!instance_has_memory(pvt)) {
3552 amd64_info("Node %d: No DIMMs detected.\n", nid);
3553 goto err_enable;
3556 if (!ecc_enabled(pvt)) {
3557 ret = -ENODEV;
3559 if (!ecc_enable_override)
3560 goto err_enable;
3562 if (boot_cpu_data.x86 >= 0x17) {
3563 amd64_warn("Forcing ECC on is not recommended on newer systems. Please enable ECC in BIOS.");
3564 goto err_enable;
3565 } else
3566 amd64_warn("Forcing ECC on!\n");
3568 if (!enable_ecc_error_reporting(s, nid, F3))
3569 goto err_enable;
3572 ret = init_one_instance(pvt);
3573 if (ret < 0) {
3574 amd64_err("Error probing instance: %d\n", nid);
3576 if (boot_cpu_data.x86 < 0x17)
3577 restore_ecc_error_reporting(s, nid, F3);
3579 goto err_enable;
3582 dump_misc_regs(pvt);
3584 return ret;
3586 err_enable:
3587 hw_info_put(pvt);
3588 kfree(pvt);
3590 err_settings:
3591 kfree(s);
3592 ecc_stngs[nid] = NULL;
3594 err_out:
3595 return ret;
3598 static void remove_one_instance(unsigned int nid)
3600 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
3601 struct ecc_settings *s = ecc_stngs[nid];
3602 struct mem_ctl_info *mci;
3603 struct amd64_pvt *pvt;
3605 /* Remove from EDAC CORE tracking list */
3606 mci = edac_mc_del_mc(&F3->dev);
3607 if (!mci)
3608 return;
3610 pvt = mci->pvt_info;
3612 restore_ecc_error_reporting(s, nid, F3);
3614 kfree(ecc_stngs[nid]);
3615 ecc_stngs[nid] = NULL;
3617 /* Free the EDAC CORE resources */
3618 mci->pvt_info = NULL;
3620 hw_info_put(pvt);
3621 kfree(pvt);
3622 edac_mc_free(mci);
3625 static void setup_pci_device(void)
3627 if (pci_ctl)
3628 return;
3630 pci_ctl = edac_pci_create_generic_ctl(pci_ctl_dev, EDAC_MOD_STR);
3631 if (!pci_ctl) {
3632 pr_warn("%s(): Unable to create PCI control\n", __func__);
3633 pr_warn("%s(): PCI error report via EDAC not set\n", __func__);
3637 static const struct x86_cpu_id amd64_cpuids[] = {
3638 X86_MATCH_VENDOR_FAM(AMD, 0x0F, NULL),
3639 X86_MATCH_VENDOR_FAM(AMD, 0x10, NULL),
3640 X86_MATCH_VENDOR_FAM(AMD, 0x15, NULL),
3641 X86_MATCH_VENDOR_FAM(AMD, 0x16, NULL),
3642 X86_MATCH_VENDOR_FAM(AMD, 0x17, NULL),
3643 X86_MATCH_VENDOR_FAM(HYGON, 0x18, NULL),
3644 X86_MATCH_VENDOR_FAM(AMD, 0x19, NULL),
3647 MODULE_DEVICE_TABLE(x86cpu, amd64_cpuids);
3649 static int __init amd64_edac_init(void)
3651 const char *owner;
3652 int err = -ENODEV;
3653 int i;
3655 owner = edac_get_owner();
3656 if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
3657 return -EBUSY;
3659 if (!x86_match_cpu(amd64_cpuids))
3660 return -ENODEV;
3662 if (amd_cache_northbridges() < 0)
3663 return -ENODEV;
3665 opstate_init();
3667 err = -ENOMEM;
3668 ecc_stngs = kcalloc(amd_nb_num(), sizeof(ecc_stngs[0]), GFP_KERNEL);
3669 if (!ecc_stngs)
3670 goto err_free;
3672 msrs = msrs_alloc();
3673 if (!msrs)
3674 goto err_free;
3676 for (i = 0; i < amd_nb_num(); i++) {
3677 err = probe_one_instance(i);
3678 if (err) {
3679 /* unwind properly */
3680 while (--i >= 0)
3681 remove_one_instance(i);
3683 goto err_pci;
3687 if (!edac_has_mcs()) {
3688 err = -ENODEV;
3689 goto err_pci;
3692 /* register stuff with EDAC MCE */
3693 if (boot_cpu_data.x86 >= 0x17)
3694 amd_register_ecc_decoder(decode_umc_error);
3695 else
3696 amd_register_ecc_decoder(decode_bus_error);
3698 setup_pci_device();
3700 #ifdef CONFIG_X86_32
3701 amd64_err("%s on 32-bit is unsupported. USE AT YOUR OWN RISK!\n", EDAC_MOD_STR);
3702 #endif
3704 printk(KERN_INFO "AMD64 EDAC driver v%s\n", EDAC_AMD64_VERSION);
3706 return 0;
3708 err_pci:
3709 pci_ctl_dev = NULL;
3711 msrs_free(msrs);
3712 msrs = NULL;
3714 err_free:
3715 kfree(ecc_stngs);
3716 ecc_stngs = NULL;
3718 return err;
3721 static void __exit amd64_edac_exit(void)
3723 int i;
3725 if (pci_ctl)
3726 edac_pci_release_generic_ctl(pci_ctl);
3728 /* unregister from EDAC MCE */
3729 if (boot_cpu_data.x86 >= 0x17)
3730 amd_unregister_ecc_decoder(decode_umc_error);
3731 else
3732 amd_unregister_ecc_decoder(decode_bus_error);
3734 for (i = 0; i < amd_nb_num(); i++)
3735 remove_one_instance(i);
3737 kfree(ecc_stngs);
3738 ecc_stngs = NULL;
3740 pci_ctl_dev = NULL;
3742 msrs_free(msrs);
3743 msrs = NULL;
3746 module_init(amd64_edac_init);
3747 module_exit(amd64_edac_exit);
3749 MODULE_LICENSE("GPL");
3750 MODULE_AUTHOR("SoftwareBitMaker: Doug Thompson, "
3751 "Dave Peterson, Thayne Harbaugh");
3752 MODULE_DESCRIPTION("MC support for AMD64 memory controllers - "
3753 EDAC_AMD64_VERSION);
3755 module_param(edac_op_state, int, 0444);
3756 MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");