1// SPDX-License-Identifier: GPL-2.0-only
2#include <linux/ras.h>
3#include "amd64_edac.h"
4#include <asm/amd_nb.h>
5
6static struct edac_pci_ctl_info *pci_ctl;
7
8/*
9 * Set by command line parameter. If BIOS has enabled the ECC, this override is
10 * cleared to prevent re-enabling the hardware by this driver.
11 */
12static int ecc_enable_override;
13module_param(ecc_enable_override, int, 0644);
14
15static struct msr __percpu *msrs;
16
17static inline u32 get_umc_reg(struct amd64_pvt *pvt, u32 reg)
18{
19	if (!pvt->flags.zn_regs_v2)
20		return reg;
21
22	switch (reg) {
23	case UMCCH_ADDR_CFG:		return UMCCH_ADDR_CFG_DDR5;
24	case UMCCH_ADDR_MASK_SEC:	return UMCCH_ADDR_MASK_SEC_DDR5;
25	case UMCCH_DIMM_CFG:		return UMCCH_DIMM_CFG_DDR5;
26	}
27
28	WARN_ONCE(1, "%s: unknown register 0x%x", __func__, reg);
29	return 0;
30}
31
32/* Per-node stuff */
33static struct ecc_settings **ecc_stngs;
34
35/* Device for the PCI component */
36static struct device *pci_ctl_dev;
37
38/*
39 * Valid scrub rates for the K8 hardware memory scrubber. We map the scrubbing
40 * bandwidth to a valid bit pattern. The 'set' operation finds the 'matching-
41 * or higher value'.
42 *
43 *FIXME: Produce a better mapping/linearisation.
44 */
45static const struct scrubrate {
46       u32 scrubval;           /* bit pattern for scrub rate */
47       u32 bandwidth;          /* bandwidth consumed (bytes/sec) */
48} scrubrates[] = {
49	{ 0x01, 1600000000UL},
50	{ 0x02, 800000000UL},
51	{ 0x03, 400000000UL},
52	{ 0x04, 200000000UL},
53	{ 0x05, 100000000UL},
54	{ 0x06, 50000000UL},
55	{ 0x07, 25000000UL},
56	{ 0x08, 12284069UL},
57	{ 0x09, 6274509UL},
58	{ 0x0A, 3121951UL},
59	{ 0x0B, 1560975UL},
60	{ 0x0C, 781440UL},
61	{ 0x0D, 390720UL},
62	{ 0x0E, 195300UL},
63	{ 0x0F, 97650UL},
64	{ 0x10, 48854UL},
65	{ 0x11, 24427UL},
66	{ 0x12, 12213UL},
67	{ 0x13, 6101UL},
68	{ 0x14, 3051UL},
69	{ 0x15, 1523UL},
70	{ 0x16, 761UL},
71	{ 0x00, 0UL},        /* scrubbing off */
72};
73
74int __amd64_read_pci_cfg_dword(struct pci_dev *pdev, int offset,
75			       u32 *val, const char *func)
76{
77	int err = 0;
78
79	err = pci_read_config_dword(pdev, offset, val);
80	if (err)
81		amd64_warn("%s: error reading F%dx%03x.\n",
82			   func, PCI_FUNC(pdev->devfn), offset);
83
84	return err;
85}
86
87int __amd64_write_pci_cfg_dword(struct pci_dev *pdev, int offset,
88				u32 val, const char *func)
89{
90	int err = 0;
91
92	err = pci_write_config_dword(pdev, offset, val);
93	if (err)
94		amd64_warn("%s: error writing to F%dx%03x.\n",
95			   func, PCI_FUNC(pdev->devfn), offset);
96
97	return err;
98}
99
100/*
101 * Select DCT to which PCI cfg accesses are routed
102 */
103static void f15h_select_dct(struct amd64_pvt *pvt, u8 dct)
104{
105	u32 reg = 0;
106
107	amd64_read_pci_cfg(pvt->F1, DCT_CFG_SEL, &reg);
108	reg &= (pvt->model == 0x30) ? ~3 : ~1;
109	reg |= dct;
110	amd64_write_pci_cfg(pvt->F1, DCT_CFG_SEL, reg);
111}
112
113/*
114 *
115 * Depending on the family, F2 DCT reads need special handling:
116 *
117 * K8: has a single DCT only and no address offsets >= 0x100
118 *
119 * F10h: each DCT has its own set of regs
120 *	DCT0 -> F2x040..
121 *	DCT1 -> F2x140..
122 *
123 * F16h: has only 1 DCT
124 *
125 * F15h: we select which DCT we access using F1x10C[DctCfgSel]
126 */
127static inline int amd64_read_dct_pci_cfg(struct amd64_pvt *pvt, u8 dct,
128					 int offset, u32 *val)
129{
130	switch (pvt->fam) {
131	case 0xf:
132		if (dct || offset >= 0x100)
133			return -EINVAL;
134		break;
135
136	case 0x10:
137		if (dct) {
138			/*
139			 * Note: If ganging is enabled, barring the regs
140			 * F2x[1,0]98 and F2x[1,0]9C; reads reads to F2x1xx
141			 * return 0. (cf. Section 2.8.1 F10h BKDG)
142			 */
143			if (dct_ganging_enabled(pvt))
144				return 0;
145
146			offset += 0x100;
147		}
148		break;
149
150	case 0x15:
151		/*
152		 * F15h: F2x1xx addresses do not map explicitly to DCT1.
153		 * We should select which DCT we access using F1x10C[DctCfgSel]
154		 */
155		dct = (dct && pvt->model == 0x30) ? 3 : dct;
156		f15h_select_dct(pvt, dct);
157		break;
158
159	case 0x16:
160		if (dct)
161			return -EINVAL;
162		break;
163
164	default:
165		break;
166	}
167	return amd64_read_pci_cfg(pvt->F2, offset, val);
168}
169
170/*
171 * Memory scrubber control interface. For K8, memory scrubbing is handled by
172 * hardware and can involve L2 cache, dcache as well as the main memory. With
173 * F10, this is extended to L3 cache scrubbing on CPU models sporting that
174 * functionality.
175 *
176 * This causes the "units" for the scrubbing speed to vary from 64 byte blocks
177 * (dram) over to cache lines. This is nasty, so we will use bandwidth in
178 * bytes/sec for the setting.
179 *
180 * Currently, we only do dram scrubbing. If the scrubbing is done in software on
181 * other archs, we might not have access to the caches directly.
182 */
183
184/*
185 * Scan the scrub rate mapping table for a close or matching bandwidth value to
186 * issue. If requested is too big, then use last maximum value found.
187 */
188static int __set_scrub_rate(struct amd64_pvt *pvt, u32 new_bw, u32 min_rate)
189{
190	u32 scrubval;
191	int i;
192
193	/*
194	 * map the configured rate (new_bw) to a value specific to the AMD64
195	 * memory controller and apply to register. Search for the first
196	 * bandwidth entry that is greater or equal than the setting requested
197	 * and program that. If at last entry, turn off DRAM scrubbing.
198	 *
199	 * If no suitable bandwidth is found, turn off DRAM scrubbing entirely
200	 * by falling back to the last element in scrubrates[].
201	 */
202	for (i = 0; i < ARRAY_SIZE(scrubrates) - 1; i++) {
203		/*
204		 * skip scrub rates which aren't recommended
205		 * (see F10 BKDG, F3x58)
206		 */
207		if (scrubrates[i].scrubval < min_rate)
208			continue;
209
210		if (scrubrates[i].bandwidth <= new_bw)
211			break;
212	}
213
214	scrubval = scrubrates[i].scrubval;
215
216	if (pvt->fam == 0x15 && pvt->model == 0x60) {
217		f15h_select_dct(pvt, 0);
218		pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
219		f15h_select_dct(pvt, 1);
220		pci_write_bits32(pvt->F2, F15H_M60H_SCRCTRL, scrubval, 0x001F);
221	} else {
222		pci_write_bits32(pvt->F3, SCRCTRL, scrubval, 0x001F);
223	}
224
225	if (scrubval)
226		return scrubrates[i].bandwidth;
227
228	return 0;
229}
230
231static int set_scrub_rate(struct mem_ctl_info *mci, u32 bw)
232{
233	struct amd64_pvt *pvt = mci->pvt_info;
234	u32 min_scrubrate = 0x5;
235
236	if (pvt->fam == 0xf)
237		min_scrubrate = 0x0;
238
239	if (pvt->fam == 0x15) {
240		/* Erratum #505 */
241		if (pvt->model < 0x10)
242			f15h_select_dct(pvt, 0);
243
244		if (pvt->model == 0x60)
245			min_scrubrate = 0x6;
246	}
247	return __set_scrub_rate(pvt, bw, min_scrubrate);
248}
249
250static int get_scrub_rate(struct mem_ctl_info *mci)
251{
252	struct amd64_pvt *pvt = mci->pvt_info;
253	int i, retval = -EINVAL;
254	u32 scrubval = 0;
255
256	if (pvt->fam == 0x15) {
257		/* Erratum #505 */
258		if (pvt->model < 0x10)
259			f15h_select_dct(pvt, 0);
260
261		if (pvt->model == 0x60)
262			amd64_read_pci_cfg(pvt->F2, F15H_M60H_SCRCTRL, &scrubval);
263		else
264			amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
265	} else {
266		amd64_read_pci_cfg(pvt->F3, SCRCTRL, &scrubval);
267	}
268
269	scrubval = scrubval & 0x001F;
270
271	for (i = 0; i < ARRAY_SIZE(scrubrates); i++) {
272		if (scrubrates[i].scrubval == scrubval) {
273			retval = scrubrates[i].bandwidth;
274			break;
275		}
276	}
277	return retval;
278}
279
280/*
281 * returns true if the SysAddr given by sys_addr matches the
282 * DRAM base/limit associated with node_id
283 */
284static bool base_limit_match(struct amd64_pvt *pvt, u64 sys_addr, u8 nid)
285{
286	u64 addr;
287
288	/* The K8 treats this as a 40-bit value.  However, bits 63-40 will be
289	 * all ones if the most significant implemented address bit is 1.
290	 * Here we discard bits 63-40.  See section 3.4.2 of AMD publication
291	 * 24592: AMD x86-64 Architecture Programmer's Manual Volume 1
292	 * Application Programming.
293	 */
294	addr = sys_addr & 0x000000ffffffffffull;
295
296	return ((addr >= get_dram_base(pvt, nid)) &&
297		(addr <= get_dram_limit(pvt, nid)));
298}
299
300/*
301 * Attempt to map a SysAddr to a node. On success, return a pointer to the
302 * mem_ctl_info structure for the node that the SysAddr maps to.
303 *
304 * On failure, return NULL.
305 */
306static struct mem_ctl_info *find_mc_by_sys_addr(struct mem_ctl_info *mci,
307						u64 sys_addr)
308{
309	struct amd64_pvt *pvt;
310	u8 node_id;
311	u32 intlv_en, bits;
312
313	/*
314	 * Here we use the DRAM Base (section 3.4.4.1) and DRAM Limit (section
315	 * 3.4.4.2) registers to map the SysAddr to a node ID.
316	 */
317	pvt = mci->pvt_info;
318
319	/*
320	 * The value of this field should be the same for all DRAM Base
321	 * registers.  Therefore we arbitrarily choose to read it from the
322	 * register for node 0.
323	 */
324	intlv_en = dram_intlv_en(pvt, 0);
325
326	if (intlv_en == 0) {
327		for (node_id = 0; node_id < DRAM_RANGES; node_id++) {
328			if (base_limit_match(pvt, sys_addr, node_id))
329				goto found;
330		}
331		goto err_no_match;
332	}
333
334	if (unlikely((intlv_en != 0x01) &&
335		     (intlv_en != 0x03) &&
336		     (intlv_en != 0x07))) {
337		amd64_warn("DRAM Base[IntlvEn] junk value: 0x%x, BIOS bug?\n", intlv_en);
338		return NULL;
339	}
340
341	bits = (((u32) sys_addr) >> 12) & intlv_en;
342
343	for (node_id = 0; ; ) {
344		if ((dram_intlv_sel(pvt, node_id) & intlv_en) == bits)
345			break;	/* intlv_sel field matches */
346
347		if (++node_id >= DRAM_RANGES)
348			goto err_no_match;
349	}
350
351	/* sanity test for sys_addr */
352	if (unlikely(!base_limit_match(pvt, sys_addr, node_id))) {
353		amd64_warn("%s: sys_addr 0x%llx falls outside base/limit address"
354			   "range for node %d with node interleaving enabled.\n",
355			   __func__, sys_addr, node_id);
356		return NULL;
357	}
358
359found:
360	return edac_mc_find((int)node_id);
361
362err_no_match:
363	edac_dbg(2, "sys_addr 0x%lx doesn't match any node\n",
364		 (unsigned long)sys_addr);
365
366	return NULL;
367}
368
369/*
370 * compute the CS base address of the @csrow on the DRAM controller @dct.
371 * For details see F2x[5C:40] in the processor's BKDG
372 */
373static void get_cs_base_and_mask(struct amd64_pvt *pvt, int csrow, u8 dct,
374				 u64 *base, u64 *mask)
375{
376	u64 csbase, csmask, base_bits, mask_bits;
377	u8 addr_shift;
378
379	if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
380		csbase		= pvt->csels[dct].csbases[csrow];
381		csmask		= pvt->csels[dct].csmasks[csrow];
382		base_bits	= GENMASK_ULL(31, 21) | GENMASK_ULL(15, 9);
383		mask_bits	= GENMASK_ULL(29, 21) | GENMASK_ULL(15, 9);
384		addr_shift	= 4;
385
386	/*
387	 * F16h and F15h, models 30h and later need two addr_shift values:
388	 * 8 for high and 6 for low (cf. F16h BKDG).
389	 */
390	} else if (pvt->fam == 0x16 ||
391		  (pvt->fam == 0x15 && pvt->model >= 0x30)) {
392		csbase          = pvt->csels[dct].csbases[csrow];
393		csmask          = pvt->csels[dct].csmasks[csrow >> 1];
394
395		*base  = (csbase & GENMASK_ULL(15,  5)) << 6;
396		*base |= (csbase & GENMASK_ULL(30, 19)) << 8;
397
398		*mask = ~0ULL;
399		/* poke holes for the csmask */
400		*mask &= ~((GENMASK_ULL(15, 5)  << 6) |
401			   (GENMASK_ULL(30, 19) << 8));
402
403		*mask |= (csmask & GENMASK_ULL(15, 5))  << 6;
404		*mask |= (csmask & GENMASK_ULL(30, 19)) << 8;
405
406		return;
407	} else {
408		csbase		= pvt->csels[dct].csbases[csrow];
409		csmask		= pvt->csels[dct].csmasks[csrow >> 1];
410		addr_shift	= 8;
411
412		if (pvt->fam == 0x15)
413			base_bits = mask_bits =
414				GENMASK_ULL(30,19) | GENMASK_ULL(13,5);
415		else
416			base_bits = mask_bits =
417				GENMASK_ULL(28,19) | GENMASK_ULL(13,5);
418	}
419
420	*base  = (csbase & base_bits) << addr_shift;
421
422	*mask  = ~0ULL;
423	/* poke holes for the csmask */
424	*mask &= ~(mask_bits << addr_shift);
425	/* OR them in */
426	*mask |= (csmask & mask_bits) << addr_shift;
427}
428
429#define for_each_chip_select(i, dct, pvt) \
430	for (i = 0; i < pvt->csels[dct].b_cnt; i++)
431
432#define chip_select_base(i, dct, pvt) \
433	pvt->csels[dct].csbases[i]
434
435#define for_each_chip_select_mask(i, dct, pvt) \
436	for (i = 0; i < pvt->csels[dct].m_cnt; i++)
437
438#define for_each_umc(i) \
439	for (i = 0; i < pvt->max_mcs; i++)
440
441/*
442 * @input_addr is an InputAddr associated with the node given by mci. Return the
443 * csrow that input_addr maps to, or -1 on failure (no csrow claims input_addr).
444 */
445static int input_addr_to_csrow(struct mem_ctl_info *mci, u64 input_addr)
446{
447	struct amd64_pvt *pvt;
448	int csrow;
449	u64 base, mask;
450
451	pvt = mci->pvt_info;
452
453	for_each_chip_select(csrow, 0, pvt) {
454		if (!csrow_enabled(csrow, 0, pvt))
455			continue;
456
457		get_cs_base_and_mask(pvt, csrow, 0, &base, &mask);
458
459		mask = ~mask;
460
461		if ((input_addr & mask) == (base & mask)) {
462			edac_dbg(2, "InputAddr 0x%lx matches csrow %d (node %d)\n",
463				 (unsigned long)input_addr, csrow,
464				 pvt->mc_node_id);
465
466			return csrow;
467		}
468	}
469	edac_dbg(2, "no matching csrow for InputAddr 0x%lx (MC node %d)\n",
470		 (unsigned long)input_addr, pvt->mc_node_id);
471
472	return -1;
473}
474
475/*
476 * Obtain info from the DRAM Hole Address Register (section 3.4.8, pub #26094)
477 * for the node represented by mci. Info is passed back in *hole_base,
478 * *hole_offset, and *hole_size.  Function returns 0 if info is valid or 1 if
479 * info is invalid. Info may be invalid for either of the following reasons:
480 *
481 * - The revision of the node is not E or greater.  In this case, the DRAM Hole
482 *   Address Register does not exist.
483 *
484 * - The DramHoleValid bit is cleared in the DRAM Hole Address Register,
485 *   indicating that its contents are not valid.
486 *
487 * The values passed back in *hole_base, *hole_offset, and *hole_size are
488 * complete 32-bit values despite the fact that the bitfields in the DHAR
489 * only represent bits 31-24 of the base and offset values.
490 */
491static int get_dram_hole_info(struct mem_ctl_info *mci, u64 *hole_base,
492			      u64 *hole_offset, u64 *hole_size)
493{
494	struct amd64_pvt *pvt = mci->pvt_info;
495
496	/* only revE and later have the DRAM Hole Address Register */
497	if (pvt->fam == 0xf && pvt->ext_model < K8_REV_E) {
498		edac_dbg(1, "  revision %d for node %d does not support DHAR\n",
499			 pvt->ext_model, pvt->mc_node_id);
500		return 1;
501	}
502
503	/* valid for Fam10h and above */
504	if (pvt->fam >= 0x10 && !dhar_mem_hoist_valid(pvt)) {
505		edac_dbg(1, "  Dram Memory Hoisting is DISABLED on this system\n");
506		return 1;
507	}
508
509	if (!dhar_valid(pvt)) {
510		edac_dbg(1, "  Dram Memory Hoisting is DISABLED on this node %d\n",
511			 pvt->mc_node_id);
512		return 1;
513	}
514
515	/* This node has Memory Hoisting */
516
517	/* +------------------+--------------------+--------------------+-----
518	 * | memory           | DRAM hole          | relocated          |
519	 * | [0, (x - 1)]     | [x, 0xffffffff]    | addresses from     |
520	 * |                  |                    | DRAM hole          |
521	 * |                  |                    | [0x100000000,      |
522	 * |                  |                    |  (0x100000000+     |
523	 * |                  |                    |   (0xffffffff-x))] |
524	 * +------------------+--------------------+--------------------+-----
525	 *
526	 * Above is a diagram of physical memory showing the DRAM hole and the
527	 * relocated addresses from the DRAM hole.  As shown, the DRAM hole
528	 * starts at address x (the base address) and extends through address
529	 * 0xffffffff.  The DRAM Hole Address Register (DHAR) relocates the
530	 * addresses in the hole so that they start at 0x100000000.
531	 */
532
533	*hole_base = dhar_base(pvt);
534	*hole_size = (1ULL << 32) - *hole_base;
535
536	*hole_offset = (pvt->fam > 0xf) ? f10_dhar_offset(pvt)
537					: k8_dhar_offset(pvt);
538
539	edac_dbg(1, "  DHAR info for node %d base 0x%lx offset 0x%lx size 0x%lx\n",
540		 pvt->mc_node_id, (unsigned long)*hole_base,
541		 (unsigned long)*hole_offset, (unsigned long)*hole_size);
542
543	return 0;
544}
545
546#ifdef CONFIG_EDAC_DEBUG
547#define EDAC_DCT_ATTR_SHOW(reg)						\
548static ssize_t reg##_show(struct device *dev,				\
549			 struct device_attribute *mattr, char *data)	\
550{									\
551	struct mem_ctl_info *mci = to_mci(dev);				\
552	struct amd64_pvt *pvt = mci->pvt_info;				\
553									\
554	return sprintf(data, "0x%016llx\n", (u64)pvt->reg);		\
555}
556
557EDAC_DCT_ATTR_SHOW(dhar);
558EDAC_DCT_ATTR_SHOW(dbam0);
559EDAC_DCT_ATTR_SHOW(top_mem);
560EDAC_DCT_ATTR_SHOW(top_mem2);
561
562static ssize_t dram_hole_show(struct device *dev, struct device_attribute *mattr,
563			      char *data)
564{
565	struct mem_ctl_info *mci = to_mci(dev);
566
567	u64 hole_base = 0;
568	u64 hole_offset = 0;
569	u64 hole_size = 0;
570
571	get_dram_hole_info(mci, &hole_base, &hole_offset, &hole_size);
572
573	return sprintf(data, "%llx %llx %llx\n", hole_base, hole_offset,
574						 hole_size);
575}
576
577/*
578 * update NUM_DBG_ATTRS in case you add new members
579 */
580static DEVICE_ATTR(dhar, S_IRUGO, dhar_show, NULL);
581static DEVICE_ATTR(dbam, S_IRUGO, dbam0_show, NULL);
582static DEVICE_ATTR(topmem, S_IRUGO, top_mem_show, NULL);
583static DEVICE_ATTR(topmem2, S_IRUGO, top_mem2_show, NULL);
584static DEVICE_ATTR_RO(dram_hole);
585
586static struct attribute *dbg_attrs[] = {
587	&dev_attr_dhar.attr,
588	&dev_attr_dbam.attr,
589	&dev_attr_topmem.attr,
590	&dev_attr_topmem2.attr,
591	&dev_attr_dram_hole.attr,
592	NULL
593};
594
595static const struct attribute_group dbg_group = {
596	.attrs = dbg_attrs,
597};
598
599static ssize_t inject_section_show(struct device *dev,
600				   struct device_attribute *mattr, char *buf)
601{
602	struct mem_ctl_info *mci = to_mci(dev);
603	struct amd64_pvt *pvt = mci->pvt_info;
604	return sprintf(buf, "0x%x\n", pvt->injection.section);
605}
606
607/*
608 * store error injection section value which refers to one of 4 16-byte sections
609 * within a 64-byte cacheline
610 *
611 * range: 0..3
612 */
613static ssize_t inject_section_store(struct device *dev,
614				    struct device_attribute *mattr,
615				    const char *data, size_t count)
616{
617	struct mem_ctl_info *mci = to_mci(dev);
618	struct amd64_pvt *pvt = mci->pvt_info;
619	unsigned long value;
620	int ret;
621
622	ret = kstrtoul(data, 10, &value);
623	if (ret < 0)
624		return ret;
625
626	if (value > 3) {
627		amd64_warn("%s: invalid section 0x%lx\n", __func__, value);
628		return -EINVAL;
629	}
630
631	pvt->injection.section = (u32) value;
632	return count;
633}
634
635static ssize_t inject_word_show(struct device *dev,
636				struct device_attribute *mattr, char *buf)
637{
638	struct mem_ctl_info *mci = to_mci(dev);
639	struct amd64_pvt *pvt = mci->pvt_info;
640	return sprintf(buf, "0x%x\n", pvt->injection.word);
641}
642
643/*
644 * store error injection word value which refers to one of 9 16-bit word of the
645 * 16-byte (128-bit + ECC bits) section
646 *
647 * range: 0..8
648 */
649static ssize_t inject_word_store(struct device *dev,
650				 struct device_attribute *mattr,
651				 const char *data, size_t count)
652{
653	struct mem_ctl_info *mci = to_mci(dev);
654	struct amd64_pvt *pvt = mci->pvt_info;
655	unsigned long value;
656	int ret;
657
658	ret = kstrtoul(data, 10, &value);
659	if (ret < 0)
660		return ret;
661
662	if (value > 8) {
663		amd64_warn("%s: invalid word 0x%lx\n", __func__, value);
664		return -EINVAL;
665	}
666
667	pvt->injection.word = (u32) value;
668	return count;
669}
670
671static ssize_t inject_ecc_vector_show(struct device *dev,
672				      struct device_attribute *mattr,
673				      char *buf)
674{
675	struct mem_ctl_info *mci = to_mci(dev);
676	struct amd64_pvt *pvt = mci->pvt_info;
677	return sprintf(buf, "0x%x\n", pvt->injection.bit_map);
678}
679
680/*
681 * store 16 bit error injection vector which enables injecting errors to the
682 * corresponding bit within the error injection word above. When used during a
683 * DRAM ECC read, it holds the contents of the of the DRAM ECC bits.
684 */
685static ssize_t inject_ecc_vector_store(struct device *dev,
686				       struct device_attribute *mattr,
687				       const char *data, size_t count)
688{
689	struct mem_ctl_info *mci = to_mci(dev);
690	struct amd64_pvt *pvt = mci->pvt_info;
691	unsigned long value;
692	int ret;
693
694	ret = kstrtoul(data, 16, &value);
695	if (ret < 0)
696		return ret;
697
698	if (value & 0xFFFF0000) {
699		amd64_warn("%s: invalid EccVector: 0x%lx\n", __func__, value);
700		return -EINVAL;
701	}
702
703	pvt->injection.bit_map = (u32) value;
704	return count;
705}
706
707/*
708 * Do a DRAM ECC read. Assemble staged values in the pvt area, format into
709 * fields needed by the injection registers and read the NB Array Data Port.
710 */
711static ssize_t inject_read_store(struct device *dev,
712				 struct device_attribute *mattr,
713				 const char *data, size_t count)
714{
715	struct mem_ctl_info *mci = to_mci(dev);
716	struct amd64_pvt *pvt = mci->pvt_info;
717	unsigned long value;
718	u32 section, word_bits;
719	int ret;
720
721	ret = kstrtoul(data, 10, &value);
722	if (ret < 0)
723		return ret;
724
725	/* Form value to choose 16-byte section of cacheline */
726	section = F10_NB_ARRAY_DRAM | SET_NB_ARRAY_ADDR(pvt->injection.section);
727
728	amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_ADDR, section);
729
730	word_bits = SET_NB_DRAM_INJECTION_READ(pvt->injection);
731
732	/* Issue 'word' and 'bit' along with the READ request */
733	amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, word_bits);
734
735	edac_dbg(0, "section=0x%x word_bits=0x%x\n", section, word_bits);
736
737	return count;
738}
739
740/*
741 * Do a DRAM ECC write. Assemble staged values in the pvt area and format into
742 * fields needed by the injection registers.
743 */
744static ssize_t inject_write_store(struct device *dev,
745				  struct device_attribute *mattr,
746				  const char *data, size_t count)
747{
748	struct mem_ctl_info *mci = to_mci(dev);
749	struct amd64_pvt *pvt = mci->pvt_info;
750	u32 section, word_bits, tmp;
751	unsigned long value;
752	int ret;
753
754	ret = kstrtoul(data, 10, &value);
755	if (ret < 0)
756		return ret;
757
758	/* Form value to choose 16-byte section of cacheline */
759	section = F10_NB_ARRAY_DRAM | SET_NB_ARRAY_ADDR(pvt->injection.section);
760
761	amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_ADDR, section);
762
763	word_bits = SET_NB_DRAM_INJECTION_WRITE(pvt->injection);
764
765	pr_notice_once("Don't forget to decrease MCE polling interval in\n"
766			"/sys/bus/machinecheck/devices/machinecheck<CPUNUM>/check_interval\n"
767			"so that you can get the error report faster.\n");
768
769	on_each_cpu(disable_caches, NULL, 1);
770
771	/* Issue 'word' and 'bit' along with the READ request */
772	amd64_write_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, word_bits);
773
774 retry:
775	/* wait until injection happens */
776	amd64_read_pci_cfg(pvt->F3, F10_NB_ARRAY_DATA, &tmp);
777	if (tmp & F10_NB_ARR_ECC_WR_REQ) {
778		cpu_relax();
779		goto retry;
780	}
781
782	on_each_cpu(enable_caches, NULL, 1);
783
784	edac_dbg(0, "section=0x%x word_bits=0x%x\n", section, word_bits);
785
786	return count;
787}
788
789/*
790 * update NUM_INJ_ATTRS in case you add new members
791 */
792
793static DEVICE_ATTR_RW(inject_section);
794static DEVICE_ATTR_RW(inject_word);
795static DEVICE_ATTR_RW(inject_ecc_vector);
796static DEVICE_ATTR_WO(inject_write);
797static DEVICE_ATTR_WO(inject_read);
798
799static struct attribute *inj_attrs[] = {
800	&dev_attr_inject_section.attr,
801	&dev_attr_inject_word.attr,
802	&dev_attr_inject_ecc_vector.attr,
803	&dev_attr_inject_write.attr,
804	&dev_attr_inject_read.attr,
805	NULL
806};
807
808static umode_t inj_is_visible(struct kobject *kobj, struct attribute *attr, int idx)
809{
810	struct device *dev = kobj_to_dev(kobj);
811	struct mem_ctl_info *mci = container_of(dev, struct mem_ctl_info, dev);
812	struct amd64_pvt *pvt = mci->pvt_info;
813
814	/* Families which have that injection hw */
815	if (pvt->fam >= 0x10 && pvt->fam <= 0x16)
816		return attr->mode;
817
818	return 0;
819}
820
821static const struct attribute_group inj_group = {
822	.attrs = inj_attrs,
823	.is_visible = inj_is_visible,
824};
825#endif /* CONFIG_EDAC_DEBUG */
826
827/*
828 * Return the DramAddr that the SysAddr given by @sys_addr maps to.  It is
829 * assumed that sys_addr maps to the node given by mci.
830 *
831 * The first part of section 3.4.4 (p. 70) shows how the DRAM Base (section
832 * 3.4.4.1) and DRAM Limit (section 3.4.4.2) registers are used to translate a
833 * SysAddr to a DramAddr. If the DRAM Hole Address Register (DHAR) is enabled,
834 * then it is also involved in translating a SysAddr to a DramAddr. Sections
835 * 3.4.8 and 3.5.8.2 describe the DHAR and how it is used for memory hoisting.
836 * These parts of the documentation are unclear. I interpret them as follows:
837 *
838 * When node n receives a SysAddr, it processes the SysAddr as follows:
839 *
840 * 1. It extracts the DRAMBase and DRAMLimit values from the DRAM Base and DRAM
841 *    Limit registers for node n. If the SysAddr is not within the range
842 *    specified by the base and limit values, then node n ignores the Sysaddr
843 *    (since it does not map to node n). Otherwise continue to step 2 below.
844 *
845 * 2. If the DramHoleValid bit of the DHAR for node n is clear, the DHAR is
846 *    disabled so skip to step 3 below. Otherwise see if the SysAddr is within
847 *    the range of relocated addresses (starting at 0x100000000) from the DRAM
848 *    hole. If not, skip to step 3 below. Else get the value of the
849 *    DramHoleOffset field from the DHAR. To obtain the DramAddr, subtract the
850 *    offset defined by this value from the SysAddr.
851 *
852 * 3. Obtain the base address for node n from the DRAMBase field of the DRAM
853 *    Base register for node n. To obtain the DramAddr, subtract the base
854 *    address from the SysAddr, as shown near the start of section 3.4.4 (p.70).
855 */
856static u64 sys_addr_to_dram_addr(struct mem_ctl_info *mci, u64 sys_addr)
857{
858	struct amd64_pvt *pvt = mci->pvt_info;
859	u64 dram_base, hole_base, hole_offset, hole_size, dram_addr;
860	int ret;
861
862	dram_base = get_dram_base(pvt, pvt->mc_node_id);
863
864	ret = get_dram_hole_info(mci, &hole_base, &hole_offset, &hole_size);
865	if (!ret) {
866		if ((sys_addr >= (1ULL << 32)) &&
867		    (sys_addr < ((1ULL << 32) + hole_size))) {
868			/* use DHAR to translate SysAddr to DramAddr */
869			dram_addr = sys_addr - hole_offset;
870
871			edac_dbg(2, "using DHAR to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
872				 (unsigned long)sys_addr,
873				 (unsigned long)dram_addr);
874
875			return dram_addr;
876		}
877	}
878
879	/*
880	 * Translate the SysAddr to a DramAddr as shown near the start of
881	 * section 3.4.4 (p. 70).  Although sys_addr is a 64-bit value, the k8
882	 * only deals with 40-bit values.  Therefore we discard bits 63-40 of
883	 * sys_addr below.  If bit 39 of sys_addr is 1 then the bits we
884	 * discard are all 1s.  Otherwise the bits we discard are all 0s.  See
885	 * section 3.4.2 of AMD publication 24592: AMD x86-64 Architecture
886	 * Programmer's Manual Volume 1 Application Programming.
887	 */
888	dram_addr = (sys_addr & GENMASK_ULL(39, 0)) - dram_base;
889
890	edac_dbg(2, "using DRAM Base register to translate SysAddr 0x%lx to DramAddr 0x%lx\n",
891		 (unsigned long)sys_addr, (unsigned long)dram_addr);
892	return dram_addr;
893}
894
895/*
896 * @intlv_en is the value of the IntlvEn field from a DRAM Base register
897 * (section 3.4.4.1).  Return the number of bits from a SysAddr that are used
898 * for node interleaving.
899 */
900static int num_node_interleave_bits(unsigned intlv_en)
901{
902	static const int intlv_shift_table[] = { 0, 1, 0, 2, 0, 0, 0, 3 };
903	int n;
904
905	BUG_ON(intlv_en > 7);
906	n = intlv_shift_table[intlv_en];
907	return n;
908}
909
910/* Translate the DramAddr given by @dram_addr to an InputAddr. */
911static u64 dram_addr_to_input_addr(struct mem_ctl_info *mci, u64 dram_addr)
912{
913	struct amd64_pvt *pvt;
914	int intlv_shift;
915	u64 input_addr;
916
917	pvt = mci->pvt_info;
918
919	/*
920	 * See the start of section 3.4.4 (p. 70, BKDG #26094, K8, revA-E)
921	 * concerning translating a DramAddr to an InputAddr.
922	 */
923	intlv_shift = num_node_interleave_bits(dram_intlv_en(pvt, 0));
924	input_addr = ((dram_addr >> intlv_shift) & GENMASK_ULL(35, 12)) +
925		      (dram_addr & 0xfff);
926
927	edac_dbg(2, "  Intlv Shift=%d DramAddr=0x%lx maps to InputAddr=0x%lx\n",
928		 intlv_shift, (unsigned long)dram_addr,
929		 (unsigned long)input_addr);
930
931	return input_addr;
932}
933
934/*
935 * Translate the SysAddr represented by @sys_addr to an InputAddr.  It is
936 * assumed that @sys_addr maps to the node given by mci.
937 */
938static u64 sys_addr_to_input_addr(struct mem_ctl_info *mci, u64 sys_addr)
939{
940	u64 input_addr;
941
942	input_addr =
943	    dram_addr_to_input_addr(mci, sys_addr_to_dram_addr(mci, sys_addr));
944
945	edac_dbg(2, "SysAddr 0x%lx translates to InputAddr 0x%lx\n",
946		 (unsigned long)sys_addr, (unsigned long)input_addr);
947
948	return input_addr;
949}
950
951/* Map the Error address to a PAGE and PAGE OFFSET. */
952static inline void error_address_to_page_and_offset(u64 error_address,
953						    struct err_info *err)
954{
955	err->page = (u32) (error_address >> PAGE_SHIFT);
956	err->offset = ((u32) error_address) & ~PAGE_MASK;
957}
958
959/*
960 * @sys_addr is an error address (a SysAddr) extracted from the MCA NB Address
961 * Low (section 3.6.4.5) and MCA NB Address High (section 3.6.4.6) registers
962 * of a node that detected an ECC memory error.  mci represents the node that
963 * the error address maps to (possibly different from the node that detected
964 * the error).  Return the number of the csrow that sys_addr maps to, or -1 on
965 * error.
966 */
967static int sys_addr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr)
968{
969	int csrow;
970
971	csrow = input_addr_to_csrow(mci, sys_addr_to_input_addr(mci, sys_addr));
972
973	if (csrow == -1)
974		amd64_mc_err(mci, "Failed to translate InputAddr to csrow for "
975				  "address 0x%lx\n", (unsigned long)sys_addr);
976	return csrow;
977}
978
979/*
980 * See AMD PPR DF::LclNodeTypeMap
981 *
982 * This register gives information for nodes of the same type within a system.
983 *
984 * Reading this register from a GPU node will tell how many GPU nodes are in the
985 * system and what the lowest AMD Node ID value is for the GPU nodes. Use this
986 * info to fixup the Linux logical "Node ID" value set in the AMD NB code and EDAC.
987 */
988static struct local_node_map {
989	u16 node_count;
990	u16 base_node_id;
991} gpu_node_map;
992
993#define PCI_DEVICE_ID_AMD_MI200_DF_F1		0x14d1
994#define REG_LOCAL_NODE_TYPE_MAP			0x144
995
996/* Local Node Type Map (LNTM) fields */
997#define LNTM_NODE_COUNT				GENMASK(27, 16)
998#define LNTM_BASE_NODE_ID			GENMASK(11, 0)
999
1000static int gpu_get_node_map(struct amd64_pvt *pvt)
1001{
1002	struct pci_dev *pdev;
1003	int ret;
1004	u32 tmp;
1005
1006	/*
1007	 * Mapping of nodes from hardware-provided AMD Node ID to a
1008	 * Linux logical one is applicable for MI200 models. Therefore,
1009	 * return early for other heterogeneous systems.
1010	 */
1011	if (pvt->F3->device != PCI_DEVICE_ID_AMD_MI200_DF_F3)
1012		return 0;
1013
1014	/*
1015	 * Node ID 0 is reserved for CPUs. Therefore, a non-zero Node ID
1016	 * means the values have been already cached.
1017	 */
1018	if (gpu_node_map.base_node_id)
1019		return 0;
1020
1021	pdev = pci_get_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_MI200_DF_F1, NULL);
1022	if (!pdev) {
1023		ret = -ENODEV;
1024		goto out;
1025	}
1026
1027	ret = pci_read_config_dword(pdev, REG_LOCAL_NODE_TYPE_MAP, &tmp);
1028	if (ret)
1029		goto out;
1030
1031	gpu_node_map.node_count = FIELD_GET(LNTM_NODE_COUNT, tmp);
1032	gpu_node_map.base_node_id = FIELD_GET(LNTM_BASE_NODE_ID, tmp);
1033
1034out:
1035	pci_dev_put(pdev);
1036	return ret;
1037}
1038
1039static int fixup_node_id(int node_id, struct mce *m)
1040{
1041	/* MCA_IPID[InstanceIdHi] give the AMD Node ID for the bank. */
1042	u8 nid = (m->ipid >> 44) & 0xF;
1043
1044	if (smca_get_bank_type(m->extcpu, m->bank) != SMCA_UMC_V2)
1045		return node_id;
1046
1047	/* Nodes below the GPU base node are CPU nodes and don't need a fixup. */
1048	if (nid < gpu_node_map.base_node_id)
1049		return node_id;
1050
1051	/* Convert the hardware-provided AMD Node ID to a Linux logical one. */
1052	return nid - gpu_node_map.base_node_id + 1;
1053}
1054
1055static int get_channel_from_ecc_syndrome(struct mem_ctl_info *, u16);
1056
1057/*
1058 * Determine if the DIMMs have ECC enabled. ECC is enabled ONLY if all the DIMMs
1059 * are ECC capable.
1060 */
1061static unsigned long dct_determine_edac_cap(struct amd64_pvt *pvt)
1062{
1063	unsigned long edac_cap = EDAC_FLAG_NONE;
1064	u8 bit;
1065
1066	bit = (pvt->fam > 0xf || pvt->ext_model >= K8_REV_F)
1067		? 19
1068		: 17;
1069
1070	if (pvt->dclr0 & BIT(bit))
1071		edac_cap = EDAC_FLAG_SECDED;
1072
1073	return edac_cap;
1074}
1075
1076static unsigned long umc_determine_edac_cap(struct amd64_pvt *pvt)
1077{
1078	u8 i, umc_en_mask = 0, dimm_ecc_en_mask = 0;
1079	unsigned long edac_cap = EDAC_FLAG_NONE;
1080
1081	for_each_umc(i) {
1082		if (!(pvt->umc[i].sdp_ctrl & UMC_SDP_INIT))
1083			continue;
1084
1085		umc_en_mask |= BIT(i);
1086
1087		/* UMC Configuration bit 12 (DimmEccEn) */
1088		if (pvt->umc[i].umc_cfg & BIT(12))
1089			dimm_ecc_en_mask |= BIT(i);
1090	}
1091
1092	if (umc_en_mask == dimm_ecc_en_mask)
1093		edac_cap = EDAC_FLAG_SECDED;
1094
1095	return edac_cap;
1096}
1097
1098/*
1099 * debug routine to display the memory sizes of all logical DIMMs and its
1100 * CSROWs
1101 */
1102static void dct_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
1103{
1104	u32 *dcsb = ctrl ? pvt->csels[1].csbases : pvt->csels[0].csbases;
1105	u32 dbam  = ctrl ? pvt->dbam1 : pvt->dbam0;
1106	int dimm, size0, size1;
1107
1108	if (pvt->fam == 0xf) {
1109		/* K8 families < revF not supported yet */
1110		if (pvt->ext_model < K8_REV_F)
1111			return;
1112
1113		WARN_ON(ctrl != 0);
1114	}
1115
1116	if (pvt->fam == 0x10) {
1117		dbam = (ctrl && !dct_ganging_enabled(pvt)) ? pvt->dbam1
1118							   : pvt->dbam0;
1119		dcsb = (ctrl && !dct_ganging_enabled(pvt)) ?
1120				 pvt->csels[1].csbases :
1121				 pvt->csels[0].csbases;
1122	} else if (ctrl) {
1123		dbam = pvt->dbam0;
1124		dcsb = pvt->csels[1].csbases;
1125	}
1126	edac_dbg(1, "F2x%d80 (DRAM Bank Address Mapping): 0x%08x\n",
1127		 ctrl, dbam);
1128
1129	edac_printk(KERN_DEBUG, EDAC_MC, "DCT%d chip selects:\n", ctrl);
1130
1131	/* Dump memory sizes for DIMM and its CSROWs */
1132	for (dimm = 0; dimm < 4; dimm++) {
1133		size0 = 0;
1134		if (dcsb[dimm * 2] & DCSB_CS_ENABLE)
1135			/*
1136			 * For F15m60h, we need multiplier for LRDIMM cs_size
1137			 * calculation. We pass dimm value to the dbam_to_cs
1138			 * mapper so we can find the multiplier from the
1139			 * corresponding DCSM.
1140			 */
1141			size0 = pvt->ops->dbam_to_cs(pvt, ctrl,
1142						     DBAM_DIMM(dimm, dbam),
1143						     dimm);
1144
1145		size1 = 0;
1146		if (dcsb[dimm * 2 + 1] & DCSB_CS_ENABLE)
1147			size1 = pvt->ops->dbam_to_cs(pvt, ctrl,
1148						     DBAM_DIMM(dimm, dbam),
1149						     dimm);
1150
1151		amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
1152			   dimm * 2,     size0,
1153			   dimm * 2 + 1, size1);
1154	}
1155}
1156
1157
1158static void debug_dump_dramcfg_low(struct amd64_pvt *pvt, u32 dclr, int chan)
1159{
1160	edac_dbg(1, "F2x%d90 (DRAM Cfg Low): 0x%08x\n", chan, dclr);
1161
1162	if (pvt->dram_type == MEM_LRDDR3) {
1163		u32 dcsm = pvt->csels[chan].csmasks[0];
1164		/*
1165		 * It's assumed all LRDIMMs in a DCT are going to be of
1166		 * same 'type' until proven otherwise. So, use a cs
1167		 * value of '0' here to get dcsm value.
1168		 */
1169		edac_dbg(1, " LRDIMM %dx rank multiply\n", (dcsm & 0x3));
1170	}
1171
1172	edac_dbg(1, "All DIMMs support ECC:%s\n",
1173		    (dclr & BIT(19)) ? "yes" : "no");
1174
1175
1176	edac_dbg(1, "  PAR/ERR parity: %s\n",
1177		 (dclr & BIT(8)) ?  "enabled" : "disabled");
1178
1179	if (pvt->fam == 0x10)
1180		edac_dbg(1, "  DCT 128bit mode width: %s\n",
1181			 (dclr & BIT(11)) ?  "128b" : "64b");
1182
1183	edac_dbg(1, "  x4 logical DIMMs present: L0: %s L1: %s L2: %s L3: %s\n",
1184		 (dclr & BIT(12)) ?  "yes" : "no",
1185		 (dclr & BIT(13)) ?  "yes" : "no",
1186		 (dclr & BIT(14)) ?  "yes" : "no",
1187		 (dclr & BIT(15)) ?  "yes" : "no");
1188}
1189
1190#define CS_EVEN_PRIMARY		BIT(0)
1191#define CS_ODD_PRIMARY		BIT(1)
1192#define CS_EVEN_SECONDARY	BIT(2)
1193#define CS_ODD_SECONDARY	BIT(3)
1194#define CS_3R_INTERLEAVE	BIT(4)
1195
1196#define CS_EVEN			(CS_EVEN_PRIMARY | CS_EVEN_SECONDARY)
1197#define CS_ODD			(CS_ODD_PRIMARY | CS_ODD_SECONDARY)
1198
1199static int umc_get_cs_mode(int dimm, u8 ctrl, struct amd64_pvt *pvt)
1200{
1201	u8 base, count = 0;
1202	int cs_mode = 0;
1203
1204	if (csrow_enabled(2 * dimm, ctrl, pvt))
1205		cs_mode |= CS_EVEN_PRIMARY;
1206
1207	if (csrow_enabled(2 * dimm + 1, ctrl, pvt))
1208		cs_mode |= CS_ODD_PRIMARY;
1209
1210	/* Asymmetric dual-rank DIMM support. */
1211	if (csrow_sec_enabled(2 * dimm + 1, ctrl, pvt))
1212		cs_mode |= CS_ODD_SECONDARY;
1213
1214	/*
1215	 * 3 Rank inteleaving support.
1216	 * There should be only three bases enabled and their two masks should
1217	 * be equal.
1218	 */
1219	for_each_chip_select(base, ctrl, pvt)
1220		count += csrow_enabled(base, ctrl, pvt);
1221
1222	if (count == 3 &&
1223	    pvt->csels[ctrl].csmasks[0] == pvt->csels[ctrl].csmasks[1]) {
1224		edac_dbg(1, "3R interleaving in use.\n");
1225		cs_mode |= CS_3R_INTERLEAVE;
1226	}
1227
1228	return cs_mode;
1229}
1230
1231static int __addr_mask_to_cs_size(u32 addr_mask_orig, unsigned int cs_mode,
1232				  int csrow_nr, int dimm)
1233{
1234	u32 msb, weight, num_zero_bits;
1235	u32 addr_mask_deinterleaved;
1236	int size = 0;
1237
1238	/*
1239	 * The number of zero bits in the mask is equal to the number of bits
1240	 * in a full mask minus the number of bits in the current mask.
1241	 *
1242	 * The MSB is the number of bits in the full mask because BIT[0] is
1243	 * always 0.
1244	 *
1245	 * In the special 3 Rank interleaving case, a single bit is flipped
1246	 * without swapping with the most significant bit. This can be handled
1247	 * by keeping the MSB where it is and ignoring the single zero bit.
1248	 */
1249	msb = fls(addr_mask_orig) - 1;
1250	weight = hweight_long(addr_mask_orig);
1251	num_zero_bits = msb - weight - !!(cs_mode & CS_3R_INTERLEAVE);
1252
1253	/* Take the number of zero bits off from the top of the mask. */
1254	addr_mask_deinterleaved = GENMASK_ULL(msb - num_zero_bits, 1);
1255
1256	edac_dbg(1, "CS%d DIMM%d AddrMasks:\n", csrow_nr, dimm);
1257	edac_dbg(1, "  Original AddrMask: 0x%x\n", addr_mask_orig);
1258	edac_dbg(1, "  Deinterleaved AddrMask: 0x%x\n", addr_mask_deinterleaved);
1259
1260	/* Register [31:1] = Address [39:9]. Size is in kBs here. */
1261	size = (addr_mask_deinterleaved >> 2) + 1;
1262
1263	/* Return size in MBs. */
1264	return size >> 10;
1265}
1266
1267static int umc_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc,
1268				    unsigned int cs_mode, int csrow_nr)
1269{
1270	int cs_mask_nr = csrow_nr;
1271	u32 addr_mask_orig;
1272	int dimm, size = 0;
1273
1274	/* No Chip Selects are enabled. */
1275	if (!cs_mode)
1276		return size;
1277
1278	/* Requested size of an even CS but none are enabled. */
1279	if (!(cs_mode & CS_EVEN) && !(csrow_nr & 1))
1280		return size;
1281
1282	/* Requested size of an odd CS but none are enabled. */
1283	if (!(cs_mode & CS_ODD) && (csrow_nr & 1))
1284		return size;
1285
1286	/*
1287	 * Family 17h introduced systems with one mask per DIMM,
1288	 * and two Chip Selects per DIMM.
1289	 *
1290	 *	CS0 and CS1 -> MASK0 / DIMM0
1291	 *	CS2 and CS3 -> MASK1 / DIMM1
1292	 *
1293	 * Family 19h Model 10h introduced systems with one mask per Chip Select,
1294	 * and two Chip Selects per DIMM.
1295	 *
1296	 *	CS0 -> MASK0 -> DIMM0
1297	 *	CS1 -> MASK1 -> DIMM0
1298	 *	CS2 -> MASK2 -> DIMM1
1299	 *	CS3 -> MASK3 -> DIMM1
1300	 *
1301	 * Keep the mask number equal to the Chip Select number for newer systems,
1302	 * and shift the mask number for older systems.
1303	 */
1304	dimm = csrow_nr >> 1;
1305
1306	if (!pvt->flags.zn_regs_v2)
1307		cs_mask_nr >>= 1;
1308
1309	/* Asymmetric dual-rank DIMM support. */
1310	if ((csrow_nr & 1) && (cs_mode & CS_ODD_SECONDARY))
1311		addr_mask_orig = pvt->csels[umc].csmasks_sec[cs_mask_nr];
1312	else
1313		addr_mask_orig = pvt->csels[umc].csmasks[cs_mask_nr];
1314
1315	return __addr_mask_to_cs_size(addr_mask_orig, cs_mode, csrow_nr, dimm);
1316}
1317
1318static void umc_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
1319{
1320	int dimm, size0, size1, cs0, cs1, cs_mode;
1321
1322	edac_printk(KERN_DEBUG, EDAC_MC, "UMC%d chip selects:\n", ctrl);
1323
1324	for (dimm = 0; dimm < 2; dimm++) {
1325		cs0 = dimm * 2;
1326		cs1 = dimm * 2 + 1;
1327
1328		cs_mode = umc_get_cs_mode(dimm, ctrl, pvt);
1329
1330		size0 = umc_addr_mask_to_cs_size(pvt, ctrl, cs_mode, cs0);
1331		size1 = umc_addr_mask_to_cs_size(pvt, ctrl, cs_mode, cs1);
1332
1333		amd64_info(EDAC_MC ": %d: %5dMB %d: %5dMB\n",
1334				cs0,	size0,
1335				cs1,	size1);
1336	}
1337}
1338
1339static void umc_dump_misc_regs(struct amd64_pvt *pvt)
1340{
1341	struct amd64_umc *umc;
1342	u32 i, tmp, umc_base;
1343
1344	for_each_umc(i) {
1345		umc_base = get_umc_base(i);
1346		umc = &pvt->umc[i];
1347
1348		edac_dbg(1, "UMC%d DIMM cfg: 0x%x\n", i, umc->dimm_cfg);
1349		edac_dbg(1, "UMC%d UMC cfg: 0x%x\n", i, umc->umc_cfg);
1350		edac_dbg(1, "UMC%d SDP ctrl: 0x%x\n", i, umc->sdp_ctrl);
1351		edac_dbg(1, "UMC%d ECC ctrl: 0x%x\n", i, umc->ecc_ctrl);
1352
1353		amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_ECC_BAD_SYMBOL, &tmp);
1354		edac_dbg(1, "UMC%d ECC bad symbol: 0x%x\n", i, tmp);
1355
1356		amd_smn_read(pvt->mc_node_id, umc_base + UMCCH_UMC_CAP, &tmp);
1357		edac_dbg(1, "UMC%d UMC cap: 0x%x\n", i, tmp);
1358		edac_dbg(1, "UMC%d UMC cap high: 0x%x\n", i, umc->umc_cap_hi);
1359
1360		edac_dbg(1, "UMC%d ECC capable: %s, ChipKill ECC capable: %s\n",
1361				i, (umc->umc_cap_hi & BIT(30)) ? "yes" : "no",
1362				    (umc->umc_cap_hi & BIT(31)) ? "yes" : "no");
1363		edac_dbg(1, "UMC%d All DIMMs support ECC: %s\n",
1364				i, (umc->umc_cfg & BIT(12)) ? "yes" : "no");
1365		edac_dbg(1, "UMC%d x4 DIMMs present: %s\n",
1366				i, (umc->dimm_cfg & BIT(6)) ? "yes" : "no");
1367		edac_dbg(1, "UMC%d x16 DIMMs present: %s\n",
1368				i, (umc->dimm_cfg & BIT(7)) ? "yes" : "no");
1369
1370		if (umc->dram_type == MEM_LRDDR4 || umc->dram_type == MEM_LRDDR5) {
1371			amd_smn_read(pvt->mc_node_id,
1372				     umc_base + get_umc_reg(pvt, UMCCH_ADDR_CFG),
1373				     &tmp);
1374			edac_dbg(1, "UMC%d LRDIMM %dx rank multiply\n",
1375					i, 1 << ((tmp >> 4) & 0x3));
1376		}
1377
1378		umc_debug_display_dimm_sizes(pvt, i);
1379	}
1380}
1381
1382static void dct_dump_misc_regs(struct amd64_pvt *pvt)
1383{
1384	edac_dbg(1, "F3xE8 (NB Cap): 0x%08x\n", pvt->nbcap);
1385
1386	edac_dbg(1, "  NB two channel DRAM capable: %s\n",
1387		 (pvt->nbcap & NBCAP_DCT_DUAL) ? "yes" : "no");
1388
1389	edac_dbg(1, "  ECC capable: %s, ChipKill ECC capable: %s\n",
1390		 (pvt->nbcap & NBCAP_SECDED) ? "yes" : "no",
1391		 (pvt->nbcap & NBCAP_CHIPKILL) ? "yes" : "no");
1392
1393	debug_dump_dramcfg_low(pvt, pvt->dclr0, 0);
1394
1395	edac_dbg(1, "F3xB0 (Online Spare): 0x%08x\n", pvt->online_spare);
1396
1397	edac_dbg(1, "F1xF0 (DRAM Hole Address): 0x%08x, base: 0x%08x, offset: 0x%08x\n",
1398		 pvt->dhar, dhar_base(pvt),
1399		 (pvt->fam == 0xf) ? k8_dhar_offset(pvt)
1400				   : f10_dhar_offset(pvt));
1401
1402	dct_debug_display_dimm_sizes(pvt, 0);
1403
1404	/* everything below this point is Fam10h and above */
1405	if (pvt->fam == 0xf)
1406		return;
1407
1408	dct_debug_display_dimm_sizes(pvt, 1);
1409
1410	/* Only if NOT ganged does dclr1 have valid info */
1411	if (!dct_ganging_enabled(pvt))
1412		debug_dump_dramcfg_low(pvt, pvt->dclr1, 1);
1413
1414	edac_dbg(1, "  DramHoleValid: %s\n", dhar_valid(pvt) ? "yes" : "no");
1415
1416	amd64_info("using x%u syndromes.\n", pvt->ecc_sym_sz);
1417}
1418
1419/*
1420 * See BKDG, F2x[1,0][5C:40], F2[1,0][6C:60]
1421 */
1422static void dct_prep_chip_selects(struct amd64_pvt *pvt)
1423{
1424	if (pvt->fam == 0xf && pvt->ext_model < K8_REV_F) {
1425		pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
1426		pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 8;
1427	} else if (pvt->fam == 0x15 && pvt->model == 0x30) {
1428		pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 4;
1429		pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 2;
1430	} else {
1431		pvt->csels[0].b_cnt = pvt->csels[1].b_cnt = 8;
1432		pvt->csels[0].m_cnt = pvt->csels[1].m_cnt = 4;
1433	}
1434}
1435
1436static void umc_prep_chip_selects(struct amd64_pvt *pvt)
1437{
1438	int umc;
1439
1440	for_each_umc(umc) {
1441		pvt->csels[umc].b_cnt = 4;
1442		pvt->csels[umc].m_cnt = pvt->flags.zn_regs_v2 ? 4 : 2;
1443	}
1444}
1445
1446static void umc_read_base_mask(struct amd64_pvt *pvt)
1447{
1448	u32 umc_base_reg, umc_base_reg_sec;
1449	u32 umc_mask_reg, umc_mask_reg_sec;
1450	u32 base_reg, base_reg_sec;
1451	u32 mask_reg, mask_reg_sec;
1452	u32 *base, *base_sec;
1453	u32 *mask, *mask_sec;
1454	int cs, umc;
1455
1456	for_each_umc(umc) {
1457		umc_base_reg = get_umc_base(umc) + UMCCH_BASE_ADDR;
1458		umc_base_reg_sec = get_umc_base(umc) + UMCCH_BASE_ADDR_SEC;
1459
1460		for_each_chip_select(cs, umc, pvt) {
1461			base = &pvt->csels[umc].csbases[cs];
1462			base_sec = &pvt->csels[umc].csbases_sec[cs];
1463
1464			base_reg = umc_base_reg + (cs * 4);
1465			base_reg_sec = umc_base_reg_sec + (cs * 4);
1466
1467			if (!amd_smn_read(pvt->mc_node_id, base_reg, base))
1468				edac_dbg(0, "  DCSB%d[%d]=0x%08x reg: 0x%x\n",
1469					 umc, cs, *base, base_reg);
1470
1471			if (!amd_smn_read(pvt->mc_node_id, base_reg_sec, base_sec))
1472				edac_dbg(0, "    DCSB_SEC%d[%d]=0x%08x reg: 0x%x\n",
1473					 umc, cs, *base_sec, base_reg_sec);
1474		}
1475
1476		umc_mask_reg = get_umc_base(umc) + UMCCH_ADDR_MASK;
1477		umc_mask_reg_sec = get_umc_base(umc) + get_umc_reg(pvt, UMCCH_ADDR_MASK_SEC);
1478
1479		for_each_chip_select_mask(cs, umc, pvt) {
1480			mask = &pvt->csels[umc].csmasks[cs];
1481			mask_sec = &pvt->csels[umc].csmasks_sec[cs];
1482
1483			mask_reg = umc_mask_reg + (cs * 4);
1484			mask_reg_sec = umc_mask_reg_sec + (cs * 4);
1485
1486			if (!amd_smn_read(pvt->mc_node_id, mask_reg, mask))
1487				edac_dbg(0, "  DCSM%d[%d]=0x%08x reg: 0x%x\n",
1488					 umc, cs, *mask, mask_reg);
1489
1490			if (!amd_smn_read(pvt->mc_node_id, mask_reg_sec, mask_sec))
1491				edac_dbg(0, "    DCSM_SEC%d[%d]=0x%08x reg: 0x%x\n",
1492					 umc, cs, *mask_sec, mask_reg_sec);
1493		}
1494	}
1495}
1496
1497/*
1498 * Function 2 Offset F10_DCSB0; read in the DCS Base and DCS Mask registers
1499 */
1500static void dct_read_base_mask(struct amd64_pvt *pvt)
1501{
1502	int cs;
1503
1504	for_each_chip_select(cs, 0, pvt) {
1505		int reg0   = DCSB0 + (cs * 4);
1506		int reg1   = DCSB1 + (cs * 4);
1507		u32 *base0 = &pvt->csels[0].csbases[cs];
1508		u32 *base1 = &pvt->csels[1].csbases[cs];
1509
1510		if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, base0))
1511			edac_dbg(0, "  DCSB0[%d]=0x%08x reg: F2x%x\n",
1512				 cs, *base0, reg0);
1513
1514		if (pvt->fam == 0xf)
1515			continue;
1516
1517		if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, base1))
1518			edac_dbg(0, "  DCSB1[%d]=0x%08x reg: F2x%x\n",
1519				 cs, *base1, (pvt->fam == 0x10) ? reg1
1520							: reg0);
1521	}
1522
1523	for_each_chip_select_mask(cs, 0, pvt) {
1524		int reg0   = DCSM0 + (cs * 4);
1525		int reg1   = DCSM1 + (cs * 4);
1526		u32 *mask0 = &pvt->csels[0].csmasks[cs];
1527		u32 *mask1 = &pvt->csels[1].csmasks[cs];
1528
1529		if (!amd64_read_dct_pci_cfg(pvt, 0, reg0, mask0))
1530			edac_dbg(0, "    DCSM0[%d]=0x%08x reg: F2x%x\n",
1531				 cs, *mask0, reg0);
1532
1533		if (pvt->fam == 0xf)
1534			continue;
1535
1536		if (!amd64_read_dct_pci_cfg(pvt, 1, reg0, mask1))
1537			edac_dbg(0, "    DCSM1[%d]=0x%08x reg: F2x%x\n",
1538				 cs, *mask1, (pvt->fam == 0x10) ? reg1
1539							: reg0);
1540	}
1541}
1542
1543static void umc_determine_memory_type(struct amd64_pvt *pvt)
1544{
1545	struct amd64_umc *umc;
1546	u32 i;
1547
1548	for_each_umc(i) {
1549		umc = &pvt->umc[i];
1550
1551		if (!(umc->sdp_ctrl & UMC_SDP_INIT)) {
1552			umc->dram_type = MEM_EMPTY;
1553			continue;
1554		}
1555
1556		/*
1557		 * Check if the system supports the "DDR Type" field in UMC Config
1558		 * and has DDR5 DIMMs in use.
1559		 */
1560		if (pvt->flags.zn_regs_v2 && ((umc->umc_cfg & GENMASK(2, 0)) == 0x1)) {
1561			if (umc->dimm_cfg & BIT(5))
1562				umc->dram_type = MEM_LRDDR5;
1563			else if (umc->dimm_cfg & BIT(4))
1564				umc->dram_type = MEM_RDDR5;
1565			else
1566				umc->dram_type = MEM_DDR5;
1567		} else {
1568			if (umc->dimm_cfg & BIT(5))
1569				umc->dram_type = MEM_LRDDR4;
1570			else if (umc->dimm_cfg & BIT(4))
1571				umc->dram_type = MEM_RDDR4;
1572			else
1573				umc->dram_type = MEM_DDR4;
1574		}
1575
1576		edac_dbg(1, "  UMC%d DIMM type: %s\n", i, edac_mem_types[umc->dram_type]);
1577	}
1578}
1579
1580static void dct_determine_memory_type(struct amd64_pvt *pvt)
1581{
1582	u32 dram_ctrl, dcsm;
1583
1584	switch (pvt->fam) {
1585	case 0xf:
1586		if (pvt->ext_model >= K8_REV_F)
1587			goto ddr3;
1588
1589		pvt->dram_type = (pvt->dclr0 & BIT(18)) ? MEM_DDR : MEM_RDDR;
1590		return;
1591
1592	case 0x10:
1593		if (pvt->dchr0 & DDR3_MODE)
1594			goto ddr3;
1595
1596		pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR2 : MEM_RDDR2;
1597		return;
1598
1599	case 0x15:
1600		if (pvt->model < 0x60)
1601			goto ddr3;
1602
1603		/*
1604		 * Model 0x60h needs special handling:
1605		 *
1606		 * We use a Chip Select value of '0' to obtain dcsm.
1607		 * Theoretically, it is possible to populate LRDIMMs of different
1608		 * 'Rank' value on a DCT. But this is not the common case. So,
1609		 * it's reasonable to assume all DIMMs are going to be of same
1610		 * 'type' until proven otherwise.
1611		 */
1612		amd64_read_dct_pci_cfg(pvt, 0, DRAM_CONTROL, &dram_ctrl);
1613		dcsm = pvt->csels[0].csmasks[0];
1614
1615		if (((dram_ctrl >> 8) & 0x7) == 0x2)
1616			pvt->dram_type = MEM_DDR4;
1617		else if (pvt->dclr0 & BIT(16))
1618			pvt->dram_type = MEM_DDR3;
1619		else if (dcsm & 0x3)
1620			pvt->dram_type = MEM_LRDDR3;
1621		else
1622			pvt->dram_type = MEM_RDDR3;
1623
1624		return;
1625
1626	case 0x16:
1627		goto ddr3;
1628
1629	default:
1630		WARN(1, KERN_ERR "%s: Family??? 0x%x\n", __func__, pvt->fam);
1631		pvt->dram_type = MEM_EMPTY;
1632	}
1633
1634	edac_dbg(1, "  DIMM type: %s\n", edac_mem_types[pvt->dram_type]);
1635	return;
1636
1637ddr3:
1638	pvt->dram_type = (pvt->dclr0 & BIT(16)) ? MEM_DDR3 : MEM_RDDR3;
1639}
1640
1641/* On F10h and later ErrAddr is MC4_ADDR[47:1] */
1642static u64 get_error_address(struct amd64_pvt *pvt, struct mce *m)
1643{
1644	u16 mce_nid = topology_amd_node_id(m->extcpu);
1645	struct mem_ctl_info *mci;
1646	u8 start_bit = 1;
1647	u8 end_bit   = 47;
1648	u64 addr;
1649
1650	mci = edac_mc_find(mce_nid);
1651	if (!mci)
1652		return 0;
1653
1654	pvt = mci->pvt_info;
1655
1656	if (pvt->fam == 0xf) {
1657		start_bit = 3;
1658		end_bit   = 39;
1659	}
1660
1661	addr = m->addr & GENMASK_ULL(end_bit, start_bit);
1662
1663	/*
1664	 * Erratum 637 workaround
1665	 */
1666	if (pvt->fam == 0x15) {
1667		u64 cc6_base, tmp_addr;
1668		u32 tmp;
1669		u8 intlv_en;
1670
1671		if ((addr & GENMASK_ULL(47, 24)) >> 24 != 0x00fdf7)
1672			return addr;
1673
1674
1675		amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_LIM, &tmp);
1676		intlv_en = tmp >> 21 & 0x7;
1677
1678		/* add [47:27] + 3 trailing bits */
1679		cc6_base  = (tmp & GENMASK_ULL(20, 0)) << 3;
1680
1681		/* reverse and add DramIntlvEn */
1682		cc6_base |= intlv_en ^ 0x7;
1683
1684		/* pin at [47:24] */
1685		cc6_base <<= 24;
1686
1687		if (!intlv_en)
1688			return cc6_base | (addr & GENMASK_ULL(23, 0));
1689
1690		amd64_read_pci_cfg(pvt->F1, DRAM_LOCAL_NODE_BASE, &tmp);
1691
1692							/* faster log2 */
1693		tmp_addr  = (addr & GENMASK_ULL(23, 12)) << __fls(intlv_en + 1);
1694
1695		/* OR DramIntlvSel into bits [14:12] */
1696		tmp_addr |= (tmp & GENMASK_ULL(23, 21)) >> 9;
1697
1698		/* add remaining [11:0] bits from original MC4_ADDR */
1699		tmp_addr |= addr & GENMASK_ULL(11, 0);
1700
1701		return cc6_base | tmp_addr;
1702	}
1703
1704	return addr;
1705}
1706
1707static struct pci_dev *pci_get_related_function(unsigned int vendor,
1708						unsigned int device,
1709						struct pci_dev *related)
1710{
1711	struct pci_dev *dev = NULL;
1712
1713	while ((dev = pci_get_device(vendor, device, dev))) {
1714		if (pci_domain_nr(dev->bus) == pci_domain_nr(related->bus) &&
1715		    (dev->bus->number == related->bus->number) &&
1716		    (PCI_SLOT(dev->devfn) == PCI_SLOT(related->devfn)))
1717			break;
1718	}
1719
1720	return dev;
1721}
1722
1723static void read_dram_base_limit_regs(struct amd64_pvt *pvt, unsigned range)
1724{
1725	struct amd_northbridge *nb;
1726	struct pci_dev *f1 = NULL;
1727	unsigned int pci_func;
1728	int off = range << 3;
1729	u32 llim;
1730
1731	amd64_read_pci_cfg(pvt->F1, DRAM_BASE_LO + off,  &pvt->ranges[range].base.lo);
1732	amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_LO + off, &pvt->ranges[range].lim.lo);
1733
1734	if (pvt->fam == 0xf)
1735		return;
1736
1737	if (!dram_rw(pvt, range))
1738		return;
1739
1740	amd64_read_pci_cfg(pvt->F1, DRAM_BASE_HI + off,  &pvt->ranges[range].base.hi);
1741	amd64_read_pci_cfg(pvt->F1, DRAM_LIMIT_HI + off, &pvt->ranges[range].lim.hi);
1742
1743	/* F15h: factor in CC6 save area by reading dst node's limit reg */
1744	if (pvt->fam != 0x15)
1745		return;
1746
1747	nb = node_to_amd_nb(dram_dst_node(pvt, range));
1748	if (WARN_ON(!nb))
1749		return;
1750
1751	if (pvt->model == 0x60)
1752		pci_func = PCI_DEVICE_ID_AMD_15H_M60H_NB_F1;
1753	else if (pvt->model == 0x30)
1754		pci_func = PCI_DEVICE_ID_AMD_15H_M30H_NB_F1;
1755	else
1756		pci_func = PCI_DEVICE_ID_AMD_15H_NB_F1;
1757
1758	f1 = pci_get_related_function(nb->misc->vendor, pci_func, nb->misc);
1759	if (WARN_ON(!f1))
1760		return;
1761
1762	amd64_read_pci_cfg(f1, DRAM_LOCAL_NODE_LIM, &llim);
1763
1764	pvt->ranges[range].lim.lo &= GENMASK_ULL(15, 0);
1765
1766				    /* {[39:27],111b} */
1767	pvt->ranges[range].lim.lo |= ((llim & 0x1fff) << 3 | 0x7) << 16;
1768
1769	pvt->ranges[range].lim.hi &= GENMASK_ULL(7, 0);
1770
1771				    /* [47:40] */
1772	pvt->ranges[range].lim.hi |= llim >> 13;
1773
1774	pci_dev_put(f1);
1775}
1776
1777static void k8_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
1778				    struct err_info *err)
1779{
1780	struct amd64_pvt *pvt = mci->pvt_info;
1781
1782	error_address_to_page_and_offset(sys_addr, err);
1783
1784	/*
1785	 * Find out which node the error address belongs to. This may be
1786	 * different from the node that detected the error.
1787	 */
1788	err->src_mci = find_mc_by_sys_addr(mci, sys_addr);
1789	if (!err->src_mci) {
1790		amd64_mc_err(mci, "failed to map error addr 0x%lx to a node\n",
1791			     (unsigned long)sys_addr);
1792		err->err_code = ERR_NODE;
1793		return;
1794	}
1795
1796	/* Now map the sys_addr to a CSROW */
1797	err->csrow = sys_addr_to_csrow(err->src_mci, sys_addr);
1798	if (err->csrow < 0) {
1799		err->err_code = ERR_CSROW;
1800		return;
1801	}
1802
1803	/* CHIPKILL enabled */
1804	if (pvt->nbcfg & NBCFG_CHIPKILL) {
1805		err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
1806		if (err->channel < 0) {
1807			/*
1808			 * Syndrome didn't map, so we don't know which of the
1809			 * 2 DIMMs is in error. So we need to ID 'both' of them
1810			 * as suspect.
1811			 */
1812			amd64_mc_warn(err->src_mci, "unknown syndrome 0x%04x - "
1813				      "possible error reporting race\n",
1814				      err->syndrome);
1815			err->err_code = ERR_CHANNEL;
1816			return;
1817		}
1818	} else {
1819		/*
1820		 * non-chipkill ecc mode
1821		 *
1822		 * The k8 documentation is unclear about how to determine the
1823		 * channel number when using non-chipkill memory.  This method
1824		 * was obtained from email communication with someone at AMD.
1825		 * (Wish the email was placed in this comment - norsk)
1826		 */
1827		err->channel = ((sys_addr & BIT(3)) != 0);
1828	}
1829}
1830
1831static int ddr2_cs_size(unsigned i, bool dct_width)
1832{
1833	unsigned shift = 0;
1834
1835	if (i <= 2)
1836		shift = i;
1837	else if (!(i & 0x1))
1838		shift = i >> 1;
1839	else
1840		shift = (i + 1) >> 1;
1841
1842	return 128 << (shift + !!dct_width);
1843}
1844
1845static int k8_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1846				  unsigned cs_mode, int cs_mask_nr)
1847{
1848	u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1849
1850	if (pvt->ext_model >= K8_REV_F) {
1851		WARN_ON(cs_mode > 11);
1852		return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1853	}
1854	else if (pvt->ext_model >= K8_REV_D) {
1855		unsigned diff;
1856		WARN_ON(cs_mode > 10);
1857
1858		/*
1859		 * the below calculation, besides trying to win an obfuscated C
1860		 * contest, maps cs_mode values to DIMM chip select sizes. The
1861		 * mappings are:
1862		 *
1863		 * cs_mode	CS size (mb)
1864		 * =======	============
1865		 * 0		32
1866		 * 1		64
1867		 * 2		128
1868		 * 3		128
1869		 * 4		256
1870		 * 5		512
1871		 * 6		256
1872		 * 7		512
1873		 * 8		1024
1874		 * 9		1024
1875		 * 10		2048
1876		 *
1877		 * Basically, it calculates a value with which to shift the
1878		 * smallest CS size of 32MB.
1879		 *
1880		 * ddr[23]_cs_size have a similar purpose.
1881		 */
1882		diff = cs_mode/3 + (unsigned)(cs_mode > 5);
1883
1884		return 32 << (cs_mode - diff);
1885	}
1886	else {
1887		WARN_ON(cs_mode > 6);
1888		return 32 << cs_mode;
1889	}
1890}
1891
1892static int ddr3_cs_size(unsigned i, bool dct_width)
1893{
1894	unsigned shift = 0;
1895	int cs_size = 0;
1896
1897	if (i == 0 || i == 3 || i == 4)
1898		cs_size = -1;
1899	else if (i <= 2)
1900		shift = i;
1901	else if (i == 12)
1902		shift = 7;
1903	else if (!(i & 0x1))
1904		shift = i >> 1;
1905	else
1906		shift = (i + 1) >> 1;
1907
1908	if (cs_size != -1)
1909		cs_size = (128 * (1 << !!dct_width)) << shift;
1910
1911	return cs_size;
1912}
1913
1914static int ddr3_lrdimm_cs_size(unsigned i, unsigned rank_multiply)
1915{
1916	unsigned shift = 0;
1917	int cs_size = 0;
1918
1919	if (i < 4 || i == 6)
1920		cs_size = -1;
1921	else if (i == 12)
1922		shift = 7;
1923	else if (!(i & 0x1))
1924		shift = i >> 1;
1925	else
1926		shift = (i + 1) >> 1;
1927
1928	if (cs_size != -1)
1929		cs_size = rank_multiply * (128 << shift);
1930
1931	return cs_size;
1932}
1933
1934static int ddr4_cs_size(unsigned i)
1935{
1936	int cs_size = 0;
1937
1938	if (i == 0)
1939		cs_size = -1;
1940	else if (i == 1)
1941		cs_size = 1024;
1942	else
1943		/* Min cs_size = 1G */
1944		cs_size = 1024 * (1 << (i >> 1));
1945
1946	return cs_size;
1947}
1948
1949static int f10_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1950				   unsigned cs_mode, int cs_mask_nr)
1951{
1952	u32 dclr = dct ? pvt->dclr1 : pvt->dclr0;
1953
1954	WARN_ON(cs_mode > 11);
1955
1956	if (pvt->dchr0 & DDR3_MODE || pvt->dchr1 & DDR3_MODE)
1957		return ddr3_cs_size(cs_mode, dclr & WIDTH_128);
1958	else
1959		return ddr2_cs_size(cs_mode, dclr & WIDTH_128);
1960}
1961
1962/*
1963 * F15h supports only 64bit DCT interfaces
1964 */
1965static int f15_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1966				   unsigned cs_mode, int cs_mask_nr)
1967{
1968	WARN_ON(cs_mode > 12);
1969
1970	return ddr3_cs_size(cs_mode, false);
1971}
1972
1973/* F15h M60h supports DDR4 mapping as well.. */
1974static int f15_m60h_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
1975					unsigned cs_mode, int cs_mask_nr)
1976{
1977	int cs_size;
1978	u32 dcsm = pvt->csels[dct].csmasks[cs_mask_nr];
1979
1980	WARN_ON(cs_mode > 12);
1981
1982	if (pvt->dram_type == MEM_DDR4) {
1983		if (cs_mode > 9)
1984			return -1;
1985
1986		cs_size = ddr4_cs_size(cs_mode);
1987	} else if (pvt->dram_type == MEM_LRDDR3) {
1988		unsigned rank_multiply = dcsm & 0xf;
1989
1990		if (rank_multiply == 3)
1991			rank_multiply = 4;
1992		cs_size = ddr3_lrdimm_cs_size(cs_mode, rank_multiply);
1993	} else {
1994		/* Minimum cs size is 512mb for F15hM60h*/
1995		if (cs_mode == 0x1)
1996			return -1;
1997
1998		cs_size = ddr3_cs_size(cs_mode, false);
1999	}
2000
2001	return cs_size;
2002}
2003
2004/*
2005 * F16h and F15h model 30h have only limited cs_modes.
2006 */
2007static int f16_dbam_to_chip_select(struct amd64_pvt *pvt, u8 dct,
2008				unsigned cs_mode, int cs_mask_nr)
2009{
2010	WARN_ON(cs_mode > 12);
2011
2012	if (cs_mode == 6 || cs_mode == 8 ||
2013	    cs_mode == 9 || cs_mode == 12)
2014		return -1;
2015	else
2016		return ddr3_cs_size(cs_mode, false);
2017}
2018
2019static void read_dram_ctl_register(struct amd64_pvt *pvt)
2020{
2021
2022	if (pvt->fam == 0xf)
2023		return;
2024
2025	if (!amd64_read_pci_cfg(pvt->F2, DCT_SEL_LO, &pvt->dct_sel_lo)) {
2026		edac_dbg(0, "F2x110 (DCTSelLow): 0x%08x, High range addrs at: 0x%x\n",
2027			 pvt->dct_sel_lo, dct_sel_baseaddr(pvt));
2028
2029		edac_dbg(0, "  DCTs operate in %s mode\n",
2030			 (dct_ganging_enabled(pvt) ? "ganged" : "unganged"));
2031
2032		if (!dct_ganging_enabled(pvt))
2033			edac_dbg(0, "  Address range split per DCT: %s\n",
2034				 (dct_high_range_enabled(pvt) ? "yes" : "no"));
2035
2036		edac_dbg(0, "  data interleave for ECC: %s, DRAM cleared since last warm reset: %s\n",
2037			 (dct_data_intlv_enabled(pvt) ? "enabled" : "disabled"),
2038			 (dct_memory_cleared(pvt) ? "yes" : "no"));
2039
2040		edac_dbg(0, "  channel interleave: %s, "
2041			 "interleave bits selector: 0x%x\n",
2042			 (dct_interleave_enabled(pvt) ? "enabled" : "disabled"),
2043			 dct_sel_interleave_addr(pvt));
2044	}
2045
2046	amd64_read_pci_cfg(pvt->F2, DCT_SEL_HI, &pvt->dct_sel_hi);
2047}
2048
2049/*
2050 * Determine channel (DCT) based on the interleaving mode (see F15h M30h BKDG,
2051 * 2.10.12 Memory Interleaving Modes).
2052 */
2053static u8 f15_m30h_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
2054				     u8 intlv_en, int num_dcts_intlv,
2055				     u32 dct_sel)
2056{
2057	u8 channel = 0;
2058	u8 select;
2059
2060	if (!(intlv_en))
2061		return (u8)(dct_sel);
2062
2063	if (num_dcts_intlv == 2) {
2064		select = (sys_addr >> 8) & 0x3;
2065		channel = select ? 0x3 : 0;
2066	} else if (num_dcts_intlv == 4) {
2067		u8 intlv_addr = dct_sel_interleave_addr(pvt);
2068		switch (intlv_addr) {
2069		case 0x4:
2070			channel = (sys_addr >> 8) & 0x3;
2071			break;
2072		case 0x5:
2073			channel = (sys_addr >> 9) & 0x3;
2074			break;
2075		}
2076	}
2077	return channel;
2078}
2079
2080/*
2081 * Determine channel (DCT) based on the interleaving mode: F10h BKDG, 2.8.9 Memory
2082 * Interleaving Modes.
2083 */
2084static u8 f1x_determine_channel(struct amd64_pvt *pvt, u64 sys_addr,
2085				bool hi_range_sel, u8 intlv_en)
2086{
2087	u8 dct_sel_high = (pvt->dct_sel_lo >> 1) & 1;
2088
2089	if (dct_ganging_enabled(pvt))
2090		return 0;
2091
2092	if (hi_range_sel)
2093		return dct_sel_high;
2094
2095	/*
2096	 * see F2x110[DctSelIntLvAddr] - channel interleave mode
2097	 */
2098	if (dct_interleave_enabled(pvt)) {
2099		u8 intlv_addr = dct_sel_interleave_addr(pvt);
2100
2101		/* return DCT select function: 0=DCT0, 1=DCT1 */
2102		if (!intlv_addr)
2103			return sys_addr >> 6 & 1;
2104
2105		if (intlv_addr & 0x2) {
2106			u8 shift = intlv_addr & 0x1 ? 9 : 6;
2107			u32 temp = hweight_long((u32) ((sys_addr >> 16) & 0x1F)) & 1;
2108
2109			return ((sys_addr >> shift) & 1) ^ temp;
2110		}
2111
2112		if (intlv_addr & 0x4) {
2113			u8 shift = intlv_addr & 0x1 ? 9 : 8;
2114
2115			return (sys_addr >> shift) & 1;
2116		}
2117
2118		return (sys_addr >> (12 + hweight8(intlv_en))) & 1;
2119	}
2120
2121	if (dct_high_range_enabled(pvt))
2122		return ~dct_sel_high & 1;
2123
2124	return 0;
2125}
2126
2127/* Convert the sys_addr to the normalized DCT address */
2128static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, u8 range,
2129				 u64 sys_addr, bool hi_rng,
2130				 u32 dct_sel_base_addr)
2131{
2132	u64 chan_off;
2133	u64 dram_base		= get_dram_base(pvt, range);
2134	u64 hole_off		= f10_dhar_offset(pvt);
2135	u64 dct_sel_base_off	= (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16;
2136
2137	if (hi_rng) {
2138		/*
2139		 * if
2140		 * base address of high range is below 4Gb
2141		 * (bits [47:27] at [31:11])
2142		 * DRAM address space on this DCT is hoisted above 4Gb	&&
2143		 * sys_addr > 4Gb
2144		 *
2145		 *	remove hole offset from sys_addr
2146		 * else
2147		 *	remove high range offset from sys_addr
2148		 */
2149		if ((!(dct_sel_base_addr >> 16) ||
2150		     dct_sel_base_addr < dhar_base(pvt)) &&
2151		    dhar_valid(pvt) &&
2152		    (sys_addr >= BIT_64(32)))
2153			chan_off = hole_off;
2154		else
2155			chan_off = dct_sel_base_off;
2156	} else {
2157		/*
2158		 * if
2159		 * we have a valid hole		&&
2160		 * sys_addr > 4Gb
2161		 *
2162		 *	remove hole
2163		 * else
2164		 *	remove dram base to normalize to DCT address
2165		 */
2166		if (dhar_valid(pvt) && (sys_addr >= BIT_64(32)))
2167			chan_off = hole_off;
2168		else
2169			chan_off = dram_base;
2170	}
2171
2172	return (sys_addr & GENMASK_ULL(47,6)) - (chan_off & GENMASK_ULL(47,23));
2173}
2174
2175/*
2176 * checks if the csrow passed in is marked as SPARED, if so returns the new
2177 * spare row
2178 */
2179static int f10_process_possible_spare(struct amd64_pvt *pvt, u8 dct, int csrow)
2180{
2181	int tmp_cs;
2182
2183	if (online_spare_swap_done(pvt, dct) &&
2184	    csrow == online_spare_bad_dramcs(pvt, dct)) {
2185
2186		for_each_chip_select(tmp_cs, dct, pvt) {
2187			if (chip_select_base(tmp_cs, dct, pvt) & 0x2) {
2188				csrow = tmp_cs;
2189				break;
2190			}
2191		}
2192	}
2193	return csrow;
2194}
2195
2196/*
2197 * Iterate over the DRAM DCT "base" and "mask" registers looking for a
2198 * SystemAddr match on the specified 'ChannelSelect' and 'NodeID'
2199 *
2200 * Return:
2201 *	-EINVAL:  NOT FOUND
2202 *	0..csrow = Chip-Select Row
2203 */
2204static int f1x_lookup_addr_in_dct(u64 in_addr, u8 nid, u8 dct)
2205{
2206	struct mem_ctl_info *mci;
2207	struct amd64_pvt *pvt;
2208	u64 cs_base, cs_mask;
2209	int cs_found = -EINVAL;
2210	int csrow;
2211
2212	mci = edac_mc_find(nid);
2213	if (!mci)
2214		return cs_found;
2215
2216	pvt = mci->pvt_info;
2217
2218	edac_dbg(1, "input addr: 0x%llx, DCT: %d\n", in_addr, dct);
2219
2220	for_each_chip_select(csrow, dct, pvt) {
2221		if (!csrow_enabled(csrow, dct, pvt))
2222			continue;
2223
2224		get_cs_base_and_mask(pvt, csrow, dct, &cs_base, &cs_mask);
2225
2226		edac_dbg(1, "    CSROW=%d CSBase=0x%llx CSMask=0x%llx\n",
2227			 csrow, cs_base, cs_mask);
2228
2229		cs_mask = ~cs_mask;
2230
2231		edac_dbg(1, "    (InputAddr & ~CSMask)=0x%llx (CSBase & ~CSMask)=0x%llx\n",
2232			 (in_addr & cs_mask), (cs_base & cs_mask));
2233
2234		if ((in_addr & cs_mask) == (cs_base & cs_mask)) {
2235			if (pvt->fam == 0x15 && pvt->model >= 0x30) {
2236				cs_found =  csrow;
2237				break;
2238			}
2239			cs_found = f10_process_possible_spare(pvt, dct, csrow);
2240
2241			edac_dbg(1, " MATCH csrow=%d\n", cs_found);
2242			break;
2243		}
2244	}
2245	return cs_found;
2246}
2247
2248/*
2249 * See F2x10C. Non-interleaved graphics framebuffer memory under the 16G is
2250 * swapped with a region located at the bottom of memory so that the GPU can use
2251 * the interleaved region and thus two channels.
2252 */
2253static u64 f1x_swap_interleaved_region(struct amd64_pvt *pvt, u64 sys_addr)
2254{
2255	u32 swap_reg, swap_base, swap_limit, rgn_size, tmp_addr;
2256
2257	if (pvt->fam == 0x10) {
2258		/* only revC3 and revE have that feature */
2259		if (pvt->model < 4 || (pvt->model < 0xa && pvt->stepping < 3))
2260			return sys_addr;
2261	}
2262
2263	amd64_read_pci_cfg(pvt->F2, SWAP_INTLV_REG, &swap_reg);
2264
2265	if (!(swap_reg & 0x1))
2266		return sys_addr;
2267
2268	swap_base	= (swap_reg >> 3) & 0x7f;
2269	swap_limit	= (swap_reg >> 11) & 0x7f;
2270	rgn_size	= (swap_reg >> 20) & 0x7f;
2271	tmp_addr	= sys_addr >> 27;
2272
2273	if (!(sys_addr >> 34) &&
2274	    (((tmp_addr >= swap_base) &&
2275	     (tmp_addr <= swap_limit)) ||
2276	     (tmp_addr < rgn_size)))
2277		return sys_addr ^ (u64)swap_base << 27;
2278
2279	return sys_addr;
2280}
2281
2282/* For a given @dram_range, check if @sys_addr falls within it. */
2283static int f1x_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
2284				  u64 sys_addr, int *chan_sel)
2285{
2286	int cs_found = -EINVAL;
2287	u64 chan_addr;
2288	u32 dct_sel_base;
2289	u8 channel;
2290	bool high_range = false;
2291
2292	u8 node_id    = dram_dst_node(pvt, range);
2293	u8 intlv_en   = dram_intlv_en(pvt, range);
2294	u32 intlv_sel = dram_intlv_sel(pvt, range);
2295
2296	edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
2297		 range, sys_addr, get_dram_limit(pvt, range));
2298
2299	if (dhar_valid(pvt) &&
2300	    dhar_base(pvt) <= sys_addr &&
2301	    sys_addr < BIT_64(32)) {
2302		amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2303			    sys_addr);
2304		return -EINVAL;
2305	}
2306
2307	if (intlv_en && (intlv_sel != ((sys_addr >> 12) & intlv_en)))
2308		return -EINVAL;
2309
2310	sys_addr = f1x_swap_interleaved_region(pvt, sys_addr);
2311
2312	dct_sel_base = dct_sel_baseaddr(pvt);
2313
2314	/*
2315	 * check whether addresses >= DctSelBaseAddr[47:27] are to be used to
2316	 * select between DCT0 and DCT1.
2317	 */
2318	if (dct_high_range_enabled(pvt) &&
2319	   !dct_ganging_enabled(pvt) &&
2320	   ((sys_addr >> 27) >= (dct_sel_base >> 11)))
2321		high_range = true;
2322
2323	channel = f1x_determine_channel(pvt, sys_addr, high_range, intlv_en);
2324
2325	chan_addr = f1x_get_norm_dct_addr(pvt, range, sys_addr,
2326					  high_range, dct_sel_base);
2327
2328	/* Remove node interleaving, see F1x120 */
2329	if (intlv_en)
2330		chan_addr = ((chan_addr >> (12 + hweight8(intlv_en))) << 12) |
2331			    (chan_addr & 0xfff);
2332
2333	/* remove channel interleave */
2334	if (dct_interleave_enabled(pvt) &&
2335	   !dct_high_range_enabled(pvt) &&
2336	   !dct_ganging_enabled(pvt)) {
2337
2338		if (dct_sel_interleave_addr(pvt) != 1) {
2339			if (dct_sel_interleave_addr(pvt) == 0x3)
2340				/* hash 9 */
2341				chan_addr = ((chan_addr >> 10) << 9) |
2342					     (chan_addr & 0x1ff);
2343			else
2344				/* A[6] or hash 6 */
2345				chan_addr = ((chan_addr >> 7) << 6) |
2346					     (chan_addr & 0x3f);
2347		} else
2348			/* A[12] */
2349			chan_addr = ((chan_addr >> 13) << 12) |
2350				     (chan_addr & 0xfff);
2351	}
2352
2353	edac_dbg(1, "   Normalized DCT addr: 0x%llx\n", chan_addr);
2354
2355	cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, channel);
2356
2357	if (cs_found >= 0)
2358		*chan_sel = channel;
2359
2360	return cs_found;
2361}
2362
2363static int f15_m30h_match_to_this_node(struct amd64_pvt *pvt, unsigned range,
2364					u64 sys_addr, int *chan_sel)
2365{
2366	int cs_found = -EINVAL;
2367	int num_dcts_intlv = 0;
2368	u64 chan_addr, chan_offset;
2369	u64 dct_base, dct_limit;
2370	u32 dct_cont_base_reg, dct_cont_limit_reg, tmp;
2371	u8 channel, alias_channel, leg_mmio_hole, dct_sel, dct_offset_en;
2372
2373	u64 dhar_offset		= f10_dhar_offset(pvt);
2374	u8 intlv_addr		= dct_sel_interleave_addr(pvt);
2375	u8 node_id		= dram_dst_node(pvt, range);
2376	u8 intlv_en		= dram_intlv_en(pvt, range);
2377
2378	amd64_read_pci_cfg(pvt->F1, DRAM_CONT_BASE, &dct_cont_base_reg);
2379	amd64_read_pci_cfg(pvt->F1, DRAM_CONT_LIMIT, &dct_cont_limit_reg);
2380
2381	dct_offset_en		= (u8) ((dct_cont_base_reg >> 3) & BIT(0));
2382	dct_sel			= (u8) ((dct_cont_base_reg >> 4) & 0x7);
2383
2384	edac_dbg(1, "(range %d) SystemAddr= 0x%llx Limit=0x%llx\n",
2385		 range, sys_addr, get_dram_limit(pvt, range));
2386
2387	if (!(get_dram_base(pvt, range)  <= sys_addr) &&
2388	    !(get_dram_limit(pvt, range) >= sys_addr))
2389		return -EINVAL;
2390
2391	if (dhar_valid(pvt) &&
2392	    dhar_base(pvt) <= sys_addr &&
2393	    sys_addr < BIT_64(32)) {
2394		amd64_warn("Huh? Address is in the MMIO hole: 0x%016llx\n",
2395			    sys_addr);
2396		return -EINVAL;
2397	}
2398
2399	/* Verify sys_addr is within DCT Range. */
2400	dct_base = (u64) dct_sel_baseaddr(pvt);
2401	dct_limit = (dct_cont_limit_reg >> 11) & 0x1FFF;
2402
2403	if (!(dct_cont_base_reg & BIT(0)) &&
2404	    !(dct_base <= (sys_addr >> 27) &&
2405	      dct_limit >= (sys_addr >> 27)))
2406		return -EINVAL;
2407
2408	/* Verify number of dct's that participate in channel interleaving. */
2409	num_dcts_intlv = (int) hweight8(intlv_en);
2410
2411	if (!(num_dcts_intlv % 2 == 0) || (num_dcts_intlv > 4))
2412		return -EINVAL;
2413
2414	if (pvt->model >= 0x60)
2415		channel = f1x_determine_channel(pvt, sys_addr, false, intlv_en);
2416	else
2417		channel = f15_m30h_determine_channel(pvt, sys_addr, intlv_en,
2418						     num_dcts_intlv, dct_sel);
2419
2420	/* Verify we stay within the MAX number of channels allowed */
2421	if (channel > 3)
2422		return -EINVAL;
2423
2424	leg_mmio_hole = (u8) (dct_cont_base_reg >> 1 & BIT(0));
2425
2426	/* Get normalized DCT addr */
2427	if (leg_mmio_hole && (sys_addr >= BIT_64(32)))
2428		chan_offset = dhar_offset;
2429	else
2430		chan_offset = dct_base << 27;
2431
2432	chan_addr = sys_addr - chan_offset;
2433
2434	/* remove channel interleave */
2435	if (num_dcts_intlv == 2) {
2436		if (intlv_addr == 0x4)
2437			chan_addr = ((chan_addr >> 9) << 8) |
2438						(chan_addr & 0xff);
2439		else if (intlv_addr == 0x5)
2440			chan_addr = ((chan_addr >> 10) << 9) |
2441						(chan_addr & 0x1ff);
2442		else
2443			return -EINVAL;
2444
2445	} else if (num_dcts_intlv == 4) {
2446		if (intlv_addr == 0x4)
2447			chan_addr = ((chan_addr >> 10) << 8) |
2448							(chan_addr & 0xff);
2449		else if (intlv_addr == 0x5)
2450			chan_addr = ((chan_addr >> 11) << 9) |
2451							(chan_addr & 0x1ff);
2452		else
2453			return -EINVAL;
2454	}
2455
2456	if (dct_offset_en) {
2457		amd64_read_pci_cfg(pvt->F1,
2458				   DRAM_CONT_HIGH_OFF + (int) channel * 4,
2459				   &tmp);
2460		chan_addr +=  (u64) ((tmp >> 11) & 0xfff) << 27;
2461	}
2462
2463	f15h_select_dct(pvt, channel);
2464
2465	edac_dbg(1, "   Normalized DCT addr: 0x%llx\n", chan_addr);
2466
2467	/*
2468	 * Find Chip select:
2469	 * if channel = 3, then alias it to 1. This is because, in F15 M30h,
2470	 * there is support for 4 DCT's, but only 2 are currently functional.
2471	 * They are DCT0 and DCT3. But we have read all registers of DCT3 into
2472	 * pvt->csels[1]. So we need to use '1' here to get correct info.
2473	 * Refer F15 M30h BKDG Section 2.10 and 2.10.3 for clarifications.
2474	 */
2475	alias_channel =  (channel == 3) ? 1 : channel;
2476
2477	cs_found = f1x_lookup_addr_in_dct(chan_addr, node_id, alias_channel);
2478
2479	if (cs_found >= 0)
2480		*chan_sel = alias_channel;
2481
2482	return cs_found;
2483}
2484
2485static int f1x_translate_sysaddr_to_cs(struct amd64_pvt *pvt,
2486					u64 sys_addr,
2487					int *chan_sel)
2488{
2489	int cs_found = -EINVAL;
2490	unsigned range;
2491
2492	for (range = 0; range < DRAM_RANGES; range++) {
2493		if (!dram_rw(pvt, range))
2494			continue;
2495
2496		if (pvt->fam == 0x15 && pvt->model >= 0x30)
2497			cs_found = f15_m30h_match_to_this_node(pvt, range,
2498							       sys_addr,
2499							       chan_sel);
2500
2501		else if ((get_dram_base(pvt, range)  <= sys_addr) &&
2502			 (get_dram_limit(pvt, range) >= sys_addr)) {
2503			cs_found = f1x_match_to_this_node(pvt, range,
2504							  sys_addr, chan_sel);
2505			if (cs_found >= 0)
2506				break;
2507		}
2508	}
2509	return cs_found;
2510}
2511
2512/*
2513 * For reference see "2.8.5 Routing DRAM Requests" in F10 BKDG. This code maps
2514 * a @sys_addr to NodeID, DCT (channel) and chip select (CSROW).
2515 *
2516 * The @sys_addr is usually an error address received from the hardware
2517 * (MCX_ADDR).
2518 */
2519static void f1x_map_sysaddr_to_csrow(struct mem_ctl_info *mci, u64 sys_addr,
2520				     struct err_info *err)
2521{
2522	struct amd64_pvt *pvt = mci->pvt_info;
2523
2524	error_address_to_page_and_offset(sys_addr, err);
2525
2526	err->csrow = f1x_translate_sysaddr_to_cs(pvt, sys_addr, &err->channel);
2527	if (err->csrow < 0) {
2528		err->err_code = ERR_CSROW;
2529		return;
2530	}
2531
2532	/*
2533	 * We need the syndromes for channel detection only when we're
2534	 * ganged. Otherwise @chan should already contain the channel at
2535	 * this point.
2536	 */
2537	if (dct_ganging_enabled(pvt))
2538		err->channel = get_channel_from_ecc_syndrome(mci, err->syndrome);
2539}
2540
2541/*
2542 * These are tables of eigenvectors (one per line) which can be used for the
2543 * construction of the syndrome tables. The modified syndrome search algorithm
2544 * uses those to find the symbol in error and thus the DIMM.
2545 *
2546 * Algorithm courtesy of Ross LaFetra from AMD.
2547 */
2548static const u16 x4_vectors[] = {
2549	0x2f57, 0x1afe, 0x66cc, 0xdd88,
2550	0x11eb, 0x3396, 0x7f4c, 0xeac8,
2551	0x0001, 0x0002, 0x0004, 0x0008,
2552	0x1013, 0x3032, 0x4044, 0x8088,
2553	0x106b, 0x30d6, 0x70fc, 0xe0a8,
2554	0x4857, 0xc4fe, 0x13cc, 0x3288,
2555	0x1ac5, 0x2f4a, 0x5394, 0xa1e8,
2556	0x1f39, 0x251e, 0xbd6c, 0x6bd8,
2557	0x15c1, 0x2a42, 0x89ac, 0x4758,
2558	0x2b03, 0x1602, 0x4f0c, 0xca08,
2559	0x1f07, 0x3a0e, 0x6b04, 0xbd08,
2560	0x8ba7, 0x465e, 0x244c, 0x1cc8,
2561	0x2b87, 0x164e, 0x642c, 0xdc18,
2562	0x40b9, 0x80de, 0x1094, 0x20e8,
2563	0x27db, 0x1eb6, 0x9dac, 0x7b58,
2564	0x11c1, 0x2242, 0x84ac, 0x4c58,
2565	0x1be5, 0x2d7a, 0x5e34, 0xa718,
2566	0x4b39, 0x8d1e, 0x14b4, 0x28d8,
2567	0x4c97, 0xc87e, 0x11fc, 0x33a8,
2568	0x8e97, 0x497e, 0x2ffc, 0x1aa8,
2569	0x16b3, 0x3d62, 0x4f34, 0x8518,
2570	0x1e2f, 0x391a, 0x5cac, 0xf858,
2571	0x1d9f, 0x3b7a, 0x572c, 0xfe18,
2572	0x15f5, 0x2a5a, 0x5264, 0xa3b8,
2573	0x1dbb, 0x3b66, 0x715c, 0xe3f8,
2574	0x4397, 0xc27e, 0x17fc, 0x3ea8,
2575	0x1617, 0x3d3e, 0x6464, 0xb8b8,
2576	0x23ff, 0x12aa, 0xab6c, 0x56d8,
2577	0x2dfb, 0x1ba6, 0x913c, 0x7328,
2578	0x185d, 0x2ca6, 0x7914, 0x9e28,
2579	0x171b, 0x3e36, 0x7d7c, 0xebe8,
2580	0x4199, 0x82ee, 0x19f4, 0x2e58,
2581	0x4807, 0xc40e, 0x130c, 0x3208,
2582	0x1905, 0x2e0a, 0x5804, 0xac08,
2583	0x213f, 0x132a, 0xadfc, 0x5ba8,
2584	0x19a9, 0x2efe, 0xb5cc, 0x6f88,
2585};
2586
2587static const u16 x8_vectors[] = {
2588	0x0145, 0x028a, 0x2374, 0x43c8, 0xa1f0, 0x0520, 0x0a40, 0x1480,
2589	0x0211, 0x0422, 0x0844, 0x1088, 0x01b0, 0x44e0, 0x23c0, 0xed80,
2590	0x1011, 0x0116, 0x022c, 0x0458, 0x08b0, 0x8c60, 0x2740, 0x4e80,
2591	0x0411, 0x0822, 0x1044, 0x0158, 0x02b0, 0x2360, 0x46c0, 0xab80,
2592	0x0811, 0x1022, 0x012c, 0x0258, 0x04b0, 0x4660, 0x8cc0, 0x2780,
2593	0x2071, 0x40e2, 0xa0c4, 0x0108, 0x0210, 0x0420, 0x0840, 0x1080,
2594	0x4071, 0x80e2, 0x0104, 0x0208, 0x0410, 0x0820, 0x1040, 0x2080,
2595	0x8071, 0x0102, 0x0204, 0x0408, 0x0810, 0x1020, 0x2040, 0x4080,
2596	0x019d, 0x03d6, 0x136c, 0x2198, 0x50b0, 0xb2e0, 0x0740, 0x0e80,
2597	0x0189, 0x03ea, 0x072c, 0x0e58, 0x1cb0, 0x56e0, 0x37c0, 0xf580,
2598	0x01fd, 0x0376, 0x06ec, 0x0bb8, 0x1110, 0x2220, 0x4440, 0x8880,
2599	0x0163, 0x02c6, 0x1104, 0x0758, 0x0eb0, 0x2be0, 0x6140, 0xc280,
2600	0x02fd, 0x01c6, 0x0b5c, 0x1108, 0x07b0, 0x25a0, 0x8840, 0x6180,
2601	0x0801, 0x012e, 0x025c, 0x04b8, 0x1370, 0x26e0, 0x57c0, 0xb580,
2602	0x0401, 0x0802, 0x015c, 0x02b8, 0x22b0, 0x13e0, 0x7140, 0xe280,
2603	0x0201, 0x0402, 0x0804, 0x01b8, 0x11b0, 0x31a0, 0x8040, 0x7180,
2604	0x0101, 0x0202, 0x0404, 0x0808, 0x1010, 0x2020, 0x4040, 0x8080,
2605	0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
2606	0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000,
2607};
2608
2609static int decode_syndrome(u16 syndrome, const u16 *vectors, unsigned num_vecs,
2610			   unsigned v_dim)
2611{
2612	unsigned int i, err_sym;
2613
2614	for (err_sym = 0; err_sym < num_vecs / v_dim; err_sym++) {
2615		u16 s = syndrome;
2616		unsigned v_idx =  err_sym * v_dim;
2617		unsigned v_end = (err_sym + 1) * v_dim;
2618
2619		/* walk over all 16 bits of the syndrome */
2620		for (i = 1; i < (1U << 16); i <<= 1) {
2621
2622			/* if bit is set in that eigenvector... */
2623			if (v_idx < v_end && vectors[v_idx] & i) {
2624				u16 ev_comp = vectors[v_idx++];
2625
2626				/* ... and bit set in the modified syndrome, */
2627				if (s & i) {
2628					/* remove it. */
2629					s ^= ev_comp;
2630
2631					if (!s)
2632						return err_sym;
2633				}
2634
2635			} else if (s & i)
2636				/* can't get to zero, move to next symbol */
2637				break;
2638		}
2639	}
2640
2641	edac_dbg(0, "syndrome(%x) not found\n", syndrome);
2642	return -1;
2643}
2644
2645static int map_err_sym_to_channel(int err_sym, int sym_size)
2646{
2647	if (sym_size == 4)
2648		switch (err_sym) {
2649		case 0x20:
2650		case 0x21:
2651			return 0;
2652		case 0x22:
2653		case 0x23:
2654			return 1;
2655		default:
2656			return err_sym >> 4;
2657		}
2658	/* x8 symbols */
2659	else
2660		switch (err_sym) {
2661		/* imaginary bits not in a DIMM */
2662		case 0x10:
2663			WARN(1, KERN_ERR "Invalid error symbol: 0x%x\n",
2664					  err_sym);
2665			return -1;
2666		case 0x11:
2667			return 0;
2668		case 0x12:
2669			return 1;
2670		default:
2671			return err_sym >> 3;
2672		}
2673	return -1;
2674}
2675
2676static int get_channel_from_ecc_syndrome(struct mem_ctl_info *mci, u16 syndrome)
2677{
2678	struct amd64_pvt *pvt = mci->pvt_info;
2679	int err_sym = -1;
2680
2681	if (pvt->ecc_sym_sz == 8)
2682		err_sym = decode_syndrome(syndrome, x8_vectors,
2683					  ARRAY_SIZE(x8_vectors),
2684					  pvt->ecc_sym_sz);
2685	else if (pvt->ecc_sym_sz == 4)
2686		err_sym = decode_syndrome(syndrome, x4_vectors,
2687					  ARRAY_SIZE(x4_vectors),
2688					  pvt->ecc_sym_sz);
2689	else {
2690		amd64_warn("Illegal syndrome type: %u\n", pvt->ecc_sym_sz);
2691		return err_sym;
2692	}
2693
2694	return map_err_sym_to_channel(err_sym, pvt->ecc_sym_sz);
2695}
2696
2697static void __log_ecc_error(struct mem_ctl_info *mci, struct err_info *err,
2698			    u8 ecc_type)
2699{
2700	enum hw_event_mc_err_type err_type;
2701	const char *string;
2702
2703	if (ecc_type == 2)
2704		err_type = HW_EVENT_ERR_CORRECTED;
2705	else if (ecc_type == 1)
2706		err_type = HW_EVENT_ERR_UNCORRECTED;
2707	else if (ecc_type == 3)
2708		err_type = HW_EVENT_ERR_DEFERRED;
2709	else {
2710		WARN(1, "Something is rotten in the state of Denmark.\n");
2711		return;
2712	}
2713
2714	switch (err->err_code) {
2715	case DECODE_OK:
2716		string = "";
2717		break;
2718	case ERR_NODE:
2719		string = "Failed to map error addr to a node";
2720		break;
2721	case ERR_CSROW:
2722		string = "Failed to map error addr to a csrow";
2723		break;
2724	case ERR_CHANNEL:
2725		string = "Unknown syndrome - possible error reporting race";
2726		break;
2727	case ERR_SYND:
2728		string = "MCA_SYND not valid - unknown syndrome and csrow";
2729		break;
2730	case ERR_NORM_ADDR:
2731		string = "Cannot decode normalized address";
2732		break;
2733	default:
2734		string = "WTF error";
2735		break;
2736	}
2737
2738	edac_mc_handle_error(err_type, mci, 1,
2739			     err->page, err->offset, err->syndrome,
2740			     err->csrow, err->channel, -1,
2741			     string, "");
2742}
2743
2744static inline void decode_bus_error(int node_id, struct mce *m)
2745{
2746	struct mem_ctl_info *mci;
2747	struct amd64_pvt *pvt;
2748	u8 ecc_type = (m->status >> 45) & 0x3;
2749	u8 xec = XEC(m->status, 0x1f);
2750	u16 ec = EC(m->status);
2751	u64 sys_addr;
2752	struct err_info err;
2753
2754	mci = edac_mc_find(node_id);
2755	if (!mci)
2756		return;
2757
2758	pvt = mci->pvt_info;
2759
2760	/* Bail out early if this was an 'observed' error */
2761	if (PP(ec) == NBSL_PP_OBS)
2762		return;
2763
2764	/* Do only ECC errors */
2765	if (xec && xec != F10_NBSL_EXT_ERR_ECC)
2766		return;
2767
2768	memset(&err, 0, sizeof(err));
2769
2770	sys_addr = get_error_address(pvt, m);
2771
2772	if (ecc_type == 2)
2773		err.syndrome = extract_syndrome(m->status);
2774
2775	pvt->ops->map_sysaddr_to_csrow(mci, sys_addr, &err);
2776
2777	__log_ecc_error(mci, &err, ecc_type);
2778}
2779
2780/*
2781 * To find the UMC channel represented by this bank we need to match on its
2782 * instance_id. The instance_id of a bank is held in the lower 32 bits of its
2783 * IPID.
2784 *
2785 * Currently, we can derive the channel number by looking at the 6th nibble in
2786 * the instance_id. For example, instance_id=0xYXXXXX where Y is the channel
2787 * number.
2788 *
2789 * For DRAM ECC errors, the Chip Select number is given in bits [2:0] of
2790 * the MCA_SYND[ErrorInformation] field.
2791 */
2792static void umc_get_err_info(struct mce *m, struct err_info *err)
2793{
2794	err->channel = (m->ipid & GENMASK(31, 0)) >> 20;
2795	err->csrow = m->synd & 0x7;
2796}
2797
2798static void decode_umc_error(int node_id, struct mce *m)
2799{
2800	u8 ecc_type = (m->status >> 45) & 0x3;
2801	struct mem_ctl_info *mci;
2802	unsigned long sys_addr;
2803	struct amd64_pvt *pvt;
2804	struct atl_err a_err;
2805	struct err_info err;
2806
2807	node_id = fixup_node_id(node_id, m);
2808
2809	mci = edac_mc_find(node_id);
2810	if (!mci)
2811		return;
2812
2813	pvt = mci->pvt_info;
2814
2815	memset(&err, 0, sizeof(err));
2816
2817	if (m->status & MCI_STATUS_DEFERRED)
2818		ecc_type = 3;
2819
2820	if (!(m->status & MCI_STATUS_SYNDV)) {
2821		err.err_code = ERR_SYND;
2822		goto log_error;
2823	}
2824
2825	if (ecc_type == 2) {
2826		u8 length = (m->synd >> 18) & 0x3f;
2827
2828		if (length)
2829			err.syndrome = (m->synd >> 32) & GENMASK(length - 1, 0);
2830		else
2831			err.err_code = ERR_CHANNEL;
2832	}
2833
2834	pvt->ops->get_err_info(m, &err);
2835
2836	a_err.addr = m->addr;
2837	a_err.ipid = m->ipid;
2838	a_err.cpu  = m->extcpu;
2839
2840	sys_addr = amd_convert_umc_mca_addr_to_sys_addr(&a_err);
2841	if (IS_ERR_VALUE(sys_addr)) {
2842		err.err_code = ERR_NORM_ADDR;
2843		goto log_error;
2844	}
2845
2846	error_address_to_page_and_offset(sys_addr, &err);
2847
2848log_error:
2849	__log_ecc_error(mci, &err, ecc_type);
2850}
2851
2852/*
2853 * Use pvt->F3 which contains the F3 CPU PCI device to get the related
2854 * F1 (AddrMap) and F2 (Dct) devices. Return negative value on error.
2855 */
2856static int
2857reserve_mc_sibling_devs(struct amd64_pvt *pvt, u16 pci_id1, u16 pci_id2)
2858{
2859	/* Reserve the ADDRESS MAP Device */
2860	pvt->F1 = pci_get_related_function(pvt->F3->vendor, pci_id1, pvt->F3);
2861	if (!pvt->F1) {
2862		edac_dbg(1, "F1 not found: device 0x%x\n", pci_id1);
2863		return -ENODEV;
2864	}
2865
2866	/* Reserve the DCT Device */
2867	pvt->F2 = pci_get_related_function(pvt->F3->vendor, pci_id2, pvt->F3);
2868	if (!pvt->F2) {
2869		pci_dev_put(pvt->F1);
2870		pvt->F1 = NULL;
2871
2872		edac_dbg(1, "F2 not found: device 0x%x\n", pci_id2);
2873		return -ENODEV;
2874	}
2875
2876	if (!pci_ctl_dev)
2877		pci_ctl_dev = &pvt->F2->dev;
2878
2879	edac_dbg(1, "F1: %s\n", pci_name(pvt->F1));
2880	edac_dbg(1, "F2: %s\n", pci_name(pvt->F2));
2881	edac_dbg(1, "F3: %s\n", pci_name(pvt->F3));
2882
2883	return 0;
2884}
2885
2886static void determine_ecc_sym_sz(struct amd64_pvt *pvt)
2887{
2888	pvt->ecc_sym_sz = 4;
2889
2890	if (pvt->fam >= 0x10) {
2891		u32 tmp;
2892
2893		amd64_read_pci_cfg(pvt->F3, EXT_NB_MCA_CFG, &tmp);
2894		/* F16h has only DCT0, so no need to read dbam1. */
2895		if (pvt->fam != 0x16)
2896			amd64_read_dct_pci_cfg(pvt, 1, DBAM0, &pvt->dbam1);
2897
2898		/* F10h, revD and later can do x8 ECC too. */
2899		if ((pvt->fam > 0x10 || pvt->model > 7) && tmp & BIT(25))
2900			pvt->ecc_sym_sz = 8;
2901	}
2902}
2903
2904/*
2905 * Retrieve the hardware registers of the memory controller.
2906 */
2907static void umc_read_mc_regs(struct amd64_pvt *pvt)
2908{
2909	u8 nid = pvt->mc_node_id;
2910	struct amd64_umc *umc;
2911	u32 i, umc_base;
2912
2913	/* Read registers from each UMC */
2914	for_each_umc(i) {
2915
2916		umc_base = get_umc_base(i);
2917		umc = &pvt->umc[i];
2918
2919		amd_smn_read(nid, umc_base + get_umc_reg(pvt, UMCCH_DIMM_CFG), &umc->dimm_cfg);
2920		amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &umc->umc_cfg);
2921		amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &umc->sdp_ctrl);
2922		amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &umc->ecc_ctrl);
2923		amd_smn_read(nid, umc_base + UMCCH_UMC_CAP_HI, &umc->umc_cap_hi);
2924	}
2925}
2926
2927/*
2928 * Retrieve the hardware registers of the memory controller (this includes the
2929 * 'Address Map' and 'Misc' device regs)
2930 */
2931static void dct_read_mc_regs(struct amd64_pvt *pvt)
2932{
2933	unsigned int range;
2934	u64 msr_val;
2935
2936	/*
2937	 * Retrieve TOP_MEM and TOP_MEM2; no masking off of reserved bits since
2938	 * those are Read-As-Zero.
2939	 */
2940	rdmsrl(MSR_K8_TOP_MEM1, pvt->top_mem);
2941	edac_dbg(0, "  TOP_MEM:  0x%016llx\n", pvt->top_mem);
2942
2943	/* Check first whether TOP_MEM2 is enabled: */
2944	rdmsrl(MSR_AMD64_SYSCFG, msr_val);
2945	if (msr_val & BIT(21)) {
2946		rdmsrl(MSR_K8_TOP_MEM2, pvt->top_mem2);
2947		edac_dbg(0, "  TOP_MEM2: 0x%016llx\n", pvt->top_mem2);
2948	} else {
2949		edac_dbg(0, "  TOP_MEM2 disabled\n");
2950	}
2951
2952	amd64_read_pci_cfg(pvt->F3, NBCAP, &pvt->nbcap);
2953
2954	read_dram_ctl_register(pvt);
2955
2956	for (range = 0; range < DRAM_RANGES; range++) {
2957		u8 rw;
2958
2959		/* read settings for this DRAM range */
2960		read_dram_base_limit_regs(pvt, range);
2961
2962		rw = dram_rw(pvt, range);
2963		if (!rw)
2964			continue;
2965
2966		edac_dbg(1, "  DRAM range[%d], base: 0x%016llx; limit: 0x%016llx\n",
2967			 range,
2968			 get_dram_base(pvt, range),
2969			 get_dram_limit(pvt, range));
2970
2971		edac_dbg(1, "   IntlvEn=%s; Range access: %s%s IntlvSel=%d DstNode=%d\n",
2972			 dram_intlv_en(pvt, range) ? "Enabled" : "Disabled",
2973			 (rw & 0x1) ? "R" : "-",
2974			 (rw & 0x2) ? "W" : "-",
2975			 dram_intlv_sel(pvt, range),
2976			 dram_dst_node(pvt, range));
2977	}
2978
2979	amd64_read_pci_cfg(pvt->F1, DHAR, &pvt->dhar);
2980	amd64_read_dct_pci_cfg(pvt, 0, DBAM0, &pvt->dbam0);
2981
2982	amd64_read_pci_cfg(pvt->F3, F10_ONLINE_SPARE, &pvt->online_spare);
2983
2984	amd64_read_dct_pci_cfg(pvt, 0, DCLR0, &pvt->dclr0);
2985	amd64_read_dct_pci_cfg(pvt, 0, DCHR0, &pvt->dchr0);
2986
2987	if (!dct_ganging_enabled(pvt)) {
2988		amd64_read_dct_pci_cfg(pvt, 1, DCLR0, &pvt->dclr1);
2989		amd64_read_dct_pci_cfg(pvt, 1, DCHR0, &pvt->dchr1);
2990	}
2991
2992	determine_ecc_sym_sz(pvt);
2993}
2994
2995/*
2996 * NOTE: CPU Revision Dependent code
2997 *
2998 * Input:
2999 *	@csrow_nr ChipSelect Row Number (0..NUM_CHIPSELECTS-1)
3000 *	k8 private pointer to -->
3001 *			DRAM Bank Address mapping register
3002 *			node_id
3003 *			DCL register where dual_channel_active is
3004 *
3005 * The DBAM register consists of 4 sets of 4 bits each definitions:
3006 *
3007 * Bits:	CSROWs
3008 * 0-3		CSROWs 0 and 1
3009 * 4-7		CSROWs 2 and 3
3010 * 8-11		CSROWs 4 and 5
3011 * 12-15	CSROWs 6 and 7
3012 *
3013 * Values range from: 0 to 15
3014 * The meaning of the values depends on CPU revision and dual-channel state,
3015 * see relevant BKDG more info.
3016 *
3017 * The memory controller provides for total of only 8 CSROWs in its current
3018 * architecture. Each "pair" of CSROWs normally represents just one DIMM in
3019 * single channel or two (2) DIMMs in dual channel mode.
3020 *
3021 * The following code logic collapses the various tables for CSROW based on CPU
3022 * revision.
3023 *
3024 * Returns:
3025 *	The number of PAGE_SIZE pages on the specified CSROW number it
3026 *	encompasses
3027 *
3028 */
3029static u32 dct_get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr)
3030{
3031	u32 dbam = dct ? pvt->dbam1 : pvt->dbam0;
3032	u32 cs_mode, nr_pages;
3033
3034	csrow_nr >>= 1;
3035	cs_mode = DBAM_DIMM(csrow_nr, dbam);
3036
3037	nr_pages   = pvt->ops->dbam_to_cs(pvt, dct, cs_mode, csrow_nr);
3038	nr_pages <<= 20 - PAGE_SHIFT;
3039
3040	edac_dbg(0, "csrow: %d, channel: %d, DBAM idx: %d\n",
3041		    csrow_nr, dct,  cs_mode);
3042	edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
3043
3044	return nr_pages;
3045}
3046
3047static u32 umc_get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr_orig)
3048{
3049	int csrow_nr = csrow_nr_orig;
3050	u32 cs_mode, nr_pages;
3051
3052	cs_mode = umc_get_cs_mode(csrow_nr >> 1, dct, pvt);
3053
3054	nr_pages   = umc_addr_mask_to_cs_size(pvt, dct, cs_mode, csrow_nr);
3055	nr_pages <<= 20 - PAGE_SHIFT;
3056
3057	edac_dbg(0, "csrow: %d, channel: %d, cs_mode %d\n",
3058		 csrow_nr_orig, dct,  cs_mode);
3059	edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
3060
3061	return nr_pages;
3062}
3063
3064static void umc_init_csrows(struct mem_ctl_info *mci)
3065{
3066	struct amd64_pvt *pvt = mci->pvt_info;
3067	enum edac_type edac_mode = EDAC_NONE;
3068	enum dev_type dev_type = DEV_UNKNOWN;
3069	struct dimm_info *dimm;
3070	u8 umc, cs;
3071
3072	if (mci->edac_ctl_cap & EDAC_FLAG_S16ECD16ED) {
3073		edac_mode = EDAC_S16ECD16ED;
3074		dev_type = DEV_X16;
3075	} else if (mci->edac_ctl_cap & EDAC_FLAG_S8ECD8ED) {
3076		edac_mode = EDAC_S8ECD8ED;
3077		dev_type = DEV_X8;
3078	} else if (mci->edac_ctl_cap & EDAC_FLAG_S4ECD4ED) {
3079		edac_mode = EDAC_S4ECD4ED;
3080		dev_type = DEV_X4;
3081	} else if (mci->edac_ctl_cap & EDAC_FLAG_SECDED) {
3082		edac_mode = EDAC_SECDED;
3083	}
3084
3085	for_each_umc(umc) {
3086		for_each_chip_select(cs, umc, pvt) {
3087			if (!csrow_enabled(cs, umc, pvt))
3088				continue;
3089
3090			dimm = mci->csrows[cs]->channels[umc]->dimm;
3091
3092			edac_dbg(1, "MC node: %d, csrow: %d\n",
3093					pvt->mc_node_id, cs);
3094
3095			dimm->nr_pages = umc_get_csrow_nr_pages(pvt, umc, cs);
3096			dimm->mtype = pvt->umc[umc].dram_type;
3097			dimm->edac_mode = edac_mode;
3098			dimm->dtype = dev_type;
3099			dimm->grain = 64;
3100		}
3101	}
3102}
3103
3104/*
3105 * Initialize the array of csrow attribute instances, based on the values
3106 * from pci config hardware registers.
3107 */
3108static void dct_init_csrows(struct mem_ctl_info *mci)
3109{
3110	struct amd64_pvt *pvt = mci->pvt_info;
3111	enum edac_type edac_mode = EDAC_NONE;
3112	struct csrow_info *csrow;
3113	struct dimm_info *dimm;
3114	int nr_pages = 0;
3115	int i, j;
3116	u32 val;
3117
3118	amd64_read_pci_cfg(pvt->F3, NBCFG, &val);
3119
3120	pvt->nbcfg = val;
3121
3122	edac_dbg(0, "node %d, NBCFG=0x%08x[ChipKillEccCap: %d|DramEccEn: %d]\n",
3123		 pvt->mc_node_id, val,
3124		 !!(val & NBCFG_CHIPKILL), !!(val & NBCFG_ECC_ENABLE));
3125
3126	/*
3127	 * We iterate over DCT0 here but we look at DCT1 in parallel, if needed.
3128	 */
3129	for_each_chip_select(i, 0, pvt) {
3130		bool row_dct0 = !!csrow_enabled(i, 0, pvt);
3131		bool row_dct1 = false;
3132
3133		if (pvt->fam != 0xf)
3134			row_dct1 = !!csrow_enabled(i, 1, pvt);
3135
3136		if (!row_dct0 && !row_dct1)
3137			continue;
3138
3139		csrow = mci->csrows[i];
3140
3141		edac_dbg(1, "MC node: %d, csrow: %d\n",
3142			    pvt->mc_node_id, i);
3143
3144		if (row_dct0) {
3145			nr_pages = dct_get_csrow_nr_pages(pvt, 0, i);
3146			csrow->channels[0]->dimm->nr_pages = nr_pages;
3147		}
3148
3149		/* K8 has only one DCT */
3150		if (pvt->fam != 0xf && row_dct1) {
3151			int row_dct1_pages = dct_get_csrow_nr_pages(pvt, 1, i);
3152
3153			csrow->channels[1]->dimm->nr_pages = row_dct1_pages;
3154			nr_pages += row_dct1_pages;
3155		}
3156
3157		edac_dbg(1, "Total csrow%d pages: %u\n", i, nr_pages);
3158
3159		/* Determine DIMM ECC mode: */
3160		if (pvt->nbcfg & NBCFG_ECC_ENABLE) {
3161			edac_mode = (pvt->nbcfg & NBCFG_CHIPKILL)
3162					? EDAC_S4ECD4ED
3163					: EDAC_SECDED;
3164		}
3165
3166		for (j = 0; j < pvt->max_mcs; j++) {
3167			dimm = csrow->channels[j]->dimm;
3168			dimm->mtype = pvt->dram_type;
3169			dimm->edac_mode = edac_mode;
3170			dimm->grain = 64;
3171		}
3172	}
3173}
3174
3175/* get all cores on this DCT */
3176static void get_cpus_on_this_dct_cpumask(struct cpumask *mask, u16 nid)
3177{
3178	int cpu;
3179
3180	for_each_online_cpu(cpu)
3181		if (topology_amd_node_id(cpu) == nid)
3182			cpumask_set_cpu(cpu, mask);
3183}
3184
3185/* check MCG_CTL on all the cpus on this node */
3186static bool nb_mce_bank_enabled_on_node(u16 nid)
3187{
3188	cpumask_var_t mask;
3189	int cpu, nbe;
3190	bool ret = false;
3191
3192	if (!zalloc_cpumask_var(&mask, GFP_KERNEL)) {
3193		amd64_warn("%s: Error allocating mask\n", __func__);
3194		return false;
3195	}
3196
3197	get_cpus_on_this_dct_cpumask(mask, nid);
3198
3199	rdmsr_on_cpus(mask, MSR_IA32_MCG_CTL, msrs);
3200
3201	for_each_cpu(cpu, mask) {
3202		struct msr *reg = per_cpu_ptr(msrs, cpu);
3203		nbe = reg->l & MSR_MCGCTL_NBE;
3204
3205		edac_dbg(0, "core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
3206			 cpu, reg->q,
3207			 (nbe ? "enabled" : "disabled"));
3208
3209		if (!nbe)
3210			goto out;
3211	}
3212	ret = true;
3213
3214out:
3215	free_cpumask_var(mask);
3216	return ret;
3217}
3218
3219static int toggle_ecc_err_reporting(struct ecc_settings *s, u16 nid, bool on)
3220{
3221	cpumask_var_t cmask;
3222	int cpu;
3223
3224	if (!zalloc_cpumask_var(&cmask, GFP_KERNEL)) {
3225		amd64_warn("%s: error allocating mask\n", __func__);
3226		return -ENOMEM;
3227	}
3228
3229	get_cpus_on_this_dct_cpumask(cmask, nid);
3230
3231	rdmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3232
3233	for_each_cpu(cpu, cmask) {
3234
3235		struct msr *reg = per_cpu_ptr(msrs, cpu);
3236
3237		if (on) {
3238			if (reg->l & MSR_MCGCTL_NBE)
3239				s->flags.nb_mce_enable = 1;
3240
3241			reg->l |= MSR_MCGCTL_NBE;
3242		} else {
3243			/*
3244			 * Turn off NB MCE reporting only when it was off before
3245			 */
3246			if (!s->flags.nb_mce_enable)
3247				reg->l &= ~MSR_MCGCTL_NBE;
3248		}
3249	}
3250	wrmsr_on_cpus(cmask, MSR_IA32_MCG_CTL, msrs);
3251
3252	free_cpumask_var(cmask);
3253
3254	return 0;
3255}
3256
3257static bool enable_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3258				       struct pci_dev *F3)
3259{
3260	bool ret = true;
3261	u32 value, mask = 0x3;		/* UECC/CECC enable */
3262
3263	if (toggle_ecc_err_reporting(s, nid, ON)) {
3264		amd64_warn("Error enabling ECC reporting over MCGCTL!\n");
3265		return false;
3266	}
3267
3268	amd64_read_pci_cfg(F3, NBCTL, &value);
3269
3270	s->old_nbctl   = value & mask;
3271	s->nbctl_valid = true;
3272
3273	value |= mask;
3274	amd64_write_pci_cfg(F3, NBCTL, value);
3275
3276	amd64_read_pci_cfg(F3, NBCFG, &value);
3277
3278	edac_dbg(0, "1: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3279		 nid, value, !!(value & NBCFG_ECC_ENABLE));
3280
3281	if (!(value & NBCFG_ECC_ENABLE)) {
3282		amd64_warn("DRAM ECC disabled on this node, enabling...\n");
3283
3284		s->flags.nb_ecc_prev = 0;
3285
3286		/* Attempt to turn on DRAM ECC Enable */
3287		value |= NBCFG_ECC_ENABLE;
3288		amd64_write_pci_cfg(F3, NBCFG, value);
3289
3290		amd64_read_pci_cfg(F3, NBCFG, &value);
3291
3292		if (!(value & NBCFG_ECC_ENABLE)) {
3293			amd64_warn("Hardware rejected DRAM ECC enable,"
3294				   "check memory DIMM configuration.\n");
3295			ret = false;
3296		} else {
3297			amd64_info("Hardware accepted DRAM ECC Enable\n");
3298		}
3299	} else {
3300		s->flags.nb_ecc_prev = 1;
3301	}
3302
3303	edac_dbg(0, "2: node %d, NBCFG=0x%08x[DramEccEn: %d]\n",
3304		 nid, value, !!(value & NBCFG_ECC_ENABLE));
3305
3306	return ret;
3307}
3308
3309static void restore_ecc_error_reporting(struct ecc_settings *s, u16 nid,
3310					struct pci_dev *F3)
3311{
3312	u32 value, mask = 0x3;		/* UECC/CECC enable */
3313
3314	if (!s->nbctl_valid)
3315		return;
3316
3317	amd64_read_pci_cfg(F3, NBCTL, &value);
3318	value &= ~mask;
3319	value |= s->old_nbctl;
3320
3321	amd64_write_pci_cfg(F3, NBCTL, value);
3322
3323	/* restore previous BIOS DRAM ECC "off" setting we force-enabled */
3324	if (!s->flags.nb_ecc_prev) {
3325		amd64_read_pci_cfg(F3, NBCFG, &value);
3326		value &= ~NBCFG_ECC_ENABLE;
3327		amd64_write_pci_cfg(F3, NBCFG, value);
3328	}
3329
3330	/* restore the NB Enable MCGCTL bit */
3331	if (toggle_ecc_err_reporting(s, nid, OFF))
3332		amd64_warn("Error restoring NB MCGCTL settings!\n");
3333}
3334
3335static bool dct_ecc_enabled(struct amd64_pvt *pvt)
3336{
3337	u16 nid = pvt->mc_node_id;
3338	bool nb_mce_en = false;
3339	u8 ecc_en = 0;
3340	u32 value;
3341
3342	amd64_read_pci_cfg(pvt->F3, NBCFG, &value);
3343
3344	ecc_en = !!(value & NBCFG_ECC_ENABLE);
3345
3346	nb_mce_en = nb_mce_bank_enabled_on_node(nid);
3347	if (!nb_mce_en)
3348		edac_dbg(0, "NB MCE bank disabled, set MSR 0x%08x[4] on node %d to enable.\n",
3349			 MSR_IA32_MCG_CTL, nid);
3350
3351	edac_dbg(3, "Node %d: DRAM ECC %s.\n", nid, (ecc_en ? "enabled" : "disabled"));
3352
3353	if (!ecc_en || !nb_mce_en)
3354		return false;
3355	else
3356		return true;
3357}
3358
3359static bool umc_ecc_enabled(struct amd64_pvt *pvt)
3360{
3361	u8 umc_en_mask = 0, ecc_en_mask = 0;
3362	u16 nid = pvt->mc_node_id;
3363	struct amd64_umc *umc;
3364	u8 ecc_en = 0, i;
3365
3366	for_each_umc(i) {
3367		umc = &pvt->umc[i];
3368
3369		/* Only check enabled UMCs. */
3370		if (!(umc->sdp_ctrl & UMC_SDP_INIT))
3371			continue;
3372
3373		umc_en_mask |= BIT(i);
3374
3375		if (umc->umc_cap_hi & UMC_ECC_ENABLED)
3376			ecc_en_mask |= BIT(i);
3377	}
3378
3379	/* Check whether at least one UMC is enabled: */
3380	if (umc_en_mask)
3381		ecc_en = umc_en_mask == ecc_en_mask;
3382	else
3383		edac_dbg(0, "Node %d: No enabled UMCs.\n", nid);
3384
3385	edac_dbg(3, "Node %d: DRAM ECC %s.\n", nid, (ecc_en ? "enabled" : "disabled"));
3386
3387	if (!ecc_en)
3388		return false;
3389	else
3390		return true;
3391}
3392
3393static inline void
3394umc_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)
3395{
3396	u8 i, ecc_en = 1, cpk_en = 1, dev_x4 = 1, dev_x16 = 1;
3397
3398	for_each_umc(i) {
3399		if (pvt->umc[i].sdp_ctrl & UMC_SDP_INIT) {
3400			ecc_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_ENABLED);
3401			cpk_en &= !!(pvt->umc[i].umc_cap_hi & UMC_ECC_CHIPKILL_CAP);
3402
3403			dev_x4  &= !!(pvt->umc[i].dimm_cfg & BIT(6));
3404			dev_x16 &= !!(pvt->umc[i].dimm_cfg & BIT(7));
3405		}
3406	}
3407
3408	/* Set chipkill only if ECC is enabled: */
3409	if (ecc_en) {
3410		mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3411
3412		if (!cpk_en)
3413			return;
3414
3415		if (dev_x4)
3416			mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3417		else if (dev_x16)
3418			mci->edac_ctl_cap |= EDAC_FLAG_S16ECD16ED;
3419		else
3420			mci->edac_ctl_cap |= EDAC_FLAG_S8ECD8ED;
3421	}
3422}
3423
3424static void dct_setup_mci_misc_attrs(struct mem_ctl_info *mci)
3425{
3426	struct amd64_pvt *pvt = mci->pvt_info;
3427
3428	mci->mtype_cap		= MEM_FLAG_DDR2 | MEM_FLAG_RDDR2;
3429	mci->edac_ctl_cap	= EDAC_FLAG_NONE;
3430
3431	if (pvt->nbcap & NBCAP_SECDED)
3432		mci->edac_ctl_cap |= EDAC_FLAG_SECDED;
3433
3434	if (pvt->nbcap & NBCAP_CHIPKILL)
3435		mci->edac_ctl_cap |= EDAC_FLAG_S4ECD4ED;
3436
3437	mci->edac_cap		= dct_determine_edac_cap(pvt);
3438	mci->mod_name		= EDAC_MOD_STR;
3439	mci->ctl_name		= pvt->ctl_name;
3440	mci->dev_name		= pci_name(pvt->F3);
3441	mci->ctl_page_to_phys	= NULL;
3442
3443	/* memory scrubber interface */
3444	mci->set_sdram_scrub_rate = set_scrub_rate;
3445	mci->get_sdram_scrub_rate = get_scrub_rate;
3446
3447	dct_init_csrows(mci);
3448}
3449
3450static void umc_setup_mci_misc_attrs(struct mem_ctl_info *mci)
3451{
3452	struct amd64_pvt *pvt = mci->pvt_info;
3453
3454	mci->mtype_cap		= MEM_FLAG_DDR4 | MEM_FLAG_RDDR4;
3455	mci->edac_ctl_cap	= EDAC_FLAG_NONE;
3456
3457	umc_determine_edac_ctl_cap(mci, pvt);
3458
3459	mci->edac_cap		= umc_determine_edac_cap(pvt);
3460	mci->mod_name		= EDAC_MOD_STR;
3461	mci->ctl_name		= pvt->ctl_name;
3462	mci->dev_name		= pci_name(pvt->F3);
3463	mci->ctl_page_to_phys	= NULL;
3464
3465	umc_init_csrows(mci);
3466}
3467
3468static int dct_hw_info_get(struct amd64_pvt *pvt)
3469{
3470	int ret = reserve_mc_sibling_devs(pvt, pvt->f1_id, pvt->f2_id);
3471
3472	if (ret)
3473		return ret;
3474
3475	dct_prep_chip_selects(pvt);
3476	dct_read_base_mask(pvt);
3477	dct_read_mc_regs(pvt);
3478	dct_determine_memory_type(pvt);
3479
3480	return 0;
3481}
3482
3483static int umc_hw_info_get(struct amd64_pvt *pvt)
3484{
3485	pvt->umc = kcalloc(pvt->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
3486	if (!pvt->umc)
3487		return -ENOMEM;
3488
3489	umc_prep_chip_selects(pvt);
3490	umc_read_base_mask(pvt);
3491	umc_read_mc_regs(pvt);
3492	umc_determine_memory_type(pvt);
3493
3494	return 0;
3495}
3496
3497/*
3498 * The CPUs have one channel per UMC, so UMC number is equivalent to a
3499 * channel number. The GPUs have 8 channels per UMC, so the UMC number no
3500 * longer works as a channel number.
3501 *
3502 * The channel number within a GPU UMC is given in MCA_IPID[15:12].
3503 * However, the IDs are split such that two UMC values go to one UMC, and
3504 * the channel numbers are split in two groups of four.
3505 *
3506 * Refer to comment on gpu_get_umc_base().
3507 *
3508 * For example,
3509 * UMC0 CH[3:0] = 0x0005[3:0]000
3510 * UMC0 CH[7:4] = 0x0015[3:0]000
3511 * UMC1 CH[3:0] = 0x0025[3:0]000
3512 * UMC1 CH[7:4] = 0x0035[3:0]000
3513 */
3514static void gpu_get_err_info(struct mce *m, struct err_info *err)
3515{
3516	u8 ch = (m->ipid & GENMASK(31, 0)) >> 20;
3517	u8 phy = ((m->ipid >> 12) & 0xf);
3518
3519	err->channel = ch % 2 ? phy + 4 : phy;
3520	err->csrow = phy;
3521}
3522
3523static int gpu_addr_mask_to_cs_size(struct amd64_pvt *pvt, u8 umc,
3524				    unsigned int cs_mode, int csrow_nr)
3525{
3526	u32 addr_mask_orig = pvt->csels[umc].csmasks[csrow_nr];
3527
3528	return __addr_mask_to_cs_size(addr_mask_orig, cs_mode, csrow_nr, csrow_nr >> 1);
3529}
3530
3531static void gpu_debug_display_dimm_sizes(struct amd64_pvt *pvt, u8 ctrl)
3532{
3533	int size, cs_mode, cs = 0;
3534
3535	edac_printk(KERN_DEBUG, EDAC_MC, "UMC%d chip selects:\n", ctrl);
3536
3537	cs_mode = CS_EVEN_PRIMARY | CS_ODD_PRIMARY;
3538
3539	for_each_chip_select(cs, ctrl, pvt) {
3540		size = gpu_addr_mask_to_cs_size(pvt, ctrl, cs_mode, cs);
3541		amd64_info(EDAC_MC ": %d: %5dMB\n", cs, size);
3542	}
3543}
3544
3545static void gpu_dump_misc_regs(struct amd64_pvt *pvt)
3546{
3547	struct amd64_umc *umc;
3548	u32 i;
3549
3550	for_each_umc(i) {
3551		umc = &pvt->umc[i];
3552
3553		edac_dbg(1, "UMC%d UMC cfg: 0x%x\n", i, umc->umc_cfg);
3554		edac_dbg(1, "UMC%d SDP ctrl: 0x%x\n", i, umc->sdp_ctrl);
3555		edac_dbg(1, "UMC%d ECC ctrl: 0x%x\n", i, umc->ecc_ctrl);
3556		edac_dbg(1, "UMC%d All HBMs support ECC: yes\n", i);
3557
3558		gpu_debug_display_dimm_sizes(pvt, i);
3559	}
3560}
3561
3562static u32 gpu_get_csrow_nr_pages(struct amd64_pvt *pvt, u8 dct, int csrow_nr)
3563{
3564	u32 nr_pages;
3565	int cs_mode = CS_EVEN_PRIMARY | CS_ODD_PRIMARY;
3566
3567	nr_pages   = gpu_addr_mask_to_cs_size(pvt, dct, cs_mode, csrow_nr);
3568	nr_pages <<= 20 - PAGE_SHIFT;
3569
3570	edac_dbg(0, "csrow: %d, channel: %d\n", csrow_nr, dct);
3571	edac_dbg(0, "nr_pages/channel: %u\n", nr_pages);
3572
3573	return nr_pages;
3574}
3575
3576static void gpu_init_csrows(struct mem_ctl_info *mci)
3577{
3578	struct amd64_pvt *pvt = mci->pvt_info;
3579	struct dimm_info *dimm;
3580	u8 umc, cs;
3581
3582	for_each_umc(umc) {
3583		for_each_chip_select(cs, umc, pvt) {
3584			if (!csrow_enabled(cs, umc, pvt))
3585				continue;
3586
3587			dimm = mci->csrows[umc]->channels[cs]->dimm;
3588
3589			edac_dbg(1, "MC node: %d, csrow: %d\n",
3590				 pvt->mc_node_id, cs);
3591
3592			dimm->nr_pages = gpu_get_csrow_nr_pages(pvt, umc, cs);
3593			dimm->edac_mode = EDAC_SECDED;
3594			dimm->mtype = pvt->dram_type;
3595			dimm->dtype = DEV_X16;
3596			dimm->grain = 64;
3597		}
3598	}
3599}
3600
3601static void gpu_setup_mci_misc_attrs(struct mem_ctl_info *mci)
3602{
3603	struct amd64_pvt *pvt = mci->pvt_info;
3604
3605	mci->mtype_cap		= MEM_FLAG_HBM2;
3606	mci->edac_ctl_cap	= EDAC_FLAG_SECDED;
3607
3608	mci->edac_cap		= EDAC_FLAG_EC;
3609	mci->mod_name		= EDAC_MOD_STR;
3610	mci->ctl_name		= pvt->ctl_name;
3611	mci->dev_name		= pci_name(pvt->F3);
3612	mci->ctl_page_to_phys	= NULL;
3613
3614	gpu_init_csrows(mci);
3615}
3616
3617/* ECC is enabled by default on GPU nodes */
3618static bool gpu_ecc_enabled(struct amd64_pvt *pvt)
3619{
3620	return true;
3621}
3622
3623static inline u32 gpu_get_umc_base(struct amd64_pvt *pvt, u8 umc, u8 channel)
3624{
3625	/*
3626	 * On CPUs, there is one channel per UMC, so UMC numbering equals
3627	 * channel numbering. On GPUs, there are eight channels per UMC,
3628	 * so the channel numbering is different from UMC numbering.
3629	 *
3630	 * On CPU nodes channels are selected in 6th nibble
3631	 * UMC chY[3:0]= [(chY*2 + 1) : (chY*2)]50000;
3632	 *
3633	 * On GPU nodes channels are selected in 3rd nibble
3634	 * HBM chX[3:0]= [Y  ]5X[3:0]000;
3635	 * HBM chX[7:4]= [Y+1]5X[3:0]000
3636	 *
3637	 * On MI300 APU nodes, same as GPU nodes but channels are selected
3638	 * in the base address of 0x90000
3639	 */
3640	umc *= 2;
3641
3642	if (channel >= 4)
3643		umc++;
3644
3645	return pvt->gpu_umc_base + (umc << 20) + ((channel % 4) << 12);
3646}
3647
3648static void gpu_read_mc_regs(struct amd64_pvt *pvt)
3649{
3650	u8 nid = pvt->mc_node_id;
3651	struct amd64_umc *umc;
3652	u32 i, umc_base;
3653
3654	/* Read registers from each UMC */
3655	for_each_umc(i) {
3656		umc_base = gpu_get_umc_base(pvt, i, 0);
3657		umc = &pvt->umc[i];
3658
3659		amd_smn_read(nid, umc_base + UMCCH_UMC_CFG, &umc->umc_cfg);
3660		amd_smn_read(nid, umc_base + UMCCH_SDP_CTRL, &umc->sdp_ctrl);
3661		amd_smn_read(nid, umc_base + UMCCH_ECC_CTRL, &umc->ecc_ctrl);
3662	}
3663}
3664
3665static void gpu_read_base_mask(struct amd64_pvt *pvt)
3666{
3667	u32 base_reg, mask_reg;
3668	u32 *base, *mask;
3669	int umc, cs;
3670
3671	for_each_umc(umc) {
3672		for_each_chip_select(cs, umc, pvt) {
3673			base_reg = gpu_get_umc_base(pvt, umc, cs) + UMCCH_BASE_ADDR;
3674			base = &pvt->csels[umc].csbases[cs];
3675
3676			if (!amd_smn_read(pvt->mc_node_id, base_reg, base)) {
3677				edac_dbg(0, "  DCSB%d[%d]=0x%08x reg: 0x%x\n",
3678					 umc, cs, *base, base_reg);
3679			}
3680
3681			mask_reg = gpu_get_umc_base(pvt, umc, cs) + UMCCH_ADDR_MASK;
3682			mask = &pvt->csels[umc].csmasks[cs];
3683
3684			if (!amd_smn_read(pvt->mc_node_id, mask_reg, mask)) {
3685				edac_dbg(0, "  DCSM%d[%d]=0x%08x reg: 0x%x\n",
3686					 umc, cs, *mask, mask_reg);
3687			}
3688		}
3689	}
3690}
3691
3692static void gpu_prep_chip_selects(struct amd64_pvt *pvt)
3693{
3694	int umc;
3695
3696	for_each_umc(umc) {
3697		pvt->csels[umc].b_cnt = 8;
3698		pvt->csels[umc].m_cnt = 8;
3699	}
3700}
3701
3702static int gpu_hw_info_get(struct amd64_pvt *pvt)
3703{
3704	int ret;
3705
3706	ret = gpu_get_node_map(pvt);
3707	if (ret)
3708		return ret;
3709
3710	pvt->umc = kcalloc(pvt->max_mcs, sizeof(struct amd64_umc), GFP_KERNEL);
3711	if (!pvt->umc)
3712		return -ENOMEM;
3713
3714	gpu_prep_chip_selects(pvt);
3715	gpu_read_base_mask(pvt);
3716	gpu_read_mc_regs(pvt);
3717
3718	return 0;
3719}
3720
3721static void hw_info_put(struct amd64_pvt *pvt)
3722{
3723	pci_dev_put(pvt->F1);
3724	pci_dev_put(pvt->F2);
3725	kfree(pvt->umc);
3726}
3727
3728static struct low_ops umc_ops = {
3729	.hw_info_get			= umc_hw_info_get,
3730	.ecc_enabled			= umc_ecc_enabled,
3731	.setup_mci_misc_attrs		= umc_setup_mci_misc_attrs,
3732	.dump_misc_regs			= umc_dump_misc_regs,
3733	.get_err_info			= umc_get_err_info,
3734};
3735
3736static struct low_ops gpu_ops = {
3737	.hw_info_get			= gpu_hw_info_get,
3738	.ecc_enabled			= gpu_ecc_enabled,
3739	.setup_mci_misc_attrs		= gpu_setup_mci_misc_attrs,
3740	.dump_misc_regs			= gpu_dump_misc_regs,
3741	.get_err_info			= gpu_get_err_info,
3742};
3743
3744/* Use Family 16h versions for defaults and adjust as needed below. */
3745static struct low_ops dct_ops = {
3746	.map_sysaddr_to_csrow		= f1x_map_sysaddr_to_csrow,
3747	.dbam_to_cs			= f16_dbam_to_chip_select,
3748	.hw_info_get			= dct_hw_info_get,
3749	.ecc_enabled			= dct_ecc_enabled,
3750	.setup_mci_misc_attrs		= dct_setup_mci_misc_attrs,
3751	.dump_misc_regs			= dct_dump_misc_regs,
3752};
3753
3754static int per_family_init(struct amd64_pvt *pvt)
3755{
3756	pvt->ext_model  = boot_cpu_data.x86_model >> 4;
3757	pvt->stepping	= boot_cpu_data.x86_stepping;
3758	pvt->model	= boot_cpu_data.x86_model;
3759	pvt->fam	= boot_cpu_data.x86;
3760	pvt->max_mcs	= 2;
3761
3762	/*
3763	 * Decide on which ops group to use here and do any family/model
3764	 * overrides below.
3765	 */
3766	if (pvt->fam >= 0x17)
3767		pvt->ops = &umc_ops;
3768	else
3769		pvt->ops = &dct_ops;
3770
3771	switch (pvt->fam) {
3772	case 0xf:
3773		pvt->ctl_name				= (pvt->ext_model >= K8_REV_F) ?
3774							  "K8 revF or later" : "K8 revE or earlier";
3775		pvt->f1_id				= PCI_DEVICE_ID_AMD_K8_NB_ADDRMAP;
3776		pvt->f2_id				= PCI_DEVICE_ID_AMD_K8_NB_MEMCTL;
3777		pvt->ops->map_sysaddr_to_csrow		= k8_map_sysaddr_to_csrow;
3778		pvt->ops->dbam_to_cs			= k8_dbam_to_chip_select;
3779		break;
3780
3781	case 0x10:
3782		pvt->ctl_name				= "F10h";
3783		pvt->f1_id				= PCI_DEVICE_ID_AMD_10H_NB_MAP;
3784		pvt->f2_id				= PCI_DEVICE_ID_AMD_10H_NB_DRAM;
3785		pvt->ops->dbam_to_cs			= f10_dbam_to_chip_select;
3786		break;
3787
3788	case 0x15:
3789		switch (pvt->model) {
3790		case 0x30:
3791			pvt->ctl_name			= "F15h_M30h";
3792			pvt->f1_id			= PCI_DEVICE_ID_AMD_15H_M30H_NB_F1;
3793			pvt->f2_id			= PCI_DEVICE_ID_AMD_15H_M30H_NB_F2;
3794			break;
3795		case 0x60:
3796			pvt->ctl_name			= "F15h_M60h";
3797			pvt->f1_id			= PCI_DEVICE_ID_AMD_15H_M60H_NB_F1;
3798			pvt->f2_id			= PCI_DEVICE_ID_AMD_15H_M60H_NB_F2;
3799			pvt->ops->dbam_to_cs		= f15_m60h_dbam_to_chip_select;
3800			break;
3801		case 0x13:
3802			/* Richland is only client */
3803			return -ENODEV;
3804		default:
3805			pvt->ctl_name			= "F15h";
3806			pvt->f1_id			= PCI_DEVICE_ID_AMD_15H_NB_F1;
3807			pvt->f2_id			= PCI_DEVICE_ID_AMD_15H_NB_F2;
3808			pvt->ops->dbam_to_cs		= f15_dbam_to_chip_select;
3809			break;
3810		}
3811		break;
3812
3813	case 0x16:
3814		switch (pvt->model) {
3815		case 0x30:
3816			pvt->ctl_name			= "F16h_M30h";
3817			pvt->f1_id			= PCI_DEVICE_ID_AMD_16H_M30H_NB_F1;
3818			pvt->f2_id			= PCI_DEVICE_ID_AMD_16H_M30H_NB_F2;
3819			break;
3820		default:
3821			pvt->ctl_name			= "F16h";
3822			pvt->f1_id			= PCI_DEVICE_ID_AMD_16H_NB_F1;
3823			pvt->f2_id			= PCI_DEVICE_ID_AMD_16H_NB_F2;
3824			break;
3825		}
3826		break;
3827
3828	case 0x17:
3829		switch (pvt->model) {
3830		case 0x10 ... 0x2f:
3831			pvt->ctl_name			= "F17h_M10h";
3832			break;
3833		case 0x30 ... 0x3f:
3834			pvt->ctl_name			= "F17h_M30h";
3835			pvt->max_mcs			= 8;
3836			break;
3837		case 0x60 ... 0x6f:
3838			pvt->ctl_name			= "F17h_M60h";
3839			break;
3840		case 0x70 ... 0x7f:
3841			pvt->ctl_name			= "F17h_M70h";
3842			break;
3843		default:
3844			pvt->ctl_name			= "F17h";
3845			break;
3846		}
3847		break;
3848
3849	case 0x18:
3850		pvt->ctl_name				= "F18h";
3851		break;
3852
3853	case 0x19:
3854		switch (pvt->model) {
3855		case 0x00 ... 0x0f:
3856			pvt->ctl_name			= "F19h";
3857			pvt->max_mcs			= 8;
3858			break;
3859		case 0x10 ... 0x1f:
3860			pvt->ctl_name			= "F19h_M10h";
3861			pvt->max_mcs			= 12;
3862			pvt->flags.zn_regs_v2		= 1;
3863			break;
3864		case 0x20 ... 0x2f:
3865			pvt->ctl_name			= "F19h_M20h";
3866			break;
3867		case 0x30 ... 0x3f:
3868			if (pvt->F3->device == PCI_DEVICE_ID_AMD_MI200_DF_F3) {
3869				pvt->ctl_name		= "MI200";
3870				pvt->max_mcs		= 4;
3871				pvt->dram_type		= MEM_HBM2;
3872				pvt->gpu_umc_base	= 0x50000;
3873				pvt->ops		= &gpu_ops;
3874			} else {
3875				pvt->ctl_name		= "F19h_M30h";
3876				pvt->max_mcs		= 8;
3877			}
3878			break;
3879		case 0x50 ... 0x5f:
3880			pvt->ctl_name			= "F19h_M50h";
3881			break;
3882		case 0x60 ... 0x6f:
3883			pvt->ctl_name			= "F19h_M60h";
3884			pvt->flags.zn_regs_v2		= 1;
3885			break;
3886		case 0x70 ... 0x7f:
3887			pvt->ctl_name			= "F19h_M70h";
3888			pvt->flags.zn_regs_v2		= 1;
3889			break;
3890		case 0x90 ... 0x9f:
3891			pvt->ctl_name			= "F19h_M90h";
3892			pvt->max_mcs			= 4;
3893			pvt->dram_type			= MEM_HBM3;
3894			pvt->gpu_umc_base		= 0x90000;
3895			pvt->ops			= &gpu_ops;
3896			break;
3897		case 0xa0 ... 0xaf:
3898			pvt->ctl_name			= "F19h_MA0h";
3899			pvt->max_mcs			= 12;
3900			pvt->flags.zn_regs_v2		= 1;
3901			break;
3902		}
3903		break;
3904
3905	case 0x1A:
3906		switch (pvt->model) {
3907		case 0x00 ... 0x1f:
3908			pvt->ctl_name           = "F1Ah";
3909			pvt->max_mcs            = 12;
3910			pvt->flags.zn_regs_v2   = 1;
3911			break;
3912		case 0x40 ... 0x4f:
3913			pvt->ctl_name           = "F1Ah_M40h";
3914			pvt->flags.zn_regs_v2   = 1;
3915			break;
3916		}
3917		break;
3918
3919	default:
3920		amd64_err("Unsupported family!\n");
3921		return -ENODEV;
3922	}
3923
3924	return 0;
3925}
3926
3927static const struct attribute_group *amd64_edac_attr_groups[] = {
3928#ifdef CONFIG_EDAC_DEBUG
3929	&dbg_group,
3930	&inj_group,
3931#endif
3932	NULL
3933};
3934
3935/*
3936 * For heterogeneous and APU models EDAC CHIP_SELECT and CHANNEL layers
3937 * should be swapped to fit into the layers.
3938 */
3939static unsigned int get_layer_size(struct amd64_pvt *pvt, u8 layer)
3940{
3941	bool is_gpu = (pvt->ops == &gpu_ops);
3942
3943	if (!layer)
3944		return is_gpu ? pvt->max_mcs
3945			      : pvt->csels[0].b_cnt;
3946	else
3947		return is_gpu ? pvt->csels[0].b_cnt
3948			      : pvt->max_mcs;
3949}
3950
3951static int init_one_instance(struct amd64_pvt *pvt)
3952{
3953	struct mem_ctl_info *mci = NULL;
3954	struct edac_mc_layer layers[2];
3955	int ret = -ENOMEM;
3956
3957	layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
3958	layers[0].size = get_layer_size(pvt, 0);
3959	layers[0].is_virt_csrow = true;
3960	layers[1].type = EDAC_MC_LAYER_CHANNEL;
3961	layers[1].size = get_layer_size(pvt, 1);
3962	layers[1].is_virt_csrow = false;
3963
3964	mci = edac_mc_alloc(pvt->mc_node_id, ARRAY_SIZE(layers), layers, 0);
3965	if (!mci)
3966		return ret;
3967
3968	mci->pvt_info = pvt;
3969	mci->pdev = &pvt->F3->dev;
3970
3971	pvt->ops->setup_mci_misc_attrs(mci);
3972
3973	ret = -ENODEV;
3974	if (edac_mc_add_mc_with_groups(mci, amd64_edac_attr_groups)) {
3975		edac_dbg(1, "failed edac_mc_add_mc()\n");
3976		edac_mc_free(mci);
3977		return ret;
3978	}
3979
3980	return 0;
3981}
3982
3983static bool instance_has_memory(struct amd64_pvt *pvt)
3984{
3985	bool cs_enabled = false;
3986	int cs = 0, dct = 0;
3987
3988	for (dct = 0; dct < pvt->max_mcs; dct++) {
3989		for_each_chip_select(cs, dct, pvt)
3990			cs_enabled |= csrow_enabled(cs, dct, pvt);
3991	}
3992
3993	return cs_enabled;
3994}
3995
3996static int probe_one_instance(unsigned int nid)
3997{
3998	struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
3999	struct amd64_pvt *pvt = NULL;
4000	struct ecc_settings *s;
4001	int ret;
4002
4003	ret = -ENOMEM;
4004	s = kzalloc(sizeof(struct ecc_settings), GFP_KERNEL);
4005	if (!s)
4006		goto err_out;
4007
4008	ecc_stngs[nid] = s;
4009
4010	pvt = kzalloc(sizeof(struct amd64_pvt), GFP_KERNEL);
4011	if (!pvt)
4012		goto err_settings;
4013
4014	pvt->mc_node_id	= nid;
4015	pvt->F3 = F3;
4016
4017	ret = per_family_init(pvt);
4018	if (ret < 0)
4019		goto err_enable;
4020
4021	ret = pvt->ops->hw_info_get(pvt);
4022	if (ret < 0)
4023		goto err_enable;
4024
4025	ret = 0;
4026	if (!instance_has_memory(pvt)) {
4027		amd64_info("Node %d: No DIMMs detected.\n", nid);
4028		goto err_enable;
4029	}
4030
4031	if (!pvt->ops->ecc_enabled(pvt)) {
4032		ret = -ENODEV;
4033
4034		if (!ecc_enable_override)
4035			goto err_enable;
4036
4037		if (boot_cpu_data.x86 >= 0x17) {
4038			amd64_warn("Forcing ECC on is not recommended on newer systems. Please enable ECC in BIOS.");
4039			goto err_enable;
4040		} else
4041			amd64_warn("Forcing ECC on!\n");
4042
4043		if (!enable_ecc_error_reporting(s, nid, F3))
4044			goto err_enable;
4045	}
4046
4047	ret = init_one_instance(pvt);
4048	if (ret < 0) {
4049		amd64_err("Error probing instance: %d\n", nid);
4050
4051		if (boot_cpu_data.x86 < 0x17)
4052			restore_ecc_error_reporting(s, nid, F3);
4053
4054		goto err_enable;
4055	}
4056
4057	amd64_info("%s detected (node %d).\n", pvt->ctl_name, pvt->mc_node_id);
4058
4059	/* Display and decode various registers for debug purposes. */
4060	pvt->ops->dump_misc_regs(pvt);
4061
4062	return ret;
4063
4064err_enable:
4065	hw_info_put(pvt);
4066	kfree(pvt);
4067
4068err_settings:
4069	kfree(s);
4070	ecc_stngs[nid] = NULL;
4071
4072err_out:
4073	return ret;
4074}
4075
4076static void remove_one_instance(unsigned int nid)
4077{
4078	struct pci_dev *F3 = node_to_amd_nb(nid)->misc;
4079	struct ecc_settings *s = ecc_stngs[nid];
4080	struct mem_ctl_info *mci;
4081	struct amd64_pvt *pvt;
4082
4083	/* Remove from EDAC CORE tracking list */
4084	mci = edac_mc_del_mc(&F3->dev);
4085	if (!mci)
4086		return;
4087
4088	pvt = mci->pvt_info;
4089
4090	restore_ecc_error_reporting(s, nid, F3);
4091
4092	kfree(ecc_stngs[nid]);
4093	ecc_stngs[nid] = NULL;
4094
4095	/* Free the EDAC CORE resources */
4096	mci->pvt_info = NULL;
4097
4098	hw_info_put(pvt);
4099	kfree(pvt);
4100	edac_mc_free(mci);
4101}
4102
4103static void setup_pci_device(void)
4104{
4105	if (pci_ctl)
4106		return;
4107
4108	pci_ctl = edac_pci_create_generic_ctl(pci_ctl_dev, EDAC_MOD_STR);
4109	if (!pci_ctl) {
4110		pr_warn("%s(): Unable to create PCI control\n", __func__);
4111		pr_warn("%s(): PCI error report via EDAC not set\n", __func__);
4112	}
4113}
4114
4115static const struct x86_cpu_id amd64_cpuids[] = {
4116	X86_MATCH_VENDOR_FAM(AMD,	0x0F, NULL),
4117	X86_MATCH_VENDOR_FAM(AMD,	0x10, NULL),
4118	X86_MATCH_VENDOR_FAM(AMD,	0x15, NULL),
4119	X86_MATCH_VENDOR_FAM(AMD,	0x16, NULL),
4120	X86_MATCH_VENDOR_FAM(AMD,	0x17, NULL),
4121	X86_MATCH_VENDOR_FAM(HYGON,	0x18, NULL),
4122	X86_MATCH_VENDOR_FAM(AMD,	0x19, NULL),
4123	X86_MATCH_VENDOR_FAM(AMD,	0x1A, NULL),
4124	{ }
4125};
4126MODULE_DEVICE_TABLE(x86cpu, amd64_cpuids);
4127
4128static int __init amd64_edac_init(void)
4129{
4130	const char *owner;
4131	int err = -ENODEV;
4132	int i;
4133
4134	if (ghes_get_devices())
4135		return -EBUSY;
4136
4137	owner = edac_get_owner();
4138	if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
4139		return -EBUSY;
4140
4141	if (!x86_match_cpu(amd64_cpuids))
4142		return -ENODEV;
4143
4144	if (!amd_nb_num())
4145		return -ENODEV;
4146
4147	opstate_init();
4148
4149	err = -ENOMEM;
4150	ecc_stngs = kcalloc(amd_nb_num(), sizeof(ecc_stngs[0]), GFP_KERNEL);
4151	if (!ecc_stngs)
4152		goto err_free;
4153
4154	msrs = msrs_alloc();
4155	if (!msrs)
4156		goto err_free;
4157
4158	for (i = 0; i < amd_nb_num(); i++) {
4159		err = probe_one_instance(i);
4160		if (err) {
4161			/* unwind properly */
4162			while (--i >= 0)
4163				remove_one_instance(i);
4164
4165			goto err_pci;
4166		}
4167	}
4168
4169	if (!edac_has_mcs()) {
4170		err = -ENODEV;
4171		goto err_pci;
4172	}
4173
4174	/* register stuff with EDAC MCE */
4175	if (boot_cpu_data.x86 >= 0x17) {
4176		amd_register_ecc_decoder(decode_umc_error);
4177	} else {
4178		amd_register_ecc_decoder(decode_bus_error);
4179		setup_pci_device();
4180	}
4181
4182#ifdef CONFIG_X86_32
4183	amd64_err("%s on 32-bit is unsupported. USE AT YOUR OWN RISK!\n", EDAC_MOD_STR);
4184#endif
4185
4186	return 0;
4187
4188err_pci:
4189	pci_ctl_dev = NULL;
4190
4191	msrs_free(msrs);
4192	msrs = NULL;
4193
4194err_free:
4195	kfree(ecc_stngs);
4196	ecc_stngs = NULL;
4197
4198	return err;
4199}
4200
4201static void __exit amd64_edac_exit(void)
4202{
4203	int i;
4204
4205	if (pci_ctl)
4206		edac_pci_release_generic_ctl(pci_ctl);
4207
4208	/* unregister from EDAC MCE */
4209	if (boot_cpu_data.x86 >= 0x17)
4210		amd_unregister_ecc_decoder(decode_umc_error);
4211	else
4212		amd_unregister_ecc_decoder(decode_bus_error);
4213
4214	for (i = 0; i < amd_nb_num(); i++)
4215		remove_one_instance(i);
4216
4217	kfree(ecc_stngs);
4218	ecc_stngs = NULL;
4219
4220	pci_ctl_dev = NULL;
4221
4222	msrs_free(msrs);
4223	msrs = NULL;
4224}
4225
4226module_init(amd64_edac_init);
4227module_exit(amd64_edac_exit);
4228
4229MODULE_LICENSE("GPL");
4230MODULE_AUTHOR("SoftwareBitMaker: Doug Thompson, Dave Peterson, Thayne Harbaugh; AMD");
4231MODULE_DESCRIPTION("MC support for AMD64 memory controllers");
4232
4233module_param(edac_op_state, int, 0444);
4234MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");
4235