1 // SPDX-License-Identifier: GPL-2.0-only
2 #include "amd64_edac.h"
3 #include <asm/amd_nb.h>
5 static struct edac_pci_ctl_info
*pci_ctl
;
7 static int report_gart_errors
;
8 module_param(report_gart_errors
, int, 0644);
11 * Set by command line parameter. If BIOS has enabled the ECC, this override is
12 * cleared to prevent re-enabling the hardware by this driver.
14 static int ecc_enable_override
;
15 module_param(ecc_enable_override
, int, 0644);
17 static struct msr __percpu
*msrs
;
19 static struct amd64_family_type
*fam_type
;
22 static struct ecc_settings
**ecc_stngs
;
25 * Valid scrub rates for the K8 hardware memory scrubber. We map the scrubbing
26 * bandwidth to a valid bit pattern. The 'set' operation finds the 'matching-
29 *FIXME: Produce a better mapping/linearisation.
31 static const struct scrubrate
{
32 u32 scrubval
; /* bit pattern for scrub rate */
33 u32 bandwidth
; /* bandwidth consumed (bytes/sec) */
35 { 0x01, 1600000000UL},
57 { 0x00, 0UL}, /* scrubbing off */
60 int __amd64_read_pci_cfg_dword(struct pci_dev
*pdev
, int offset
,
61 u32
*val
, const char *func
)
65 err
= pci_read_config_dword(pdev
, offset
, val
);
67 amd64_warn("%s: error reading F%dx%03x.\n",
68 func
, PCI_FUNC(pdev
->devfn
), offset
);
73 int __amd64_write_pci_cfg_dword(struct pci_dev
*pdev
, int offset
,
74 u32 val
, const char *func
)
78 err
= pci_write_config_dword(pdev
, offset
, val
);
80 amd64_warn("%s: error writing to F%dx%03x.\n",
81 func
, PCI_FUNC(pdev
->devfn
), offset
);
87 * Select DCT to which PCI cfg accesses are routed
89 static void f15h_select_dct(struct amd64_pvt
*pvt
, u8 dct
)
93 amd64_read_pci_cfg(pvt
->F1
, DCT_CFG_SEL
, ®
);
94 reg
&= (pvt
->model
== 0x30) ? ~3 : ~1;
96 amd64_write_pci_cfg(pvt
->F1
, DCT_CFG_SEL
, reg
);
101 * Depending on the family, F2 DCT reads need special handling:
103 * K8: has a single DCT only and no address offsets >= 0x100
105 * F10h: each DCT has its own set of regs
109 * F16h: has only 1 DCT
111 * F15h: we select which DCT we access using F1x10C[DctCfgSel]
113 static inline int amd64_read_dct_pci_cfg(struct amd64_pvt
*pvt
, u8 dct
,
114 int offset
, u32
*val
)
118 if (dct
|| offset
>= 0x100)
125 * Note: If ganging is enabled, barring the regs
126 * F2x[1,0]98 and F2x[1,0]9C; reads reads to F2x1xx
127 * return 0. (cf. Section 2.8.1 F10h BKDG)
129 if (dct_ganging_enabled(pvt
))
138 * F15h: F2x1xx addresses do not map explicitly to DCT1.
139 * We should select which DCT we access using F1x10C[DctCfgSel]
141 dct
= (dct
&& pvt
->model
== 0x30) ? 3 : dct
;
142 f15h_select_dct(pvt
, dct
);
153 return amd64_read_pci_cfg(pvt
->F2
, offset
, val
);
157 * Memory scrubber control interface. For K8, memory scrubbing is handled by
158 * hardware and can involve L2 cache, dcache as well as the main memory. With
159 * F10, this is extended to L3 cache scrubbing on CPU models sporting that
162 * This causes the "units" for the scrubbing speed to vary from 64 byte blocks
163 * (dram) over to cache lines. This is nasty, so we will use bandwidth in
164 * bytes/sec for the setting.
166 * Currently, we only do dram scrubbing. If the scrubbing is done in software on
167 * other archs, we might not have access to the caches directly.
170 static inline void __f17h_set_scrubval(struct amd64_pvt
*pvt
, u32 scrubval
)
173 * Fam17h supports scrub values between 0x5 and 0x14. Also, the values
174 * are shifted down by 0x5, so scrubval 0x5 is written to the register
175 * as 0x0, scrubval 0x6 as 0x1, etc.
177 if (scrubval
>= 0x5 && scrubval
<= 0x14) {
179 pci_write_bits32(pvt
->F6
, F17H_SCR_LIMIT_ADDR
, scrubval
, 0xF);
180 pci_write_bits32(pvt
->F6
, F17H_SCR_BASE_ADDR
, 1, 0x1);
182 pci_write_bits32(pvt
->F6
, F17H_SCR_BASE_ADDR
, 0, 0x1);
186 * Scan the scrub rate mapping table for a close or matching bandwidth value to
187 * issue. If requested is too big, then use last maximum value found.
189 static int __set_scrub_rate(struct amd64_pvt
*pvt
, u32 new_bw
, u32 min_rate
)
195 * map the configured rate (new_bw) to a value specific to the AMD64
196 * memory controller and apply to register. Search for the first
197 * bandwidth entry that is greater or equal than the setting requested
198 * and program that. If at last entry, turn off DRAM scrubbing.
200 * If no suitable bandwidth is found, turn off DRAM scrubbing entirely
201 * by falling back to the last element in scrubrates[].
203 for (i
= 0; i
< ARRAY_SIZE(scrubrates
) - 1; i
++) {
205 * skip scrub rates which aren't recommended
206 * (see F10 BKDG, F3x58)
208 if (scrubrates
[i
].scrubval
< min_rate
)
211 if (scrubrates
[i
].bandwidth
<= new_bw
)
215 scrubval
= scrubrates
[i
].scrubval
;
218 __f17h_set_scrubval(pvt
, scrubval
);
219 } else if (pvt
->fam
== 0x15 && pvt
->model
== 0x60) {
220 f15h_select_dct(pvt
, 0);
221 pci_write_bits32(pvt
->F2
, F15H_M60H_SCRCTRL
, scrubval
, 0x001F);
222 f15h_select_dct(pvt
, 1);
223 pci_write_bits32(pvt
->F2
, F15H_M60H_SCRCTRL
, scrubval
, 0x001F);
225 pci_write_bits32(pvt
->F3
, SCRCTRL
, scrubval
, 0x001F);
229 return scrubrates
[i
].bandwidth
;
234 static int set_scrub_rate(struct mem_ctl_info
*mci
, u32 bw
)
236 struct amd64_pvt
*pvt
= mci
->pvt_info
;
237 u32 min_scrubrate
= 0x5;
242 if (pvt
->fam
== 0x15) {
244 if (pvt
->model
< 0x10)
245 f15h_select_dct(pvt
, 0);
247 if (pvt
->model
== 0x60)
250 return __set_scrub_rate(pvt
, bw
, min_scrubrate
);
253 static int get_scrub_rate(struct mem_ctl_info
*mci
)
255 struct amd64_pvt
*pvt
= mci
->pvt_info
;
256 int i
, retval
= -EINVAL
;
260 amd64_read_pci_cfg(pvt
->F6
, F17H_SCR_BASE_ADDR
, &scrubval
);
261 if (scrubval
& BIT(0)) {
262 amd64_read_pci_cfg(pvt
->F6
, F17H_SCR_LIMIT_ADDR
, &scrubval
);
268 } else if (pvt
->fam
== 0x15) {
270 if (pvt
->model
< 0x10)
271 f15h_select_dct(pvt
, 0);
273 if (pvt
->model
== 0x60)
274 amd64_read_pci_cfg(pvt
->F2
, F15H_M60H_SCRCTRL
, &scrubval
);
276 amd64_read_pci_cfg(pvt
->F3
, SCRCTRL
, &scrubval
);
279 scrubval
= scrubval
& 0x001F;
281 for (i
= 0; i
< ARRAY_SIZE(scrubrates
); i
++) {
282 if (scrubrates
[i
].scrubval
== scrubval
) {
283 retval
= scrubrates
[i
].bandwidth
;
291 * returns true if the SysAddr given by sys_addr matches the
292 * DRAM base/limit associated with node_id
294 static bool base_limit_match(struct amd64_pvt
*pvt
, u64 sys_addr
, u8 nid
)
298 /* The K8 treats this as a 40-bit value. However, bits 63-40 will be
299 * all ones if the most significant implemented address bit is 1.
300 * Here we discard bits 63-40. See section 3.4.2 of AMD publication
301 * 24592: AMD x86-64 Architecture Programmer's Manual Volume 1
302 * Application Programming.
304 addr
= sys_addr
& 0x000000ffffffffffull
;
306 return ((addr
>= get_dram_base(pvt
, nid
)) &&
307 (addr
<= get_dram_limit(pvt
, nid
)));
311 * Attempt to map a SysAddr to a node. On success, return a pointer to the
312 * mem_ctl_info structure for the node that the SysAddr maps to.
314 * On failure, return NULL.
316 static struct mem_ctl_info
*find_mc_by_sys_addr(struct mem_ctl_info
*mci
,
319 struct amd64_pvt
*pvt
;
324 * Here we use the DRAM Base (section 3.4.4.1) and DRAM Limit (section
325 * 3.4.4.2) registers to map the SysAddr to a node ID.
330 * The value of this field should be the same for all DRAM Base
331 * registers. Therefore we arbitrarily choose to read it from the
332 * register for node 0.
334 intlv_en
= dram_intlv_en(pvt
, 0);
337 for (node_id
= 0; node_id
< DRAM_RANGES
; node_id
++) {
338 if (base_limit_match(pvt
, sys_addr
, node_id
))
344 if (unlikely((intlv_en
!= 0x01) &&
345 (intlv_en
!= 0x03) &&
346 (intlv_en
!= 0x07))) {
347 amd64_warn("DRAM Base[IntlvEn] junk value: 0x%x, BIOS bug?\n", intlv_en
);
351 bits
= (((u32
) sys_addr
) >> 12) & intlv_en
;
353 for (node_id
= 0; ; ) {
354 if ((dram_intlv_sel(pvt
, node_id
) & intlv_en
) == bits
)
355 break; /* intlv_sel field matches */
357 if (++node_id
>= DRAM_RANGES
)
361 /* sanity test for sys_addr */
362 if (unlikely(!base_limit_match(pvt
, sys_addr
, node_id
))) {
363 amd64_warn("%s: sys_addr 0x%llx falls outside base/limit address"
364 "range for node %d with node interleaving enabled.\n",
365 __func__
, sys_addr
, node_id
);
370 return edac_mc_find((int)node_id
);
373 edac_dbg(2, "sys_addr 0x%lx doesn't match any node\n",
374 (unsigned long)sys_addr
);
380 * compute the CS base address of the @csrow on the DRAM controller @dct.
381 * For details see F2x[5C:40] in the processor's BKDG
383 static void get_cs_base_and_mask(struct amd64_pvt
*pvt
, int csrow
, u8 dct
,
384 u64
*base
, u64
*mask
)
386 u64 csbase
, csmask
, base_bits
, mask_bits
;
389 if (pvt
->fam
== 0xf && pvt
->ext_model
< K8_REV_F
) {
390 csbase
= pvt
->csels
[dct
].csbases
[csrow
];
391 csmask
= pvt
->csels
[dct
].csmasks
[csrow
];
392 base_bits
= GENMASK_ULL(31, 21) | GENMASK_ULL(15, 9);
393 mask_bits
= GENMASK_ULL(29, 21) | GENMASK_ULL(15, 9);
397 * F16h and F15h, models 30h and later need two addr_shift values:
398 * 8 for high and 6 for low (cf. F16h BKDG).
400 } else if (pvt
->fam
== 0x16 ||
401 (pvt
->fam
== 0x15 && pvt
->model
>= 0x30)) {
402 csbase
= pvt
->csels
[dct
].csbases
[csrow
];
403 csmask
= pvt
->csels
[dct
].csmasks
[csrow
>> 1];
405 *base
= (csbase
& GENMASK_ULL(15, 5)) << 6;
406 *base
|= (csbase
& GENMASK_ULL(30, 19)) << 8;
409 /* poke holes for the csmask */
410 *mask
&= ~((GENMASK_ULL(15, 5) << 6) |
411 (GENMASK_ULL(30, 19) << 8));
413 *mask
|= (csmask
& GENMASK_ULL(15, 5)) << 6;
414 *mask
|= (csmask
& GENMASK_ULL(30, 19)) << 8;
418 csbase
= pvt
->csels
[dct
].csbases
[csrow
];
419 csmask
= pvt
->csels
[dct
].csmasks
[csrow
>> 1];
422 if (pvt
->fam
== 0x15)
423 base_bits
= mask_bits
=
424 GENMASK_ULL(30,19) | GENMASK_ULL(13,5);
426 base_bits
= mask_bits
=
427 GENMASK_ULL(28,19) | GENMASK_ULL(13,5);
430 *base
= (csbase
& base_bits
) << addr_shift
;
433 /* poke holes for the csmask */
434 *mask
&= ~(mask_bits
<< addr_shift
);
436 *mask
|= (csmask
& mask_bits
) << addr_shift
;
439 #define for_each_chip_select(i, dct, pvt) \
440 for (i = 0; i < pvt->csels[dct].b_cnt; i++)
442 #define chip_select_base(i, dct, pvt) \
443 pvt->csels[dct].csbases[i]
445 #define for_each_chip_select_mask(i, dct, pvt) \
446 for (i = 0; i < pvt->csels[dct].m_cnt; i++)
448 #define for_each_umc(i) \
449 for (i = 0; i < fam_type->max_mcs; i++)
452 * @input_addr is an InputAddr associated with the node given by mci. Return the
453 * csrow that input_addr maps to, or -1 on failure (no csrow claims input_addr).
455 static int input_addr_to_csrow(struct mem_ctl_info
*mci
, u64 input_addr
)
457 struct amd64_pvt
*pvt
;
463 for_each_chip_select(csrow
, 0, pvt
) {
464 if (!csrow_enabled(csrow
, 0, pvt
))
467 get_cs_base_and_mask(pvt
, csrow
, 0, &base
, &mask
);
471 if ((input_addr
& mask
) == (base
& mask
)) {
472 edac_dbg(2, "InputAddr 0x%lx matches csrow %d (node %d)\n",
473 (unsigned long)input_addr
, csrow
,
479 edac_dbg(2, "no matching csrow for InputAddr 0x%lx (MC node %d)\n",
480 (unsigned long)input_addr
, pvt
->mc_node_id
);
486 * Obtain info from the DRAM Hole Address Register (section 3.4.8, pub #26094)
487 * for the node represented by mci. Info is passed back in *hole_base,
488 * *hole_offset, and *hole_size. Function returns 0 if info is valid or 1 if
489 * info is invalid. Info may be invalid for either of the following reasons:
491 * - The revision of the node is not E or greater. In this case, the DRAM Hole
492 * Address Register does not exist.
494 * - The DramHoleValid bit is cleared in the DRAM Hole Address Register,
495 * indicating that its contents are not valid.
497 * The values passed back in *hole_base, *hole_offset, and *hole_size are
498 * complete 32-bit values despite the fact that the bitfields in the DHAR
499 * only represent bits 31-24 of the base and offset values.
501 int amd64_get_dram_hole_info(struct mem_ctl_info
*mci
, u64
*hole_base
,
502 u64
*hole_offset
, u64
*hole_size
)
504 struct amd64_pvt
*pvt
= mci
->pvt_info
;
506 /* only revE and later have the DRAM Hole Address Register */
507 if (pvt
->fam
== 0xf && pvt
->ext_model
< K8_REV_E
) {
508 edac_dbg(1, " revision %d for node %d does not support DHAR\n",
509 pvt
->ext_model
, pvt
->mc_node_id
);
513 /* valid for Fam10h and above */
514 if (pvt
->fam
>= 0x10 && !dhar_mem_hoist_valid(pvt
)) {
515 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this system\n");
519 if (!dhar_valid(pvt
)) {
520 edac_dbg(1, " Dram Memory Hoisting is DISABLED on this node %d\n",
525 /* This node has Memory Hoisting */
527 /* +------------------+--------------------+--------------------+-----
528 * | memory | DRAM hole | relocated |
529 * | [0, (x - 1)] | [x, 0xffffffff] | addresses from |
531 * | | | [0x100000000, |
532 * | | | (0x100000000+ |
533 * | | | (0xffffffff-x))] |
534 * +------------------+--------------------+--------------------+-----
536 * Above is a diagram of physical memory showing the DRAM hole and the
537 * relocated addresses from the DRAM hole. As shown, the DRAM hole
538 * starts at address x (the base address) and extends through address
539 * 0xffffffff. The DRAM Hole Address Register (DHAR) relocates the
540 * addresses in the hole so that they start at 0x100000000.
543 *hole_base
= dhar_base(pvt
);
544 *hole_size
= (1ULL << 32) - *hole_base
;
546 *hole_offset
= (pvt
->fam
> 0xf) ? f10_dhar_offset(pvt
)
547 : k8_dhar_offset(pvt
);
549 edac_dbg(1, " DHAR info for node %d base 0x%lx offset 0x%lx size 0x%lx\n",
550 pvt
->mc_node_id
, (unsigned long)*hole_base
,
551 (unsigned long)*hole_offset
, (unsigned long)*hole_size
);
555 EXPORT_SYMBOL_GPL(amd64_get_dram_hole_info
);
558 * Return the DramAddr that the SysAddr given by @sys_addr maps to. It is
559 * assumed that sys_addr maps to the node given by mci.
561 * The first part of section 3.4.4 (p. 70) shows how the DRAM Base (section
562 * 3.4.4.1) and DRAM Limit (section 3.4.4.2) registers are used to translate a
563 * SysAddr to a DramAddr. If the DRAM Hole Address Register (DHAR) is enabled,
564 * then it is also involved in translating a SysAddr to a DramAddr. Sections
565 * 3.4.8 and 3.5.8.2 describe the DHAR and how it is used for memory hoisting.
566 * These parts of the documentation are unclear. I interpret them as follows:
568 * When node n receives a SysAddr, it processes the SysAddr as follows:
570 * 1. It extracts the DRAMBase and DRAMLimit values from the DRAM Base and DRAM
571 * Limit registers for node n. If the SysAddr is not within the range
572 * specified by the base and limit values, then node n ignores the Sysaddr
573 * (since it does not map to node n). Otherwise continue to step 2 below.
575 * 2. If the DramHoleValid bit of the DHAR for node n is clear, the DHAR is
576 * disabled so skip to step 3 below. Otherwise see if the SysAddr is within
577 * the range of relocated addresses (starting at 0x100000000) from the DRAM
578 * hole. If not, skip to step 3 below. Else get the value of the
579 * DramHoleOffset field from the DHAR. To obtain the DramAddr, subtract the
580 * offset defined by this value from the SysAddr.
582 * 3. Obtain the base address for node n from the DRAMBase field of the DRAM
583 * Base register for node n. To obtain the DramAddr, subtract the base
584 * address from the SysAddr, as shown near the start of section 3.4.4 (p.70).
586 static u64
sys_addr_to_dram_addr(struct mem_ctl_info
*mci
, u64 sys_addr
)
588 struct amd64_pvt
*pvt
= mci
->pvt_info
;
589 u64 dram_base
, hole_base
, hole_offset
, hole_size
, dram_addr
;
592 dram_base
= get_dram_base(pvt
, pvt
->mc_node_id
);
594 ret
= amd64_get_dram_hole_info(mci
, &hole_base
, &hole_offset
,
597 if ((sys_addr
>= (1ULL << 32)) &&
598 (sys_addr
< ((1ULL << 32) + hole_size
))) {
599 /* use DHAR to translate SysAddr to DramAddr */
600 dram_addr
= sys_addr
- hole_offset
;
602 edac_dbg(2, "using DHAR to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
603 (unsigned long)sys_addr
,
604 (unsigned long)dram_addr
);
611 * Translate the SysAddr to a DramAddr as shown near the start of
612 * section 3.4.4 (p. 70). Although sys_addr is a 64-bit value, the k8
613 * only deals with 40-bit values. Therefore we discard bits 63-40 of
614 * sys_addr below. If bit 39 of sys_addr is 1 then the bits we
615 * discard are all 1s. Otherwise the bits we discard are all 0s. See
616 * section 3.4.2 of AMD publication 24592: AMD x86-64 Architecture
617 * Programmer's Manual Volume 1 Application Programming.
619 dram_addr
= (sys_addr
& GENMASK_ULL(39, 0)) - dram_base
;
621 edac_dbg(2, "using DRAM Base register to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
622 (unsigned long)sys_addr
, (unsigned long)dram_addr
);
627 * @intlv_en is the value of the IntlvEn field from a DRAM Base register
628 * (section 3.4.4.1). Return the number of bits from a SysAddr that are used
629 * for node interleaving.
631 static int num_node_interleave_bits(unsigned intlv_en
)
633 static const int intlv_shift_table
[] = { 0, 1, 0, 2, 0, 0, 0, 3 };
636 BUG_ON(intlv_en
> 7);
637 n
= intlv_shift_table
[intlv_en
];
641 /* Translate the DramAddr given by @dram_addr to an InputAddr. */
642 static u64
dram_addr_to_input_addr(struct mem_ctl_info
*mci
, u64 dram_addr
)
644 struct amd64_pvt
*pvt
;
651 * See the start of section 3.4.4 (p. 70, BKDG #26094, K8, revA-E)
652 * concerning translating a DramAddr to an InputAddr.
654 intlv_shift
= num_node_interleave_bits(dram_intlv_en(pvt
, 0));
655 input_addr
= ((dram_addr
>> intlv_shift
) & GENMASK_ULL(35, 12)) +
658 edac_dbg(2, " Intlv Shift=%d DramAddr=0x%lx maps to InputAddr=0x%lx\n",
659 intlv_shift
, (unsigned long)dram_addr
,
660 (unsigned long)input_addr
);
666 * Translate the SysAddr represented by @sys_addr to an InputAddr. It is
667 * assumed that @sys_addr maps to the node given by mci.
669 static u64
sys_addr_to_input_addr(struct mem_ctl_info
*mci
, u64 sys_addr
)
674 dram_addr_to_input_addr(mci
, sys_addr_to_dram_addr(mci
, sys_addr
));
676 edac_dbg(2, "SysAddr 0x%lx translates to InputAddr 0x%lx\n",
677 (unsigned long)sys_addr
, (unsigned long)input_addr
);
682 /* Map the Error address to a PAGE and PAGE OFFSET. */
683 static inline void error_address_to_page_and_offset(u64 error_address
,
684 struct err_info
*err
)
686 err
->page
= (u32
) (error_address
>> PAGE_SHIFT
);
687 err
->offset
= ((u32
) error_address
) & ~PAGE_MASK
;
691 * @sys_addr is an error address (a SysAddr) extracted from the MCA NB Address
692 * Low (section 3.6.4.5) and MCA NB Address High (section 3.6.4.6) registers
693 * of a node that detected an ECC memory error. mci represents the node that
694 * the error address maps to (possibly different from the node that detected
695 * the error). Return the number of the csrow that sys_addr maps to, or -1 on
698 static int sys_addr_to_csrow(struct mem_ctl_info
*mci
, u64 sys_addr
)
702 csrow
= input_addr_to_csrow(mci
, sys_addr_to_input_addr(mci
, sys_addr
));
705 amd64_mc_err(mci
, "Failed to translate InputAddr to csrow for "
706 "address 0x%lx\n", (unsigned long)sys_addr
);
710 static int get_channel_from_ecc_syndrome(struct mem_ctl_info
*, u16
);
713 * Determine if the DIMMs have ECC enabled. ECC is enabled ONLY if all the DIMMs
716 static unsigned long determine_edac_cap(struct amd64_pvt
*pvt
)
718 unsigned long edac_cap
= EDAC_FLAG_NONE
;
722 u8 i
, umc_en_mask
= 0, dimm_ecc_en_mask
= 0;
725 if (!(pvt
->umc
[i
].sdp_ctrl
& UMC_SDP_INIT
))
728 umc_en_mask
|= BIT(i
);
730 /* UMC Configuration bit 12 (DimmEccEn) */
731 if (pvt
->umc
[i
].umc_cfg
& BIT(12))
732 dimm_ecc_en_mask
|= BIT(i
);
735 if (umc_en_mask
== dimm_ecc_en_mask
)
736 edac_cap
= EDAC_FLAG_SECDED
;
738 bit
= (pvt
->fam
> 0xf || pvt
->ext_model
>= K8_REV_F
)
742 if (pvt
->dclr0
& BIT(bit
))
743 edac_cap
= EDAC_FLAG_SECDED
;
749 static void debug_display_dimm_sizes(struct amd64_pvt
*, u8
);
751 static void debug_dump_dramcfg_low(struct amd64_pvt
*pvt
, u32 dclr
, int chan
)
753 edac_dbg(1, "F2x%d90 (DRAM Cfg Low): 0x%08x\n", chan
, dclr
);
755 if (pvt
->dram_type
== MEM_LRDDR3
) {
756 u32 dcsm
= pvt
->csels
[chan
].csmasks
[0];
758 * It's assumed all LRDIMMs in a DCT are going to be of
759 * same 'type' until proven otherwise. So, use a cs
760 * value of '0' here to get dcsm value.
762 edac_dbg(1, " LRDIMM %dx rank multiply\n", (dcsm
& 0x3));
765 edac_dbg(1, "All DIMMs support ECC:%s\n",
766 (dclr
& BIT(19)) ? "yes" : "no");
769 edac_dbg(1, " PAR/ERR parity: %s\n",
770 (dclr
& BIT(8)) ? "enabled" : "disabled");
772 if (pvt
->fam
== 0x10)
773 edac_dbg(1, " DCT 128bit mode width: %s\n",
774 (dclr
& BIT(11)) ? "128b" : "64b");
776 edac_dbg(1, " x4 logical DIMMs present: L0: %s L1: %s L2: %s L3: %s\n",
777 (dclr
& BIT(12)) ? "yes" : "no",
778 (dclr
& BIT(13)) ? "yes" : "no",
779 (dclr
& BIT(14)) ? "yes" : "no",
780 (dclr
& BIT(15)) ? "yes" : "no");
783 #define CS_EVEN_PRIMARY BIT(0)
784 #define CS_ODD_PRIMARY BIT(1)
785 #define CS_EVEN_SECONDARY BIT(2)
786 #define CS_ODD_SECONDARY BIT(3)
788 #define CS_EVEN (CS_EVEN_PRIMARY | CS_EVEN_SECONDARY)
789 #define CS_ODD (CS_ODD_PRIMARY | CS_ODD_SECONDARY)
791 static int f17_get_cs_mode(int dimm
, u8 ctrl
, struct amd64_pvt
*pvt
)
795 if (csrow_enabled(2 * dimm
, ctrl
, pvt
))
796 cs_mode
|= CS_EVEN_PRIMARY
;
798 if (csrow_enabled(2 * dimm
+ 1, ctrl
, pvt
))
799 cs_mode
|= CS_ODD_PRIMARY
;
801 /* Asymmetric dual-rank DIMM support. */
802 if (csrow_sec_enabled(2 * dimm
+ 1, ctrl
, pvt
))
803 cs_mode
|= CS_ODD_SECONDARY
;
808 static void debug_display_dimm_sizes_df(struct amd64_pvt
*pvt
, u8 ctrl
)
810 int dimm
, size0
, size1
, cs0
, cs1
, cs_mode
;
812 edac_printk(KERN_DEBUG
, EDAC_MC
, "UMC%d chip selects:\n", ctrl
);
814 for (dimm
= 0; dimm
< 2; dimm
++) {
818 cs_mode
= f17_get_cs_mode(dimm
, ctrl
, pvt
);
820 size0
= pvt
->ops
->dbam_to_cs(pvt
, ctrl
, cs_mode
, cs0
);
821 size1
= pvt
->ops
->dbam_to_cs(pvt
, ctrl
, cs_mode
, cs1
);
823 amd64_info(EDAC_MC
": %d: %5dMB %d: %5dMB\n",
829 static void __dump_misc_regs_df(struct amd64_pvt
*pvt
)
831 struct amd64_umc
*umc
;
832 u32 i
, tmp
, umc_base
;
835 umc_base
= get_umc_base(i
);
838 edac_dbg(1, "UMC%d DIMM cfg: 0x%x\n", i
, umc
->dimm_cfg
);
839 edac_dbg(1, "UMC%d UMC cfg: 0x%x\n", i
, umc
->umc_cfg
);
840 edac_dbg(1, "UMC%d SDP ctrl: 0x%x\n", i
, umc
->sdp_ctrl
);
841 edac_dbg(1, "UMC%d ECC ctrl: 0x%x\n", i
, umc
->ecc_ctrl
);
843 amd_smn_read(pvt
->mc_node_id
, umc_base
+ UMCCH_ECC_BAD_SYMBOL
, &tmp
);
844 edac_dbg(1, "UMC%d ECC bad symbol: 0x%x\n", i
, tmp
);
846 amd_smn_read(pvt
->mc_node_id
, umc_base
+ UMCCH_UMC_CAP
, &tmp
);
847 edac_dbg(1, "UMC%d UMC cap: 0x%x\n", i
, tmp
);
848 edac_dbg(1, "UMC%d UMC cap high: 0x%x\n", i
, umc
->umc_cap_hi
);
850 edac_dbg(1, "UMC%d ECC capable: %s, ChipKill ECC capable: %s\n",
851 i
, (umc
->umc_cap_hi
& BIT(30)) ? "yes" : "no",
852 (umc
->umc_cap_hi
& BIT(31)) ? "yes" : "no");
853 edac_dbg(1, "UMC%d All DIMMs support ECC: %s\n",
854 i
, (umc
->umc_cfg
& BIT(12)) ? "yes" : "no");
855 edac_dbg(1, "UMC%d x4 DIMMs present: %s\n",
856 i
, (umc
->dimm_cfg
& BIT(6)) ? "yes" : "no");
857 edac_dbg(1, "UMC%d x16 DIMMs present: %s\n",
858 i
, (umc
->dimm_cfg
& BIT(7)) ? "yes" : "no");
860 if (pvt
->dram_type
== MEM_LRDDR4
) {
861 amd_smn_read(pvt
->mc_node_id
, umc_base
+ UMCCH_ADDR_CFG
, &tmp
);
862 edac_dbg(1, "UMC%d LRDIMM %dx rank multiply\n",
863 i
, 1 << ((tmp
>> 4) & 0x3));
866 debug_display_dimm_sizes_df(pvt
, i
);
869 edac_dbg(1, "F0x104 (DRAM Hole Address): 0x%08x, base: 0x%08x\n",
870 pvt
->dhar
, dhar_base(pvt
));
873 /* Display and decode various NB registers for debug purposes. */
874 static void __dump_misc_regs(struct amd64_pvt
*pvt
)
876 edac_dbg(1, "F3xE8 (NB Cap): 0x%08x\n", pvt
->nbcap
);
878 edac_dbg(1, " NB two channel DRAM capable: %s\n",
879 (pvt
->nbcap
& NBCAP_DCT_DUAL
) ? "yes" : "no");
881 edac_dbg(1, " ECC capable: %s, ChipKill ECC capable: %s\n",
882 (pvt
->nbcap
& NBCAP_SECDED
) ? "yes" : "no",
883 (pvt
->nbcap
& NBCAP_CHIPKILL
) ? "yes" : "no");
885 debug_dump_dramcfg_low(pvt
, pvt
->dclr0
, 0);
887 edac_dbg(1, "F3xB0 (Online Spare): 0x%08x\n", pvt
->online_spare
);
889 edac_dbg(1, "F1xF0 (DRAM Hole Address): 0x%08x, base: 0x%08x, offset: 0x%08x\n",
890 pvt
->dhar
, dhar_base(pvt
),
891 (pvt
->fam
== 0xf) ? k8_dhar_offset(pvt
)
892 : f10_dhar_offset(pvt
));
894 debug_display_dimm_sizes(pvt
, 0);
896 /* everything below this point is Fam10h and above */
900 debug_display_dimm_sizes(pvt
, 1);
902 /* Only if NOT ganged does dclr1 have valid info */
903 if (!dct_ganging_enabled(pvt
))
904 debug_dump_dramcfg_low(pvt
, pvt
->dclr1
, 1);
907 /* Display and decode various NB registers for debug purposes. */
908 static void dump_misc_regs(struct amd64_pvt
*pvt
)
911 __dump_misc_regs_df(pvt
);
913 __dump_misc_regs(pvt
);
915 edac_dbg(1, " DramHoleValid: %s\n", dhar_valid(pvt
) ? "yes" : "no");
917 amd64_info("using x%u syndromes.\n", pvt
->ecc_sym_sz
);
921 * See BKDG, F2x[1,0][5C:40], F2[1,0][6C:60]
923 static void prep_chip_selects(struct amd64_pvt
*pvt
)
925 if (pvt
->fam
== 0xf && pvt
->ext_model
< K8_REV_F
) {
926 pvt
->csels
[0].b_cnt
= pvt
->csels
[1].b_cnt
= 8;
927 pvt
->csels
[0].m_cnt
= pvt
->csels
[1].m_cnt
= 8;
928 } else if (pvt
->fam
== 0x15 && pvt
->model
== 0x30) {
929 pvt
->csels
[0].b_cnt
= pvt
->csels
[1].b_cnt
= 4;
930 pvt
->csels
[0].m_cnt
= pvt
->csels
[1].m_cnt
= 2;
931 } else if (pvt
->fam
>= 0x17) {
935 pvt
->csels
[umc
].b_cnt
= 4;
936 pvt
->csels
[umc
].m_cnt
= 2;
940 pvt
->csels
[0].b_cnt
= pvt
->csels
[1].b_cnt
= 8;
941 pvt
->csels
[0].m_cnt
= pvt
->csels
[1].m_cnt
= 4;
945 static void read_umc_base_mask(struct amd64_pvt
*pvt
)
947 u32 umc_base_reg
, umc_base_reg_sec
;
948 u32 umc_mask_reg
, umc_mask_reg_sec
;
949 u32 base_reg
, base_reg_sec
;
950 u32 mask_reg
, mask_reg_sec
;
951 u32
*base
, *base_sec
;
952 u32
*mask
, *mask_sec
;
956 umc_base_reg
= get_umc_base(umc
) + UMCCH_BASE_ADDR
;
957 umc_base_reg_sec
= get_umc_base(umc
) + UMCCH_BASE_ADDR_SEC
;
959 for_each_chip_select(cs
, umc
, pvt
) {
960 base
= &pvt
->csels
[umc
].csbases
[cs
];
961 base_sec
= &pvt
->csels
[umc
].csbases_sec
[cs
];
963 base_reg
= umc_base_reg
+ (cs
* 4);
964 base_reg_sec
= umc_base_reg_sec
+ (cs
* 4);
966 if (!amd_smn_read(pvt
->mc_node_id
, base_reg
, base
))
967 edac_dbg(0, " DCSB%d[%d]=0x%08x reg: 0x%x\n",
968 umc
, cs
, *base
, base_reg
);
970 if (!amd_smn_read(pvt
->mc_node_id
, base_reg_sec
, base_sec
))
971 edac_dbg(0, " DCSB_SEC%d[%d]=0x%08x reg: 0x%x\n",
972 umc
, cs
, *base_sec
, base_reg_sec
);
975 umc_mask_reg
= get_umc_base(umc
) + UMCCH_ADDR_MASK
;
976 umc_mask_reg_sec
= get_umc_base(umc
) + UMCCH_ADDR_MASK_SEC
;
978 for_each_chip_select_mask(cs
, umc
, pvt
) {
979 mask
= &pvt
->csels
[umc
].csmasks
[cs
];
980 mask_sec
= &pvt
->csels
[umc
].csmasks_sec
[cs
];
982 mask_reg
= umc_mask_reg
+ (cs
* 4);
983 mask_reg_sec
= umc_mask_reg_sec
+ (cs
* 4);
985 if (!amd_smn_read(pvt
->mc_node_id
, mask_reg
, mask
))
986 edac_dbg(0, " DCSM%d[%d]=0x%08x reg: 0x%x\n",
987 umc
, cs
, *mask
, mask_reg
);
989 if (!amd_smn_read(pvt
->mc_node_id
, mask_reg_sec
, mask_sec
))
990 edac_dbg(0, " DCSM_SEC%d[%d]=0x%08x reg: 0x%x\n",
991 umc
, cs
, *mask_sec
, mask_reg_sec
);
997 * Function 2 Offset F10_DCSB0; read in the DCS Base and DCS Mask registers
999 static void read_dct_base_mask(struct amd64_pvt
*pvt
)
1003 prep_chip_selects(pvt
);
1006 return read_umc_base_mask(pvt
);
1008 for_each_chip_select(cs
, 0, pvt
) {
1009 int reg0
= DCSB0
+ (cs
* 4);
1010 int reg1
= DCSB1
+ (cs
* 4);
1011 u32
*base0
= &pvt
->csels
[0].csbases
[cs
];
1012 u32
*base1
= &pvt
->csels
[1].csbases
[cs
];
1014 if (!amd64_read_dct_pci_cfg(pvt
, 0, reg0
, base0
))
1015 edac_dbg(0, " DCSB0[%d]=0x%08x reg: F2x%x\n",
1018 if (pvt
->fam
== 0xf)
1021 if (!amd64_read_dct_pci_cfg(pvt
, 1, reg0
, base1
))
1022 edac_dbg(0, " DCSB1[%d]=0x%08x reg: F2x%x\n",
1023 cs
, *base1
, (pvt
->fam
== 0x10) ? reg1
1027 for_each_chip_select_mask(cs
, 0, pvt
) {
1028 int reg0
= DCSM0
+ (cs
* 4);
1029 int reg1
= DCSM1
+ (cs
* 4);
1030 u32
*mask0
= &pvt
->csels
[0].csmasks
[cs
];
1031 u32
*mask1
= &pvt
->csels
[1].csmasks
[cs
];
1033 if (!amd64_read_dct_pci_cfg(pvt
, 0, reg0
, mask0
))
1034 edac_dbg(0, " DCSM0[%d]=0x%08x reg: F2x%x\n",
1037 if (pvt
->fam
== 0xf)
1040 if (!amd64_read_dct_pci_cfg(pvt
, 1, reg0
, mask1
))
1041 edac_dbg(0, " DCSM1[%d]=0x%08x reg: F2x%x\n",
1042 cs
, *mask1
, (pvt
->fam
== 0x10) ? reg1
1047 static void determine_memory_type(struct amd64_pvt
*pvt
)
1049 u32 dram_ctrl
, dcsm
;
1052 if ((pvt
->umc
[0].dimm_cfg
| pvt
->umc
[1].dimm_cfg
) & BIT(5))
1053 pvt
->dram_type
= MEM_LRDDR4
;
1054 else if ((pvt
->umc
[0].dimm_cfg
| pvt
->umc
[1].dimm_cfg
) & BIT(4))
1055 pvt
->dram_type
= MEM_RDDR4
;
1057 pvt
->dram_type
= MEM_DDR4
;
1063 if (pvt
->ext_model
>= K8_REV_F
)
1066 pvt
->dram_type
= (pvt
->dclr0
& BIT(18)) ? MEM_DDR
: MEM_RDDR
;
1070 if (pvt
->dchr0
& DDR3_MODE
)
1073 pvt
->dram_type
= (pvt
->dclr0
& BIT(16)) ? MEM_DDR2
: MEM_RDDR2
;
1077 if (pvt
->model
< 0x60)
1081 * Model 0x60h needs special handling:
1083 * We use a Chip Select value of '0' to obtain dcsm.
1084 * Theoretically, it is possible to populate LRDIMMs of different
1085 * 'Rank' value on a DCT. But this is not the common case. So,
1086 * it's reasonable to assume all DIMMs are going to be of same
1087 * 'type' until proven otherwise.
1089 amd64_read_dct_pci_cfg(pvt
, 0, DRAM_CONTROL
, &dram_ctrl
);
1090 dcsm
= pvt
->csels
[0].csmasks
[0];
1092 if (((dram_ctrl
>> 8) & 0x7) == 0x2)
1093 pvt
->dram_type
= MEM_DDR4
;
1094 else if (pvt
->dclr0
& BIT(16))
1095 pvt
->dram_type
= MEM_DDR3
;
1096 else if (dcsm
& 0x3)
1097 pvt
->dram_type
= MEM_LRDDR3
;
1099 pvt
->dram_type
= MEM_RDDR3
;
1107 WARN(1, KERN_ERR
"%s: Family??? 0x%x\n", __func__
, pvt
->fam
);
1108 pvt
->dram_type
= MEM_EMPTY
;
1113 pvt
->dram_type
= (pvt
->dclr0
& BIT(16)) ? MEM_DDR3
: MEM_RDDR3
;
1116 /* Get the number of DCT channels the memory controller is using. */
1117 static int k8_early_channel_count(struct amd64_pvt
*pvt
)
1121 if (pvt
->ext_model
>= K8_REV_F
)
1122 /* RevF (NPT) and later */
1123 flag
= pvt
->dclr0
& WIDTH_128
;
1125 /* RevE and earlier */
1126 flag
= pvt
->dclr0
& REVE_WIDTH_128
;
1131 return (flag
) ? 2 : 1;
1134 /* On F10h and later ErrAddr is MC4_ADDR[47:1] */
1135 static u64
get_error_address(struct amd64_pvt
*pvt
, struct mce
*m
)
1137 u16 mce_nid
= amd_get_nb_id(m
->extcpu
);
1138 struct mem_ctl_info
*mci
;
1143 mci
= edac_mc_find(mce_nid
);
1147 pvt
= mci
->pvt_info
;
1149 if (pvt
->fam
== 0xf) {
1154 addr
= m
->addr
& GENMASK_ULL(end_bit
, start_bit
);
1157 * Erratum 637 workaround
1159 if (pvt
->fam
== 0x15) {
1160 u64 cc6_base
, tmp_addr
;
1164 if ((addr
& GENMASK_ULL(47, 24)) >> 24 != 0x00fdf7)
1168 amd64_read_pci_cfg(pvt
->F1
, DRAM_LOCAL_NODE_LIM
, &tmp
);
1169 intlv_en
= tmp
>> 21 & 0x7;
1171 /* add [47:27] + 3 trailing bits */
1172 cc6_base
= (tmp
& GENMASK_ULL(20, 0)) << 3;
1174 /* reverse and add DramIntlvEn */
1175 cc6_base
|= intlv_en
^ 0x7;
1177 /* pin at [47:24] */
1181 return cc6_base
| (addr
& GENMASK_ULL(23, 0));
1183 amd64_read_pci_cfg(pvt
->F1
, DRAM_LOCAL_NODE_BASE
, &tmp
);
1186 tmp_addr
= (addr
& GENMASK_ULL(23, 12)) << __fls(intlv_en
+ 1);
1188 /* OR DramIntlvSel into bits [14:12] */
1189 tmp_addr
|= (tmp
& GENMASK_ULL(23, 21)) >> 9;
1191 /* add remaining [11:0] bits from original MC4_ADDR */
1192 tmp_addr
|= addr
& GENMASK_ULL(11, 0);
1194 return cc6_base
| tmp_addr
;
1200 static struct pci_dev
*pci_get_related_function(unsigned int vendor
,
1201 unsigned int device
,
1202 struct pci_dev
*related
)
1204 struct pci_dev
*dev
= NULL
;
1206 while ((dev
= pci_get_device(vendor
, device
, dev
))) {
1207 if (pci_domain_nr(dev
->bus
) == pci_domain_nr(related
->bus
) &&
1208 (dev
->bus
->number
== related
->bus
->number
) &&
1209 (PCI_SLOT(dev
->devfn
) == PCI_SLOT(related
->devfn
)))
1216 static void read_dram_base_limit_regs(struct amd64_pvt
*pvt
, unsigned range
)
1218 struct amd_northbridge
*nb
;
1219 struct pci_dev
*f1
= NULL
;
1220 unsigned int pci_func
;
1221 int off
= range
<< 3;
1224 amd64_read_pci_cfg(pvt
->F1
, DRAM_BASE_LO
+ off
, &pvt
->ranges
[range
].base
.lo
);
1225 amd64_read_pci_cfg(pvt
->F1
, DRAM_LIMIT_LO
+ off
, &pvt
->ranges
[range
].lim
.lo
);
1227 if (pvt
->fam
== 0xf)
1230 if (!dram_rw(pvt
, range
))
1233 amd64_read_pci_cfg(pvt
->F1
, DRAM_BASE_HI
+ off
, &pvt
->ranges
[range
].base
.hi
);
1234 amd64_read_pci_cfg(pvt
->F1
, DRAM_LIMIT_HI
+ off
, &pvt
->ranges
[range
].lim
.hi
);
1236 /* F15h: factor in CC6 save area by reading dst node's limit reg */
1237 if (pvt
->fam
!= 0x15)
1240 nb
= node_to_amd_nb(dram_dst_node(pvt
, range
));
1244 if (pvt
->model
== 0x60)
1245 pci_func
= PCI_DEVICE_ID_AMD_15H_M60H_NB_F1
;
1246 else if (pvt
->model
== 0x30)
1247 pci_func
= PCI_DEVICE_ID_AMD_15H_M30H_NB_F1
;
1249 pci_func
= PCI_DEVICE_ID_AMD_15H_NB_F1
;
1251 f1
= pci_get_related_function(nb
->misc
->vendor
, pci_func
, nb
->misc
);
1255 amd64_read_pci_cfg(f1
, DRAM_LOCAL_NODE_LIM
, &llim
);
1257 pvt
->ranges
[range
].lim
.lo
&= GENMASK_ULL(15, 0);
1259 /* {[39:27],111b} */
1260 pvt
->ranges
[range
].lim
.lo
|= ((llim
& 0x1fff) << 3 | 0x7) << 16;
1262 pvt
->ranges
[range
].lim
.hi
&= GENMASK_ULL(7, 0);
1265 pvt
->ranges
[range
].lim
.hi
|= llim
>> 13;
1270 static void k8_map_sysaddr_to_csrow(struct mem_ctl_info
*mci
, u64 sys_addr
,
1271 struct err_info
*err
)
1273 struct amd64_pvt
*pvt
= mci
->pvt_info
;
1275 error_address_to_page_and_offset(sys_addr
, err
);
1278 * Find out which node the error address belongs to. This may be
1279 * different from the node that detected the error.
1281 err
->src_mci
= find_mc_by_sys_addr(mci
, sys_addr
);
1282 if (!err
->src_mci
) {
1283 amd64_mc_err(mci
, "failed to map error addr 0x%lx to a node\n",
1284 (unsigned long)sys_addr
);
1285 err
->err_code
= ERR_NODE
;
1289 /* Now map the sys_addr to a CSROW */
1290 err
->csrow
= sys_addr_to_csrow(err
->src_mci
, sys_addr
);
1291 if (err
->csrow
< 0) {
1292 err
->err_code
= ERR_CSROW
;
1296 /* CHIPKILL enabled */
1297 if (pvt
->nbcfg
& NBCFG_CHIPKILL
) {
1298 err
->channel
= get_channel_from_ecc_syndrome(mci
, err
->syndrome
);
1299 if (err
->channel
< 0) {
1301 * Syndrome didn't map, so we don't know which of the
1302 * 2 DIMMs is in error. So we need to ID 'both' of them
1305 amd64_mc_warn(err
->src_mci
, "unknown syndrome 0x%04x - "
1306 "possible error reporting race\n",
1308 err
->err_code
= ERR_CHANNEL
;
1313 * non-chipkill ecc mode
1315 * The k8 documentation is unclear about how to determine the
1316 * channel number when using non-chipkill memory. This method
1317 * was obtained from email communication with someone at AMD.
1318 * (Wish the email was placed in this comment - norsk)
1320 err
->channel
= ((sys_addr
& BIT(3)) != 0);
1324 static int ddr2_cs_size(unsigned i
, bool dct_width
)
1330 else if (!(i
& 0x1))
1333 shift
= (i
+ 1) >> 1;
1335 return 128 << (shift
+ !!dct_width
);
1338 static int k8_dbam_to_chip_select(struct amd64_pvt
*pvt
, u8 dct
,
1339 unsigned cs_mode
, int cs_mask_nr
)
1341 u32 dclr
= dct
? pvt
->dclr1
: pvt
->dclr0
;
1343 if (pvt
->ext_model
>= K8_REV_F
) {
1344 WARN_ON(cs_mode
> 11);
1345 return ddr2_cs_size(cs_mode
, dclr
& WIDTH_128
);
1347 else if (pvt
->ext_model
>= K8_REV_D
) {
1349 WARN_ON(cs_mode
> 10);
1352 * the below calculation, besides trying to win an obfuscated C
1353 * contest, maps cs_mode values to DIMM chip select sizes. The
1356 * cs_mode CS size (mb)
1357 * ======= ============
1370 * Basically, it calculates a value with which to shift the
1371 * smallest CS size of 32MB.
1373 * ddr[23]_cs_size have a similar purpose.
1375 diff
= cs_mode
/3 + (unsigned)(cs_mode
> 5);
1377 return 32 << (cs_mode
- diff
);
1380 WARN_ON(cs_mode
> 6);
1381 return 32 << cs_mode
;
1386 * Get the number of DCT channels in use.
1389 * number of Memory Channels in operation
1391 * contents of the DCL0_LOW register
1393 static int f1x_early_channel_count(struct amd64_pvt
*pvt
)
1395 int i
, j
, channels
= 0;
1397 /* On F10h, if we are in 128 bit mode, then we are using 2 channels */
1398 if (pvt
->fam
== 0x10 && (pvt
->dclr0
& WIDTH_128
))
1402 * Need to check if in unganged mode: In such, there are 2 channels,
1403 * but they are not in 128 bit mode and thus the above 'dclr0' status
1406 * Need to check DCT0[0] and DCT1[0] to see if only one of them has
1407 * their CSEnable bit on. If so, then SINGLE DIMM case.
1409 edac_dbg(0, "Data width is not 128 bits - need more decoding\n");
1412 * Check DRAM Bank Address Mapping values for each DIMM to see if there
1413 * is more than just one DIMM present in unganged mode. Need to check
1414 * both controllers since DIMMs can be placed in either one.
1416 for (i
= 0; i
< 2; i
++) {
1417 u32 dbam
= (i
? pvt
->dbam1
: pvt
->dbam0
);
1419 for (j
= 0; j
< 4; j
++) {
1420 if (DBAM_DIMM(j
, dbam
) > 0) {
1430 amd64_info("MCT channel count: %d\n", channels
);
1435 static int f17_early_channel_count(struct amd64_pvt
*pvt
)
1437 int i
, channels
= 0;
1439 /* SDP Control bit 31 (SdpInit) is clear for unused UMC channels */
1441 channels
+= !!(pvt
->umc
[i
].sdp_ctrl
& UMC_SDP_INIT
);
1443 amd64_info("MCT channel count: %d\n", channels
);
1448 static int ddr3_cs_size(unsigned i
, bool dct_width
)
1453 if (i
== 0 || i
== 3 || i
== 4)
1459 else if (!(i
& 0x1))
1462 shift
= (i
+ 1) >> 1;
1465 cs_size
= (128 * (1 << !!dct_width
)) << shift
;
1470 static int ddr3_lrdimm_cs_size(unsigned i
, unsigned rank_multiply
)
1475 if (i
< 4 || i
== 6)
1479 else if (!(i
& 0x1))
1482 shift
= (i
+ 1) >> 1;
1485 cs_size
= rank_multiply
* (128 << shift
);
1490 static int ddr4_cs_size(unsigned i
)
1499 /* Min cs_size = 1G */
1500 cs_size
= 1024 * (1 << (i
>> 1));
1505 static int f10_dbam_to_chip_select(struct amd64_pvt
*pvt
, u8 dct
,
1506 unsigned cs_mode
, int cs_mask_nr
)
1508 u32 dclr
= dct
? pvt
->dclr1
: pvt
->dclr0
;
1510 WARN_ON(cs_mode
> 11);
1512 if (pvt
->dchr0
& DDR3_MODE
|| pvt
->dchr1
& DDR3_MODE
)
1513 return ddr3_cs_size(cs_mode
, dclr
& WIDTH_128
);
1515 return ddr2_cs_size(cs_mode
, dclr
& WIDTH_128
);
1519 * F15h supports only 64bit DCT interfaces
1521 static int f15_dbam_to_chip_select(struct amd64_pvt
*pvt
, u8 dct
,
1522 unsigned cs_mode
, int cs_mask_nr
)
1524 WARN_ON(cs_mode
> 12);
1526 return ddr3_cs_size(cs_mode
, false);
1529 /* F15h M60h supports DDR4 mapping as well.. */
1530 static int f15_m60h_dbam_to_chip_select(struct amd64_pvt
*pvt
, u8 dct
,
1531 unsigned cs_mode
, int cs_mask_nr
)
1534 u32 dcsm
= pvt
->csels
[dct
].csmasks
[cs_mask_nr
];
1536 WARN_ON(cs_mode
> 12);
1538 if (pvt
->dram_type
== MEM_DDR4
) {
1542 cs_size
= ddr4_cs_size(cs_mode
);
1543 } else if (pvt
->dram_type
== MEM_LRDDR3
) {
1544 unsigned rank_multiply
= dcsm
& 0xf;
1546 if (rank_multiply
== 3)
1548 cs_size
= ddr3_lrdimm_cs_size(cs_mode
, rank_multiply
);
1550 /* Minimum cs size is 512mb for F15hM60h*/
1554 cs_size
= ddr3_cs_size(cs_mode
, false);
1561 * F16h and F15h model 30h have only limited cs_modes.
1563 static int f16_dbam_to_chip_select(struct amd64_pvt
*pvt
, u8 dct
,
1564 unsigned cs_mode
, int cs_mask_nr
)
1566 WARN_ON(cs_mode
> 12);
1568 if (cs_mode
== 6 || cs_mode
== 8 ||
1569 cs_mode
== 9 || cs_mode
== 12)
1572 return ddr3_cs_size(cs_mode
, false);
1575 static int f17_addr_mask_to_cs_size(struct amd64_pvt
*pvt
, u8 umc
,
1576 unsigned int cs_mode
, int csrow_nr
)
1578 u32 addr_mask_orig
, addr_mask_deinterleaved
;
1579 u32 msb
, weight
, num_zero_bits
;
1582 /* No Chip Selects are enabled. */
1586 /* Requested size of an even CS but none are enabled. */
1587 if (!(cs_mode
& CS_EVEN
) && !(csrow_nr
& 1))
1590 /* Requested size of an odd CS but none are enabled. */
1591 if (!(cs_mode
& CS_ODD
) && (csrow_nr
& 1))
1595 * There is one mask per DIMM, and two Chip Selects per DIMM.
1596 * CS0 and CS1 -> DIMM0
1597 * CS2 and CS3 -> DIMM1
1599 dimm
= csrow_nr
>> 1;
1601 /* Asymmetric dual-rank DIMM support. */
1602 if ((csrow_nr
& 1) && (cs_mode
& CS_ODD_SECONDARY
))
1603 addr_mask_orig
= pvt
->csels
[umc
].csmasks_sec
[dimm
];
1605 addr_mask_orig
= pvt
->csels
[umc
].csmasks
[dimm
];
1608 * The number of zero bits in the mask is equal to the number of bits
1609 * in a full mask minus the number of bits in the current mask.
1611 * The MSB is the number of bits in the full mask because BIT[0] is
1614 msb
= fls(addr_mask_orig
) - 1;
1615 weight
= hweight_long(addr_mask_orig
);
1616 num_zero_bits
= msb
- weight
;
1618 /* Take the number of zero bits off from the top of the mask. */
1619 addr_mask_deinterleaved
= GENMASK_ULL(msb
- num_zero_bits
, 1);
1621 edac_dbg(1, "CS%d DIMM%d AddrMasks:\n", csrow_nr
, dimm
);
1622 edac_dbg(1, " Original AddrMask: 0x%x\n", addr_mask_orig
);
1623 edac_dbg(1, " Deinterleaved AddrMask: 0x%x\n", addr_mask_deinterleaved
);
1625 /* Register [31:1] = Address [39:9]. Size is in kBs here. */
1626 size
= (addr_mask_deinterleaved
>> 2) + 1;
1628 /* Return size in MBs. */
1632 static void read_dram_ctl_register(struct amd64_pvt
*pvt
)
1635 if (pvt
->fam
== 0xf)
1638 if (!amd64_read_pci_cfg(pvt
->F2
, DCT_SEL_LO
, &pvt
->dct_sel_lo
)) {
1639 edac_dbg(0, "F2x110 (DCTSelLow): 0x%08x, High range addrs at: 0x%x\n",
1640 pvt
->dct_sel_lo
, dct_sel_baseaddr(pvt
));
1642 edac_dbg(0, " DCTs operate in %s mode\n",
1643 (dct_ganging_enabled(pvt
) ? "ganged" : "unganged"));
1645 if (!dct_ganging_enabled(pvt
))
1646 edac_dbg(0, " Address range split per DCT: %s\n",
1647 (dct_high_range_enabled(pvt
) ? "yes" : "no"));
1649 edac_dbg(0, " data interleave for ECC: %s, DRAM cleared since last warm reset: %s\n",
1650 (dct_data_intlv_enabled(pvt
) ? "enabled" : "disabled"),
1651 (dct_memory_cleared(pvt
) ? "yes" : "no"));
1653 edac_dbg(0, " channel interleave: %s, "
1654 "interleave bits selector: 0x%x\n",
1655 (dct_interleave_enabled(pvt
) ? "enabled" : "disabled"),
1656 dct_sel_interleave_addr(pvt
));
1659 amd64_read_pci_cfg(pvt
->F2
, DCT_SEL_HI
, &pvt
->dct_sel_hi
);
1663 * Determine channel (DCT) based on the interleaving mode (see F15h M30h BKDG,
1664 * 2.10.12 Memory Interleaving Modes).
1666 static u8
f15_m30h_determine_channel(struct amd64_pvt
*pvt
, u64 sys_addr
,
1667 u8 intlv_en
, int num_dcts_intlv
,
1674 return (u8
)(dct_sel
);
1676 if (num_dcts_intlv
== 2) {
1677 select
= (sys_addr
>> 8) & 0x3;
1678 channel
= select
? 0x3 : 0;
1679 } else if (num_dcts_intlv
== 4) {
1680 u8 intlv_addr
= dct_sel_interleave_addr(pvt
);
1681 switch (intlv_addr
) {
1683 channel
= (sys_addr
>> 8) & 0x3;
1686 channel
= (sys_addr
>> 9) & 0x3;
1694 * Determine channel (DCT) based on the interleaving mode: F10h BKDG, 2.8.9 Memory
1695 * Interleaving Modes.
1697 static u8
f1x_determine_channel(struct amd64_pvt
*pvt
, u64 sys_addr
,
1698 bool hi_range_sel
, u8 intlv_en
)
1700 u8 dct_sel_high
= (pvt
->dct_sel_lo
>> 1) & 1;
1702 if (dct_ganging_enabled(pvt
))
1706 return dct_sel_high
;
1709 * see F2x110[DctSelIntLvAddr] - channel interleave mode
1711 if (dct_interleave_enabled(pvt
)) {
1712 u8 intlv_addr
= dct_sel_interleave_addr(pvt
);
1714 /* return DCT select function: 0=DCT0, 1=DCT1 */
1716 return sys_addr
>> 6 & 1;
1718 if (intlv_addr
& 0x2) {
1719 u8 shift
= intlv_addr
& 0x1 ? 9 : 6;
1720 u32 temp
= hweight_long((u32
) ((sys_addr
>> 16) & 0x1F)) & 1;
1722 return ((sys_addr
>> shift
) & 1) ^ temp
;
1725 if (intlv_addr
& 0x4) {
1726 u8 shift
= intlv_addr
& 0x1 ? 9 : 8;
1728 return (sys_addr
>> shift
) & 1;
1731 return (sys_addr
>> (12 + hweight8(intlv_en
))) & 1;
1734 if (dct_high_range_enabled(pvt
))
1735 return ~dct_sel_high
& 1;
1740 /* Convert the sys_addr to the normalized DCT address */
1741 static u64
f1x_get_norm_dct_addr(struct amd64_pvt
*pvt
, u8 range
,
1742 u64 sys_addr
, bool hi_rng
,
1743 u32 dct_sel_base_addr
)
1746 u64 dram_base
= get_dram_base(pvt
, range
);
1747 u64 hole_off
= f10_dhar_offset(pvt
);
1748 u64 dct_sel_base_off
= (u64
)(pvt
->dct_sel_hi
& 0xFFFFFC00) << 16;
1753 * base address of high range is below 4Gb
1754 * (bits [47:27] at [31:11])
1755 * DRAM address space on this DCT is hoisted above 4Gb &&
1758 * remove hole offset from sys_addr
1760 * remove high range offset from sys_addr
1762 if ((!(dct_sel_base_addr
>> 16) ||
1763 dct_sel_base_addr
< dhar_base(pvt
)) &&
1765 (sys_addr
>= BIT_64(32)))
1766 chan_off
= hole_off
;
1768 chan_off
= dct_sel_base_off
;
1772 * we have a valid hole &&
1777 * remove dram base to normalize to DCT address
1779 if (dhar_valid(pvt
) && (sys_addr
>= BIT_64(32)))
1780 chan_off
= hole_off
;
1782 chan_off
= dram_base
;
1785 return (sys_addr
& GENMASK_ULL(47,6)) - (chan_off
& GENMASK_ULL(47,23));
1789 * checks if the csrow passed in is marked as SPARED, if so returns the new
1792 static int f10_process_possible_spare(struct amd64_pvt
*pvt
, u8 dct
, int csrow
)
1796 if (online_spare_swap_done(pvt
, dct
) &&
1797 csrow
== online_spare_bad_dramcs(pvt
, dct
)) {
1799 for_each_chip_select(tmp_cs
, dct
, pvt
) {
1800 if (chip_select_base(tmp_cs
, dct
, pvt
) & 0x2) {
1810 * Iterate over the DRAM DCT "base" and "mask" registers looking for a
1811 * SystemAddr match on the specified 'ChannelSelect' and 'NodeID'
1814 * -EINVAL: NOT FOUND
1815 * 0..csrow = Chip-Select Row
1817 static int f1x_lookup_addr_in_dct(u64 in_addr
, u8 nid
, u8 dct
)
1819 struct mem_ctl_info
*mci
;
1820 struct amd64_pvt
*pvt
;
1821 u64 cs_base
, cs_mask
;
1822 int cs_found
= -EINVAL
;
1825 mci
= edac_mc_find(nid
);
1829 pvt
= mci
->pvt_info
;
1831 edac_dbg(1, "input addr: 0x%llx, DCT: %d\n", in_addr
, dct
);
1833 for_each_chip_select(csrow
, dct
, pvt
) {
1834 if (!csrow_enabled(csrow
, dct
, pvt
))
1837 get_cs_base_and_mask(pvt
, csrow
, dct
, &cs_base
, &cs_mask
);
1839 edac_dbg(1, " CSROW=%d CSBase=0x%llx CSMask=0x%llx\n",
1840 csrow
, cs_base
, cs_mask
);
1844 edac_dbg(1, " (InputAddr & ~CSMask)=0x%llx (CSBase & ~CSMask)=0x%llx\n",
1845 (in_addr
& cs_mask
), (cs_base
& cs_mask
));
1847 if ((in_addr
& cs_mask
) == (cs_base
& cs_mask
)) {
1848 if (pvt
->fam
== 0x15 && pvt
->model
>= 0x30) {
1852 cs_found
= f10_process_possible_spare(pvt
, dct
, csrow
);
1854 edac_dbg(1, " MATCH csrow=%d\n", cs_found
);
1862 * See F2x10C. Non-interleaved graphics framebuffer memory under the 16G is
1863 * swapped with a region located at the bottom of memory so that the GPU can use
1864 * the interleaved region and thus two channels.
1866 static u64
f1x_swap_interleaved_region(struct amd64_pvt
*pvt
, u64 sys_addr
)
1868 u32 swap_reg
, swap_base
, swap_limit
, rgn_size
, tmp_addr
;
1870 if (pvt
->fam
== 0x10) {
1871 /* only revC3 and revE have that feature */
1872 if (pvt
->model
< 4 || (pvt
->model
< 0xa && pvt
->stepping
< 3))
1876 amd64_read_pci_cfg(pvt
->F2
, SWAP_INTLV_REG
, &swap_reg
);
1878 if (!(swap_reg
& 0x1))
1881 swap_base
= (swap_reg
>> 3) & 0x7f;
1882 swap_limit
= (swap_reg
>> 11) & 0x7f;
1883 rgn_size
= (swap_reg
>> 20) & 0x7f;
1884 tmp_addr
= sys_addr
>> 27;
1886 if (!(sys_addr
>> 34) &&
1887 (((tmp_addr
>= swap_base
) &&
1888 (tmp_addr
<= swap_limit
)) ||
1889 (tmp_addr
< rgn_size
)))
1890 return sys_addr
^ (u64
)swap_base
<< 27;
1895 /* For a given @dram_range, check if @sys_addr falls within it. */
1896 static int f1x_match_to_this_node(struct amd64_pvt
*pvt
, unsigned range
,
1897 u64 sys_addr
, int *chan_sel
)
1899 int cs_found
= -EINVAL
;
1903 bool high_range
= false;
1905 u8 node_id
= dram_dst_node(pvt
, range
);
1906 u8 intlv_en
= dram_intlv_en(pvt
, range
);
1907 u32 intlv_sel
= dram_intlv_sel(pvt
, range
);
1909 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
1910 range
, sys_addr
, get_dram_limit(pvt
, range
));
1912 if (dhar_valid(pvt
) &&
1913 dhar_base(pvt
) <= sys_addr
&&
1914 sys_addr
< BIT_64(32)) {
1915 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
1920 if (intlv_en
&& (intlv_sel
!= ((sys_addr
>> 12) & intlv_en
)))
1923 sys_addr
= f1x_swap_interleaved_region(pvt
, sys_addr
);
1925 dct_sel_base
= dct_sel_baseaddr(pvt
);
1928 * check whether addresses >= DctSelBaseAddr[47:27] are to be used to
1929 * select between DCT0 and DCT1.
1931 if (dct_high_range_enabled(pvt
) &&
1932 !dct_ganging_enabled(pvt
) &&
1933 ((sys_addr
>> 27) >= (dct_sel_base
>> 11)))
1936 channel
= f1x_determine_channel(pvt
, sys_addr
, high_range
, intlv_en
);
1938 chan_addr
= f1x_get_norm_dct_addr(pvt
, range
, sys_addr
,
1939 high_range
, dct_sel_base
);
1941 /* Remove node interleaving, see F1x120 */
1943 chan_addr
= ((chan_addr
>> (12 + hweight8(intlv_en
))) << 12) |
1944 (chan_addr
& 0xfff);
1946 /* remove channel interleave */
1947 if (dct_interleave_enabled(pvt
) &&
1948 !dct_high_range_enabled(pvt
) &&
1949 !dct_ganging_enabled(pvt
)) {
1951 if (dct_sel_interleave_addr(pvt
) != 1) {
1952 if (dct_sel_interleave_addr(pvt
) == 0x3)
1954 chan_addr
= ((chan_addr
>> 10) << 9) |
1955 (chan_addr
& 0x1ff);
1957 /* A[6] or hash 6 */
1958 chan_addr
= ((chan_addr
>> 7) << 6) |
1962 chan_addr
= ((chan_addr
>> 13) << 12) |
1963 (chan_addr
& 0xfff);
1966 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr
);
1968 cs_found
= f1x_lookup_addr_in_dct(chan_addr
, node_id
, channel
);
1971 *chan_sel
= channel
;
1976 static int f15_m30h_match_to_this_node(struct amd64_pvt
*pvt
, unsigned range
,
1977 u64 sys_addr
, int *chan_sel
)
1979 int cs_found
= -EINVAL
;
1980 int num_dcts_intlv
= 0;
1981 u64 chan_addr
, chan_offset
;
1982 u64 dct_base
, dct_limit
;
1983 u32 dct_cont_base_reg
, dct_cont_limit_reg
, tmp
;
1984 u8 channel
, alias_channel
, leg_mmio_hole
, dct_sel
, dct_offset_en
;
1986 u64 dhar_offset
= f10_dhar_offset(pvt
);
1987 u8 intlv_addr
= dct_sel_interleave_addr(pvt
);
1988 u8 node_id
= dram_dst_node(pvt
, range
);
1989 u8 intlv_en
= dram_intlv_en(pvt
, range
);
1991 amd64_read_pci_cfg(pvt
->F1
, DRAM_CONT_BASE
, &dct_cont_base_reg
);
1992 amd64_read_pci_cfg(pvt
->F1
, DRAM_CONT_LIMIT
, &dct_cont_limit_reg
);
1994 dct_offset_en
= (u8
) ((dct_cont_base_reg
>> 3) & BIT(0));
1995 dct_sel
= (u8
) ((dct_cont_base_reg
>> 4) & 0x7);
1997 edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
1998 range
, sys_addr
, get_dram_limit(pvt
, range
));
2000 if (!(get_dram_base(pvt
, range
) <= sys_addr
) &&
2001 !(get_dram_limit(pvt
, range
) >= sys_addr
))
2004 if (dhar_valid(pvt
) &&
2005 dhar_base(pvt
) <= sys_addr
&&
2006 sys_addr
< BIT_64(32)) {
2007 amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2012 /* Verify sys_addr is within DCT Range. */
2013 dct_base
= (u64
) dct_sel_baseaddr(pvt
);
2014 dct_limit
= (dct_cont_limit_reg
>> 11) & 0x1FFF;
2016 if (!(dct_cont_base_reg
& BIT(0)) &&
2017 !(dct_base
<= (sys_addr
>> 27) &&
2018 dct_limit
>= (sys_addr
>> 27)))
2021 /* Verify number of dct's that participate in channel interleaving. */
2022 num_dcts_intlv
= (int) hweight8(intlv_en
);
2024 if (!(num_dcts_intlv
% 2 == 0) || (num_dcts_intlv
> 4))
2027 if (pvt
->model
>= 0x60)
2028 channel
= f1x_determine_channel(pvt
, sys_addr
, false, intlv_en
);
2030 channel
= f15_m30h_determine_channel(pvt
, sys_addr
, intlv_en
,
2031 num_dcts_intlv
, dct_sel
);
2033 /* Verify we stay within the MAX number of channels allowed */
2037 leg_mmio_hole
= (u8
) (dct_cont_base_reg
>> 1 & BIT(0));
2039 /* Get normalized DCT addr */
2040 if (leg_mmio_hole
&& (sys_addr
>= BIT_64(32)))
2041 chan_offset
= dhar_offset
;
2043 chan_offset
= dct_base
<< 27;
2045 chan_addr
= sys_addr
- chan_offset
;
2047 /* remove channel interleave */
2048 if (num_dcts_intlv
== 2) {
2049 if (intlv_addr
== 0x4)
2050 chan_addr
= ((chan_addr
>> 9) << 8) |
2052 else if (intlv_addr
== 0x5)
2053 chan_addr
= ((chan_addr
>> 10) << 9) |
2054 (chan_addr
& 0x1ff);
2058 } else if (num_dcts_intlv
== 4) {
2059 if (intlv_addr
== 0x4)
2060 chan_addr
= ((chan_addr
>> 10) << 8) |
2062 else if (intlv_addr
== 0x5)
2063 chan_addr
= ((chan_addr
>> 11) << 9) |
2064 (chan_addr
& 0x1ff);
2069 if (dct_offset_en
) {
2070 amd64_read_pci_cfg(pvt
->F1
,
2071 DRAM_CONT_HIGH_OFF
+ (int) channel
* 4,
2073 chan_addr
+= (u64
) ((tmp
>> 11) & 0xfff) << 27;
2076 f15h_select_dct(pvt
, channel
);
2078 edac_dbg(1, " Normalized DCT addr: 0x%llx\n", chan_addr
);
2082 * if channel = 3, then alias it to 1. This is because, in F15 M30h,
2083 * there is support for 4 DCT's, but only 2 are currently functional.
2084 * They are DCT0 and DCT3. But we have read all registers of DCT3 into
2085 * pvt->csels[1]. So we need to use '1' here to get correct info.
2086 * Refer F15 M30h BKDG Section 2.10 and 2.10.3 for clarifications.
2088 alias_channel
= (channel
== 3) ? 1 : channel
;
2090 cs_found
= f1x_lookup_addr_in_dct(chan_addr
, node_id
, alias_channel
);
2093 *chan_sel
= alias_channel
;
2098 static int f1x_translate_sysaddr_to_cs(struct amd64_pvt
*pvt
,
2102 int cs_found
= -EINVAL
;
2105 for (range
= 0; range
< DRAM_RANGES
; range
++) {
2106 if (!dram_rw(pvt
, range
))
2109 if (pvt
->fam
== 0x15 && pvt
->model
>= 0x30)
2110 cs_found
= f15_m30h_match_to_this_node(pvt
, range
,
2114 else if ((get_dram_base(pvt
, range
) <= sys_addr
) &&
2115 (get_dram_limit(pvt
, range
) >= sys_addr
)) {
2116 cs_found
= f1x_match_to_this_node(pvt
, range
,
2117 sys_addr
, chan_sel
);
2126 * For reference see "2.8.5 Routing DRAM Requests" in F10 BKDG. This code maps
2127 * a @sys_addr to NodeID, DCT (channel) and chip select (CSROW).
2129 * The @sys_addr is usually an error address received from the hardware
2132 static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info
*mci
, u64 sys_addr
,
2133 struct err_info
*err
)
2135 struct amd64_pvt
*pvt
= mci
->pvt_info
;
2137 error_address_to_page_and_offset(sys_addr
, err
);
2139 err
->csrow
= f1x_translate_sysaddr_to_cs(pvt
, sys_addr
, &err
->channel
);
2140 if (err
->csrow
< 0) {
2141 err
->err_code
= ERR_CSROW
;
2146 * We need the syndromes for channel detection only when we're
2147 * ganged. Otherwise @chan should already contain the channel at
2150 if (dct_ganging_enabled(pvt
))
2151 err
->channel
= get_channel_from_ecc_syndrome(mci
, err
->syndrome
);
2155 * debug routine to display the memory sizes of all logical DIMMs and its
2158 static void debug_display_dimm_sizes(struct amd64_pvt
*pvt
, u8 ctrl
)
2160 int dimm
, size0
, size1
;
2161 u32
*dcsb
= ctrl
? pvt
->csels
[1].csbases
: pvt
->csels
[0].csbases
;
2162 u32 dbam
= ctrl
? pvt
->dbam1
: pvt
->dbam0
;
2164 if (pvt
->fam
== 0xf) {
2165 /* K8 families < revF not supported yet */
2166 if (pvt
->ext_model
< K8_REV_F
)
2172 if (pvt
->fam
== 0x10) {
2173 dbam
= (ctrl
&& !dct_ganging_enabled(pvt
)) ? pvt
->dbam1
2175 dcsb
= (ctrl
&& !dct_ganging_enabled(pvt
)) ?
2176 pvt
->csels
[1].csbases
:
2177 pvt
->csels
[0].csbases
;
2180 dcsb
= pvt
->csels
[1].csbases
;
2182 edac_dbg(1, "F2x%d80 (DRAM Bank Address Mapping): 0x%08x\n",
2185 edac_printk(KERN_DEBUG
, EDAC_MC
, "DCT%d chip selects:\n", ctrl
);
2187 /* Dump memory sizes for DIMM and its CSROWs */
2188 for (dimm
= 0; dimm
< 4; dimm
++) {
2191 if (dcsb
[dimm
*2] & DCSB_CS_ENABLE
)
2193 * For F15m60h, we need multiplier for LRDIMM cs_size
2194 * calculation. We pass dimm value to the dbam_to_cs
2195 * mapper so we can find the multiplier from the
2196 * corresponding DCSM.
2198 size0
= pvt
->ops
->dbam_to_cs(pvt
, ctrl
,
2199 DBAM_DIMM(dimm
, dbam
),
2203 if (dcsb
[dimm
*2 + 1] & DCSB_CS_ENABLE
)
2204 size1
= pvt
->ops
->dbam_to_cs(pvt
, ctrl
,
2205 DBAM_DIMM(dimm
, dbam
),
2208 amd64_info(EDAC_MC
": %d: %5dMB %d: %5dMB\n",
2210 dimm
* 2 + 1, size1
);
2214 static struct amd64_family_type family_types
[] = {
2217 .f1_id
= PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP
,
2218 .f2_id
= PCI_DEVICE_ID_AMD_K8_NB_MEMCTL
,
2221 .early_channel_count
= k8_early_channel_count
,
2222 .map_sysaddr_to_csrow
= k8_map_sysaddr_to_csrow
,
2223 .dbam_to_cs
= k8_dbam_to_chip_select
,
2228 .f1_id
= PCI_DEVICE_ID_AMD_10H_NB_MAP
,
2229 .f2_id
= PCI_DEVICE_ID_AMD_10H_NB_DRAM
,
2232 .early_channel_count
= f1x_early_channel_count
,
2233 .map_sysaddr_to_csrow
= f1x_map_sysaddr_to_csrow
,
2234 .dbam_to_cs
= f10_dbam_to_chip_select
,
2239 .f1_id
= PCI_DEVICE_ID_AMD_15H_NB_F1
,
2240 .f2_id
= PCI_DEVICE_ID_AMD_15H_NB_F2
,
2243 .early_channel_count
= f1x_early_channel_count
,
2244 .map_sysaddr_to_csrow
= f1x_map_sysaddr_to_csrow
,
2245 .dbam_to_cs
= f15_dbam_to_chip_select
,
2249 .ctl_name
= "F15h_M30h",
2250 .f1_id
= PCI_DEVICE_ID_AMD_15H_M30H_NB_F1
,
2251 .f2_id
= PCI_DEVICE_ID_AMD_15H_M30H_NB_F2
,
2254 .early_channel_count
= f1x_early_channel_count
,
2255 .map_sysaddr_to_csrow
= f1x_map_sysaddr_to_csrow
,
2256 .dbam_to_cs
= f16_dbam_to_chip_select
,
2260 .ctl_name
= "F15h_M60h",
2261 .f1_id
= PCI_DEVICE_ID_AMD_15H_M60H_NB_F1
,
2262 .f2_id
= PCI_DEVICE_ID_AMD_15H_M60H_NB_F2
,
2265 .early_channel_count
= f1x_early_channel_count
,
2266 .map_sysaddr_to_csrow
= f1x_map_sysaddr_to_csrow
,
2267 .dbam_to_cs
= f15_m60h_dbam_to_chip_select
,
2272 .f1_id
= PCI_DEVICE_ID_AMD_16H_NB_F1
,
2273 .f2_id
= PCI_DEVICE_ID_AMD_16H_NB_F2
,
2276 .early_channel_count
= f1x_early_channel_count
,
2277 .map_sysaddr_to_csrow
= f1x_map_sysaddr_to_csrow
,
2278 .dbam_to_cs
= f16_dbam_to_chip_select
,
2282 .ctl_name
= "F16h_M30h",
2283 .f1_id
= PCI_DEVICE_ID_AMD_16H_M30H_NB_F1
,
2284 .f2_id
= PCI_DEVICE_ID_AMD_16H_M30H_NB_F2
,
2287 .early_channel_count
= f1x_early_channel_count
,
2288 .map_sysaddr_to_csrow
= f1x_map_sysaddr_to_csrow
,
2289 .dbam_to_cs
= f16_dbam_to_chip_select
,
2294 .f0_id
= PCI_DEVICE_ID_AMD_17H_DF_F0
,
2295 .f6_id
= PCI_DEVICE_ID_AMD_17H_DF_F6
,
2298 .early_channel_count
= f17_early_channel_count
,
2299 .dbam_to_cs
= f17_addr_mask_to_cs_size
,
2303 .ctl_name
= "F17h_M10h",
2304 .f0_id
= PCI_DEVICE_ID_AMD_17H_M10H_DF_F0
,
2305 .f6_id
= PCI_DEVICE_ID_AMD_17H_M10H_DF_F6
,
2308 .early_channel_count
= f17_early_channel_count
,
2309 .dbam_to_cs
= f17_addr_mask_to_cs_size
,
2313 .ctl_name
= "F17h_M30h",
2314 .f0_id
= PCI_DEVICE_ID_AMD_17H_M30H_DF_F0
,
2315 .f6_id
= PCI_DEVICE_ID_AMD_17H_M30H_DF_F6
,
2318 .early_channel_count
= f17_early_channel_count
,
2319 .dbam_to_cs
= f17_addr_mask_to_cs_size
,
2323 .ctl_name
= "F17h_M70h",
2324 .f0_id
= PCI_DEVICE_ID_AMD_17H_M70H_DF_F0
,
2325 .f6_id
= PCI_DEVICE_ID_AMD_17H_M70H_DF_F6
,
2328 .early_channel_count
= f17_early_channel_count
,
2329 .dbam_to_cs
= f17_addr_mask_to_cs_size
,
2334 .f0_id
= PCI_DEVICE_ID_AMD_19H_DF_F0
,
2335 .f6_id
= PCI_DEVICE_ID_AMD_19H_DF_F6
,
2338 .early_channel_count
= f17_early_channel_count
,
2339 .dbam_to_cs
= f17_addr_mask_to_cs_size
,
2345 * These are tables of eigenvectors (one per line) which can be used for the
2346 * construction of the syndrome tables. The modified syndrome search algorithm
2347 * uses those to find the symbol in error and thus the DIMM.
2349 * Algorithm courtesy of Ross LaFetra from AMD.
2351 static const u16 x4_vectors
[] = {
2352 0x2f57, 0x1afe, 0x66cc, 0xdd88,
2353 0x11eb, 0x3396, 0x7f4c, 0xeac8,
2354 0x0001, 0x0002, 0x0004, 0x0008,
2355 0x1013, 0x3032, 0x4044, 0x8088,
2356 0x106b, 0x30d6, 0x70fc, 0xe0a8,
2357 0x4857, 0xc4fe, 0x13cc, 0x3288,
2358 0x1ac5, 0x2f4a, 0x5394, 0xa1e8,
2359 0x1f39, 0x251e, 0xbd6c, 0x6bd8,
2360 0x15c1, 0x2a42, 0x89ac, 0x4758,
2361 0x2b03, 0x1602, 0x4f0c, 0xca08,
2362 0x1f07, 0x3a0e, 0x6b04, 0xbd08,
2363 0x8ba7, 0x465e, 0x244c, 0x1cc8,
2364 0x2b87, 0x164e, 0x642c, 0xdc18,
2365 0x40b9, 0x80de, 0x1094, 0x20e8,
2366 0x27db, 0x1eb6, 0x9dac, 0x7b58,
2367 0x11c1, 0x2242, 0x84ac, 0x4c58,
2368 0x1be5, 0x2d7a, 0x5e34, 0xa718,
2369 0x4b39, 0x8d1e, 0x14b4, 0x28d8,
2370 0x4c97, 0xc87e, 0x11fc, 0x33a8,
2371 0x8e97, 0x497e, 0x2ffc, 0x1aa8,
2372 0x16b3, 0x3d62, 0x4f34, 0x8518,
2373 0x1e2f, 0x391a, 0x5cac, 0xf858,
2374 0x1d9f, 0x3b7a, 0x572c, 0xfe18,
2375 0x15f5, 0x2a5a, 0x5264, 0xa3b8,
2376 0x1dbb, 0x3b66, 0x715c, 0xe3f8,
2377 0x4397, 0xc27e, 0x17fc, 0x3ea8,
2378 0x1617, 0x3d3e, 0x6464, 0xb8b8,
2379 0x23ff, 0x12aa, 0xab6c, 0x56d8,
2380 0x2dfb, 0x1ba6, 0x913c, 0x7328,
2381 0x185d, 0x2ca6, 0x7914, 0x9e28,
2382 0x171b, 0x3e36, 0x7d7c, 0xebe8,
2383 0x4199, 0x82ee, 0x19f4, 0x2e58,
2384 0x4807, 0xc40e, 0x130c, 0x3208,
2385 0x1905, 0x2e0a, 0x5804, 0xac08,
2386 0x213f, 0x132a, 0xadfc, 0x5ba8,
2387 0x19a9, 0x2efe, 0xb5cc, 0x6f88,
2390 static const u16 x8_vectors
[] = {
2391 0x0145, 0x028a, 0x2374, 0x43c8, 0xa1f0, 0x0520, 0x0a40, 0x1480,
2392 0x0211, 0x0422, 0x0844, 0x1088, 0x01b0, 0x44e0, 0x23c0, 0xed80,
2393 0x1011, 0x0116, 0x022c, 0x0458, 0x08b0, 0x8c60, 0x2740, 0x4e80,
2394 0x0411, 0x0822, 0x1044, 0x0158, 0x02b0, 0x2360, 0x46c0, 0xab80,
2395 0x0811, 0x1022, 0x012c, 0x0258, 0x04b0, 0x4660, 0x8cc0, 0x2780,
2396 0x2071, 0x40e2, 0xa0c4, 0x0108, 0x0210, 0x0420, 0x0840, 0x1080,
2397 0x4071, 0x80e2, 0x0104, 0x0208, 0x0410, 0x0820, 0x1040, 0x2080,
2398 0x8071, 0x0102, 0x0204, 0x0408, 0x0810, 0x1020, 0x2040, 0x4080,
2399 0x019d, 0x03d6, 0x136c, 0x2198, 0x50b0, 0xb2e0, 0x0740, 0x0e80,
2400 0x0189, 0x03ea, 0x072c, 0x0e58, 0x1cb0, 0x56e0, 0x37c0, 0xf580,
2401 0x01fd, 0x0376, 0x06ec, 0x0bb8, 0x1110, 0x2220, 0x4440, 0x8880,
2402 0x0163, 0x02c6, 0x1104, 0x0758, 0x0eb0, 0x2be0, 0x6140, 0xc280,
2403 0x02fd, 0x01c6, 0x0b5c, 0x1108, 0x07b0, 0x25a0, 0x8840, 0x6180,
2404 0x0801, 0x012e, 0x025c, 0x04b8, 0x1370, 0x26e0, 0x57c0, 0xb580,
2405 0x0401, 0x0802, 0x015c, 0x02b8, 0x22b0, 0x13e0, 0x7140, 0xe280,
2406 0x0201, 0x0402, 0x0804, 0x01b8, 0x11b0, 0x31a0, 0x8040, 0x7180,
2407 0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
2408 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
2409 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
2412 static int decode_syndrome(u16 syndrome
, const u16
*vectors
, unsigned num_vecs
,
2415 unsigned int i
, err_sym
;
2417 for (err_sym
= 0; err_sym
< num_vecs
/ v_dim
; err_sym
++) {
2419 unsigned v_idx
= err_sym
* v_dim
;
2420 unsigned v_end
= (err_sym
+ 1) * v_dim
;
2422 /* walk over all 16 bits of the syndrome */
2423 for (i
= 1; i
< (1U << 16); i
<<= 1) {
2425 /* if bit is set in that eigenvector... */
2426 if (v_idx
< v_end
&& vectors
[v_idx
] & i
) {
2427 u16 ev_comp
= vectors
[v_idx
++];
2429 /* ... and bit set in the modified syndrome, */
2439 /* can't get to zero, move to next symbol */
2444 edac_dbg(0, "syndrome(%x) not found\n", syndrome
);
2448 static int map_err_sym_to_channel(int err_sym
, int sym_size
)
2461 return err_sym
>> 4;
2467 /* imaginary bits not in a DIMM */
2469 WARN(1, KERN_ERR
"Invalid error symbol: 0x%x\n",
2481 return err_sym
>> 3;
2487 static int get_channel_from_ecc_syndrome(struct mem_ctl_info
*mci
, u16 syndrome
)
2489 struct amd64_pvt
*pvt
= mci
->pvt_info
;
2492 if (pvt
->ecc_sym_sz
== 8)
2493 err_sym
= decode_syndrome(syndrome
, x8_vectors
,
2494 ARRAY_SIZE(x8_vectors
),
2496 else if (pvt
->ecc_sym_sz
== 4)
2497 err_sym
= decode_syndrome(syndrome
, x4_vectors
,
2498 ARRAY_SIZE(x4_vectors
),
2501 amd64_warn("Illegal syndrome type: %u\n", pvt
->ecc_sym_sz
);
2505 return map_err_sym_to_channel(err_sym
, pvt
->ecc_sym_sz
);
2508 static void __log_ecc_error(struct mem_ctl_info
*mci
, struct err_info
*err
,
2511 enum hw_event_mc_err_type err_type
;
2515 err_type
= HW_EVENT_ERR_CORRECTED
;
2516 else if (ecc_type
== 1)
2517 err_type
= HW_EVENT_ERR_UNCORRECTED
;
2518 else if (ecc_type
== 3)
2519 err_type
= HW_EVENT_ERR_DEFERRED
;
2521 WARN(1, "Something is rotten in the state of Denmark.\n");
2525 switch (err
->err_code
) {
2530 string
= "Failed to map error addr to a node";
2533 string
= "Failed to map error addr to a csrow";
2536 string
= "Unknown syndrome - possible error reporting race";
2539 string
= "MCA_SYND not valid - unknown syndrome and csrow";
2542 string
= "Cannot decode normalized address";
2545 string
= "WTF error";
2549 edac_mc_handle_error(err_type
, mci
, 1,
2550 err
->page
, err
->offset
, err
->syndrome
,
2551 err
->csrow
, err
->channel
, -1,
2555 static inline void decode_bus_error(int node_id
, struct mce
*m
)
2557 struct mem_ctl_info
*mci
;
2558 struct amd64_pvt
*pvt
;
2559 u8 ecc_type
= (m
->status
>> 45) & 0x3;
2560 u8 xec
= XEC(m
->status
, 0x1f);
2561 u16 ec
= EC(m
->status
);
2563 struct err_info err
;
2565 mci
= edac_mc_find(node_id
);
2569 pvt
= mci
->pvt_info
;
2571 /* Bail out early if this was an 'observed' error */
2572 if (PP(ec
) == NBSL_PP_OBS
)
2575 /* Do only ECC errors */
2576 if (xec
&& xec
!= F10_NBSL_EXT_ERR_ECC
)
2579 memset(&err
, 0, sizeof(err
));
2581 sys_addr
= get_error_address(pvt
, m
);
2584 err
.syndrome
= extract_syndrome(m
->status
);
2586 pvt
->ops
->map_sysaddr_to_csrow(mci
, sys_addr
, &err
);
2588 __log_ecc_error(mci
, &err
, ecc_type
);
2592 * To find the UMC channel represented by this bank we need to match on its
2593 * instance_id. The instance_id of a bank is held in the lower 32 bits of its
2596 * Currently, we can derive the channel number by looking at the 6th nibble in
2597 * the instance_id. For example, instance_id=0xYXXXXX where Y is the channel
2600 static int find_umc_channel(struct mce
*m
)
2602 return (m
->ipid
& GENMASK(31, 0)) >> 20;
2605 static void decode_umc_error(int node_id
, struct mce
*m
)
2607 u8 ecc_type
= (m
->status
>> 45) & 0x3;
2608 struct mem_ctl_info
*mci
;
2609 struct amd64_pvt
*pvt
;
2610 struct err_info err
;
2613 mci
= edac_mc_find(node_id
);
2617 pvt
= mci
->pvt_info
;
2619 memset(&err
, 0, sizeof(err
));
2621 if (m
->status
& MCI_STATUS_DEFERRED
)
2624 err
.channel
= find_umc_channel(m
);
2626 if (!(m
->status
& MCI_STATUS_SYNDV
)) {
2627 err
.err_code
= ERR_SYND
;
2631 if (ecc_type
== 2) {
2632 u8 length
= (m
->synd
>> 18) & 0x3f;
2635 err
.syndrome
= (m
->synd
>> 32) & GENMASK(length
- 1, 0);
2637 err
.err_code
= ERR_CHANNEL
;
2640 err
.csrow
= m
->synd
& 0x7;
2642 if (umc_normaddr_to_sysaddr(m
->addr
, pvt
->mc_node_id
, err
.channel
, &sys_addr
)) {
2643 err
.err_code
= ERR_NORM_ADDR
;
2647 error_address_to_page_and_offset(sys_addr
, &err
);
2650 __log_ecc_error(mci
, &err
, ecc_type
);
2654 * Use pvt->F3 which contains the F3 CPU PCI device to get the related
2655 * F1 (AddrMap) and F2 (Dct) devices. Return negative value on error.
2656 * Reserve F0 and F6 on systems with a UMC.
2659 reserve_mc_sibling_devs(struct amd64_pvt
*pvt
, u16 pci_id1
, u16 pci_id2
)
2662 pvt
->F0
= pci_get_related_function(pvt
->F3
->vendor
, pci_id1
, pvt
->F3
);
2664 amd64_err("F0 not found, device 0x%x (broken BIOS?)\n", pci_id1
);
2668 pvt
->F6
= pci_get_related_function(pvt
->F3
->vendor
, pci_id2
, pvt
->F3
);
2670 pci_dev_put(pvt
->F0
);
2673 amd64_err("F6 not found: device 0x%x (broken BIOS?)\n", pci_id2
);
2677 edac_dbg(1, "F0: %s\n", pci_name(pvt
->F0
));
2678 edac_dbg(1, "F3: %s\n", pci_name(pvt
->F3
));
2679 edac_dbg(1, "F6: %s\n", pci_name(pvt
->F6
));
2684 /* Reserve the ADDRESS MAP Device */
2685 pvt
->F1
= pci_get_related_function(pvt
->F3
->vendor
, pci_id1
, pvt
->F3
);
2687 amd64_err("F1 not found: device 0x%x (broken BIOS?)\n", pci_id1
);
2691 /* Reserve the DCT Device */
2692 pvt
->F2
= pci_get_related_function(pvt
->F3
->vendor
, pci_id2
, pvt
->F3
);
2694 pci_dev_put(pvt
->F1
);
2697 amd64_err("F2 not found: device 0x%x (broken BIOS?)\n", pci_id2
);
2701 edac_dbg(1, "F1: %s\n", pci_name(pvt
->F1
));
2702 edac_dbg(1, "F2: %s\n", pci_name(pvt
->F2
));
2703 edac_dbg(1, "F3: %s\n", pci_name(pvt
->F3
));
2708 static void free_mc_sibling_devs(struct amd64_pvt
*pvt
)
2711 pci_dev_put(pvt
->F0
);
2712 pci_dev_put(pvt
->F6
);
2714 pci_dev_put(pvt
->F1
);
2715 pci_dev_put(pvt
->F2
);
2719 static void determine_ecc_sym_sz(struct amd64_pvt
*pvt
)
2721 pvt
->ecc_sym_sz
= 4;
2727 /* Check enabled channels only: */
2728 if (pvt
->umc
[i
].sdp_ctrl
& UMC_SDP_INIT
) {
2729 if (pvt
->umc
[i
].ecc_ctrl
& BIT(9)) {
2730 pvt
->ecc_sym_sz
= 16;
2732 } else if (pvt
->umc
[i
].ecc_ctrl
& BIT(7)) {
2733 pvt
->ecc_sym_sz
= 8;
2738 } else if (pvt
->fam
>= 0x10) {
2741 amd64_read_pci_cfg(pvt
->F3
, EXT_NB_MCA_CFG
, &tmp
);
2742 /* F16h has only DCT0, so no need to read dbam1. */
2743 if (pvt
->fam
!= 0x16)
2744 amd64_read_dct_pci_cfg(pvt
, 1, DBAM0
, &pvt
->dbam1
);
2746 /* F10h, revD and later can do x8 ECC too. */
2747 if ((pvt
->fam
> 0x10 || pvt
->model
> 7) && tmp
& BIT(25))
2748 pvt
->ecc_sym_sz
= 8;
2753 * Retrieve the hardware registers of the memory controller.
2755 static void __read_mc_regs_df(struct amd64_pvt
*pvt
)
2757 u8 nid
= pvt
->mc_node_id
;
2758 struct amd64_umc
*umc
;
2761 /* Read registers from each UMC */
2764 umc_base
= get_umc_base(i
);
2767 amd_smn_read(nid
, umc_base
+ UMCCH_DIMM_CFG
, &umc
->dimm_cfg
);
2768 amd_smn_read(nid
, umc_base
+ UMCCH_UMC_CFG
, &umc
->umc_cfg
);
2769 amd_smn_read(nid
, umc_base
+ UMCCH_SDP_CTRL
, &umc
->sdp_ctrl
);
2770 amd_smn_read(nid
, umc_base
+ UMCCH_ECC_CTRL
, &umc
->ecc_ctrl
);
2771 amd_smn_read(nid
, umc_base
+ UMCCH_UMC_CAP_HI
, &umc
->umc_cap_hi
);
2776 * Retrieve the hardware registers of the memory controller (this includes the
2777 * 'Address Map' and 'Misc' device regs)
2779 static void read_mc_regs(struct amd64_pvt
*pvt
)
2785 * Retrieve TOP_MEM and TOP_MEM2; no masking off of reserved bits since
2786 * those are Read-As-Zero.
2788 rdmsrl(MSR_K8_TOP_MEM1
, pvt
->top_mem
);
2789 edac_dbg(0, " TOP_MEM: 0x%016llx\n", pvt
->top_mem
);
2791 /* Check first whether TOP_MEM2 is enabled: */
2792 rdmsrl(MSR_K8_SYSCFG
, msr_val
);
2793 if (msr_val
& BIT(21)) {
2794 rdmsrl(MSR_K8_TOP_MEM2
, pvt
->top_mem2
);
2795 edac_dbg(0, " TOP_MEM2: 0x%016llx\n", pvt
->top_mem2
);
2797 edac_dbg(0, " TOP_MEM2 disabled\n");
2801 __read_mc_regs_df(pvt
);
2802 amd64_read_pci_cfg(pvt
->F0
, DF_DHAR
, &pvt
->dhar
);
2807 amd64_read_pci_cfg(pvt
->F3
, NBCAP
, &pvt
->nbcap
);
2809 read_dram_ctl_register(pvt
);
2811 for (range
= 0; range
< DRAM_RANGES
; range
++) {
2814 /* read settings for this DRAM range */
2815 read_dram_base_limit_regs(pvt
, range
);
2817 rw
= dram_rw(pvt
, range
);
2821 edac_dbg(1, " DRAM range[%d], base: 0x%016llx; limit: 0x%016llx\n",
2823 get_dram_base(pvt
, range
),
2824 get_dram_limit(pvt
, range
));
2826 edac_dbg(1, " IntlvEn=%s; Range access: %s%s IntlvSel=%d DstNode=%d\n",
2827 dram_intlv_en(pvt
, range
) ? "Enabled" : "Disabled",
2828 (rw
& 0x1) ? "R" : "-",
2829 (rw
& 0x2) ? "W" : "-",
2830 dram_intlv_sel(pvt
, range
),
2831 dram_dst_node(pvt
, range
));
2834 amd64_read_pci_cfg(pvt
->F1
, DHAR
, &pvt
->dhar
);
2835 amd64_read_dct_pci_cfg(pvt
, 0, DBAM0
, &pvt
->dbam0
);
2837 amd64_read_pci_cfg(pvt
->F3
, F10_ONLINE_SPARE
, &pvt
->online_spare
);
2839 amd64_read_dct_pci_cfg(pvt
, 0, DCLR0
, &pvt
->dclr0
);
2840 amd64_read_dct_pci_cfg(pvt
, 0, DCHR0
, &pvt
->dchr0
);
2842 if (!dct_ganging_enabled(pvt
)) {
2843 amd64_read_dct_pci_cfg(pvt
, 1, DCLR0
, &pvt
->dclr1
);
2844 amd64_read_dct_pci_cfg(pvt
, 1, DCHR0
, &pvt
->dchr1
);
2848 read_dct_base_mask(pvt
);
2850 determine_memory_type(pvt
);
2851 edac_dbg(1, " DIMM type: %s\n", edac_mem_types
[pvt
->dram_type
]);
2853 determine_ecc_sym_sz(pvt
);
2857 * NOTE: CPU Revision Dependent code
2860 * @csrow_nr ChipSelect Row Number (0..NUM_CHIPSELECTS-1)
2861 * k8 private pointer to -->
2862 * DRAM Bank Address mapping register
2864 * DCL register where dual_channel_active is
2866 * The DBAM register consists of 4 sets of 4 bits each definitions:
2869 * 0-3 CSROWs 0 and 1
2870 * 4-7 CSROWs 2 and 3
2871 * 8-11 CSROWs 4 and 5
2872 * 12-15 CSROWs 6 and 7
2874 * Values range from: 0 to 15
2875 * The meaning of the values depends on CPU revision and dual-channel state,
2876 * see relevant BKDG more info.
2878 * The memory controller provides for total of only 8 CSROWs in its current
2879 * architecture. Each "pair" of CSROWs normally represents just one DIMM in
2880 * single channel or two (2) DIMMs in dual channel mode.
2882 * The following code logic collapses the various tables for CSROW based on CPU
2886 * The number of PAGE_SIZE pages on the specified CSROW number it
2890 static u32
get_csrow_nr_pages(struct amd64_pvt
*pvt
, u8 dct
, int csrow_nr_orig
)
2892 u32 dbam
= dct
? pvt
->dbam1
: pvt
->dbam0
;
2893 int csrow_nr
= csrow_nr_orig
;
2894 u32 cs_mode
, nr_pages
;
2898 cs_mode
= DBAM_DIMM(csrow_nr
, dbam
);
2900 cs_mode
= f17_get_cs_mode(csrow_nr
>> 1, dct
, pvt
);
2903 nr_pages
= pvt
->ops
->dbam_to_cs(pvt
, dct
, cs_mode
, csrow_nr
);
2904 nr_pages
<<= 20 - PAGE_SHIFT
;
2906 edac_dbg(0, "csrow: %d, channel: %d, DBAM idx: %d\n",
2907 csrow_nr_orig
, dct
, cs_mode
);
2908 edac_dbg(0, "nr_pages/channel: %u\n", nr_pages
);
2913 static int init_csrows_df(struct mem_ctl_info
*mci
)
2915 struct amd64_pvt
*pvt
= mci
->pvt_info
;
2916 enum edac_type edac_mode
= EDAC_NONE
;
2917 enum dev_type dev_type
= DEV_UNKNOWN
;
2918 struct dimm_info
*dimm
;
2922 if (mci
->edac_ctl_cap
& EDAC_FLAG_S16ECD16ED
) {
2923 edac_mode
= EDAC_S16ECD16ED
;
2925 } else if (mci
->edac_ctl_cap
& EDAC_FLAG_S8ECD8ED
) {
2926 edac_mode
= EDAC_S8ECD8ED
;
2928 } else if (mci
->edac_ctl_cap
& EDAC_FLAG_S4ECD4ED
) {
2929 edac_mode
= EDAC_S4ECD4ED
;
2931 } else if (mci
->edac_ctl_cap
& EDAC_FLAG_SECDED
) {
2932 edac_mode
= EDAC_SECDED
;
2936 for_each_chip_select(cs
, umc
, pvt
) {
2937 if (!csrow_enabled(cs
, umc
, pvt
))
2941 dimm
= mci
->csrows
[cs
]->channels
[umc
]->dimm
;
2943 edac_dbg(1, "MC node: %d, csrow: %d\n",
2944 pvt
->mc_node_id
, cs
);
2946 dimm
->nr_pages
= get_csrow_nr_pages(pvt
, umc
, cs
);
2947 dimm
->mtype
= pvt
->dram_type
;
2948 dimm
->edac_mode
= edac_mode
;
2949 dimm
->dtype
= dev_type
;
2958 * Initialize the array of csrow attribute instances, based on the values
2959 * from pci config hardware registers.
2961 static int init_csrows(struct mem_ctl_info
*mci
)
2963 struct amd64_pvt
*pvt
= mci
->pvt_info
;
2964 enum edac_type edac_mode
= EDAC_NONE
;
2965 struct csrow_info
*csrow
;
2966 struct dimm_info
*dimm
;
2967 int i
, j
, empty
= 1;
2972 return init_csrows_df(mci
);
2974 amd64_read_pci_cfg(pvt
->F3
, NBCFG
, &val
);
2978 edac_dbg(0, "node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
2979 pvt
->mc_node_id
, val
,
2980 !!(val
& NBCFG_CHIPKILL
), !!(val
& NBCFG_ECC_ENABLE
));
2983 * We iterate over DCT0 here but we look at DCT1 in parallel, if needed.
2985 for_each_chip_select(i
, 0, pvt
) {
2986 bool row_dct0
= !!csrow_enabled(i
, 0, pvt
);
2987 bool row_dct1
= false;
2989 if (pvt
->fam
!= 0xf)
2990 row_dct1
= !!csrow_enabled(i
, 1, pvt
);
2992 if (!row_dct0
&& !row_dct1
)
2995 csrow
= mci
->csrows
[i
];
2998 edac_dbg(1, "MC node: %d, csrow: %d\n",
2999 pvt
->mc_node_id
, i
);
3002 nr_pages
= get_csrow_nr_pages(pvt
, 0, i
);
3003 csrow
->channels
[0]->dimm
->nr_pages
= nr_pages
;
3006 /* K8 has only one DCT */
3007 if (pvt
->fam
!= 0xf && row_dct1
) {
3008 int row_dct1_pages
= get_csrow_nr_pages(pvt
, 1, i
);
3010 csrow
->channels
[1]->dimm
->nr_pages
= row_dct1_pages
;
3011 nr_pages
+= row_dct1_pages
;
3014 edac_dbg(1, "Total csrow%d pages: %u\n", i
, nr_pages
);
3016 /* Determine DIMM ECC mode: */
3017 if (pvt
->nbcfg
& NBCFG_ECC_ENABLE
) {
3018 edac_mode
= (pvt
->nbcfg
& NBCFG_CHIPKILL
)
3023 for (j
= 0; j
< pvt
->channel_count
; j
++) {
3024 dimm
= csrow
->channels
[j
]->dimm
;
3025 dimm
->mtype
= pvt
->dram_type
;
3026 dimm
->edac_mode
= edac_mode
;
3034 /* get all cores on this DCT */
3035 static void get_cpus_on_this_dct_cpumask(struct cpumask
*mask
, u16 nid
)
3039 for_each_online_cpu(cpu
)
3040 if (amd_get_nb_id(cpu
) == nid
)
3041 cpumask_set_cpu(cpu
, mask
);
3044 /* check MCG_CTL on all the cpus on this node */
3045 static bool nb_mce_bank_enabled_on_node(u16 nid
)
3051 if (!zalloc_cpumask_var(&mask
, GFP_KERNEL
)) {
3052 amd64_warn("%s: Error allocating mask\n", __func__
);
3056 get_cpus_on_this_dct_cpumask(mask
, nid
);
3058 rdmsr_on_cpus(mask
, MSR_IA32_MCG_CTL
, msrs
);
3060 for_each_cpu(cpu
, mask
) {
3061 struct msr
*reg
= per_cpu_ptr(msrs
, cpu
);
3062 nbe
= reg
->l
& MSR_MCGCTL_NBE
;
3064 edac_dbg(0, "core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
3066 (nbe
? "enabled" : "disabled"));
3074 free_cpumask_var(mask
);
3078 static int toggle_ecc_err_reporting(struct ecc_settings
*s
, u16 nid
, bool on
)
3080 cpumask_var_t cmask
;
3083 if (!zalloc_cpumask_var(&cmask
, GFP_KERNEL
)) {
3084 amd64_warn("%s: error allocating mask\n", __func__
);
3088 get_cpus_on_this_dct_cpumask(cmask
, nid
);
3090 rdmsr_on_cpus(cmask
, MSR_IA32_MCG_CTL
, msrs
);
3092 for_each_cpu(cpu
, cmask
) {
3094 struct msr
*reg
= per_cpu_ptr(msrs
, cpu
);
3097 if (reg
->l
& MSR_MCGCTL_NBE
)
3098 s
->flags
.nb_mce_enable
= 1;
3100 reg
->l
|= MSR_MCGCTL_NBE
;
3103 * Turn off NB MCE reporting only when it was off before
3105 if (!s
->flags
.nb_mce_enable
)
3106 reg
->l
&= ~MSR_MCGCTL_NBE
;
3109 wrmsr_on_cpus(cmask
, MSR_IA32_MCG_CTL
, msrs
);
3111 free_cpumask_var(cmask
);
3116 static bool enable_ecc_error_reporting(struct ecc_settings
*s
, u16 nid
,
3120 u32 value
, mask
= 0x3; /* UECC/CECC enable */
3122 if (toggle_ecc_err_reporting(s
, nid
, ON
)) {
3123 amd64_warn("Error enabling ECC reporting over MCGCTL!\n");
3127 amd64_read_pci_cfg(F3
, NBCTL
, &value
);
3129 s
->old_nbctl
= value
& mask
;
3130 s
->nbctl_valid
= true;
3133 amd64_write_pci_cfg(F3
, NBCTL
, value
);
3135 amd64_read_pci_cfg(F3
, NBCFG
, &value
);
3137 edac_dbg(0, "1: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3138 nid
, value
, !!(value
& NBCFG_ECC_ENABLE
));
3140 if (!(value
& NBCFG_ECC_ENABLE
)) {
3141 amd64_warn("DRAM ECC disabled on this node, enabling...\n");
3143 s
->flags
.nb_ecc_prev
= 0;
3145 /* Attempt to turn on DRAM ECC Enable */
3146 value
|= NBCFG_ECC_ENABLE
;
3147 amd64_write_pci_cfg(F3
, NBCFG
, value
);
3149 amd64_read_pci_cfg(F3
, NBCFG
, &value
);
3151 if (!(value
& NBCFG_ECC_ENABLE
)) {
3152 amd64_warn("Hardware rejected DRAM ECC enable,"
3153 "check memory DIMM configuration.\n");
3156 amd64_info("Hardware accepted DRAM ECC Enable\n");
3159 s
->flags
.nb_ecc_prev
= 1;
3162 edac_dbg(0, "2: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3163 nid
, value
, !!(value
& NBCFG_ECC_ENABLE
));
3168 static void restore_ecc_error_reporting(struct ecc_settings
*s
, u16 nid
,
3171 u32 value
, mask
= 0x3; /* UECC/CECC enable */
3173 if (!s
->nbctl_valid
)
3176 amd64_read_pci_cfg(F3
, NBCTL
, &value
);
3178 value
|= s
->old_nbctl
;
3180 amd64_write_pci_cfg(F3
, NBCTL
, value
);
3182 /* restore previous BIOS DRAM ECC "off" setting we force-enabled */
3183 if (!s
->flags
.nb_ecc_prev
) {
3184 amd64_read_pci_cfg(F3
, NBCFG
, &value
);
3185 value
&= ~NBCFG_ECC_ENABLE
;
3186 amd64_write_pci_cfg(F3
, NBCFG
, value
);
3189 /* restore the NB Enable MCGCTL bit */
3190 if (toggle_ecc_err_reporting(s
, nid
, OFF
))
3191 amd64_warn("Error restoring NB MCGCTL settings!\n");
3194 static bool ecc_enabled(struct amd64_pvt
*pvt
)
3196 u16 nid
= pvt
->mc_node_id
;
3197 bool nb_mce_en
= false;
3201 if (boot_cpu_data
.x86
>= 0x17) {
3202 u8 umc_en_mask
= 0, ecc_en_mask
= 0;
3203 struct amd64_umc
*umc
;
3208 /* Only check enabled UMCs. */
3209 if (!(umc
->sdp_ctrl
& UMC_SDP_INIT
))
3212 umc_en_mask
|= BIT(i
);
3214 if (umc
->umc_cap_hi
& UMC_ECC_ENABLED
)
3215 ecc_en_mask
|= BIT(i
);
3218 /* Check whether at least one UMC is enabled: */
3220 ecc_en
= umc_en_mask
== ecc_en_mask
;
3222 edac_dbg(0, "Node %d: No enabled UMCs.\n", nid
);
3224 /* Assume UMC MCA banks are enabled. */
3227 amd64_read_pci_cfg(pvt
->F3
, NBCFG
, &value
);
3229 ecc_en
= !!(value
& NBCFG_ECC_ENABLE
);
3231 nb_mce_en
= nb_mce_bank_enabled_on_node(nid
);
3233 edac_dbg(0, "NB MCE bank disabled, set MSR 0x%08x[4] on node %d to enable.\n",
3234 MSR_IA32_MCG_CTL
, nid
);
3237 amd64_info("Node %d: DRAM ECC %s.\n",
3238 nid
, (ecc_en
? "enabled" : "disabled"));
3240 if (!ecc_en
|| !nb_mce_en
)
3247 f17h_determine_edac_ctl_cap(struct mem_ctl_info
*mci
, struct amd64_pvt
*pvt
)
3249 u8 i
, ecc_en
= 1, cpk_en
= 1, dev_x4
= 1, dev_x16
= 1;
3252 if (pvt
->umc
[i
].sdp_ctrl
& UMC_SDP_INIT
) {
3253 ecc_en
&= !!(pvt
->umc
[i
].umc_cap_hi
& UMC_ECC_ENABLED
);
3254 cpk_en
&= !!(pvt
->umc
[i
].umc_cap_hi
& UMC_ECC_CHIPKILL_CAP
);
3256 dev_x4
&= !!(pvt
->umc
[i
].dimm_cfg
& BIT(6));
3257 dev_x16
&= !!(pvt
->umc
[i
].dimm_cfg
& BIT(7));
3261 /* Set chipkill only if ECC is enabled: */
3263 mci
->edac_ctl_cap
|= EDAC_FLAG_SECDED
;
3269 mci
->edac_ctl_cap
|= EDAC_FLAG_S4ECD4ED
;
3271 mci
->edac_ctl_cap
|= EDAC_FLAG_S16ECD16ED
;
3273 mci
->edac_ctl_cap
|= EDAC_FLAG_S8ECD8ED
;
3277 static void setup_mci_misc_attrs(struct mem_ctl_info
*mci
)
3279 struct amd64_pvt
*pvt
= mci
->pvt_info
;
3281 mci
->mtype_cap
= MEM_FLAG_DDR2
| MEM_FLAG_RDDR2
;
3282 mci
->edac_ctl_cap
= EDAC_FLAG_NONE
;
3285 f17h_determine_edac_ctl_cap(mci
, pvt
);
3287 if (pvt
->nbcap
& NBCAP_SECDED
)
3288 mci
->edac_ctl_cap
|= EDAC_FLAG_SECDED
;
3290 if (pvt
->nbcap
& NBCAP_CHIPKILL
)
3291 mci
->edac_ctl_cap
|= EDAC_FLAG_S4ECD4ED
;
3294 mci
->edac_cap
= determine_edac_cap(pvt
);
3295 mci
->mod_name
= EDAC_MOD_STR
;
3296 mci
->ctl_name
= fam_type
->ctl_name
;
3297 mci
->dev_name
= pci_name(pvt
->F3
);
3298 mci
->ctl_page_to_phys
= NULL
;
3300 /* memory scrubber interface */
3301 mci
->set_sdram_scrub_rate
= set_scrub_rate
;
3302 mci
->get_sdram_scrub_rate
= get_scrub_rate
;
3306 * returns a pointer to the family descriptor on success, NULL otherwise.
3308 static struct amd64_family_type
*per_family_init(struct amd64_pvt
*pvt
)
3310 pvt
->ext_model
= boot_cpu_data
.x86_model
>> 4;
3311 pvt
->stepping
= boot_cpu_data
.x86_stepping
;
3312 pvt
->model
= boot_cpu_data
.x86_model
;
3313 pvt
->fam
= boot_cpu_data
.x86
;
3317 fam_type
= &family_types
[K8_CPUS
];
3318 pvt
->ops
= &family_types
[K8_CPUS
].ops
;
3322 fam_type
= &family_types
[F10_CPUS
];
3323 pvt
->ops
= &family_types
[F10_CPUS
].ops
;
3327 if (pvt
->model
== 0x30) {
3328 fam_type
= &family_types
[F15_M30H_CPUS
];
3329 pvt
->ops
= &family_types
[F15_M30H_CPUS
].ops
;
3331 } else if (pvt
->model
== 0x60) {
3332 fam_type
= &family_types
[F15_M60H_CPUS
];
3333 pvt
->ops
= &family_types
[F15_M60H_CPUS
].ops
;
3337 fam_type
= &family_types
[F15_CPUS
];
3338 pvt
->ops
= &family_types
[F15_CPUS
].ops
;
3342 if (pvt
->model
== 0x30) {
3343 fam_type
= &family_types
[F16_M30H_CPUS
];
3344 pvt
->ops
= &family_types
[F16_M30H_CPUS
].ops
;
3347 fam_type
= &family_types
[F16_CPUS
];
3348 pvt
->ops
= &family_types
[F16_CPUS
].ops
;
3352 if (pvt
->model
>= 0x10 && pvt
->model
<= 0x2f) {
3353 fam_type
= &family_types
[F17_M10H_CPUS
];
3354 pvt
->ops
= &family_types
[F17_M10H_CPUS
].ops
;
3356 } else if (pvt
->model
>= 0x30 && pvt
->model
<= 0x3f) {
3357 fam_type
= &family_types
[F17_M30H_CPUS
];
3358 pvt
->ops
= &family_types
[F17_M30H_CPUS
].ops
;
3360 } else if (pvt
->model
>= 0x70 && pvt
->model
<= 0x7f) {
3361 fam_type
= &family_types
[F17_M70H_CPUS
];
3362 pvt
->ops
= &family_types
[F17_M70H_CPUS
].ops
;
3367 fam_type
= &family_types
[F17_CPUS
];
3368 pvt
->ops
= &family_types
[F17_CPUS
].ops
;
3370 if (pvt
->fam
== 0x18)
3371 family_types
[F17_CPUS
].ctl_name
= "F18h";
3375 fam_type
= &family_types
[F19_CPUS
];
3376 pvt
->ops
= &family_types
[F19_CPUS
].ops
;
3377 family_types
[F19_CPUS
].ctl_name
= "F19h";
3381 amd64_err("Unsupported family!\n");
3385 amd64_info("%s %sdetected (node %d).\n", fam_type
->ctl_name
,
3387 (pvt
->ext_model
>= K8_REV_F
? "revF or later "
3388 : "revE or earlier ")
3389 : ""), pvt
->mc_node_id
);
3393 static const struct attribute_group
*amd64_edac_attr_groups
[] = {
3394 #ifdef CONFIG_EDAC_DEBUG
3395 &amd64_edac_dbg_group
,
3397 #ifdef CONFIG_EDAC_AMD64_ERROR_INJECTION
3398 &amd64_edac_inj_group
,
3403 static int hw_info_get(struct amd64_pvt
*pvt
)
3405 u16 pci_id1
, pci_id2
;
3408 if (pvt
->fam
>= 0x17) {
3409 pvt
->umc
= kcalloc(fam_type
->max_mcs
, sizeof(struct amd64_umc
), GFP_KERNEL
);
3413 pci_id1
= fam_type
->f0_id
;
3414 pci_id2
= fam_type
->f6_id
;
3416 pci_id1
= fam_type
->f1_id
;
3417 pci_id2
= fam_type
->f2_id
;
3420 ret
= reserve_mc_sibling_devs(pvt
, pci_id1
, pci_id2
);
3429 static void hw_info_put(struct amd64_pvt
*pvt
)
3431 if (pvt
->F0
|| pvt
->F1
)
3432 free_mc_sibling_devs(pvt
);
3437 static int init_one_instance(struct amd64_pvt
*pvt
)
3439 struct mem_ctl_info
*mci
= NULL
;
3440 struct edac_mc_layer layers
[2];
3444 * We need to determine how many memory channels there are. Then use
3445 * that information for calculating the size of the dynamic instance
3446 * tables in the 'mci' structure.
3448 pvt
->channel_count
= pvt
->ops
->early_channel_count(pvt
);
3449 if (pvt
->channel_count
< 0)
3453 layers
[0].type
= EDAC_MC_LAYER_CHIP_SELECT
;
3454 layers
[0].size
= pvt
->csels
[0].b_cnt
;
3455 layers
[0].is_virt_csrow
= true;
3456 layers
[1].type
= EDAC_MC_LAYER_CHANNEL
;
3459 * Always allocate two channels since we can have setups with DIMMs on
3460 * only one channel. Also, this simplifies handling later for the price
3461 * of a couple of KBs tops.
3463 layers
[1].size
= fam_type
->max_mcs
;
3464 layers
[1].is_virt_csrow
= false;
3466 mci
= edac_mc_alloc(pvt
->mc_node_id
, ARRAY_SIZE(layers
), layers
, 0);
3470 mci
->pvt_info
= pvt
;
3471 mci
->pdev
= &pvt
->F3
->dev
;
3473 setup_mci_misc_attrs(mci
);
3475 if (init_csrows(mci
))
3476 mci
->edac_cap
= EDAC_FLAG_NONE
;
3479 if (edac_mc_add_mc_with_groups(mci
, amd64_edac_attr_groups
)) {
3480 edac_dbg(1, "failed edac_mc_add_mc()\n");
3488 static bool instance_has_memory(struct amd64_pvt
*pvt
)
3490 bool cs_enabled
= false;
3491 int cs
= 0, dct
= 0;
3493 for (dct
= 0; dct
< fam_type
->max_mcs
; dct
++) {
3494 for_each_chip_select(cs
, dct
, pvt
)
3495 cs_enabled
|= csrow_enabled(cs
, dct
, pvt
);
3501 static int probe_one_instance(unsigned int nid
)
3503 struct pci_dev
*F3
= node_to_amd_nb(nid
)->misc
;
3504 struct amd64_pvt
*pvt
= NULL
;
3505 struct ecc_settings
*s
;
3509 s
= kzalloc(sizeof(struct ecc_settings
), GFP_KERNEL
);
3515 pvt
= kzalloc(sizeof(struct amd64_pvt
), GFP_KERNEL
);
3519 pvt
->mc_node_id
= nid
;
3522 fam_type
= per_family_init(pvt
);
3526 ret
= hw_info_get(pvt
);
3531 if (!instance_has_memory(pvt
)) {
3532 amd64_info("Node %d: No DIMMs detected.\n", nid
);
3536 if (!ecc_enabled(pvt
)) {
3539 if (!ecc_enable_override
)
3542 if (boot_cpu_data
.x86
>= 0x17) {
3543 amd64_warn("Forcing ECC on is not recommended on newer systems. Please enable ECC in BIOS.");
3546 amd64_warn("Forcing ECC on!\n");
3548 if (!enable_ecc_error_reporting(s
, nid
, F3
))
3552 ret
= init_one_instance(pvt
);
3554 amd64_err("Error probing instance: %d\n", nid
);
3556 if (boot_cpu_data
.x86
< 0x17)
3557 restore_ecc_error_reporting(s
, nid
, F3
);
3562 dump_misc_regs(pvt
);
3572 ecc_stngs
[nid
] = NULL
;
3578 static void remove_one_instance(unsigned int nid
)
3580 struct pci_dev
*F3
= node_to_amd_nb(nid
)->misc
;
3581 struct ecc_settings
*s
= ecc_stngs
[nid
];
3582 struct mem_ctl_info
*mci
;
3583 struct amd64_pvt
*pvt
;
3585 /* Remove from EDAC CORE tracking list */
3586 mci
= edac_mc_del_mc(&F3
->dev
);
3590 pvt
= mci
->pvt_info
;
3592 restore_ecc_error_reporting(s
, nid
, F3
);
3594 kfree(ecc_stngs
[nid
]);
3595 ecc_stngs
[nid
] = NULL
;
3597 /* Free the EDAC CORE resources */
3598 mci
->pvt_info
= NULL
;
3605 static void setup_pci_device(void)
3607 struct mem_ctl_info
*mci
;
3608 struct amd64_pvt
*pvt
;
3613 mci
= edac_mc_find(0);
3617 pvt
= mci
->pvt_info
;
3619 pci_ctl
= edac_pci_create_generic_ctl(&pvt
->F0
->dev
, EDAC_MOD_STR
);
3621 pci_ctl
= edac_pci_create_generic_ctl(&pvt
->F2
->dev
, EDAC_MOD_STR
);
3623 pr_warn("%s(): Unable to create PCI control\n", __func__
);
3624 pr_warn("%s(): PCI error report via EDAC not set\n", __func__
);
3628 static const struct x86_cpu_id amd64_cpuids
[] = {
3629 X86_MATCH_VENDOR_FAM(AMD
, 0x0F, NULL
),
3630 X86_MATCH_VENDOR_FAM(AMD
, 0x10, NULL
),
3631 X86_MATCH_VENDOR_FAM(AMD
, 0x15, NULL
),
3632 X86_MATCH_VENDOR_FAM(AMD
, 0x16, NULL
),
3633 X86_MATCH_VENDOR_FAM(AMD
, 0x17, NULL
),
3634 X86_MATCH_VENDOR_FAM(HYGON
, 0x18, NULL
),
3635 X86_MATCH_VENDOR_FAM(AMD
, 0x19, NULL
),
3638 MODULE_DEVICE_TABLE(x86cpu
, amd64_cpuids
);
3640 static int __init
amd64_edac_init(void)
3646 owner
= edac_get_owner();
3647 if (owner
&& strncmp(owner
, EDAC_MOD_STR
, sizeof(EDAC_MOD_STR
)))
3650 if (!x86_match_cpu(amd64_cpuids
))
3653 if (amd_cache_northbridges() < 0)
3659 ecc_stngs
= kcalloc(amd_nb_num(), sizeof(ecc_stngs
[0]), GFP_KERNEL
);
3663 msrs
= msrs_alloc();
3667 for (i
= 0; i
< amd_nb_num(); i
++) {
3668 err
= probe_one_instance(i
);
3670 /* unwind properly */
3672 remove_one_instance(i
);
3678 if (!edac_has_mcs()) {
3683 /* register stuff with EDAC MCE */
3684 if (report_gart_errors
)
3685 amd_report_gart_errors(true);
3687 if (boot_cpu_data
.x86
>= 0x17)
3688 amd_register_ecc_decoder(decode_umc_error
);
3690 amd_register_ecc_decoder(decode_bus_error
);
3694 #ifdef CONFIG_X86_32
3695 amd64_err("%s on 32-bit is unsupported. USE AT YOUR OWN RISK!\n", EDAC_MOD_STR
);
3698 printk(KERN_INFO
"AMD64 EDAC driver v%s\n", EDAC_AMD64_VERSION
);
3713 static void __exit
amd64_edac_exit(void)
3718 edac_pci_release_generic_ctl(pci_ctl
);
3720 /* unregister from EDAC MCE */
3721 amd_report_gart_errors(false);
3723 if (boot_cpu_data
.x86
>= 0x17)
3724 amd_unregister_ecc_decoder(decode_umc_error
);
3726 amd_unregister_ecc_decoder(decode_bus_error
);
3728 for (i
= 0; i
< amd_nb_num(); i
++)
3729 remove_one_instance(i
);
3738 module_init(amd64_edac_init
);
3739 module_exit(amd64_edac_exit
);
3741 MODULE_LICENSE("GPL");
3742 MODULE_AUTHOR("SoftwareBitMaker: Doug Thompson, "
3743 "Dave Peterson, Thayne Harbaugh");
3744 MODULE_DESCRIPTION("MC support for AMD64 memory controllers - "
3745 EDAC_AMD64_VERSION
);
3747 module_param(edac_op_state
, int, 0444);
3748 MODULE_PARM_DESC(edac_op_state
, "EDAC Error Reporting state: 0=Poll,1=NMI");