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;
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 inline u32 get_umc_reg(struct amd64_pvt *pvt, u32 reg)
18 if (!pvt->flags.zn_regs_v2)
22 case UMCCH_ADDR_CFG: return UMCCH_ADDR_CFG_DDR5;
23 case UMCCH_ADDR_MASK_SEC: return UMCCH_ADDR_MASK_SEC_DDR5;
24 case UMCCH_DIMM_CFG: return UMCCH_DIMM_CFG_DDR5;
27 WARN_ONCE(1, "%s: unknown register 0x%x", __func__, reg);
32 static struct ecc_settings **ecc_stngs;
34 /* Device for the PCI component */
35 static struct device *pci_ctl_dev;
38 * Valid scrub rates for the K8 hardware memory scrubber. We map the scrubbing
39 * bandwidth to a valid bit pattern. The 'set' operation finds the 'matching-
42 *FIXME: Produce a better mapping/linearisation.
44 static const struct scrubrate {
45 u32 scrubval; /* bit pattern for scrub rate */
46 u32 bandwidth; /* bandwidth consumed (bytes/sec) */
48 { 0x01, 1600000000UL},
70 { 0x00, 0UL}, /* scrubbing off */
73 int __amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset,
74 u32 *val, const char *func)
78 err = pci_read_config_dword(pdev, offset, val);
80 amd64_warn("%s: error reading F%dx%03x.\n",
81 func, PCI_FUNC(pdev->devfn), offset);
86 int __amd64_write_pci_cfg_dword(struct pci_dev *pdev, int offset,
87 u32 val, const char *func)
91 err = pci_write_config_dword(pdev, offset, val);
93 amd64_warn("%s: error writing to F%dx%03x.\n",
94 func, PCI_FUNC(pdev->devfn), offset);
100 * Select DCT to which PCI cfg accesses are routed
102 static void f15h_select_dct(struct amd64_pvt *pvt, u8 dct)
106 amd64_read_pci_cfg(pvt->F1, DCT_CFG_SEL, ®);
107 reg &= (pvt->model == 0x30) ? ~3 : ~1;
109 amd64_write_pci_cfg(pvt->F1, DCT_CFG_SEL, reg);
114 * Depending on the family, F2 DCT reads need special handling:
116 * K8: has a single DCT only and no address offsets >= 0x100
118 * F10h: each DCT has its own set of regs
122 * F16h: has only 1 DCT
124 * F15h: we select which DCT we access using F1x10C[DctCfgSel]
126 static inline int amd64_read_dct_pci_cfg(struct amd64_pvt *pvt, u8 dct,
127 int offset, u32 *val)
131 if (dct || offset >= 0x100)
138 * Note: If ganging is enabled, barring the regs
139 * F2x[1,0]98 and F2x[1,0]9C; reads reads to F2x1xx
140 * return 0. (cf. Section 2.8.1 F10h BKDG)
142 if (dct_ganging_enabled(pvt))
151 * F15h: F2x1xx addresses do not map explicitly to DCT1.
152 * We should select which DCT we access using F1x10C[DctCfgSel]
154 dct = (dct && pvt->model == 0x30) ? 3 : dct;
155 f15h_select_dct(pvt, dct);
166 return amd64_read_pci_cfg(pvt->F2, offset, val);
170 * Memory scrubber control interface. For K8, memory scrubbing is handled by
171 * hardware and can involve L2 cache, dcache as well as the main memory. With
172 * F10, this is extended to L3 cache scrubbing on CPU models sporting that
175 * This causes the "units" for the scrubbing speed to vary from 64 byte blocks
176 * (dram) over to cache lines. This is nasty, so we will use bandwidth in
177 * bytes/sec for the setting.
179 * Currently, we only do dram scrubbing. If the scrubbing is done in software on
180 * other archs, we might not have access to the caches directly.
184 * Scan the scrub rate mapping table for a close or matching bandwidth value to
185 * issue. If requested is too big, then use last maximum value found.
187 static int __set_scrub_rate(struct amd64_pvt *pvt, u32 new_bw, u32 min_rate)
193 * map the configured rate (new_bw) to a value specific to the AMD64
194 * memory controller and apply to register. Search for the first
195 * bandwidth entry that is greater or equal than the setting requested
196 * and program that. If at last entry, turn off DRAM scrubbing.
198 * If no suitable bandwidth is found, turn off DRAM scrubbing entirely
199 * by falling back to the last element in scrubrates[].
201 for (i = 0; i < ARRAY_SIZE(scrubrates) - 1; i++) {
203 * skip scrub rates which aren't recommended
204 * (see F10 BKDG, F3x58)
206 if (scrubrates[i].scrubval < min_rate)
209 if (scrubrates[i].bandwidth <= new_bw)
213 scrubval = scrubrates[i].scrubval;
215 if (pvt->fam == 0x15 && pvt->model == 0x60) {
216 f15h_select_dct(pvt, 0);
217 pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
218 f15h_select_dct(pvt, 1);
219 pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
221 pci_write_bits32(pvt->F3, SCRCTRL, scrubval, 0x001F);
225 return scrubrates[i].bandwidth;
230 static int set_scrub_rate(struct mem_ctl_info *mci, u32 bw)
232 struct amd64_pvt *pvt = mci->pvt_info;
233 u32 min_scrubrate = 0x5;
238 if (pvt->fam == 0x15) {
240 if (pvt->model < 0x10)
241 f15h_select_dct(pvt, 0);
243 if (pvt->model == 0x60)
246 return __set_scrub_rate(pvt, bw, min_scrubrate);
249 static int get_scrub_rate(struct mem_ctl_info *mci)
251 struct amd64_pvt *pvt = mci->pvt_info;
252 int i, retval = -EINVAL;
255 if (pvt->fam == 0x15) {
257 if (pvt->model < 0x10)
258 f15h_select_dct(pvt, 0);
260 if (pvt->model == 0x60)
261 amd64_read_pci_cfg(pvt->F2, F15H_M60H_SCRCTRL, &scrubval);
263 amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
265 amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
268 scrubval = scrubval & 0x001F;
270 for (i = 0; i < ARRAY_SIZE(scrubrates); i++) {
271 if (scrubrates[i].scrubval == scrubval) {
272 retval = scrubrates[i].bandwidth;
280 * returns true if the SysAddr given by sys_addr matches the
281 * DRAM base/limit associated with node_id
283 static bool base_limit_match(struct amd64_pvt *pvt, u64 sys_addr, u8 nid)
287 /* The K8 treats this as a 40-bit value. However, bits 63-40 will be
288 * all ones if the most significant implemented address bit is 1.
289 * Here we discard bits 63-40. See section 3.4.2 of AMD publication
290 * 24592: AMD x86-64 Architecture Programmer's Manual Volume 1
291 * Application Programming.
293 addr = sys_addr & 0x000000ffffffffffull;
295 return ((addr >= get_dram_base(pvt, nid)) &&
296 (addr <= get_dram_limit(pvt, nid)));
300 * Attempt to map a SysAddr to a node. On success, return a pointer to the
301 * mem_ctl_info structure for the node that the SysAddr maps to.
303 * On failure, return NULL.
305 static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci,
308 struct amd64_pvt *pvt;
313 * Here we use the DRAM Base (section 3.4.4.1) and DRAM Limit (section
314 * 3.4.4.2) registers to map the SysAddr to a node ID.
319 * The value of this field should be the same for all DRAM Base
320 * registers. Therefore we arbitrarily choose to read it from the
321 * register for node 0.
323 intlv_en = dram_intlv_en(pvt, 0);
326 for (node_id = 0; node_id < DRAM_RANGES; node_id++) {
327 if (base_limit_match(pvt, sys_addr, node_id))
333 if (unlikely((intlv_en != 0x01) &&
334 (intlv_en != 0x03) &&
335 (intlv_en != 0x07))) {
336 amd64_warn("DRAM Base[IntlvEn] junk value: 0x%x, BIOS bug?\n", intlv_en);
340 bits = (((u32) sys_addr) >> 12) & intlv_en;
342 for (node_id = 0; ; ) {
343 if ((dram_intlv_sel(pvt, node_id) & intlv_en) == bits)
344 break; /* intlv_sel field matches */
346 if (++node_id >= DRAM_RANGES)
350 /* sanity test for sys_addr */
351 if (unlikely(!base_limit_match(pvt, sys_addr, node_id))) {
352 amd64_warn("%s: sys_addr 0x%llx falls outside base/limit address"
353 "range for node %d with node interleaving enabled.\n",
354 __func__, sys_addr, node_id);
359 return edac_mc_find((int)node_id);
362 edac_dbg(2, "sys_addr 0x%lx doesn't match any node\n",
363 (unsigned long)sys_addr);
369 * compute the CS base address of the @csrow on the DRAM controller @dct.
370 * For details see F2x[5C:40] in the processor's BKDG
372 static void get_cs_base_and_mask(struct amd64_pvt *pvt, int csrow, u8 dct,
373 u64 *base, u64 *mask)
375 u64 csbase, csmask, base_bits, mask_bits;
378 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
379 csbase = pvt->csels[dct].csbases[csrow];
380 csmask = pvt->csels[dct].csmasks[csrow];
381 base_bits = GENMASK_ULL(31, 21) | GENMASK_ULL(15, 9);
382 mask_bits = GENMASK_ULL(29, 21) | GENMASK_ULL(15, 9);
386 * F16h and F15h, models 30h and later need two addr_shift values:
387 * 8 for high and 6 for low (cf. F16h BKDG).
389 } else if (pvt->fam == 0x16 ||
390 (pvt->fam == 0x15 && pvt->model >= 0x30)) {
391 csbase = pvt->csels[dct].csbases[csrow];
392 csmask = pvt->csels[dct].csmasks[csrow >> 1];
394 *base = (csbase & GENMASK_ULL(15, 5)) << 6;
395 *base |= (csbase & GENMASK_ULL(30, 19)) << 8;
398 /* poke holes for the csmask */
399 *mask &= ~((GENMASK_ULL(15, 5) << 6) |
400 (GENMASK_ULL(30, 19) << 8));
402 *mask |= (csmask & GENMASK_ULL(15, 5)) << 6;
403 *mask |= (csmask & GENMASK_ULL(30, 19)) << 8;
407 csbase = pvt->csels[dct].csbases[csrow];
408 csmask = pvt->csels[dct].csmasks[csrow >> 1];
411 if (pvt->fam == 0x15)
412 base_bits = mask_bits =
413 GENMASK_ULL(30,19) | GENMASK_ULL(13,5);
415 base_bits = mask_bits =
416 GENMASK_ULL(28,19) | GENMASK_ULL(13,5);
419 *base = (csbase & base_bits) << addr_shift;
422 /* poke holes for the csmask */
423 *mask &= ~(mask_bits << addr_shift);
425 *mask |= (csmask & mask_bits) << addr_shift;
428 #define for_each_chip_select(i, dct, pvt) \
429 for (i = 0; i < pvt->csels[dct].b_cnt; i++)
431 #define chip_select_base(i, dct, pvt) \
432 pvt->csels[dct].csbases[i]
434 #define for_each_chip_select_mask(i, dct, pvt) \
435 for (i = 0; i < pvt->csels[dct].m_cnt; i++)
437 #define for_each_umc(i) \
438 for (i = 0; i < pvt->max_mcs; i++)
441 * @input_addr is an InputAddr associated with the node given by mci. Return the
442 * csrow that input_addr maps to, or -1 on failure (no csrow claims input_addr).
444 static int input_addr_to_csrow(struct mem_ctl_info *mci, u64 input_addr)
446 struct amd64_pvt *pvt;
452 for_each_chip_select(csrow, 0, pvt) {
453 if (!csrow_enabled(csrow, 0, pvt))
456 get_cs_base_and_mask(pvt, csrow, 0, &base, &mask);
460 if ((input_addr & mask) == (base & mask)) {
461 edac_dbg(2, "InputAddr 0x%lx matches csrow %d (node %d)\n",
462 (unsigned long)input_addr, csrow,
468 edac_dbg(2, "no matching csrow for InputAddr 0x%lx (MC node %d)\n",
469 (unsigned long)input_addr, pvt->mc_node_id);
475 * Obtain info from the DRAM Hole Address Register (section 3.4.8, pub #26094)
476 * for the node represented by mci. Info is passed back in *hole_base,
477 * *hole_offset, and *hole_size. Function returns 0 if info is valid or 1 if
478 * info is invalid. Info may be invalid for either of the following reasons:
480 * - The revision of the node is not E or greater. In this case, the DRAM Hole
481 * Address Register does not exist.
483 * - The DramHoleValid bit is cleared in the DRAM Hole Address Register,
484 * indicating that its contents are not valid.
486 * The values passed back in *hole_base, *hole_offset, and *hole_size are
487 * complete 32-bit values despite the fact that the bitfields in the DHAR
488 * only represent bits 31-24 of the base and offset values.
490 static int get_dram_hole_info(struct mem_ctl_info *mci, u64 *hole_base,
491 u64 *hole_offset, u64 *hole_size)
493 struct amd64_pvt *pvt = mci->pvt_info;
495 /* only revE and later have the DRAM Hole Address Register */
496 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_E) {
497 edac_dbg(1, " revision %d for node %d does not support DHAR\n",
498 pvt->ext_model, pvt->mc_node_id);
502 /* valid for Fam10h and above */
503 if (pvt->fam >= 0x10 && !dhar_mem_hoist_valid(pvt)) {
504 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this system\n");
508 if (!dhar_valid(pvt)) {
509 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this node %d\n",
514 /* This node has Memory Hoisting */
516 /* +------------------+--------------------+--------------------+-----
517 * | memory | DRAM hole | relocated |
518 * | [0, (x - 1)] | [x, 0xffffffff] | addresses from |
520 * | | | [0x100000000, |
521 * | | | (0x100000000+ |
522 * | | | (0xffffffff-x))] |
523 * +------------------+--------------------+--------------------+-----
525 * Above is a diagram of physical memory showing the DRAM hole and the
526 * relocated addresses from the DRAM hole. As shown, the DRAM hole
527 * starts at address x (the base address) and extends through address
528 * 0xffffffff. The DRAM Hole Address Register (DHAR) relocates the
529 * addresses in the hole so that they start at 0x100000000.
532 *hole_base = dhar_base(pvt);
533 *hole_size = (1ULL << 32) - *hole_base;
535 *hole_offset = (pvt->fam > 0xf) ? f10_dhar_offset(pvt)
536 : k8_dhar_offset(pvt);
538 edac_dbg(1, " DHAR info for node %d base 0x%lx offset 0x%lx size 0x%lx\n",
539 pvt->mc_node_id, (unsigned long)*hole_base,
540 (unsigned long)*hole_offset, (unsigned long)*hole_size);
545 #ifdef CONFIG_EDAC_DEBUG
546 #define EDAC_DCT_ATTR_SHOW(reg) \
547 static ssize_t reg##_show(struct device *dev, \
548 struct device_attribute *mattr, char *data) \
550 struct mem_ctl_info *mci = to_mci(dev); \
551 struct amd64_pvt *pvt = mci->pvt_info; \
553 return sprintf(data, "0x%016llx\n", (u64)pvt->reg); \
556 EDAC_DCT_ATTR_SHOW(dhar);
557 EDAC_DCT_ATTR_SHOW(dbam0);
558 EDAC_DCT_ATTR_SHOW(top_mem);
559 EDAC_DCT_ATTR_SHOW(top_mem2);
561 static ssize_t dram_hole_show(struct device *dev, struct device_attribute *mattr,
564 struct mem_ctl_info *mci = to_mci(dev);
570 get_dram_hole_info(mci, &hole_base, &hole_offset, &hole_size);
572 return sprintf(data, "%llx %llx %llx\n", hole_base, hole_offset,
577 * update NUM_DBG_ATTRS in case you add new members
579 static DEVICE_ATTR(dhar, S_IRUGO, dhar_show, NULL);
580 static DEVICE_ATTR(dbam, S_IRUGO, dbam0_show, NULL);
581 static DEVICE_ATTR(topmem, S_IRUGO, top_mem_show, NULL);
582 static DEVICE_ATTR(topmem2, S_IRUGO, top_mem2_show, NULL);
583 static DEVICE_ATTR_RO(dram_hole);
585 static struct attribute *dbg_attrs[] = {
588 &dev_attr_topmem.attr,
589 &dev_attr_topmem2.attr,
590 &dev_attr_dram_hole.attr,
594 static const struct attribute_group dbg_group = {
598 static ssize_t inject_section_show(struct device *dev,
599 struct device_attribute *mattr, char *buf)
601 struct mem_ctl_info *mci = to_mci(dev);
602 struct amd64_pvt *pvt = mci->pvt_info;
603 return sprintf(buf, "0x%x\n", pvt->injection.section);
607 * store error injection section value which refers to one of 4 16-byte sections
608 * within a 64-byte cacheline
612 static ssize_t inject_section_store(struct device *dev,
613 struct device_attribute *mattr,
614 const char *data, size_t count)
616 struct mem_ctl_info *mci = to_mci(dev);
617 struct amd64_pvt *pvt = mci->pvt_info;
621 ret = kstrtoul(data, 10, &value);
626 amd64_warn("%s: invalid section 0x%lx\n", __func__, value);
630 pvt->injection.section = (u32) value;
634 static ssize_t inject_word_show(struct device *dev,
635 struct device_attribute *mattr, char *buf)
637 struct mem_ctl_info *mci = to_mci(dev);
638 struct amd64_pvt *pvt = mci->pvt_info;
639 return sprintf(buf, "0x%x\n", pvt->injection.word);
643 * store error injection word value which refers to one of 9 16-bit word of the
644 * 16-byte (128-bit + ECC bits) section
648 static ssize_t inject_word_store(struct device *dev,
649 struct device_attribute *mattr,
650 const char *data, size_t count)
652 struct mem_ctl_info *mci = to_mci(dev);
653 struct amd64_pvt *pvt = mci->pvt_info;
657 ret = kstrtoul(data, 10, &value);
662 amd64_warn("%s: invalid word 0x%lx\n", __func__, value);
666 pvt->injection.word = (u32) value;
670 static ssize_t inject_ecc_vector_show(struct device *dev,
671 struct device_attribute *mattr,
674 struct mem_ctl_info *mci = to_mci(dev);
675 struct amd64_pvt *pvt = mci->pvt_info;
676 return sprintf(buf, "0x%x\n", pvt->injection.bit_map);
680 * store 16 bit error injection vector which enables injecting errors to the
681 * corresponding bit within the error injection word above. When used during a
682 * DRAM ECC read, it holds the contents of the of the DRAM ECC bits.
684 static ssize_t inject_ecc_vector_store(struct device *dev,
685 struct device_attribute *mattr,
686 const char *data, size_t count)
688 struct mem_ctl_info *mci = to_mci(dev);
689 struct amd64_pvt *pvt = mci->pvt_info;
693 ret = kstrtoul(data, 16, &value);
697 if (value & 0xFFFF0000) {
698 amd64_warn("%s: invalid EccVector: 0x%lx\n", __func__, value);
702 pvt->injection.bit_map = (u32) value;
707 * Do a DRAM ECC read. Assemble staged values in the pvt area, format into
708 * fields needed by the injection registers and read the NB Array Data Port.
710 static ssize_t inject_read_store(struct device *dev,
711 struct device_attribute *mattr,
712 const char *data, size_t count)
714 struct mem_ctl_info *mci = to_mci(dev);
715 struct amd64_pvt *pvt = mci->pvt_info;
717 u32 section, word_bits;
720 ret = kstrtoul(data, 10, &value);
724 /* Form value to choose 16-byte section of cacheline */
725 section = F10_NB_ARRAY_DRAM | SET_NB_ARRAY_ADDR(pvt->injection.section);
727 amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_ADDR, section);
729 word_bits = SET_NB_DRAM_INJECTION_READ(pvt->injection);
731 /* Issue 'word' and 'bit' along with the READ request */
732 amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, word_bits);
734 edac_dbg(0, "section=0x%x word_bits=0x%x\n", section, word_bits);
740 * Do a DRAM ECC write. Assemble staged values in the pvt area and format into
741 * fields needed by the injection registers.
743 static ssize_t inject_write_store(struct device *dev,
744 struct device_attribute *mattr,
745 const char *data, size_t count)
747 struct mem_ctl_info *mci = to_mci(dev);
748 struct amd64_pvt *pvt = mci->pvt_info;
749 u32 section, word_bits, tmp;
753 ret = kstrtoul(data, 10, &value);
757 /* Form value to choose 16-byte section of cacheline */
758 section = F10_NB_ARRAY_DRAM | SET_NB_ARRAY_ADDR(pvt->injection.section);
760 amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_ADDR, section);
762 word_bits = SET_NB_DRAM_INJECTION_WRITE(pvt->injection);
764 pr_notice_once("Don't forget to decrease MCE polling interval in\n"
765 "/sys/bus/machinecheck/devices/machinecheck<CPUNUM>/check_interval\n"
766 "so that you can get the error report faster.\n");
768 on_each_cpu(disable_caches, NULL, 1);
770 /* Issue 'word' and 'bit' along with the READ request */
771 amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, word_bits);
774 /* wait until injection happens */
775 amd64_read_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, &tmp);
776 if (tmp & F10_NB_ARR_ECC_WR_REQ) {
781 on_each_cpu(enable_caches, NULL, 1);
783 edac_dbg(0, "section=0x%x word_bits=0x%x\n", section, word_bits);
789 * update NUM_INJ_ATTRS in case you add new members
792 static DEVICE_ATTR_RW(inject_section);
793 static DEVICE_ATTR_RW(inject_word);
794 static DEVICE_ATTR_RW(inject_ecc_vector);
795 static DEVICE_ATTR_WO(inject_write);
796 static DEVICE_ATTR_WO(inject_read);
798 static struct attribute *inj_attrs[] = {
799 &dev_attr_inject_section.attr,
800 &dev_attr_inject_word.attr,
801 &dev_attr_inject_ecc_vector.attr,
802 &dev_attr_inject_write.attr,
803 &dev_attr_inject_read.attr,
807 static umode_t inj_is_visible(struct kobject *kobj, struct attribute *attr, int idx)
809 struct device *dev = kobj_to_dev(kobj);
810 struct mem_ctl_info *mci = container_of(dev, struct mem_ctl_info, dev);
811 struct amd64_pvt *pvt = mci->pvt_info;
813 /* Families which have that injection hw */
814 if (pvt->fam >= 0x10 && pvt->fam <= 0x16)
820 static const struct attribute_group inj_group = {
822 .is_visible = inj_is_visible,
824 #endif /* CONFIG_EDAC_DEBUG */
827 * Return the DramAddr that the SysAddr given by @sys_addr maps to. It is
828 * assumed that sys_addr maps to the node given by mci.
830 * The first part of section 3.4.4 (p. 70) shows how the DRAM Base (section
831 * 3.4.4.1) and DRAM Limit (section 3.4.4.2) registers are used to translate a
832 * SysAddr to a DramAddr. If the DRAM Hole Address Register (DHAR) is enabled,
833 * then it is also involved in translating a SysAddr to a DramAddr. Sections
834 * 3.4.8 and 3.5.8.2 describe the DHAR and how it is used for memory hoisting.
835 * These parts of the documentation are unclear. I interpret them as follows:
837 * When node n receives a SysAddr, it processes the SysAddr as follows:
839 * 1. It extracts the DRAMBase and DRAMLimit values from the DRAM Base and DRAM
840 * Limit registers for node n. If the SysAddr is not within the range
841 * specified by the base and limit values, then node n ignores the Sysaddr
842 * (since it does not map to node n). Otherwise continue to step 2 below.
844 * 2. If the DramHoleValid bit of the DHAR for node n is clear, the DHAR is
845 * disabled so skip to step 3 below. Otherwise see if the SysAddr is within
846 * the range of relocated addresses (starting at 0x100000000) from the DRAM
847 * hole. If not, skip to step 3 below. Else get the value of the
848 * DramHoleOffset field from the DHAR. To obtain the DramAddr, subtract the
849 * offset defined by this value from the SysAddr.
851 * 3. Obtain the base address for node n from the DRAMBase field of the DRAM
852 * Base register for node n. To obtain the DramAddr, subtract the base
853 * address from the SysAddr, as shown near the start of section 3.4.4 (p.70).
855 static u64 sys_addr_to_dram_addr(struct mem_ctl_info *mci, u64 sys_addr)
857 struct amd64_pvt *pvt = mci->pvt_info;
858 u64 dram_base, hole_base, hole_offset, hole_size, dram_addr;
861 dram_base = get_dram_base(pvt, pvt->mc_node_id);
863 ret = get_dram_hole_info(mci, &hole_base, &hole_offset, &hole_size);
865 if ((sys_addr >= (1ULL << 32)) &&
866 (sys_addr < ((1ULL << 32) + hole_size))) {
867 /* use DHAR to translate SysAddr to DramAddr */
868 dram_addr = sys_addr - hole_offset;
870 edac_dbg(2, "using DHAR to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
871 (unsigned long)sys_addr,
872 (unsigned long)dram_addr);
879 * Translate the SysAddr to a DramAddr as shown near the start of
880 * section 3.4.4 (p. 70). Although sys_addr is a 64-bit value, the k8
881 * only deals with 40-bit values. Therefore we discard bits 63-40 of
882 * sys_addr below. If bit 39 of sys_addr is 1 then the bits we
883 * discard are all 1s. Otherwise the bits we discard are all 0s. See
884 * section 3.4.2 of AMD publication 24592: AMD x86-64 Architecture
885 * Programmer's Manual Volume 1 Application Programming.
887 dram_addr = (sys_addr & GENMASK_ULL(39, 0)) - dram_base;
889 edac_dbg(2, "using DRAM Base register to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
890 (unsigned long)sys_addr, (unsigned long)dram_addr);
895 * @intlv_en is the value of the IntlvEn field from a DRAM Base register
896 * (section 3.4.4.1). Return the number of bits from a SysAddr that are used
897 * for node interleaving.
899 static int num_node_interleave_bits(unsigned intlv_en)
901 static const int intlv_shift_table[] = { 0, 1, 0, 2, 0, 0, 0, 3 };
904 BUG_ON(intlv_en > 7);
905 n = intlv_shift_table[intlv_en];
909 /* Translate the DramAddr given by @dram_addr to an InputAddr. */
910 static u64 dram_addr_to_input_addr(struct mem_ctl_info *mci, u64 dram_addr)
912 struct amd64_pvt *pvt;
919 * See the start of section 3.4.4 (p. 70, BKDG #26094, K8, revA-E)
920 * concerning translating a DramAddr to an InputAddr.
922 intlv_shift = num_node_interleave_bits(dram_intlv_en(pvt, 0));
923 input_addr = ((dram_addr >> intlv_shift) & GENMASK_ULL(35, 12)) +
926 edac_dbg(2, " Intlv Shift=%d DramAddr=0x%lx maps to InputAddr=0x%lx\n",
927 intlv_shift, (unsigned long)dram_addr,
928 (unsigned long)input_addr);
934 * Translate the SysAddr represented by @sys_addr to an InputAddr. It is
935 * assumed that @sys_addr maps to the node given by mci.
937 static u64 sys_addr_to_input_addr(struct mem_ctl_info *mci, u64 sys_addr)
942 dram_addr_to_input_addr(mci, sys_addr_to_dram_addr(mci, sys_addr));
944 edac_dbg(2, "SysAddr 0x%lx translates to InputAddr 0x%lx\n",
945 (unsigned long)sys_addr, (unsigned long)input_addr);
950 /* Map the Error address to a PAGE and PAGE OFFSET. */
951 static inline void error_address_to_page_and_offset(u64 error_address,
952 struct err_info *err)
954 err->page = (u32) (error_address >> PAGE_SHIFT);
955 err->offset = ((u32) error_address) & ~PAGE_MASK;
959 * @sys_addr is an error address (a SysAddr) extracted from the MCA NB Address
960 * Low (section 3.6.4.5) and MCA NB Address High (section 3.6.4.6) registers
961 * of a node that detected an ECC memory error. mci represents the node that
962 * the error address maps to (possibly different from the node that detected
963 * the error). Return the number of the csrow that sys_addr maps to, or -1 on
966 static int sys_addr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr)
970 csrow = input_addr_to_csrow(mci, sys_addr_to_input_addr(mci, sys_addr));
973 amd64_mc_err(mci, "Failed to translate InputAddr to csrow for "
974 "address 0x%lx\n", (unsigned long)sys_addr);
978 /* Protect the PCI config register pairs used for DF indirect access. */
979 static DEFINE_MUTEX(df_indirect_mutex);
982 * Data Fabric Indirect Access uses FICAA/FICAD.
984 * Fabric Indirect Configuration Access Address (FICAA): Constructed based
985 * on the device's Instance Id and the PCI function and register offset of
986 * the desired register.
988 * Fabric Indirect Configuration Access Data (FICAD): There are FICAD LO
989 * and FICAD HI registers but so far we only need the LO register.
991 * Use Instance Id 0xFF to indicate a broadcast read.
993 #define DF_BROADCAST 0xFF
994 static int __df_indirect_read(u16 node, u8 func, u16 reg, u8 instance_id, u32 *lo)
1000 if (node >= amd_nb_num())
1003 F4 = node_to_amd_nb(node)->link;
1007 ficaa = (instance_id == DF_BROADCAST) ? 0 : 1;
1008 ficaa |= reg & 0x3FC;
1009 ficaa |= (func & 0x7) << 11;
1010 ficaa |= instance_id << 16;
1012 mutex_lock(&df_indirect_mutex);
1014 err = pci_write_config_dword(F4, 0x5C, ficaa);
1016 pr_warn("Error writing DF Indirect FICAA, FICAA=0x%x\n", ficaa);
1020 err = pci_read_config_dword(F4, 0x98, lo);
1022 pr_warn("Error reading DF Indirect FICAD LO, FICAA=0x%x.\n", ficaa);
1025 mutex_unlock(&df_indirect_mutex);
1031 static int df_indirect_read_instance(u16 node, u8 func, u16 reg, u8 instance_id, u32 *lo)
1033 return __df_indirect_read(node, func, reg, instance_id, lo);
1036 static int df_indirect_read_broadcast(u16 node, u8 func, u16 reg, u32 *lo)
1038 return __df_indirect_read(node, func, reg, DF_BROADCAST, lo);
1048 static int umc_normaddr_to_sysaddr(u64 norm_addr, u16 nid, u8 umc, u64 *sys_addr)
1050 u64 dram_base_addr, dram_limit_addr, dram_hole_base;
1052 u8 die_id_shift, die_id_mask, socket_id_shift, socket_id_mask;
1053 u8 intlv_num_dies, intlv_num_chan, intlv_num_sockets;
1054 u8 intlv_addr_sel, intlv_addr_bit;
1055 u8 num_intlv_bits, hashed_bit;
1056 u8 lgcy_mmio_hole_en, base = 0;
1057 u8 cs_mask, cs_id = 0;
1058 bool hash_enabled = false;
1060 struct addr_ctx ctx;
1062 memset(&ctx, 0, sizeof(ctx));
1064 /* Start from the normalized address */
1065 ctx.ret_addr = norm_addr;
1070 /* Read D18F0x1B4 (DramOffset), check if base 1 is used. */
1071 if (df_indirect_read_instance(nid, 0, 0x1B4, umc, &ctx.tmp))
1074 /* Remove HiAddrOffset from normalized address, if enabled: */
1075 if (ctx.tmp & BIT(0)) {
1076 u64 hi_addr_offset = (ctx.tmp & GENMASK_ULL(31, 20)) << 8;
1078 if (norm_addr >= hi_addr_offset) {
1079 ctx.ret_addr -= hi_addr_offset;
1084 /* Read D18F0x110 (DramBaseAddress). */
1085 if (df_indirect_read_instance(nid, 0, 0x110 + (8 * base), umc, &ctx.tmp))
1088 /* Check if address range is valid. */
1089 if (!(ctx.tmp & BIT(0))) {
1090 pr_err("%s: Invalid DramBaseAddress range: 0x%x.\n",
1095 lgcy_mmio_hole_en = ctx.tmp & BIT(1);
1096 intlv_num_chan = (ctx.tmp >> 4) & 0xF;
1097 intlv_addr_sel = (ctx.tmp >> 8) & 0x7;
1098 dram_base_addr = (ctx.tmp & GENMASK_ULL(31, 12)) << 16;
1100 /* {0, 1, 2, 3} map to address bits {8, 9, 10, 11} respectively */
1101 if (intlv_addr_sel > 3) {
1102 pr_err("%s: Invalid interleave address select %d.\n",
1103 __func__, intlv_addr_sel);
1107 /* Read D18F0x114 (DramLimitAddress). */
1108 if (df_indirect_read_instance(nid, 0, 0x114 + (8 * base), umc, &ctx.tmp))
1111 intlv_num_sockets = (ctx.tmp >> 8) & 0x1;
1112 intlv_num_dies = (ctx.tmp >> 10) & 0x3;
1113 dram_limit_addr = ((ctx.tmp & GENMASK_ULL(31, 12)) << 16) | GENMASK_ULL(27, 0);
1115 intlv_addr_bit = intlv_addr_sel + 8;
1117 /* Re-use intlv_num_chan by setting it equal to log2(#channels) */
1118 switch (intlv_num_chan) {
1119 case 0: intlv_num_chan = 0; break;
1120 case 1: intlv_num_chan = 1; break;
1121 case 3: intlv_num_chan = 2; break;
1122 case 5: intlv_num_chan = 3; break;
1123 case 7: intlv_num_chan = 4; break;
1125 case 8: intlv_num_chan = 1;
1126 hash_enabled = true;
1129 pr_err("%s: Invalid number of interleaved channels %d.\n",
1130 __func__, intlv_num_chan);
1134 num_intlv_bits = intlv_num_chan;
1136 if (intlv_num_dies > 2) {
1137 pr_err("%s: Invalid number of interleaved nodes/dies %d.\n",
1138 __func__, intlv_num_dies);
1142 num_intlv_bits += intlv_num_dies;
1144 /* Add a bit if sockets are interleaved. */
1145 num_intlv_bits += intlv_num_sockets;
1147 /* Assert num_intlv_bits <= 4 */
1148 if (num_intlv_bits > 4) {
1149 pr_err("%s: Invalid interleave bits %d.\n",
1150 __func__, num_intlv_bits);
1154 if (num_intlv_bits > 0) {
1155 u64 temp_addr_x, temp_addr_i, temp_addr_y;
1156 u8 die_id_bit, sock_id_bit, cs_fabric_id;
1159 * Read FabricBlockInstanceInformation3_CS[BlockFabricID].
1160 * This is the fabric id for this coherent slave. Use
1161 * umc/channel# as instance id of the coherent slave
1164 if (df_indirect_read_instance(nid, 0, 0x50, umc, &ctx.tmp))
1167 cs_fabric_id = (ctx.tmp >> 8) & 0xFF;
1170 /* If interleaved over more than 1 channel: */
1171 if (intlv_num_chan) {
1172 die_id_bit = intlv_num_chan;
1173 cs_mask = (1 << die_id_bit) - 1;
1174 cs_id = cs_fabric_id & cs_mask;
1177 sock_id_bit = die_id_bit;
1179 /* Read D18F1x208 (SystemFabricIdMask). */
1180 if (intlv_num_dies || intlv_num_sockets)
1181 if (df_indirect_read_broadcast(nid, 1, 0x208, &ctx.tmp))
1184 /* If interleaved over more than 1 die. */
1185 if (intlv_num_dies) {
1186 sock_id_bit = die_id_bit + intlv_num_dies;
1187 die_id_shift = (ctx.tmp >> 24) & 0xF;
1188 die_id_mask = (ctx.tmp >> 8) & 0xFF;
1190 cs_id |= ((cs_fabric_id & die_id_mask) >> die_id_shift) << die_id_bit;
1193 /* If interleaved over more than 1 socket. */
1194 if (intlv_num_sockets) {
1195 socket_id_shift = (ctx.tmp >> 28) & 0xF;
1196 socket_id_mask = (ctx.tmp >> 16) & 0xFF;
1198 cs_id |= ((cs_fabric_id & socket_id_mask) >> socket_id_shift) << sock_id_bit;
1202 * The pre-interleaved address consists of XXXXXXIIIYYYYY
1203 * where III is the ID for this CS, and XXXXXXYYYYY are the
1204 * address bits from the post-interleaved address.
1205 * "num_intlv_bits" has been calculated to tell us how many "I"
1206 * bits there are. "intlv_addr_bit" tells us how many "Y" bits
1207 * there are (where "I" starts).
1209 temp_addr_y = ctx.ret_addr & GENMASK_ULL(intlv_addr_bit - 1, 0);
1210 temp_addr_i = (cs_id << intlv_addr_bit);
1211 temp_addr_x = (ctx.ret_addr & GENMASK_ULL(63, intlv_addr_bit)) << num_intlv_bits;
1212 ctx.ret_addr = temp_addr_x | temp_addr_i | temp_addr_y;
1215 /* Add dram base address */
1216 ctx.ret_addr += dram_base_addr;
1218 /* If legacy MMIO hole enabled */
1219 if (lgcy_mmio_hole_en) {
1220 if (df_indirect_read_broadcast(nid, 0, 0x104, &ctx.tmp))
1223 dram_hole_base = ctx.tmp & GENMASK(31, 24);
1224 if (ctx.ret_addr >= dram_hole_base)
1225 ctx.ret_addr += (BIT_ULL(32) - dram_hole_base);
1229 /* Save some parentheses and grab ls-bit at the end. */
1230 hashed_bit = (ctx.ret_addr >> 12) ^
1231 (ctx.ret_addr >> 18) ^
1232 (ctx.ret_addr >> 21) ^
1233 (ctx.ret_addr >> 30) ^
1236 hashed_bit &= BIT(0);
1238 if (hashed_bit != ((ctx.ret_addr >> intlv_addr_bit) & BIT(0)))
1239 ctx.ret_addr ^= BIT(intlv_addr_bit);
1242 /* Is calculated system address is above DRAM limit address? */
1243 if (ctx.ret_addr > dram_limit_addr)
1246 *sys_addr = ctx.ret_addr;
1253 static int get_channel_from_ecc_syndrome(struct mem_ctl_info *, u16);
1256 * Determine if the DIMMs have ECC enabled. ECC is enabled ONLY if all the DIMMs
1259 static unsigned long dct_determine_edac_cap(struct amd64_pvt *pvt)
1261 unsigned long edac_cap = EDAC_FLAG_NONE;
1264 bit = (pvt->fam > 0xf || pvt->ext_model >= K8_REV_F)
1268 if (pvt->dclr0 & BIT(bit))
1269 edac_cap = EDAC_FLAG_SECDED;
1274 static unsigned long umc_determine_edac_cap(struct amd64_pvt *pvt)
1276 u8 i, umc_en_mask = 0, dimm_ecc_en_mask = 0;
1277 unsigned long edac_cap = EDAC_FLAG_NONE;
1280 if (!(pvt->umc[i].sdp_ctrl & UMC_SDP_INIT))
1283 umc_en_mask |= BIT(i);
1285 /* UMC Configuration bit 12 (DimmEccEn) */
1286 if (pvt->umc[i].umc_cfg & BIT(12))
1287 dimm_ecc_en_mask |= BIT(i);
1290 if (umc_en_mask == dimm_ecc_en_mask)
1291 edac_cap = EDAC_FLAG_SECDED;
1297 * debug routine to display the memory sizes of all logical DIMMs and its
1300 static void dct_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
1302 u32 *dcsb = ctrl ? pvt->csels[1].csbases : pvt->csels[0].csbases;
1303 u32 dbam = ctrl ? pvt->dbam1 : pvt->dbam0;
1304 int dimm, size0, size1;
1306 if (pvt->fam == 0xf) {
1307 /* K8 families < revF not supported yet */
1308 if (pvt->ext_model < K8_REV_F)
1314 if (pvt->fam == 0x10) {
1315 dbam = (ctrl && !dct_ganging_enabled(pvt)) ? pvt->dbam1
1317 dcsb = (ctrl && !dct_ganging_enabled(pvt)) ?
1318 pvt->csels[1].csbases :
1319 pvt->csels[0].csbases;
1322 dcsb = pvt->csels[1].csbases;
1324 edac_dbg(1, "F2x%d80 (DRAM Bank Address Mapping): 0x%08x\n",
1327 edac_printk(KERN_DEBUG, EDAC_MC, "DCT%d chip selects:\n", ctrl);
1329 /* Dump memory sizes for DIMM and its CSROWs */
1330 for (dimm = 0; dimm < 4; dimm++) {
1332 if (dcsb[dimm * 2] & DCSB_CS_ENABLE)
1334 * For F15m60h, we need multiplier for LRDIMM cs_size
1335 * calculation. We pass dimm value to the dbam_to_cs
1336 * mapper so we can find the multiplier from the
1337 * corresponding DCSM.
1339 size0 = pvt->ops->dbam_to_cs(pvt, ctrl,
1340 DBAM_DIMM(dimm, dbam),
1344 if (dcsb[dimm * 2 + 1] & DCSB_CS_ENABLE)
1345 size1 = pvt->ops->dbam_to_cs(pvt, ctrl,
1346 DBAM_DIMM(dimm, dbam),
1349 amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
1351 dimm * 2 + 1, size1);
1356 static void debug_dump_dramcfg_low(struct amd64_pvt *pvt, u32 dclr, int chan)
1358 edac_dbg(1, "F2x%d90 (DRAM Cfg Low): 0x%08x\n", chan, dclr);
1360 if (pvt->dram_type == MEM_LRDDR3) {
1361 u32 dcsm = pvt->csels[chan].csmasks[0];
1363 * It's assumed all LRDIMMs in a DCT are going to be of
1364 * same 'type' until proven otherwise. So, use a cs
1365 * value of '0' here to get dcsm value.
1367 edac_dbg(1, " LRDIMM %dx rank multiply\n", (dcsm & 0x3));
1370 edac_dbg(1, "All DIMMs support ECC:%s\n",
1371 (dclr & BIT(19)) ? "yes" : "no");
1374 edac_dbg(1, " PAR/ERR parity: %s\n",
1375 (dclr & BIT(8)) ? "enabled" : "disabled");
1377 if (pvt->fam == 0x10)
1378 edac_dbg(1, " DCT 128bit mode width: %s\n",
1379 (dclr & BIT(11)) ? "128b" : "64b");
1381 edac_dbg(1, " x4 logical DIMMs present: L0: %s L1: %s L2: %s L3: %s\n",
1382 (dclr & BIT(12)) ? "yes" : "no",
1383 (dclr & BIT(13)) ? "yes" : "no",
1384 (dclr & BIT(14)) ? "yes" : "no",
1385 (dclr & BIT(15)) ? "yes" : "no");
1388 #define CS_EVEN_PRIMARY BIT(0)
1389 #define CS_ODD_PRIMARY BIT(1)
1390 #define CS_EVEN_SECONDARY BIT(2)
1391 #define CS_ODD_SECONDARY BIT(3)
1392 #define CS_3R_INTERLEAVE BIT(4)
1394 #define CS_EVEN (CS_EVEN_PRIMARY | CS_EVEN_SECONDARY)
1395 #define CS_ODD (CS_ODD_PRIMARY | CS_ODD_SECONDARY)
1397 static int umc_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt)
1402 if (csrow_enabled(2 * dimm, ctrl, pvt))
1403 cs_mode |= CS_EVEN_PRIMARY;
1405 if (csrow_enabled(2 * dimm + 1, ctrl, pvt))
1406 cs_mode |= CS_ODD_PRIMARY;
1408 /* Asymmetric dual-rank DIMM support. */
1409 if (csrow_sec_enabled(2 * dimm + 1, ctrl, pvt))
1410 cs_mode |= CS_ODD_SECONDARY;
1413 * 3 Rank inteleaving support.
1414 * There should be only three bases enabled and their two masks should
1417 for_each_chip_select(base, ctrl, pvt)
1418 count += csrow_enabled(base, ctrl, pvt);
1421 pvt->csels[ctrl].csmasks[0] == pvt->csels[ctrl].csmasks[1]) {
1422 edac_dbg(1, "3R interleaving in use.\n");
1423 cs_mode |= CS_3R_INTERLEAVE;
1429 static int umc_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc,
1430 unsigned int cs_mode, int csrow_nr)
1432 u32 addr_mask_orig, addr_mask_deinterleaved;
1433 u32 msb, weight, num_zero_bits;
1434 int cs_mask_nr = csrow_nr;
1437 /* No Chip Selects are enabled. */
1441 /* Requested size of an even CS but none are enabled. */
1442 if (!(cs_mode & CS_EVEN) && !(csrow_nr & 1))
1445 /* Requested size of an odd CS but none are enabled. */
1446 if (!(cs_mode & CS_ODD) && (csrow_nr & 1))
1450 * Family 17h introduced systems with one mask per DIMM,
1451 * and two Chip Selects per DIMM.
1453 * CS0 and CS1 -> MASK0 / DIMM0
1454 * CS2 and CS3 -> MASK1 / DIMM1
1456 * Family 19h Model 10h introduced systems with one mask per Chip Select,
1457 * and two Chip Selects per DIMM.
1459 * CS0 -> MASK0 -> DIMM0
1460 * CS1 -> MASK1 -> DIMM0
1461 * CS2 -> MASK2 -> DIMM1
1462 * CS3 -> MASK3 -> DIMM1
1464 * Keep the mask number equal to the Chip Select number for newer systems,
1465 * and shift the mask number for older systems.
1467 dimm = csrow_nr >> 1;
1469 if (!pvt->flags.zn_regs_v2)
1472 /* Asymmetric dual-rank DIMM support. */
1473 if ((csrow_nr & 1) && (cs_mode & CS_ODD_SECONDARY))
1474 addr_mask_orig = pvt->csels[umc].csmasks_sec[cs_mask_nr];
1476 addr_mask_orig = pvt->csels[umc].csmasks[cs_mask_nr];
1479 * The number of zero bits in the mask is equal to the number of bits
1480 * in a full mask minus the number of bits in the current mask.
1482 * The MSB is the number of bits in the full mask because BIT[0] is
1485 * In the special 3 Rank interleaving case, a single bit is flipped
1486 * without swapping with the most significant bit. This can be handled
1487 * by keeping the MSB where it is and ignoring the single zero bit.
1489 msb = fls(addr_mask_orig) - 1;
1490 weight = hweight_long(addr_mask_orig);
1491 num_zero_bits = msb - weight - !!(cs_mode & CS_3R_INTERLEAVE);
1493 /* Take the number of zero bits off from the top of the mask. */
1494 addr_mask_deinterleaved = GENMASK_ULL(msb - num_zero_bits, 1);
1496 edac_dbg(1, "CS%d DIMM%d AddrMasks:\n", csrow_nr, dimm);
1497 edac_dbg(1, " Original AddrMask: 0x%x\n", addr_mask_orig);
1498 edac_dbg(1, " Deinterleaved AddrMask: 0x%x\n", addr_mask_deinterleaved);
1500 /* Register [31:1] = Address [39:9]. Size is in kBs here. */
1501 size = (addr_mask_deinterleaved >> 2) + 1;
1503 /* Return size in MBs. */
1507 static void umc_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
1509 int dimm, size0, size1, cs0, cs1, cs_mode;
1511 edac_printk(KERN_DEBUG, EDAC_MC, "UMC%d chip selects:\n", ctrl);
1513 for (dimm = 0; dimm < 2; dimm++) {
1517 cs_mode = umc_get_cs_mode(dimm, ctrl, pvt);
1519 size0 = umc_addr_mask_to_cs_size(pvt, ctrl, cs_mode, cs0);
1520 size1 = umc_addr_mask_to_cs_size(pvt, ctrl, cs_mode, cs1);
1522 amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
1528 static void umc_dump_misc_regs(struct amd64_pvt *pvt)
1530 struct amd64_umc *umc;
1531 u32 i, tmp, umc_base;
1534 umc_base = get_umc_base(i);
1537 edac_dbg(1, "UMC%d DIMM cfg: 0x%x\n", i, umc->dimm_cfg);
1538 edac_dbg(1, "UMC%d UMC cfg: 0x%x\n", i, umc->umc_cfg);
1539 edac_dbg(1, "UMC%d SDP ctrl: 0x%x\n", i, umc->sdp_ctrl);
1540 edac_dbg(1, "UMC%d ECC ctrl: 0x%x\n", i, umc->ecc_ctrl);
1542 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_ECC_BAD_SYMBOL, &tmp);
1543 edac_dbg(1, "UMC%d ECC bad symbol: 0x%x\n", i, tmp);
1545 amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_UMC_CAP, &tmp);
1546 edac_dbg(1, "UMC%d UMC cap: 0x%x\n", i, tmp);
1547 edac_dbg(1, "UMC%d UMC cap high: 0x%x\n", i, umc->umc_cap_hi);
1549 edac_dbg(1, "UMC%d ECC capable: %s, ChipKill ECC capable: %s\n",
1550 i, (umc->umc_cap_hi & BIT(30)) ? "yes" : "no",
1551 (umc->umc_cap_hi & BIT(31)) ? "yes" : "no");
1552 edac_dbg(1, "UMC%d All DIMMs support ECC: %s\n",
1553 i, (umc->umc_cfg & BIT(12)) ? "yes" : "no");
1554 edac_dbg(1, "UMC%d x4 DIMMs present: %s\n",
1555 i, (umc->dimm_cfg & BIT(6)) ? "yes" : "no");
1556 edac_dbg(1, "UMC%d x16 DIMMs present: %s\n",
1557 i, (umc->dimm_cfg & BIT(7)) ? "yes" : "no");
1559 if (umc->dram_type == MEM_LRDDR4 || umc->dram_type == MEM_LRDDR5) {
1560 amd_smn_read(pvt->mc_node_id,
1561 umc_base + get_umc_reg(pvt, UMCCH_ADDR_CFG),
1563 edac_dbg(1, "UMC%d LRDIMM %dx rank multiply\n",
1564 i, 1 << ((tmp >> 4) & 0x3));
1567 umc_debug_display_dimm_sizes(pvt, i);
1571 static void dct_dump_misc_regs(struct amd64_pvt *pvt)
1573 edac_dbg(1, "F3xE8 (NB Cap): 0x%08x\n", pvt->nbcap);
1575 edac_dbg(1, " NB two channel DRAM capable: %s\n",
1576 (pvt->nbcap & NBCAP_DCT_DUAL) ? "yes" : "no");
1578 edac_dbg(1, " ECC capable: %s, ChipKill ECC capable: %s\n",
1579 (pvt->nbcap & NBCAP_SECDED) ? "yes" : "no",
1580 (pvt->nbcap & NBCAP_CHIPKILL) ? "yes" : "no");
1582 debug_dump_dramcfg_low(pvt, pvt->dclr0, 0);
1584 edac_dbg(1, "F3xB0 (Online Spare): 0x%08x\n", pvt->online_spare);
1586 edac_dbg(1, "F1xF0 (DRAM Hole Address): 0x%08x, base: 0x%08x, offset: 0x%08x\n",
1587 pvt->dhar, dhar_base(pvt),
1588 (pvt->fam == 0xf) ? k8_dhar_offset(pvt)
1589 : f10_dhar_offset(pvt));
1591 dct_debug_display_dimm_sizes(pvt, 0);
1593 /* everything below this point is Fam10h and above */
1594 if (pvt->fam == 0xf)
1597 dct_debug_display_dimm_sizes(pvt, 1);
1599 /* Only if NOT ganged does dclr1 have valid info */
1600 if (!dct_ganging_enabled(pvt))
1601 debug_dump_dramcfg_low(pvt, pvt->dclr1, 1);
1603 edac_dbg(1, " DramHoleValid: %s\n", dhar_valid(pvt) ? "yes" : "no");
1605 amd64_info("using x%u syndromes.\n", pvt->ecc_sym_sz);
1609 * See BKDG, F2x[1,0][5C:40], F2[1,0][6C:60]
1611 static void dct_prep_chip_selects(struct amd64_pvt *pvt)
1613 if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
1614 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
1615 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 8;
1616 } else if (pvt->fam == 0x15 && pvt->model == 0x30) {
1617 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 4;
1618 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 2;
1620 pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
1621 pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 4;
1625 static void umc_prep_chip_selects(struct amd64_pvt *pvt)
1630 pvt->csels[umc].b_cnt = 4;
1631 pvt->csels[umc].m_cnt = pvt->flags.zn_regs_v2 ? 4 : 2;
1635 static void umc_read_base_mask(struct amd64_pvt *pvt)
1637 u32 umc_base_reg, umc_base_reg_sec;
1638 u32 umc_mask_reg, umc_mask_reg_sec;
1639 u32 base_reg, base_reg_sec;
1640 u32 mask_reg, mask_reg_sec;
1641 u32 *base, *base_sec;
1642 u32 *mask, *mask_sec;
1646 umc_base_reg = get_umc_base(umc) + UMCCH_BASE_ADDR;
1647 umc_base_reg_sec = get_umc_base(umc) + UMCCH_BASE_ADDR_SEC;
1649 for_each_chip_select(cs, umc, pvt) {
1650 base = &pvt->csels[umc].csbases[cs];
1651 base_sec = &pvt->csels[umc].csbases_sec[cs];
1653 base_reg = umc_base_reg + (cs * 4);
1654 base_reg_sec = umc_base_reg_sec + (cs * 4);
1656 if (!amd_smn_read(pvt->mc_node_id, base_reg, base))
1657 edac_dbg(0, " DCSB%d[%d]=0x%08x reg: 0x%x\n",
1658 umc, cs, *base, base_reg);
1660 if (!amd_smn_read(pvt->mc_node_id, base_reg_sec, base_sec))
1661 edac_dbg(0, " DCSB_SEC%d[%d]=0x%08x reg: 0x%x\n",
1662 umc, cs, *base_sec, base_reg_sec);
1665 umc_mask_reg = get_umc_base(umc) + UMCCH_ADDR_MASK;
1666 umc_mask_reg_sec = get_umc_base(umc) + get_umc_reg(pvt, UMCCH_ADDR_MASK_SEC);
1668 for_each_chip_select_mask(cs, umc, pvt) {
1669 mask = &pvt->csels[umc].csmasks[cs];
1670 mask_sec = &pvt->csels[umc].csmasks_sec[cs];
1672 mask_reg = umc_mask_reg + (cs * 4);
1673 mask_reg_sec = umc_mask_reg_sec + (cs * 4);
1675 if (!amd_smn_read(pvt->mc_node_id, mask_reg, mask))
1676 edac_dbg(0, " DCSM%d[%d]=0x%08x reg: 0x%x\n",
1677 umc, cs, *mask, mask_reg);
1679 if (!amd_smn_read(pvt->mc_node_id, mask_reg_sec, mask_sec))
1680 edac_dbg(0, " DCSM_SEC%d[%d]=0x%08x reg: 0x%x\n",
1681 umc, cs, *mask_sec, mask_reg_sec);
1687 * Function 2 Offset F10_DCSB0; read in the DCS Base and DCS Mask registers
1689 static void dct_read_base_mask(struct amd64_pvt *pvt)
1693 for_each_chip_select(cs, 0, pvt) {
1694 int reg0 = DCSB0 + (cs * 4);
1695 int reg1 = DCSB1 + (cs * 4);
1696 u32 *base0 = &pvt->csels[0].csbases[cs];
1697 u32 *base1 = &pvt->csels[1].csbases[cs];
1699 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0))
1700 edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n",
1703 if (pvt->fam == 0xf)
1706 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1))
1707 edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n",
1708 cs, *base1, (pvt->fam == 0x10) ? reg1
1712 for_each_chip_select_mask(cs, 0, pvt) {
1713 int reg0 = DCSM0 + (cs * 4);
1714 int reg1 = DCSM1 + (cs * 4);
1715 u32 *mask0 = &pvt->csels[0].csmasks[cs];
1716 u32 *mask1 = &pvt->csels[1].csmasks[cs];
1718 if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0))
1719 edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n",
1722 if (pvt->fam == 0xf)
1725 if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1))
1726 edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n",
1727 cs, *mask1, (pvt->fam == 0x10) ? reg1
1732 static void umc_determine_memory_type(struct amd64_pvt *pvt)
1734 struct amd64_umc *umc;
1740 if (!(umc->sdp_ctrl & UMC_SDP_INIT)) {
1741 umc->dram_type = MEM_EMPTY;
1746 * Check if the system supports the "DDR Type" field in UMC Config
1747 * and has DDR5 DIMMs in use.
1749 if (pvt->flags.zn_regs_v2 && ((umc->umc_cfg & GENMASK(2, 0)) == 0x1)) {
1750 if (umc->dimm_cfg & BIT(5))
1751 umc->dram_type = MEM_LRDDR5;
1752 else if (umc->dimm_cfg & BIT(4))
1753 umc->dram_type = MEM_RDDR5;
1755 umc->dram_type = MEM_DDR5;
1757 if (umc->dimm_cfg & BIT(5))
1758 umc->dram_type = MEM_LRDDR4;
1759 else if (umc->dimm_cfg & BIT(4))
1760 umc->dram_type = MEM_RDDR4;
1762 umc->dram_type = MEM_DDR4;
1765 edac_dbg(1, " UMC%d DIMM type: %s\n", i, edac_mem_types[umc->dram_type]);
1769 static void dct_determine_memory_type(struct amd64_pvt *pvt)
1771 u32 dram_ctrl, dcsm;
1775 if (pvt->ext_model >= K8_REV_F)
1778 pvt->dram_type = (pvt->dclr0 & BIT(18)) ? MEM_DDR : MEM_RDDR;
1782 if (pvt->dchr0 & DDR3_MODE)
1785 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR2 : MEM_RDDR2;
1789 if (pvt->model < 0x60)
1793 * Model 0x60h needs special handling:
1795 * We use a Chip Select value of '0' to obtain dcsm.
1796 * Theoretically, it is possible to populate LRDIMMs of different
1797 * 'Rank' value on a DCT. But this is not the common case. So,
1798 * it's reasonable to assume all DIMMs are going to be of same
1799 * 'type' until proven otherwise.
1801 amd64_read_dct_pci_cfg(pvt, 0, DRAM_CONTROL, &dram_ctrl);
1802 dcsm = pvt->csels[0].csmasks[0];
1804 if (((dram_ctrl >> 8) & 0x7) == 0x2)
1805 pvt->dram_type = MEM_DDR4;
1806 else if (pvt->dclr0 & BIT(16))
1807 pvt->dram_type = MEM_DDR3;
1808 else if (dcsm & 0x3)
1809 pvt->dram_type = MEM_LRDDR3;
1811 pvt->dram_type = MEM_RDDR3;
1819 WARN(1, KERN_ERR "%s: Family??? 0x%x\n", __func__, pvt->fam);
1820 pvt->dram_type = MEM_EMPTY;
1823 edac_dbg(1, " DIMM type: %s\n", edac_mem_types[pvt->dram_type]);
1827 pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR3 : MEM_RDDR3;
1830 /* On F10h and later ErrAddr is MC4_ADDR[47:1] */
1831 static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m)
1833 u16 mce_nid = topology_die_id(m->extcpu);
1834 struct mem_ctl_info *mci;
1839 mci = edac_mc_find(mce_nid);
1843 pvt = mci->pvt_info;
1845 if (pvt->fam == 0xf) {
1850 addr = m->addr & GENMASK_ULL(end_bit, start_bit);
1853 * Erratum 637 workaround
1855 if (pvt->fam == 0x15) {
1856 u64 cc6_base, tmp_addr;
1860 if ((addr & GENMASK_ULL(47, 24)) >> 24 != 0x00fdf7)
1864 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_LIM, &tmp);
1865 intlv_en = tmp >> 21 & 0x7;
1867 /* add [47:27] + 3 trailing bits */
1868 cc6_base = (tmp & GENMASK_ULL(20, 0)) << 3;
1870 /* reverse and add DramIntlvEn */
1871 cc6_base |= intlv_en ^ 0x7;
1873 /* pin at [47:24] */
1877 return cc6_base | (addr & GENMASK_ULL(23, 0));
1879 amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_BASE, &tmp);
1882 tmp_addr = (addr & GENMASK_ULL(23, 12)) << __fls(intlv_en + 1);
1884 /* OR DramIntlvSel into bits [14:12] */
1885 tmp_addr |= (tmp & GENMASK_ULL(23, 21)) >> 9;
1887 /* add remaining [11:0] bits from original MC4_ADDR */
1888 tmp_addr |= addr & GENMASK_ULL(11, 0);
1890 return cc6_base | tmp_addr;
1896 static struct pci_dev *pci_get_related_function(unsigned int vendor,
1897 unsigned int device,
1898 struct pci_dev *related)
1900 struct pci_dev *dev = NULL;
1902 while ((dev = pci_get_device(vendor, device, dev))) {
1903 if (pci_domain_nr(dev->bus) == pci_domain_nr(related->bus) &&
1904 (dev->bus->number == related->bus->number) &&
1905 (PCI_SLOT(dev->devfn) == PCI_SLOT(related->devfn)))
1912 static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range)
1914 struct amd_northbridge *nb;
1915 struct pci_dev *f1 = NULL;
1916 unsigned int pci_func;
1917 int off = range << 3;
1920 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_LO + off, &pvt->ranges[range].base.lo);
1921 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_LO + off, &pvt->ranges[range].lim.lo);
1923 if (pvt->fam == 0xf)
1926 if (!dram_rw(pvt, range))
1929 amd64_read_pci_cfg(pvt->F1, DRAM_BASE_HI + off, &pvt->ranges[range].base.hi);
1930 amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi);
1932 /* F15h: factor in CC6 save area by reading dst node's limit reg */
1933 if (pvt->fam != 0x15)
1936 nb = node_to_amd_nb(dram_dst_node(pvt, range));
1940 if (pvt->model == 0x60)
1941 pci_func = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1;
1942 else if (pvt->model == 0x30)
1943 pci_func = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1;
1945 pci_func = PCI_DEVICE_ID_AMD_15H_NB_F1;
1947 f1 = pci_get_related_function(nb->misc->vendor, pci_func, nb->misc);
1951 amd64_read_pci_cfg(f1, DRAM_LOCAL_NODE_LIM, &llim);
1953 pvt->ranges[range].lim.lo &= GENMASK_ULL(15, 0);
1955 /* {[39:27],111b} */
1956 pvt->ranges[range].lim.lo |= ((llim & 0x1fff) << 3 | 0x7) << 16;
1958 pvt->ranges[range].lim.hi &= GENMASK_ULL(7, 0);
1961 pvt->ranges[range].lim.hi |= llim >> 13;
1966 static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1967 struct err_info *err)
1969 struct amd64_pvt *pvt = mci->pvt_info;
1971 error_address_to_page_and_offset(sys_addr, err);
1974 * Find out which node the error address belongs to. This may be
1975 * different from the node that detected the error.
1977 err->src_mci = find_mc_by_sys_addr(mci, sys_addr);
1978 if (!err->src_mci) {
1979 amd64_mc_err(mci, "failed to map error addr 0x%lx to a node\n",
1980 (unsigned long)sys_addr);
1981 err->err_code = ERR_NODE;
1985 /* Now map the sys_addr to a CSROW */
1986 err->csrow = sys_addr_to_csrow(err->src_mci, sys_addr);
1987 if (err->csrow < 0) {
1988 err->err_code = ERR_CSROW;
1992 /* CHIPKILL enabled */
1993 if (pvt->nbcfg & NBCFG_CHIPKILL) {
1994 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
1995 if (err->channel < 0) {
1997 * Syndrome didn't map, so we don't know which of the
1998 * 2 DIMMs is in error. So we need to ID 'both' of them
2001 amd64_mc_warn(err->src_mci, "unknown syndrome 0x%04x - "
2002 "possible error reporting race\n",
2004 err->err_code = ERR_CHANNEL;
2009 * non-chipkill ecc mode
2011 * The k8 documentation is unclear about how to determine the
2012 * channel number when using non-chipkill memory. This method
2013 * was obtained from email communication with someone at AMD.
2014 * (Wish the email was placed in this comment - norsk)
2016 err->channel = ((sys_addr & BIT(3)) != 0);
2020 static int ddr2_cs_size(unsigned i, bool dct_width)
2026 else if (!(i & 0x1))
2029 shift = (i + 1) >> 1;
2031 return 128 << (shift + !!dct_width);
2034 static int k8_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
2035 unsigned cs_mode, int cs_mask_nr)
2037 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
2039 if (pvt->ext_model >= K8_REV_F) {
2040 WARN_ON(cs_mode > 11);
2041 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
2043 else if (pvt->ext_model >= K8_REV_D) {
2045 WARN_ON(cs_mode > 10);
2048 * the below calculation, besides trying to win an obfuscated C
2049 * contest, maps cs_mode values to DIMM chip select sizes. The
2052 * cs_mode CS size (mb)
2053 * ======= ============
2066 * Basically, it calculates a value with which to shift the
2067 * smallest CS size of 32MB.
2069 * ddr[23]_cs_size have a similar purpose.
2071 diff = cs_mode/3 + (unsigned)(cs_mode > 5);
2073 return 32 << (cs_mode - diff);
2076 WARN_ON(cs_mode > 6);
2077 return 32 << cs_mode;
2081 static int ddr3_cs_size(unsigned i, bool dct_width)
2086 if (i == 0 || i == 3 || i == 4)
2092 else if (!(i & 0x1))
2095 shift = (i + 1) >> 1;
2098 cs_size = (128 * (1 << !!dct_width)) << shift;
2103 static int ddr3_lrdimm_cs_size(unsigned i, unsigned rank_multiply)
2108 if (i < 4 || i == 6)
2112 else if (!(i & 0x1))
2115 shift = (i + 1) >> 1;
2118 cs_size = rank_multiply * (128 << shift);
2123 static int ddr4_cs_size(unsigned i)
2132 /* Min cs_size = 1G */
2133 cs_size = 1024 * (1 << (i >> 1));
2138 static int f10_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
2139 unsigned cs_mode, int cs_mask_nr)
2141 u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
2143 WARN_ON(cs_mode > 11);
2145 if (pvt->dchr0 & DDR3_MODE || pvt->dchr1 & DDR3_MODE)
2146 return ddr3_cs_size(cs_mode, dclr & WIDTH_128);
2148 return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
2152 * F15h supports only 64bit DCT interfaces
2154 static int f15_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
2155 unsigned cs_mode, int cs_mask_nr)
2157 WARN_ON(cs_mode > 12);
2159 return ddr3_cs_size(cs_mode, false);
2162 /* F15h M60h supports DDR4 mapping as well.. */
2163 static int f15_m60h_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
2164 unsigned cs_mode, int cs_mask_nr)
2167 u32 dcsm = pvt->csels[dct].csmasks[cs_mask_nr];
2169 WARN_ON(cs_mode > 12);
2171 if (pvt->dram_type == MEM_DDR4) {
2175 cs_size = ddr4_cs_size(cs_mode);
2176 } else if (pvt->dram_type == MEM_LRDDR3) {
2177 unsigned rank_multiply = dcsm & 0xf;
2179 if (rank_multiply == 3)
2181 cs_size = ddr3_lrdimm_cs_size(cs_mode, rank_multiply);
2183 /* Minimum cs size is 512mb for F15hM60h*/
2187 cs_size = ddr3_cs_size(cs_mode, false);
2194 * F16h and F15h model 30h have only limited cs_modes.
2196 static int f16_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
2197 unsigned cs_mode, int cs_mask_nr)
2199 WARN_ON(cs_mode > 12);
2201 if (cs_mode == 6 || cs_mode == 8 ||
2202 cs_mode == 9 || cs_mode == 12)
2205 return ddr3_cs_size(cs_mode, false);
2208 static void read_dram_ctl_register(struct amd64_pvt *pvt)
2211 if (pvt->fam == 0xf)
2214 if (!amd64_read_pci_cfg(pvt->F2, DCT_SEL_LO, &pvt->dct_sel_lo)) {
2215 edac_dbg(0, "F2x110 (DCTSelLow): 0x%08x, High range addrs at: 0x%x\n",
2216 pvt->dct_sel_lo, dct_sel_baseaddr(pvt));
2218 edac_dbg(0, " DCTs operate in %s mode\n",
2219 (dct_ganging_enabled(pvt) ? "ganged" : "unganged"));
2221 if (!dct_ganging_enabled(pvt))
2222 edac_dbg(0, " Address range split per DCT: %s\n",
2223 (dct_high_range_enabled(pvt) ? "yes" : "no"));
2225 edac_dbg(0, " data interleave for ECC: %s, DRAM cleared since last warm reset: %s\n",
2226 (dct_data_intlv_enabled(pvt) ? "enabled" : "disabled"),
2227 (dct_memory_cleared(pvt) ? "yes" : "no"));
2229 edac_dbg(0, " channel interleave: %s, "
2230 "interleave bits selector: 0x%x\n",
2231 (dct_interleave_enabled(pvt) ? "enabled" : "disabled"),
2232 dct_sel_interleave_addr(pvt));
2235 amd64_read_pci_cfg(pvt->F2, DCT_SEL_HI, &pvt->dct_sel_hi);
2239 * Determine channel (DCT) based on the interleaving mode (see F15h M30h BKDG,
2240 * 2.10.12 Memory Interleaving Modes).
2242 static u8 f15_m30h_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
2243 u8 intlv_en, int num_dcts_intlv,
2250 return (u8)(dct_sel);
2252 if (num_dcts_intlv == 2) {
2253 select = (sys_addr >> 8) & 0x3;
2254 channel = select ? 0x3 : 0;
2255 } else if (num_dcts_intlv == 4) {
2256 u8 intlv_addr = dct_sel_interleave_addr(pvt);
2257 switch (intlv_addr) {
2259 channel = (sys_addr >> 8) & 0x3;
2262 channel = (sys_addr >> 9) & 0x3;
2270 * Determine channel (DCT) based on the interleaving mode: F10h BKDG, 2.8.9 Memory
2271 * Interleaving Modes.
2273 static u8 f1x_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
2274 bool hi_range_sel, u8 intlv_en)
2276 u8 dct_sel_high = (pvt->dct_sel_lo >> 1) & 1;
2278 if (dct_ganging_enabled(pvt))
2282 return dct_sel_high;
2285 * see F2x110[DctSelIntLvAddr] - channel interleave mode
2287 if (dct_interleave_enabled(pvt)) {
2288 u8 intlv_addr = dct_sel_interleave_addr(pvt);
2290 /* return DCT select function: 0=DCT0, 1=DCT1 */
2292 return sys_addr >> 6 & 1;
2294 if (intlv_addr & 0x2) {
2295 u8 shift = intlv_addr & 0x1 ? 9 : 6;
2296 u32 temp = hweight_long((u32) ((sys_addr >> 16) & 0x1F)) & 1;
2298 return ((sys_addr >> shift) & 1) ^ temp;
2301 if (intlv_addr & 0x4) {
2302 u8 shift = intlv_addr & 0x1 ? 9 : 8;
2304 return (sys_addr >> shift) & 1;
2307 return (sys_addr >> (12 + hweight8(intlv_en))) & 1;
2310 if (dct_high_range_enabled(pvt))
2311 return ~dct_sel_high & 1;
2316 /* Convert the sys_addr to the normalized DCT address */
2317 static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, u8 range,
2318 u64 sys_addr, bool hi_rng,
2319 u32 dct_sel_base_addr)
2322 u64 dram_base = get_dram_base(pvt, range);
2323 u64 hole_off = f10_dhar_offset(pvt);
2324 u64 dct_sel_base_off = (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16;
2329 * base address of high range is below 4Gb
2330 * (bits [47:27] at [31:11])
2331 * DRAM address space on this DCT is hoisted above 4Gb &&
2334 * remove hole offset from sys_addr
2336 * remove high range offset from sys_addr
2338 if ((!(dct_sel_base_addr >> 16) ||
2339 dct_sel_base_addr < dhar_base(pvt)) &&
2341 (sys_addr >= BIT_64(32)))
2342 chan_off = hole_off;
2344 chan_off = dct_sel_base_off;
2348 * we have a valid hole &&
2353 * remove dram base to normalize to DCT address
2355 if (dhar_valid(pvt) && (sys_addr >= BIT_64(32)))
2356 chan_off = hole_off;
2358 chan_off = dram_base;
2361 return (sys_addr & GENMASK_ULL(47,6)) - (chan_off & GENMASK_ULL(47,23));
2365 * checks if the csrow passed in is marked as SPARED, if so returns the new
2368 static int f10_process_possible_spare(struct amd64_pvt *pvt, u8 dct, int csrow)
2372 if (online_spare_swap_done(pvt, dct) &&
2373 csrow == online_spare_bad_dramcs(pvt, dct)) {
2375 for_each_chip_select(tmp_cs, dct, pvt) {
2376 if (chip_select_base(tmp_cs, dct, pvt) & 0x2) {
2386 * Iterate over the DRAM DCT "base" and "mask" registers looking for a
2387 * SystemAddr match on the specified 'ChannelSelect' and 'NodeID'
2390 * -EINVAL: NOT FOUND
2391 * 0..csrow = Chip-Select Row
2393 static int f1x_lookup_addr_in_dct(u64 in_addr, u8 nid, u8 dct)
2395 struct mem_ctl_info *mci;
2396 struct amd64_pvt *pvt;
2397 u64 cs_base, cs_mask;
2398 int cs_found = -EINVAL;
2401 mci = edac_mc_find(nid);
2405 pvt = mci->pvt_info;
2407 edac_dbg(1, "input addr: 0x%llx, DCT: %d\n", in_addr, dct);
2409 for_each_chip_select(csrow, dct, pvt) {
2410 if (!csrow_enabled(csrow, dct, pvt))
2413 get_cs_base_and_mask(pvt, csrow, dct, &cs_base, &cs_mask);
2415 edac_dbg(1, " CSROW=%d CSBase=0x%llx CSMask=0x%llx\n",
2416 csrow, cs_base, cs_mask);
2420 edac_dbg(1, " (InputAddr & ~CSMask)=0x%llx (CSBase & ~CSMask)=0x%llx\n",
2421 (in_addr & cs_mask), (cs_base & cs_mask));
2423 if ((in_addr & cs_mask) == (cs_base & cs_mask)) {
2424 if (pvt->fam == 0x15 && pvt->model >= 0x30) {
2428 cs_found = f10_process_possible_spare(pvt, dct, csrow);
2430 edac_dbg(1, " MATCH csrow=%d\n", cs_found);
2438 * See F2x10C. Non-interleaved graphics framebuffer memory under the 16G is
2439 * swapped with a region located at the bottom of memory so that the GPU can use
2440 * the interleaved region and thus two channels.
2442 static u64 f1x_swap_interleaved_region(struct amd64_pvt *pvt, u64 sys_addr)
2444 u32 swap_reg, swap_base, swap_limit, rgn_size, tmp_addr;
2446 if (pvt->fam == 0x10) {
2447 /* only revC3 and revE have that feature */
2448 if (pvt->model < 4 || (pvt->model < 0xa && pvt->stepping < 3))
2452 amd64_read_pci_cfg(pvt->F2, SWAP_INTLV_REG, &swap_reg);
2454 if (!(swap_reg & 0x1))
2457 swap_base = (swap_reg >> 3) & 0x7f;
2458 swap_limit = (swap_reg >> 11) & 0x7f;
2459 rgn_size = (swap_reg >> 20) & 0x7f;
2460 tmp_addr = sys_addr >> 27;
2462 if (!(sys_addr >> 34) &&
2463 (((tmp_addr >= swap_base) &&
2464 (tmp_addr <= swap_limit)) ||
2465 (tmp_addr < rgn_size)))
2466 return sys_addr ^ (u64)swap_base << 27;
2471 /* For a given @dram_range, check if @sys_addr falls within it. */
2472 static int f1x_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
2473 u64 sys_addr, int *chan_sel)
2475 int cs_found = -EINVAL;
2479 bool high_range = false;
2481 u8 node_id = dram_dst_node(pvt, range);
2482 u8 intlv_en = dram_intlv_en(pvt, range);
2483 u32 intlv_sel = dram_intlv_sel(pvt, range);
2485 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
2486 range, sys_addr, get_dram_limit(pvt, range));
2488 if (dhar_valid(pvt) &&
2489 dhar_base(pvt) <= sys_addr &&
2490 sys_addr < BIT_64(32)) {
2491 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2496 if (intlv_en && (intlv_sel != ((sys_addr >> 12) & intlv_en)))
2499 sys_addr = f1x_swap_interleaved_region(pvt, sys_addr);
2501 dct_sel_base = dct_sel_baseaddr(pvt);
2504 * check whether addresses >= DctSelBaseAddr[47:27] are to be used to
2505 * select between DCT0 and DCT1.
2507 if (dct_high_range_enabled(pvt) &&
2508 !dct_ganging_enabled(pvt) &&
2509 ((sys_addr >> 27) >= (dct_sel_base >> 11)))
2512 channel = f1x_determine_channel(pvt, sys_addr, high_range, intlv_en);
2514 chan_addr = f1x_get_norm_dct_addr(pvt, range, sys_addr,
2515 high_range, dct_sel_base);
2517 /* Remove node interleaving, see F1x120 */
2519 chan_addr = ((chan_addr >> (12 + hweight8(intlv_en))) << 12) |
2520 (chan_addr & 0xfff);
2522 /* remove channel interleave */
2523 if (dct_interleave_enabled(pvt) &&
2524 !dct_high_range_enabled(pvt) &&
2525 !dct_ganging_enabled(pvt)) {
2527 if (dct_sel_interleave_addr(pvt) != 1) {
2528 if (dct_sel_interleave_addr(pvt) == 0x3)
2530 chan_addr = ((chan_addr >> 10) << 9) |
2531 (chan_addr & 0x1ff);
2533 /* A[6] or hash 6 */
2534 chan_addr = ((chan_addr >> 7) << 6) |
2538 chan_addr = ((chan_addr >> 13) << 12) |
2539 (chan_addr & 0xfff);
2542 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
2544 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, channel);
2547 *chan_sel = channel;
2552 static int f15_m30h_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
2553 u64 sys_addr, int *chan_sel)
2555 int cs_found = -EINVAL;
2556 int num_dcts_intlv = 0;
2557 u64 chan_addr, chan_offset;
2558 u64 dct_base, dct_limit;
2559 u32 dct_cont_base_reg, dct_cont_limit_reg, tmp;
2560 u8 channel, alias_channel, leg_mmio_hole, dct_sel, dct_offset_en;
2562 u64 dhar_offset = f10_dhar_offset(pvt);
2563 u8 intlv_addr = dct_sel_interleave_addr(pvt);
2564 u8 node_id = dram_dst_node(pvt, range);
2565 u8 intlv_en = dram_intlv_en(pvt, range);
2567 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_BASE, &dct_cont_base_reg);
2568 amd64_read_pci_cfg(pvt->F1, DRAM_CONT_LIMIT, &dct_cont_limit_reg);
2570 dct_offset_en = (u8) ((dct_cont_base_reg >> 3) & BIT(0));
2571 dct_sel = (u8) ((dct_cont_base_reg >> 4) & 0x7);
2573 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
2574 range, sys_addr, get_dram_limit(pvt, range));
2576 if (!(get_dram_base(pvt, range) <= sys_addr) &&
2577 !(get_dram_limit(pvt, range) >= sys_addr))
2580 if (dhar_valid(pvt) &&
2581 dhar_base(pvt) <= sys_addr &&
2582 sys_addr < BIT_64(32)) {
2583 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2588 /* Verify sys_addr is within DCT Range. */
2589 dct_base = (u64) dct_sel_baseaddr(pvt);
2590 dct_limit = (dct_cont_limit_reg >> 11) & 0x1FFF;
2592 if (!(dct_cont_base_reg & BIT(0)) &&
2593 !(dct_base <= (sys_addr >> 27) &&
2594 dct_limit >= (sys_addr >> 27)))
2597 /* Verify number of dct's that participate in channel interleaving. */
2598 num_dcts_intlv = (int) hweight8(intlv_en);
2600 if (!(num_dcts_intlv % 2 == 0) || (num_dcts_intlv > 4))
2603 if (pvt->model >= 0x60)
2604 channel = f1x_determine_channel(pvt, sys_addr, false, intlv_en);
2606 channel = f15_m30h_determine_channel(pvt, sys_addr, intlv_en,
2607 num_dcts_intlv, dct_sel);
2609 /* Verify we stay within the MAX number of channels allowed */
2613 leg_mmio_hole = (u8) (dct_cont_base_reg >> 1 & BIT(0));
2615 /* Get normalized DCT addr */
2616 if (leg_mmio_hole && (sys_addr >= BIT_64(32)))
2617 chan_offset = dhar_offset;
2619 chan_offset = dct_base << 27;
2621 chan_addr = sys_addr - chan_offset;
2623 /* remove channel interleave */
2624 if (num_dcts_intlv == 2) {
2625 if (intlv_addr == 0x4)
2626 chan_addr = ((chan_addr >> 9) << 8) |
2628 else if (intlv_addr == 0x5)
2629 chan_addr = ((chan_addr >> 10) << 9) |
2630 (chan_addr & 0x1ff);
2634 } else if (num_dcts_intlv == 4) {
2635 if (intlv_addr == 0x4)
2636 chan_addr = ((chan_addr >> 10) << 8) |
2638 else if (intlv_addr == 0x5)
2639 chan_addr = ((chan_addr >> 11) << 9) |
2640 (chan_addr & 0x1ff);
2645 if (dct_offset_en) {
2646 amd64_read_pci_cfg(pvt->F1,
2647 DRAM_CONT_HIGH_OFF + (int) channel * 4,
2649 chan_addr += (u64) ((tmp >> 11) & 0xfff) << 27;
2652 f15h_select_dct(pvt, channel);
2654 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr);
2658 * if channel = 3, then alias it to 1. This is because, in F15 M30h,
2659 * there is support for 4 DCT's, but only 2 are currently functional.
2660 * They are DCT0 and DCT3. But we have read all registers of DCT3 into
2661 * pvt->csels[1]. So we need to use '1' here to get correct info.
2662 * Refer F15 M30h BKDG Section 2.10 and 2.10.3 for clarifications.
2664 alias_channel = (channel == 3) ? 1 : channel;
2666 cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, alias_channel);
2669 *chan_sel = alias_channel;
2674 static int f1x_translate_sysaddr_to_cs(struct amd64_pvt *pvt,
2678 int cs_found = -EINVAL;
2681 for (range = 0; range < DRAM_RANGES; range++) {
2682 if (!dram_rw(pvt, range))
2685 if (pvt->fam == 0x15 && pvt->model >= 0x30)
2686 cs_found = f15_m30h_match_to_this_node(pvt, range,
2690 else if ((get_dram_base(pvt, range) <= sys_addr) &&
2691 (get_dram_limit(pvt, range) >= sys_addr)) {
2692 cs_found = f1x_match_to_this_node(pvt, range,
2693 sys_addr, chan_sel);
2702 * For reference see "2.8.5 Routing DRAM Requests" in F10 BKDG. This code maps
2703 * a @sys_addr to NodeID, DCT (channel) and chip select (CSROW).
2705 * The @sys_addr is usually an error address received from the hardware
2708 static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
2709 struct err_info *err)
2711 struct amd64_pvt *pvt = mci->pvt_info;
2713 error_address_to_page_and_offset(sys_addr, err);
2715 err->csrow = f1x_translate_sysaddr_to_cs(pvt, sys_addr, &err->channel);
2716 if (err->csrow < 0) {
2717 err->err_code = ERR_CSROW;
2722 * We need the syndromes for channel detection only when we're
2723 * ganged. Otherwise @chan should already contain the channel at
2726 if (dct_ganging_enabled(pvt))
2727 err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
2731 * These are tables of eigenvectors (one per line) which can be used for the
2732 * construction of the syndrome tables. The modified syndrome search algorithm
2733 * uses those to find the symbol in error and thus the DIMM.
2735 * Algorithm courtesy of Ross LaFetra from AMD.
2737 static const u16 x4_vectors[] = {
2738 0x2f57, 0x1afe, 0x66cc, 0xdd88,
2739 0x11eb, 0x3396, 0x7f4c, 0xeac8,
2740 0x0001, 0x0002, 0x0004, 0x0008,
2741 0x1013, 0x3032, 0x4044, 0x8088,
2742 0x106b, 0x30d6, 0x70fc, 0xe0a8,
2743 0x4857, 0xc4fe, 0x13cc, 0x3288,
2744 0x1ac5, 0x2f4a, 0x5394, 0xa1e8,
2745 0x1f39, 0x251e, 0xbd6c, 0x6bd8,
2746 0x15c1, 0x2a42, 0x89ac, 0x4758,
2747 0x2b03, 0x1602, 0x4f0c, 0xca08,
2748 0x1f07, 0x3a0e, 0x6b04, 0xbd08,
2749 0x8ba7, 0x465e, 0x244c, 0x1cc8,
2750 0x2b87, 0x164e, 0x642c, 0xdc18,
2751 0x40b9, 0x80de, 0x1094, 0x20e8,
2752 0x27db, 0x1eb6, 0x9dac, 0x7b58,
2753 0x11c1, 0x2242, 0x84ac, 0x4c58,
2754 0x1be5, 0x2d7a, 0x5e34, 0xa718,
2755 0x4b39, 0x8d1e, 0x14b4, 0x28d8,
2756 0x4c97, 0xc87e, 0x11fc, 0x33a8,
2757 0x8e97, 0x497e, 0x2ffc, 0x1aa8,
2758 0x16b3, 0x3d62, 0x4f34, 0x8518,
2759 0x1e2f, 0x391a, 0x5cac, 0xf858,
2760 0x1d9f, 0x3b7a, 0x572c, 0xfe18,
2761 0x15f5, 0x2a5a, 0x5264, 0xa3b8,
2762 0x1dbb, 0x3b66, 0x715c, 0xe3f8,
2763 0x4397, 0xc27e, 0x17fc, 0x3ea8,
2764 0x1617, 0x3d3e, 0x6464, 0xb8b8,
2765 0x23ff, 0x12aa, 0xab6c, 0x56d8,
2766 0x2dfb, 0x1ba6, 0x913c, 0x7328,
2767 0x185d, 0x2ca6, 0x7914, 0x9e28,
2768 0x171b, 0x3e36, 0x7d7c, 0xebe8,
2769 0x4199, 0x82ee, 0x19f4, 0x2e58,
2770 0x4807, 0xc40e, 0x130c, 0x3208,
2771 0x1905, 0x2e0a, 0x5804, 0xac08,
2772 0x213f, 0x132a, 0xadfc, 0x5ba8,
2773 0x19a9, 0x2efe, 0xb5cc, 0x6f88,
2776 static const u16 x8_vectors[] = {
2777 0x0145, 0x028a, 0x2374, 0x43c8, 0xa1f0, 0x0520, 0x0a40, 0x1480,
2778 0x0211, 0x0422, 0x0844, 0x1088, 0x01b0, 0x44e0, 0x23c0, 0xed80,
2779 0x1011, 0x0116, 0x022c, 0x0458, 0x08b0, 0x8c60, 0x2740, 0x4e80,
2780 0x0411, 0x0822, 0x1044, 0x0158, 0x02b0, 0x2360, 0x46c0, 0xab80,
2781 0x0811, 0x1022, 0x012c, 0x0258, 0x04b0, 0x4660, 0x8cc0, 0x2780,
2782 0x2071, 0x40e2, 0xa0c4, 0x0108, 0x0210, 0x0420, 0x0840, 0x1080,
2783 0x4071, 0x80e2, 0x0104, 0x0208, 0x0410, 0x0820, 0x1040, 0x2080,
2784 0x8071, 0x0102, 0x0204, 0x0408, 0x0810, 0x1020, 0x2040, 0x4080,
2785 0x019d, 0x03d6, 0x136c, 0x2198, 0x50b0, 0xb2e0, 0x0740, 0x0e80,
2786 0x0189, 0x03ea, 0x072c, 0x0e58, 0x1cb0, 0x56e0, 0x37c0, 0xf580,
2787 0x01fd, 0x0376, 0x06ec, 0x0bb8, 0x1110, 0x2220, 0x4440, 0x8880,
2788 0x0163, 0x02c6, 0x1104, 0x0758, 0x0eb0, 0x2be0, 0x6140, 0xc280,
2789 0x02fd, 0x01c6, 0x0b5c, 0x1108, 0x07b0, 0x25a0, 0x8840, 0x6180,
2790 0x0801, 0x012e, 0x025c, 0x04b8, 0x1370, 0x26e0, 0x57c0, 0xb580,
2791 0x0401, 0x0802, 0x015c, 0x02b8, 0x22b0, 0x13e0, 0x7140, 0xe280,
2792 0x0201, 0x0402, 0x0804, 0x01b8, 0x11b0, 0x31a0, 0x8040, 0x7180,
2793 0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
2794 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
2795 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
2798 static int decode_syndrome(u16 syndrome, const u16 *vectors, unsigned num_vecs,
2801 unsigned int i, err_sym;
2803 for (err_sym = 0; err_sym < num_vecs / v_dim; err_sym++) {
2805 unsigned v_idx = err_sym * v_dim;
2806 unsigned v_end = (err_sym + 1) * v_dim;
2808 /* walk over all 16 bits of the syndrome */
2809 for (i = 1; i < (1U << 16); i <<= 1) {
2811 /* if bit is set in that eigenvector... */
2812 if (v_idx < v_end && vectors[v_idx] & i) {
2813 u16 ev_comp = vectors[v_idx++];
2815 /* ... and bit set in the modified syndrome, */
2825 /* can't get to zero, move to next symbol */
2830 edac_dbg(0, "syndrome(%x) not found\n", syndrome);
2834 static int map_err_sym_to_channel(int err_sym, int sym_size)
2845 return err_sym >> 4;
2850 /* imaginary bits not in a DIMM */
2852 WARN(1, KERN_ERR "Invalid error symbol: 0x%x\n",
2860 return err_sym >> 3;
2865 static int get_channel_from_ecc_syndrome(struct mem_ctl_info *mci, u16 syndrome)
2867 struct amd64_pvt *pvt = mci->pvt_info;
2870 if (pvt->ecc_sym_sz == 8)
2871 err_sym = decode_syndrome(syndrome, x8_vectors,
2872 ARRAY_SIZE(x8_vectors),
2874 else if (pvt->ecc_sym_sz == 4)
2875 err_sym = decode_syndrome(syndrome, x4_vectors,
2876 ARRAY_SIZE(x4_vectors),
2879 amd64_warn("Illegal syndrome type: %u\n", pvt->ecc_sym_sz);
2883 return map_err_sym_to_channel(err_sym, pvt->ecc_sym_sz);
2886 static void __log_ecc_error(struct mem_ctl_info *mci, struct err_info *err,
2889 enum hw_event_mc_err_type err_type;
2893 err_type = HW_EVENT_ERR_CORRECTED;
2894 else if (ecc_type == 1)
2895 err_type = HW_EVENT_ERR_UNCORRECTED;
2896 else if (ecc_type == 3)
2897 err_type = HW_EVENT_ERR_DEFERRED;
2899 WARN(1, "Something is rotten in the state of Denmark.\n");
2903 switch (err->err_code) {
2908 string = "Failed to map error addr to a node";
2911 string = "Failed to map error addr to a csrow";
2914 string = "Unknown syndrome - possible error reporting race";
2917 string = "MCA_SYND not valid - unknown syndrome and csrow";
2920 string = "Cannot decode normalized address";
2923 string = "WTF error";
2927 edac_mc_handle_error(err_type, mci, 1,
2928 err->page, err->offset, err->syndrome,
2929 err->csrow, err->channel, -1,
2933 static inline void decode_bus_error(int node_id, struct mce *m)
2935 struct mem_ctl_info *mci;
2936 struct amd64_pvt *pvt;
2937 u8 ecc_type = (m->status >> 45) & 0x3;
2938 u8 xec = XEC(m->status, 0x1f);
2939 u16 ec = EC(m->status);
2941 struct err_info err;
2943 mci = edac_mc_find(node_id);
2947 pvt = mci->pvt_info;
2949 /* Bail out early if this was an 'observed' error */
2950 if (PP(ec) == NBSL_PP_OBS)
2953 /* Do only ECC errors */
2954 if (xec && xec != F10_NBSL_EXT_ERR_ECC)
2957 memset(&err, 0, sizeof(err));
2959 sys_addr = get_error_address(pvt, m);
2962 err.syndrome = extract_syndrome(m->status);
2964 pvt->ops->map_sysaddr_to_csrow(mci, sys_addr, &err);
2966 __log_ecc_error(mci, &err, ecc_type);
2970 * To find the UMC channel represented by this bank we need to match on its
2971 * instance_id. The instance_id of a bank is held in the lower 32 bits of its
2974 * Currently, we can derive the channel number by looking at the 6th nibble in
2975 * the instance_id. For example, instance_id=0xYXXXXX where Y is the channel
2978 * For DRAM ECC errors, the Chip Select number is given in bits [2:0] of
2979 * the MCA_SYND[ErrorInformation] field.
2981 static void umc_get_err_info(struct mce *m, struct err_info *err)
2983 err->channel = (m->ipid & GENMASK(31, 0)) >> 20;
2984 err->csrow = m->synd & 0x7;
2987 static void decode_umc_error(int node_id, struct mce *m)
2989 u8 ecc_type = (m->status >> 45) & 0x3;
2990 struct mem_ctl_info *mci;
2991 struct amd64_pvt *pvt;
2992 struct err_info err;
2995 mci = edac_mc_find(node_id);
2999 pvt = mci->pvt_info;
3001 memset(&err, 0, sizeof(err));
3003 if (m->status & MCI_STATUS_DEFERRED)
3006 if (!(m->status & MCI_STATUS_SYNDV)) {
3007 err.err_code = ERR_SYND;
3011 if (ecc_type == 2) {
3012 u8 length = (m->synd >> 18) & 0x3f;
3015 err.syndrome = (m->synd >> 32) & GENMASK(length - 1, 0);
3017 err.err_code = ERR_CHANNEL;
3020 pvt->ops->get_err_info(m, &err);
3022 if (umc_normaddr_to_sysaddr(m->addr, pvt->mc_node_id, err.channel, &sys_addr)) {
3023 err.err_code = ERR_NORM_ADDR;
3027 error_address_to_page_and_offset(sys_addr, &err);
3030 __log_ecc_error(mci, &err, ecc_type);
3034 * Use pvt->F3 which contains the F3 CPU PCI device to get the related
3035 * F1 (AddrMap) and F2 (Dct) devices. Return negative value on error.
3038 reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 pci_id1, u16 pci_id2)
3040 /* Reserve the ADDRESS MAP Device */
3041 pvt->F1 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
3043 edac_dbg(1, "F1 not found: device 0x%x\n", pci_id1);
3047 /* Reserve the DCT Device */
3048 pvt->F2 = pci_get_related_function(pvt->F3->vendor, pci_id2, pvt->F3);
3050 pci_dev_put(pvt->F1);
3053 edac_dbg(1, "F2 not found: device 0x%x\n", pci_id2);
3058 pci_ctl_dev = &pvt->F2->dev;
3060 edac_dbg(1, "F1: %s\n", pci_name(pvt->F1));
3061 edac_dbg(1, "F2: %s\n", pci_name(pvt->F2));
3062 edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
3067 static void determine_ecc_sym_sz(struct amd64_pvt *pvt)
3069 pvt->ecc_sym_sz = 4;
3071 if (pvt->fam >= 0x10) {
3074 amd64_read_pci_cfg(pvt->F3, EXT_NB_MCA_CFG, &tmp);
3075 /* F16h has only DCT0, so no need to read dbam1. */
3076 if (pvt->fam != 0x16)
3077 amd64_read_dct_pci_cfg(pvt, 1, DBAM0, &pvt->dbam1);
3079 /* F10h, revD and later can do x8 ECC too. */
3080 if ((pvt->fam > 0x10 || pvt->model > 7) && tmp & BIT(25))
3081 pvt->ecc_sym_sz = 8;
3086 * Retrieve the hardware registers of the memory controller.
3088 static void umc_read_mc_regs(struct amd64_pvt *pvt)
3090 u8 nid = pvt->mc_node_id;
3091 struct amd64_umc *umc;
3094 /* Read registers from each UMC */
3097 umc_base = get_umc_base(i);
3100 amd_smn_read(nid, umc_base + get_umc_reg(pvt, UMCCH_DIMM_CFG), &umc->dimm_cfg);
3101 amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &umc->umc_cfg);
3102 amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &umc->sdp_ctrl);
3103 amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &umc->ecc_ctrl);
3104 amd_smn_read(nid, umc_base + UMCCH_UMC_CAP_HI, &umc->umc_cap_hi);
3109 * Retrieve the hardware registers of the memory controller (this includes the
3110 * 'Address Map' and 'Misc' device regs)
3112 static void dct_read_mc_regs(struct amd64_pvt *pvt)
3118 * Retrieve TOP_MEM and TOP_MEM2; no masking off of reserved bits since
3119 * those are Read-As-Zero.
3121 rdmsrl(MSR_K8_TOP_MEM1, pvt->top_mem);
3122 edac_dbg(0, " TOP_MEM: 0x%016llx\n", pvt->top_mem);
3124 /* Check first whether TOP_MEM2 is enabled: */
3125 rdmsrl(MSR_AMD64_SYSCFG, msr_val);
3126 if (msr_val & BIT(21)) {
3127 rdmsrl(MSR_K8_TOP_MEM2, pvt->top_mem2);
3128 edac_dbg(0, " TOP_MEM2: 0x%016llx\n", pvt->top_mem2);
3130 edac_dbg(0, " TOP_MEM2 disabled\n");
3133 amd64_read_pci_cfg(pvt->F3, NBCAP, &pvt->nbcap);
3135 read_dram_ctl_register(pvt);
3137 for (range = 0; range < DRAM_RANGES; range++) {
3140 /* read settings for this DRAM range */
3141 read_dram_base_limit_regs(pvt, range);
3143 rw = dram_rw(pvt, range);
3147 edac_dbg(1, " DRAM range[%d], base: 0x%016llx; limit: 0x%016llx\n",
3149 get_dram_base(pvt, range),
3150 get_dram_limit(pvt, range));
3152 edac_dbg(1, " IntlvEn=%s; Range access: %s%s IntlvSel=%d DstNode=%d\n",
3153 dram_intlv_en(pvt, range) ? "Enabled" : "Disabled",
3154 (rw & 0x1) ? "R" : "-",
3155 (rw & 0x2) ? "W" : "-",
3156 dram_intlv_sel(pvt, range),
3157 dram_dst_node(pvt, range));
3160 amd64_read_pci_cfg(pvt->F1, DHAR, &pvt->dhar);
3161 amd64_read_dct_pci_cfg(pvt, 0, DBAM0, &pvt->dbam0);
3163 amd64_read_pci_cfg(pvt->F3, F10_ONLINE_SPARE, &pvt->online_spare);
3165 amd64_read_dct_pci_cfg(pvt, 0, DCLR0, &pvt->dclr0);
3166 amd64_read_dct_pci_cfg(pvt, 0, DCHR0, &pvt->dchr0);
3168 if (!dct_ganging_enabled(pvt)) {
3169 amd64_read_dct_pci_cfg(pvt, 1, DCLR0, &pvt->dclr1);
3170 amd64_read_dct_pci_cfg(pvt, 1, DCHR0, &pvt->dchr1);
3173 determine_ecc_sym_sz(pvt);
3177 * NOTE: CPU Revision Dependent code
3180 * @csrow_nr ChipSelect Row Number (0..NUM_CHIPSELECTS-1)
3181 * k8 private pointer to -->
3182 * DRAM Bank Address mapping register
3184 * DCL register where dual_channel_active is
3186 * The DBAM register consists of 4 sets of 4 bits each definitions:
3189 * 0-3 CSROWs 0 and 1
3190 * 4-7 CSROWs 2 and 3
3191 * 8-11 CSROWs 4 and 5
3192 * 12-15 CSROWs 6 and 7
3194 * Values range from: 0 to 15
3195 * The meaning of the values depends on CPU revision and dual-channel state,
3196 * see relevant BKDG more info.
3198 * The memory controller provides for total of only 8 CSROWs in its current
3199 * architecture. Each "pair" of CSROWs normally represents just one DIMM in
3200 * single channel or two (2) DIMMs in dual channel mode.
3202 * The following code logic collapses the various tables for CSROW based on CPU
3206 * The number of PAGE_SIZE pages on the specified CSROW number it
3210 static u32 dct_get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr)
3212 u32 dbam = dct ? pvt->dbam1 : pvt->dbam0;
3213 u32 cs_mode, nr_pages;
3216 cs_mode = DBAM_DIMM(csrow_nr, dbam);
3218 nr_pages = pvt->ops->dbam_to_cs(pvt, dct, cs_mode, csrow_nr);
3219 nr_pages <<= 20 - PAGE_SHIFT;
3221 edac_dbg(0, "csrow: %d, channel: %d, DBAM idx: %d\n",
3222 csrow_nr, dct, cs_mode);
3223 edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
3228 static u32 umc_get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr_orig)
3230 int csrow_nr = csrow_nr_orig;
3231 u32 cs_mode, nr_pages;
3233 cs_mode = umc_get_cs_mode(csrow_nr >> 1, dct, pvt);
3235 nr_pages = umc_addr_mask_to_cs_size(pvt, dct, cs_mode, csrow_nr);
3236 nr_pages <<= 20 - PAGE_SHIFT;
3238 edac_dbg(0, "csrow: %d, channel: %d, cs_mode %d\n",
3239 csrow_nr_orig, dct, cs_mode);
3240 edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
3245 static void umc_init_csrows(struct mem_ctl_info *mci)
3247 struct amd64_pvt *pvt = mci->pvt_info;
3248 enum edac_type edac_mode = EDAC_NONE;
3249 enum dev_type dev_type = DEV_UNKNOWN;
3250 struct dimm_info *dimm;
3253 if (mci->edac_ctl_cap & EDAC_FLAG_S16ECD16ED) {
3254 edac_mode = EDAC_S16ECD16ED;
3256 } else if (mci->edac_ctl_cap & EDAC_FLAG_S8ECD8ED) {
3257 edac_mode = EDAC_S8ECD8ED;
3259 } else if (mci->edac_ctl_cap & EDAC_FLAG_S4ECD4ED) {
3260 edac_mode = EDAC_S4ECD4ED;
3262 } else if (mci->edac_ctl_cap & EDAC_FLAG_SECDED) {
3263 edac_mode = EDAC_SECDED;
3267 for_each_chip_select(cs, umc, pvt) {
3268 if (!csrow_enabled(cs, umc, pvt))
3271 dimm = mci->csrows[cs]->channels[umc]->dimm;
3273 edac_dbg(1, "MC node: %d, csrow: %d\n",
3274 pvt->mc_node_id, cs);
3276 dimm->nr_pages = umc_get_csrow_nr_pages(pvt, umc, cs);
3277 dimm->mtype = pvt->umc[umc].dram_type;
3278 dimm->edac_mode = edac_mode;
3279 dimm->dtype = dev_type;
3286 * Initialize the array of csrow attribute instances, based on the values
3287 * from pci config hardware registers.
3289 static void dct_init_csrows(struct mem_ctl_info *mci)
3291 struct amd64_pvt *pvt = mci->pvt_info;
3292 enum edac_type edac_mode = EDAC_NONE;
3293 struct csrow_info *csrow;
3294 struct dimm_info *dimm;
3299 amd64_read_pci_cfg(pvt->F3, NBCFG, &val);
3303 edac_dbg(0, "node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
3304 pvt->mc_node_id, val,
3305 !!(val & NBCFG_CHIPKILL), !!(val & NBCFG_ECC_ENABLE));
3308 * We iterate over DCT0 here but we look at DCT1 in parallel, if needed.
3310 for_each_chip_select(i, 0, pvt) {
3311 bool row_dct0 = !!csrow_enabled(i, 0, pvt);
3312 bool row_dct1 = false;
3314 if (pvt->fam != 0xf)
3315 row_dct1 = !!csrow_enabled(i, 1, pvt);
3317 if (!row_dct0 && !row_dct1)
3320 csrow = mci->csrows[i];
3322 edac_dbg(1, "MC node: %d, csrow: %d\n",
3323 pvt->mc_node_id, i);
3326 nr_pages = dct_get_csrow_nr_pages(pvt, 0, i);
3327 csrow->channels[0]->dimm->nr_pages = nr_pages;
3330 /* K8 has only one DCT */
3331 if (pvt->fam != 0xf && row_dct1) {
3332 int row_dct1_pages = dct_get_csrow_nr_pages(pvt, 1, i);
3334 csrow->channels[1]->dimm->nr_pages = row_dct1_pages;
3335 nr_pages += row_dct1_pages;
3338 edac_dbg(1, "Total csrow%d pages: %u\n", i, nr_pages);
3340 /* Determine DIMM ECC mode: */
3341 if (pvt->nbcfg & NBCFG_ECC_ENABLE) {
3342 edac_mode = (pvt->nbcfg & NBCFG_CHIPKILL)
3347 for (j = 0; j < pvt->max_mcs; j++) {
3348 dimm = csrow->channels[j]->dimm;
3349 dimm->mtype = pvt->dram_type;
3350 dimm->edac_mode = edac_mode;
3356 /* get all cores on this DCT */
3357 static void get_cpus_on_this_dct_cpumask(struct cpumask *mask, u16 nid)
3361 for_each_online_cpu(cpu)
3362 if (topology_die_id(cpu) == nid)
3363 cpumask_set_cpu(cpu, mask);
3366 /* check MCG_CTL on all the cpus on this node */
3367 static bool nb_mce_bank_enabled_on_node(u16 nid)
3373 if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) {
3374 amd64_warn("%s: Error allocating mask\n", __func__);
3378 get_cpus_on_this_dct_cpumask(mask, nid);
3380 rdmsr_on_cpus(mask, MSR_IA32_MCG_CTL, msrs);
3382 for_each_cpu(cpu, mask) {
3383 struct msr *reg = per_cpu_ptr(msrs, cpu);
3384 nbe = reg->l & MSR_MCGCTL_NBE;
3386 edac_dbg(0, "core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
3388 (nbe ? "enabled" : "disabled"));
3396 free_cpumask_var(mask);
3400 static int toggle_ecc_err_reporting(struct ecc_settings *s, u16 nid, bool on)
3402 cpumask_var_t cmask;
3405 if (!zalloc_cpumask_var(&cmask, GFP_KERNEL)) {
3406 amd64_warn("%s: error allocating mask\n", __func__);
3410 get_cpus_on_this_dct_cpumask(cmask, nid);
3412 rdmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3414 for_each_cpu(cpu, cmask) {
3416 struct msr *reg = per_cpu_ptr(msrs, cpu);
3419 if (reg->l & MSR_MCGCTL_NBE)
3420 s->flags.nb_mce_enable = 1;
3422 reg->l |= MSR_MCGCTL_NBE;
3425 * Turn off NB MCE reporting only when it was off before
3427 if (!s->flags.nb_mce_enable)
3428 reg->l &= ~MSR_MCGCTL_NBE;
3431 wrmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3433 free_cpumask_var(cmask);
3438 static bool enable_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3442 u32 value, mask = 0x3; /* UECC/CECC enable */
3444 if (toggle_ecc_err_reporting(s, nid, ON)) {
3445 amd64_warn("Error enabling ECC reporting over MCGCTL!\n");
3449 amd64_read_pci_cfg(F3, NBCTL, &value);
3451 s->old_nbctl = value & mask;
3452 s->nbctl_valid = true;
3455 amd64_write_pci_cfg(F3, NBCTL, value);
3457 amd64_read_pci_cfg(F3, NBCFG, &value);
3459 edac_dbg(0, "1: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3460 nid, value, !!(value & NBCFG_ECC_ENABLE));
3462 if (!(value & NBCFG_ECC_ENABLE)) {
3463 amd64_warn("DRAM ECC disabled on this node, enabling...\n");
3465 s->flags.nb_ecc_prev = 0;
3467 /* Attempt to turn on DRAM ECC Enable */
3468 value |= NBCFG_ECC_ENABLE;
3469 amd64_write_pci_cfg(F3, NBCFG, value);
3471 amd64_read_pci_cfg(F3, NBCFG, &value);
3473 if (!(value & NBCFG_ECC_ENABLE)) {
3474 amd64_warn("Hardware rejected DRAM ECC enable,"
3475 "check memory DIMM configuration.\n");
3478 amd64_info("Hardware accepted DRAM ECC Enable\n");
3481 s->flags.nb_ecc_prev = 1;
3484 edac_dbg(0, "2: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3485 nid, value, !!(value & NBCFG_ECC_ENABLE));
3490 static void restore_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3493 u32 value, mask = 0x3; /* UECC/CECC enable */
3495 if (!s->nbctl_valid)
3498 amd64_read_pci_cfg(F3, NBCTL, &value);
3500 value |= s->old_nbctl;
3502 amd64_write_pci_cfg(F3, NBCTL, value);
3504 /* restore previous BIOS DRAM ECC "off" setting we force-enabled */
3505 if (!s->flags.nb_ecc_prev) {
3506 amd64_read_pci_cfg(F3, NBCFG, &value);
3507 value &= ~NBCFG_ECC_ENABLE;
3508 amd64_write_pci_cfg(F3, NBCFG, value);
3511 /* restore the NB Enable MCGCTL bit */
3512 if (toggle_ecc_err_reporting(s, nid, OFF))
3513 amd64_warn("Error restoring NB MCGCTL settings!\n");
3516 static bool dct_ecc_enabled(struct amd64_pvt *pvt)
3518 u16 nid = pvt->mc_node_id;
3519 bool nb_mce_en = false;
3523 amd64_read_pci_cfg(pvt->F3, NBCFG, &value);
3525 ecc_en = !!(value & NBCFG_ECC_ENABLE);
3527 nb_mce_en = nb_mce_bank_enabled_on_node(nid);
3529 edac_dbg(0, "NB MCE bank disabled, set MSR 0x%08x[4] on node %d to enable.\n",
3530 MSR_IA32_MCG_CTL, nid);
3532 edac_dbg(3, "Node %d: DRAM ECC %s.\n", nid, (ecc_en ? "enabled" : "disabled"));
3534 if (!ecc_en || !nb_mce_en)
3540 static bool umc_ecc_enabled(struct amd64_pvt *pvt)
3542 u8 umc_en_mask = 0, ecc_en_mask = 0;
3543 u16 nid = pvt->mc_node_id;
3544 struct amd64_umc *umc;
3550 /* Only check enabled UMCs. */
3551 if (!(umc->sdp_ctrl & UMC_SDP_INIT))
3554 umc_en_mask |= BIT(i);
3556 if (umc->umc_cap_hi & UMC_ECC_ENABLED)
3557 ecc_en_mask |= BIT(i);
3560 /* Check whether at least one UMC is enabled: */
3562 ecc_en = umc_en_mask == ecc_en_mask;
3564 edac_dbg(0, "Node %d: No enabled UMCs.\n", nid);
3566 edac_dbg(3, "Node %d: DRAM ECC %s.\n", nid, (ecc_en ? "enabled" : "disabled"));
3575 umc_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)
3577 u8 i, ecc_en = 1, cpk_en = 1, dev_x4 = 1, dev_x16 = 1;
3580 if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
3581 ecc_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_ENABLED);
3582 cpk_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_CHIPKILL_CAP);
3584 dev_x4 &= !!(pvt->umc[i].dimm_cfg & BIT(6));
3585 dev_x16 &= !!(pvt->umc[i].dimm_cfg & BIT(7));
3589 /* Set chipkill only if ECC is enabled: */
3591 mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3597 mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3599 mci->edac_ctl_cap |= EDAC_FLAG_S16ECD16ED;
3601 mci->edac_ctl_cap |= EDAC_FLAG_S8ECD8ED;
3605 static void dct_setup_mci_misc_attrs(struct mem_ctl_info *mci)
3607 struct amd64_pvt *pvt = mci->pvt_info;
3609 mci->mtype_cap = MEM_FLAG_DDR2 | MEM_FLAG_RDDR2;
3610 mci->edac_ctl_cap = EDAC_FLAG_NONE;
3612 if (pvt->nbcap & NBCAP_SECDED)
3613 mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3615 if (pvt->nbcap & NBCAP_CHIPKILL)
3616 mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3618 mci->edac_cap = dct_determine_edac_cap(pvt);
3619 mci->mod_name = EDAC_MOD_STR;
3620 mci->ctl_name = pvt->ctl_name;
3621 mci->dev_name = pci_name(pvt->F3);
3622 mci->ctl_page_to_phys = NULL;
3624 /* memory scrubber interface */
3625 mci->set_sdram_scrub_rate = set_scrub_rate;
3626 mci->get_sdram_scrub_rate = get_scrub_rate;
3628 dct_init_csrows(mci);
3631 static void umc_setup_mci_misc_attrs(struct mem_ctl_info *mci)
3633 struct amd64_pvt *pvt = mci->pvt_info;
3635 mci->mtype_cap = MEM_FLAG_DDR4 | MEM_FLAG_RDDR4;
3636 mci->edac_ctl_cap = EDAC_FLAG_NONE;
3638 umc_determine_edac_ctl_cap(mci, pvt);
3640 mci->edac_cap = umc_determine_edac_cap(pvt);
3641 mci->mod_name = EDAC_MOD_STR;
3642 mci->ctl_name = pvt->ctl_name;
3643 mci->dev_name = pci_name(pvt->F3);
3644 mci->ctl_page_to_phys = NULL;
3646 umc_init_csrows(mci);
3649 static int dct_hw_info_get(struct amd64_pvt *pvt)
3651 int ret = reserve_mc_sibling_devs(pvt, pvt->f1_id, pvt->f2_id);
3656 dct_prep_chip_selects(pvt);
3657 dct_read_base_mask(pvt);
3658 dct_read_mc_regs(pvt);
3659 dct_determine_memory_type(pvt);
3664 static int umc_hw_info_get(struct amd64_pvt *pvt)
3666 pvt->umc = kcalloc(pvt->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
3670 umc_prep_chip_selects(pvt);
3671 umc_read_base_mask(pvt);
3672 umc_read_mc_regs(pvt);
3673 umc_determine_memory_type(pvt);
3678 static void hw_info_put(struct amd64_pvt *pvt)
3680 pci_dev_put(pvt->F1);
3681 pci_dev_put(pvt->F2);
3685 static struct low_ops umc_ops = {
3686 .hw_info_get = umc_hw_info_get,
3687 .ecc_enabled = umc_ecc_enabled,
3688 .setup_mci_misc_attrs = umc_setup_mci_misc_attrs,
3689 .dump_misc_regs = umc_dump_misc_regs,
3690 .get_err_info = umc_get_err_info,
3693 /* Use Family 16h versions for defaults and adjust as needed below. */
3694 static struct low_ops dct_ops = {
3695 .map_sysaddr_to_csrow = f1x_map_sysaddr_to_csrow,
3696 .dbam_to_cs = f16_dbam_to_chip_select,
3697 .hw_info_get = dct_hw_info_get,
3698 .ecc_enabled = dct_ecc_enabled,
3699 .setup_mci_misc_attrs = dct_setup_mci_misc_attrs,
3700 .dump_misc_regs = dct_dump_misc_regs,
3703 static int per_family_init(struct amd64_pvt *pvt)
3705 pvt->ext_model = boot_cpu_data.x86_model >> 4;
3706 pvt->stepping = boot_cpu_data.x86_stepping;
3707 pvt->model = boot_cpu_data.x86_model;
3708 pvt->fam = boot_cpu_data.x86;
3712 * Decide on which ops group to use here and do any family/model
3715 if (pvt->fam >= 0x17)
3716 pvt->ops = &umc_ops;
3718 pvt->ops = &dct_ops;
3722 pvt->ctl_name = (pvt->ext_model >= K8_REV_F) ?
3723 "K8 revF or later" : "K8 revE or earlier";
3724 pvt->f1_id = PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP;
3725 pvt->f2_id = PCI_DEVICE_ID_AMD_K8_NB_MEMCTL;
3726 pvt->ops->map_sysaddr_to_csrow = k8_map_sysaddr_to_csrow;
3727 pvt->ops->dbam_to_cs = k8_dbam_to_chip_select;
3731 pvt->ctl_name = "F10h";
3732 pvt->f1_id = PCI_DEVICE_ID_AMD_10H_NB_MAP;
3733 pvt->f2_id = PCI_DEVICE_ID_AMD_10H_NB_DRAM;
3734 pvt->ops->dbam_to_cs = f10_dbam_to_chip_select;
3738 switch (pvt->model) {
3740 pvt->ctl_name = "F15h_M30h";
3741 pvt->f1_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1;
3742 pvt->f2_id = PCI_DEVICE_ID_AMD_15H_M30H_NB_F2;
3745 pvt->ctl_name = "F15h_M60h";
3746 pvt->f1_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1;
3747 pvt->f2_id = PCI_DEVICE_ID_AMD_15H_M60H_NB_F2;
3748 pvt->ops->dbam_to_cs = f15_m60h_dbam_to_chip_select;
3751 /* Richland is only client */
3754 pvt->ctl_name = "F15h";
3755 pvt->f1_id = PCI_DEVICE_ID_AMD_15H_NB_F1;
3756 pvt->f2_id = PCI_DEVICE_ID_AMD_15H_NB_F2;
3757 pvt->ops->dbam_to_cs = f15_dbam_to_chip_select;
3763 switch (pvt->model) {
3765 pvt->ctl_name = "F16h_M30h";
3766 pvt->f1_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F1;
3767 pvt->f2_id = PCI_DEVICE_ID_AMD_16H_M30H_NB_F2;
3770 pvt->ctl_name = "F16h";
3771 pvt->f1_id = PCI_DEVICE_ID_AMD_16H_NB_F1;
3772 pvt->f2_id = PCI_DEVICE_ID_AMD_16H_NB_F2;
3778 switch (pvt->model) {
3780 pvt->ctl_name = "F17h_M10h";
3783 pvt->ctl_name = "F17h_M30h";
3787 pvt->ctl_name = "F17h_M60h";
3790 pvt->ctl_name = "F17h_M70h";
3793 pvt->ctl_name = "F17h";
3799 pvt->ctl_name = "F18h";
3803 switch (pvt->model) {
3805 pvt->ctl_name = "F19h";
3809 pvt->ctl_name = "F19h_M10h";
3811 pvt->flags.zn_regs_v2 = 1;
3814 pvt->ctl_name = "F19h_M20h";
3817 pvt->ctl_name = "F19h_M50h";
3820 pvt->ctl_name = "F19h_MA0h";
3822 pvt->flags.zn_regs_v2 = 1;
3828 amd64_err("Unsupported family!\n");
3835 static const struct attribute_group *amd64_edac_attr_groups[] = {
3836 #ifdef CONFIG_EDAC_DEBUG
3843 static int init_one_instance(struct amd64_pvt *pvt)
3845 struct mem_ctl_info *mci = NULL;
3846 struct edac_mc_layer layers[2];
3849 layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
3850 layers[0].size = pvt->csels[0].b_cnt;
3851 layers[0].is_virt_csrow = true;
3852 layers[1].type = EDAC_MC_LAYER_CHANNEL;
3853 layers[1].size = pvt->max_mcs;
3854 layers[1].is_virt_csrow = false;
3856 mci = edac_mc_alloc(pvt->mc_node_id, ARRAY_SIZE(layers), layers, 0);
3860 mci->pvt_info = pvt;
3861 mci->pdev = &pvt->F3->dev;
3863 pvt->ops->setup_mci_misc_attrs(mci);
3866 if (edac_mc_add_mc_with_groups(mci, amd64_edac_attr_groups)) {
3867 edac_dbg(1, "failed edac_mc_add_mc()\n");
3875 static bool instance_has_memory(struct amd64_pvt *pvt)
3877 bool cs_enabled = false;
3878 int cs = 0, dct = 0;
3880 for (dct = 0; dct < pvt->max_mcs; dct++) {
3881 for_each_chip_select(cs, dct, pvt)
3882 cs_enabled |= csrow_enabled(cs, dct, pvt);
3888 static int probe_one_instance(unsigned int nid)
3890 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
3891 struct amd64_pvt *pvt = NULL;
3892 struct ecc_settings *s;
3896 s = kzalloc(sizeof(struct ecc_settings), GFP_KERNEL);
3902 pvt = kzalloc(sizeof(struct amd64_pvt), GFP_KERNEL);
3906 pvt->mc_node_id = nid;
3909 ret = per_family_init(pvt);
3913 ret = pvt->ops->hw_info_get(pvt);
3918 if (!instance_has_memory(pvt)) {
3919 amd64_info("Node %d: No DIMMs detected.\n", nid);
3923 if (!pvt->ops->ecc_enabled(pvt)) {
3926 if (!ecc_enable_override)
3929 if (boot_cpu_data.x86 >= 0x17) {
3930 amd64_warn("Forcing ECC on is not recommended on newer systems. Please enable ECC in BIOS.");
3933 amd64_warn("Forcing ECC on!\n");
3935 if (!enable_ecc_error_reporting(s, nid, F3))
3939 ret = init_one_instance(pvt);
3941 amd64_err("Error probing instance: %d\n", nid);
3943 if (boot_cpu_data.x86 < 0x17)
3944 restore_ecc_error_reporting(s, nid, F3);
3949 amd64_info("%s detected (node %d).\n", pvt->ctl_name, pvt->mc_node_id);
3951 /* Display and decode various registers for debug purposes. */
3952 pvt->ops->dump_misc_regs(pvt);
3962 ecc_stngs[nid] = NULL;
3968 static void remove_one_instance(unsigned int nid)
3970 struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
3971 struct ecc_settings *s = ecc_stngs[nid];
3972 struct mem_ctl_info *mci;
3973 struct amd64_pvt *pvt;
3975 /* Remove from EDAC CORE tracking list */
3976 mci = edac_mc_del_mc(&F3->dev);
3980 pvt = mci->pvt_info;
3982 restore_ecc_error_reporting(s, nid, F3);
3984 kfree(ecc_stngs[nid]);
3985 ecc_stngs[nid] = NULL;
3987 /* Free the EDAC CORE resources */
3988 mci->pvt_info = NULL;
3995 static void setup_pci_device(void)
4000 pci_ctl = edac_pci_create_generic_ctl(pci_ctl_dev, EDAC_MOD_STR);
4002 pr_warn("%s(): Unable to create PCI control\n", __func__);
4003 pr_warn("%s(): PCI error report via EDAC not set\n", __func__);
4007 static const struct x86_cpu_id amd64_cpuids[] = {
4008 X86_MATCH_VENDOR_FAM(AMD, 0x0F, NULL),
4009 X86_MATCH_VENDOR_FAM(AMD, 0x10, NULL),
4010 X86_MATCH_VENDOR_FAM(AMD, 0x15, NULL),
4011 X86_MATCH_VENDOR_FAM(AMD, 0x16, NULL),
4012 X86_MATCH_VENDOR_FAM(AMD, 0x17, NULL),
4013 X86_MATCH_VENDOR_FAM(HYGON, 0x18, NULL),
4014 X86_MATCH_VENDOR_FAM(AMD, 0x19, NULL),
4017 MODULE_DEVICE_TABLE(x86cpu, amd64_cpuids);
4019 static int __init amd64_edac_init(void)
4025 if (ghes_get_devices())
4028 owner = edac_get_owner();
4029 if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
4032 if (!x86_match_cpu(amd64_cpuids))
4041 ecc_stngs = kcalloc(amd_nb_num(), sizeof(ecc_stngs[0]), GFP_KERNEL);
4045 msrs = msrs_alloc();
4049 for (i = 0; i < amd_nb_num(); i++) {
4050 err = probe_one_instance(i);
4052 /* unwind properly */
4054 remove_one_instance(i);
4060 if (!edac_has_mcs()) {
4065 /* register stuff with EDAC MCE */
4066 if (boot_cpu_data.x86 >= 0x17) {
4067 amd_register_ecc_decoder(decode_umc_error);
4069 amd_register_ecc_decoder(decode_bus_error);
4073 #ifdef CONFIG_X86_32
4074 amd64_err("%s on 32-bit is unsupported. USE AT YOUR OWN RISK!\n", EDAC_MOD_STR);
4077 printk(KERN_INFO "AMD64 EDAC driver v%s\n", EDAC_AMD64_VERSION);
4094 static void __exit amd64_edac_exit(void)
4099 edac_pci_release_generic_ctl(pci_ctl);
4101 /* unregister from EDAC MCE */
4102 if (boot_cpu_data.x86 >= 0x17)
4103 amd_unregister_ecc_decoder(decode_umc_error);
4105 amd_unregister_ecc_decoder(decode_bus_error);
4107 for (i = 0; i < amd_nb_num(); i++)
4108 remove_one_instance(i);
4119 module_init(amd64_edac_init);
4120 module_exit(amd64_edac_exit);
4122 MODULE_LICENSE("GPL");
4123 MODULE_AUTHOR("SoftwareBitMaker: Doug Thompson, Dave Peterson, Thayne Harbaugh; AMD");
4124 MODULE_DESCRIPTION("MC support for AMD64 memory controllers - " EDAC_AMD64_VERSION);
4126 module_param(edac_op_state, int, 0444);
4127 MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");