1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Driver for Intel(R) 10nm server memory controller.
4 * Copyright (c) 2019, Intel Corporation.
5 *
6 */
7
8#include <linux/kernel.h>
9#include <linux/io.h>
10#include <asm/cpu_device_id.h>
11#include <asm/intel-family.h>
12#include <asm/mce.h>
13#include "edac_module.h"
14#include "skx_common.h"
15
16#define I10NM_REVISION	"v0.0.6"
17#define EDAC_MOD_STR	"i10nm_edac"
18
19/* Debug macros */
20#define i10nm_printk(level, fmt, arg...)	\
21	edac_printk(level, "i10nm", fmt, ##arg)
22
23#define I10NM_GET_SCK_BAR(d, reg)	\
24	pci_read_config_dword((d)->uracu, 0xd0, &(reg))
25#define I10NM_GET_IMC_BAR(d, i, reg)		\
26	pci_read_config_dword((d)->uracu,	\
27	(res_cfg->type == GNR ? 0xd4 : 0xd8) + (i) * 4, &(reg))
28#define I10NM_GET_SAD(d, offset, i, reg)\
29	pci_read_config_dword((d)->sad_all, (offset) + (i) * \
30	(res_cfg->type == GNR ? 12 : 8), &(reg))
31#define I10NM_GET_HBM_IMC_BAR(d, reg)	\
32	pci_read_config_dword((d)->uracu, 0xd4, &(reg))
33#define I10NM_GET_CAPID3_CFG(d, reg)	\
34	pci_read_config_dword((d)->pcu_cr3,	\
35	res_cfg->type == GNR ? 0x290 : 0x90, &(reg))
36#define I10NM_GET_CAPID5_CFG(d, reg)	\
37	pci_read_config_dword((d)->pcu_cr3,	\
38	res_cfg->type == GNR ? 0x298 : 0x98, &(reg))
39#define I10NM_GET_DIMMMTR(m, i, j)	\
40	readl((m)->mbase + ((m)->hbm_mc ? 0x80c :	\
41	(res_cfg->type == GNR ? 0xc0c : 0x2080c)) +	\
42	(i) * (m)->chan_mmio_sz + (j) * 4)
43#define I10NM_GET_MCDDRTCFG(m, i)	\
44	readl((m)->mbase + ((m)->hbm_mc ? 0x970 : 0x20970) + \
45	(i) * (m)->chan_mmio_sz)
46#define I10NM_GET_MCMTR(m, i)		\
47	readl((m)->mbase + ((m)->hbm_mc ? 0xef8 :	\
48	(res_cfg->type == GNR ? 0xaf8 : 0x20ef8)) +	\
49	(i) * (m)->chan_mmio_sz)
50#define I10NM_GET_AMAP(m, i)		\
51	readl((m)->mbase + ((m)->hbm_mc ? 0x814 :	\
52	(res_cfg->type == GNR ? 0xc14 : 0x20814)) +	\
53	(i) * (m)->chan_mmio_sz)
54#define I10NM_GET_REG32(m, i, offset)	\
55	readl((m)->mbase + (i) * (m)->chan_mmio_sz + (offset))
56#define I10NM_GET_REG64(m, i, offset)	\
57	readq((m)->mbase + (i) * (m)->chan_mmio_sz + (offset))
58#define I10NM_SET_REG32(m, i, offset, v)	\
59	writel(v, (m)->mbase + (i) * (m)->chan_mmio_sz + (offset))
60
61#define I10NM_GET_SCK_MMIO_BASE(reg)	(GET_BITFIELD(reg, 0, 28) << 23)
62#define I10NM_GET_IMC_MMIO_OFFSET(reg)	(GET_BITFIELD(reg, 0, 10) << 12)
63#define I10NM_GET_IMC_MMIO_SIZE(reg)	((GET_BITFIELD(reg, 13, 23) - \
64					 GET_BITFIELD(reg, 0, 10) + 1) << 12)
65#define I10NM_GET_HBM_IMC_MMIO_OFFSET(reg)	\
66	((GET_BITFIELD(reg, 0, 10) << 12) + 0x140000)
67
68#define I10NM_GNR_IMC_MMIO_OFFSET	0x24c000
69#define I10NM_GNR_IMC_MMIO_SIZE		0x4000
70#define I10NM_HBM_IMC_MMIO_SIZE		0x9000
71#define I10NM_DDR_IMC_CH_CNT(reg)	GET_BITFIELD(reg, 21, 24)
72#define I10NM_IS_HBM_PRESENT(reg)	GET_BITFIELD(reg, 27, 30)
73#define I10NM_IS_HBM_IMC(reg)		GET_BITFIELD(reg, 29, 29)
74
75#define I10NM_MAX_SAD			16
76#define I10NM_SAD_ENABLE(reg)		GET_BITFIELD(reg, 0, 0)
77#define I10NM_SAD_NM_CACHEABLE(reg)	GET_BITFIELD(reg, 5, 5)
78
79#define RETRY_RD_ERR_LOG_UC		BIT(1)
80#define RETRY_RD_ERR_LOG_NOOVER		BIT(14)
81#define RETRY_RD_ERR_LOG_EN		BIT(15)
82#define RETRY_RD_ERR_LOG_NOOVER_UC	(BIT(14) | BIT(1))
83#define RETRY_RD_ERR_LOG_OVER_UC_V	(BIT(2) | BIT(1) | BIT(0))
84
85static struct list_head *i10nm_edac_list;
86
87static struct res_config *res_cfg;
88static int retry_rd_err_log;
89static int decoding_via_mca;
90static bool mem_cfg_2lm;
91
92static u32 offsets_scrub_icx[]  = {0x22c60, 0x22c54, 0x22c5c, 0x22c58, 0x22c28, 0x20ed8};
93static u32 offsets_scrub_spr[]  = {0x22c60, 0x22c54, 0x22f08, 0x22c58, 0x22c28, 0x20ed8};
94static u32 offsets_scrub_spr_hbm0[]  = {0x2860, 0x2854, 0x2b08, 0x2858, 0x2828, 0x0ed8};
95static u32 offsets_scrub_spr_hbm1[]  = {0x2c60, 0x2c54, 0x2f08, 0x2c58, 0x2c28, 0x0fa8};
96static u32 offsets_demand_icx[] = {0x22e54, 0x22e60, 0x22e64, 0x22e58, 0x22e5c, 0x20ee0};
97static u32 offsets_demand_spr[] = {0x22e54, 0x22e60, 0x22f10, 0x22e58, 0x22e5c, 0x20ee0};
98static u32 offsets_demand2_spr[] = {0x22c70, 0x22d80, 0x22f18, 0x22d58, 0x22c64, 0x20f10};
99static u32 offsets_demand_spr_hbm0[] = {0x2a54, 0x2a60, 0x2b10, 0x2a58, 0x2a5c, 0x0ee0};
100static u32 offsets_demand_spr_hbm1[] = {0x2e54, 0x2e60, 0x2f10, 0x2e58, 0x2e5c, 0x0fb0};
101
102static void __enable_retry_rd_err_log(struct skx_imc *imc, int chan, bool enable,
103				      u32 *offsets_scrub, u32 *offsets_demand,
104				      u32 *offsets_demand2)
105{
106	u32 s, d, d2;
107
108	s = I10NM_GET_REG32(imc, chan, offsets_scrub[0]);
109	d = I10NM_GET_REG32(imc, chan, offsets_demand[0]);
110	if (offsets_demand2)
111		d2 = I10NM_GET_REG32(imc, chan, offsets_demand2[0]);
112
113	if (enable) {
114		/* Save default configurations */
115		imc->chan[chan].retry_rd_err_log_s = s;
116		imc->chan[chan].retry_rd_err_log_d = d;
117		if (offsets_demand2)
118			imc->chan[chan].retry_rd_err_log_d2 = d2;
119
120		s &= ~RETRY_RD_ERR_LOG_NOOVER_UC;
121		s |=  RETRY_RD_ERR_LOG_EN;
122		d &= ~RETRY_RD_ERR_LOG_NOOVER_UC;
123		d |=  RETRY_RD_ERR_LOG_EN;
124
125		if (offsets_demand2) {
126			d2 &= ~RETRY_RD_ERR_LOG_UC;
127			d2 |=  RETRY_RD_ERR_LOG_NOOVER;
128			d2 |=  RETRY_RD_ERR_LOG_EN;
129		}
130	} else {
131		/* Restore default configurations */
132		if (imc->chan[chan].retry_rd_err_log_s & RETRY_RD_ERR_LOG_UC)
133			s |=  RETRY_RD_ERR_LOG_UC;
134		if (imc->chan[chan].retry_rd_err_log_s & RETRY_RD_ERR_LOG_NOOVER)
135			s |=  RETRY_RD_ERR_LOG_NOOVER;
136		if (!(imc->chan[chan].retry_rd_err_log_s & RETRY_RD_ERR_LOG_EN))
137			s &= ~RETRY_RD_ERR_LOG_EN;
138		if (imc->chan[chan].retry_rd_err_log_d & RETRY_RD_ERR_LOG_UC)
139			d |=  RETRY_RD_ERR_LOG_UC;
140		if (imc->chan[chan].retry_rd_err_log_d & RETRY_RD_ERR_LOG_NOOVER)
141			d |=  RETRY_RD_ERR_LOG_NOOVER;
142		if (!(imc->chan[chan].retry_rd_err_log_d & RETRY_RD_ERR_LOG_EN))
143			d &= ~RETRY_RD_ERR_LOG_EN;
144
145		if (offsets_demand2) {
146			if (imc->chan[chan].retry_rd_err_log_d2 & RETRY_RD_ERR_LOG_UC)
147				d2 |=  RETRY_RD_ERR_LOG_UC;
148			if (!(imc->chan[chan].retry_rd_err_log_d2 & RETRY_RD_ERR_LOG_NOOVER))
149				d2 &=  ~RETRY_RD_ERR_LOG_NOOVER;
150			if (!(imc->chan[chan].retry_rd_err_log_d2 & RETRY_RD_ERR_LOG_EN))
151				d2 &= ~RETRY_RD_ERR_LOG_EN;
152		}
153	}
154
155	I10NM_SET_REG32(imc, chan, offsets_scrub[0], s);
156	I10NM_SET_REG32(imc, chan, offsets_demand[0], d);
157	if (offsets_demand2)
158		I10NM_SET_REG32(imc, chan, offsets_demand2[0], d2);
159}
160
161static void enable_retry_rd_err_log(bool enable)
162{
163	int i, j, imc_num, chan_num;
164	struct skx_imc *imc;
165	struct skx_dev *d;
166
167	edac_dbg(2, "\n");
168
169	list_for_each_entry(d, i10nm_edac_list, list) {
170		imc_num  = res_cfg->ddr_imc_num;
171		chan_num = res_cfg->ddr_chan_num;
172
173		for (i = 0; i < imc_num; i++) {
174			imc = &d->imc[i];
175			if (!imc->mbase)
176				continue;
177
178			for (j = 0; j < chan_num; j++)
179				__enable_retry_rd_err_log(imc, j, enable,
180							  res_cfg->offsets_scrub,
181							  res_cfg->offsets_demand,
182							  res_cfg->offsets_demand2);
183		}
184
185		imc_num += res_cfg->hbm_imc_num;
186		chan_num = res_cfg->hbm_chan_num;
187
188		for (; i < imc_num; i++) {
189			imc = &d->imc[i];
190			if (!imc->mbase || !imc->hbm_mc)
191				continue;
192
193			for (j = 0; j < chan_num; j++) {
194				__enable_retry_rd_err_log(imc, j, enable,
195							  res_cfg->offsets_scrub_hbm0,
196							  res_cfg->offsets_demand_hbm0,
197							  NULL);
198				__enable_retry_rd_err_log(imc, j, enable,
199							  res_cfg->offsets_scrub_hbm1,
200							  res_cfg->offsets_demand_hbm1,
201							  NULL);
202			}
203		}
204	}
205}
206
207static void show_retry_rd_err_log(struct decoded_addr *res, char *msg,
208				  int len, bool scrub_err)
209{
210	struct skx_imc *imc = &res->dev->imc[res->imc];
211	u32 log0, log1, log2, log3, log4;
212	u32 corr0, corr1, corr2, corr3;
213	u32 lxg0, lxg1, lxg3, lxg4;
214	u32 *xffsets = NULL;
215	u64 log2a, log5;
216	u64 lxg2a, lxg5;
217	u32 *offsets;
218	int n, pch;
219
220	if (!imc->mbase)
221		return;
222
223	if (imc->hbm_mc) {
224		pch = res->cs & 1;
225
226		if (pch)
227			offsets = scrub_err ? res_cfg->offsets_scrub_hbm1 :
228					      res_cfg->offsets_demand_hbm1;
229		else
230			offsets = scrub_err ? res_cfg->offsets_scrub_hbm0 :
231					      res_cfg->offsets_demand_hbm0;
232	} else {
233		if (scrub_err) {
234			offsets = res_cfg->offsets_scrub;
235		} else {
236			offsets = res_cfg->offsets_demand;
237			xffsets = res_cfg->offsets_demand2;
238		}
239	}
240
241	log0 = I10NM_GET_REG32(imc, res->channel, offsets[0]);
242	log1 = I10NM_GET_REG32(imc, res->channel, offsets[1]);
243	log3 = I10NM_GET_REG32(imc, res->channel, offsets[3]);
244	log4 = I10NM_GET_REG32(imc, res->channel, offsets[4]);
245	log5 = I10NM_GET_REG64(imc, res->channel, offsets[5]);
246
247	if (xffsets) {
248		lxg0 = I10NM_GET_REG32(imc, res->channel, xffsets[0]);
249		lxg1 = I10NM_GET_REG32(imc, res->channel, xffsets[1]);
250		lxg3 = I10NM_GET_REG32(imc, res->channel, xffsets[3]);
251		lxg4 = I10NM_GET_REG32(imc, res->channel, xffsets[4]);
252		lxg5 = I10NM_GET_REG64(imc, res->channel, xffsets[5]);
253	}
254
255	if (res_cfg->type == SPR) {
256		log2a = I10NM_GET_REG64(imc, res->channel, offsets[2]);
257		n = snprintf(msg, len, " retry_rd_err_log[%.8x %.8x %.16llx %.8x %.8x %.16llx",
258			     log0, log1, log2a, log3, log4, log5);
259
260		if (len - n > 0) {
261			if (xffsets) {
262				lxg2a = I10NM_GET_REG64(imc, res->channel, xffsets[2]);
263				n += snprintf(msg + n, len - n, " %.8x %.8x %.16llx %.8x %.8x %.16llx]",
264					     lxg0, lxg1, lxg2a, lxg3, lxg4, lxg5);
265			} else {
266				n += snprintf(msg + n, len - n, "]");
267			}
268		}
269	} else {
270		log2 = I10NM_GET_REG32(imc, res->channel, offsets[2]);
271		n = snprintf(msg, len, " retry_rd_err_log[%.8x %.8x %.8x %.8x %.8x %.16llx]",
272			     log0, log1, log2, log3, log4, log5);
273	}
274
275	if (imc->hbm_mc) {
276		if (pch) {
277			corr0 = I10NM_GET_REG32(imc, res->channel, 0x2c18);
278			corr1 = I10NM_GET_REG32(imc, res->channel, 0x2c1c);
279			corr2 = I10NM_GET_REG32(imc, res->channel, 0x2c20);
280			corr3 = I10NM_GET_REG32(imc, res->channel, 0x2c24);
281		} else {
282			corr0 = I10NM_GET_REG32(imc, res->channel, 0x2818);
283			corr1 = I10NM_GET_REG32(imc, res->channel, 0x281c);
284			corr2 = I10NM_GET_REG32(imc, res->channel, 0x2820);
285			corr3 = I10NM_GET_REG32(imc, res->channel, 0x2824);
286		}
287	} else {
288		corr0 = I10NM_GET_REG32(imc, res->channel, 0x22c18);
289		corr1 = I10NM_GET_REG32(imc, res->channel, 0x22c1c);
290		corr2 = I10NM_GET_REG32(imc, res->channel, 0x22c20);
291		corr3 = I10NM_GET_REG32(imc, res->channel, 0x22c24);
292	}
293
294	if (len - n > 0)
295		snprintf(msg + n, len - n,
296			 " correrrcnt[%.4x %.4x %.4x %.4x %.4x %.4x %.4x %.4x]",
297			 corr0 & 0xffff, corr0 >> 16,
298			 corr1 & 0xffff, corr1 >> 16,
299			 corr2 & 0xffff, corr2 >> 16,
300			 corr3 & 0xffff, corr3 >> 16);
301
302	/* Clear status bits */
303	if (retry_rd_err_log == 2) {
304		if (log0 & RETRY_RD_ERR_LOG_OVER_UC_V) {
305			log0 &= ~RETRY_RD_ERR_LOG_OVER_UC_V;
306			I10NM_SET_REG32(imc, res->channel, offsets[0], log0);
307		}
308
309		if (xffsets && (lxg0 & RETRY_RD_ERR_LOG_OVER_UC_V)) {
310			lxg0 &= ~RETRY_RD_ERR_LOG_OVER_UC_V;
311			I10NM_SET_REG32(imc, res->channel, xffsets[0], lxg0);
312		}
313	}
314}
315
316static struct pci_dev *pci_get_dev_wrapper(int dom, unsigned int bus,
317					   unsigned int dev, unsigned int fun)
318{
319	struct pci_dev *pdev;
320
321	pdev = pci_get_domain_bus_and_slot(dom, bus, PCI_DEVFN(dev, fun));
322	if (!pdev) {
323		edac_dbg(2, "No device %02x:%02x.%x\n",
324			 bus, dev, fun);
325		return NULL;
326	}
327
328	if (unlikely(pci_enable_device(pdev) < 0)) {
329		edac_dbg(2, "Failed to enable device %02x:%02x.%x\n",
330			 bus, dev, fun);
331		pci_dev_put(pdev);
332		return NULL;
333	}
334
335	return pdev;
336}
337
338/**
339 * i10nm_get_imc_num() - Get the number of present DDR memory controllers.
340 *
341 * @cfg : The pointer to the structure of EDAC resource configurations.
342 *
343 * For Granite Rapids CPUs, the number of present DDR memory controllers read
344 * at runtime overwrites the value statically configured in @cfg->ddr_imc_num.
345 * For other CPUs, the number of present DDR memory controllers is statically
346 * configured in @cfg->ddr_imc_num.
347 *
348 * RETURNS : 0 on success, < 0 on failure.
349 */
350static int i10nm_get_imc_num(struct res_config *cfg)
351{
352	int n, imc_num, chan_num = 0;
353	struct skx_dev *d;
354	u32 reg;
355
356	list_for_each_entry(d, i10nm_edac_list, list) {
357		d->pcu_cr3 = pci_get_dev_wrapper(d->seg, d->bus[res_cfg->pcu_cr3_bdf.bus],
358						 res_cfg->pcu_cr3_bdf.dev,
359						 res_cfg->pcu_cr3_bdf.fun);
360		if (!d->pcu_cr3)
361			continue;
362
363		if (I10NM_GET_CAPID5_CFG(d, reg))
364			continue;
365
366		n = I10NM_DDR_IMC_CH_CNT(reg);
367
368		if (!chan_num) {
369			chan_num = n;
370			edac_dbg(2, "Get DDR CH number: %d\n", chan_num);
371		} else if (chan_num != n) {
372			i10nm_printk(KERN_NOTICE, "Get DDR CH numbers: %d, %d\n", chan_num, n);
373		}
374	}
375
376	switch (cfg->type) {
377	case GNR:
378		/*
379		 * One channel per DDR memory controller for Granite Rapids CPUs.
380		 */
381		imc_num = chan_num;
382
383		if (!imc_num) {
384			i10nm_printk(KERN_ERR, "Invalid DDR MC number\n");
385			return -ENODEV;
386		}
387
388		if (imc_num > I10NM_NUM_DDR_IMC) {
389			i10nm_printk(KERN_ERR, "Need to make I10NM_NUM_DDR_IMC >= %d\n", imc_num);
390			return -EINVAL;
391		}
392
393		if (cfg->ddr_imc_num != imc_num) {
394			/*
395			 * Store the number of present DDR memory controllers.
396			 */
397			cfg->ddr_imc_num = imc_num;
398			edac_dbg(2, "Set DDR MC number: %d", imc_num);
399		}
400
401		return 0;
402	default:
403		/*
404		 * For other CPUs, the number of present DDR memory controllers
405		 * is statically pre-configured in cfg->ddr_imc_num.
406		 */
407		return 0;
408	}
409}
410
411static bool i10nm_check_2lm(struct res_config *cfg)
412{
413	struct skx_dev *d;
414	u32 reg;
415	int i;
416
417	list_for_each_entry(d, i10nm_edac_list, list) {
418		d->sad_all = pci_get_dev_wrapper(d->seg, d->bus[res_cfg->sad_all_bdf.bus],
419						 res_cfg->sad_all_bdf.dev,
420						 res_cfg->sad_all_bdf.fun);
421		if (!d->sad_all)
422			continue;
423
424		for (i = 0; i < I10NM_MAX_SAD; i++) {
425			I10NM_GET_SAD(d, cfg->sad_all_offset, i, reg);
426			if (I10NM_SAD_ENABLE(reg) && I10NM_SAD_NM_CACHEABLE(reg)) {
427				edac_dbg(2, "2-level memory configuration.\n");
428				return true;
429			}
430		}
431	}
432
433	return false;
434}
435
436/*
437 * Check whether the error comes from DDRT by ICX/Tremont/SPR model specific error code.
438 * Refer to SDM vol3B 17.11.3/17.13.2 Intel IMC MC error codes for IA32_MCi_STATUS.
439 */
440static bool i10nm_mscod_is_ddrt(u32 mscod)
441{
442	switch (res_cfg->type) {
443	case I10NM:
444		switch (mscod) {
445		case 0x0106: case 0x0107:
446		case 0x0800: case 0x0804:
447		case 0x0806 ... 0x0808:
448		case 0x080a ... 0x080e:
449		case 0x0810: case 0x0811:
450		case 0x0816: case 0x081e:
451		case 0x081f:
452			return true;
453		}
454
455		break;
456	case SPR:
457		switch (mscod) {
458		case 0x0800: case 0x0804:
459		case 0x0806 ... 0x0808:
460		case 0x080a ... 0x080e:
461		case 0x0810: case 0x0811:
462		case 0x0816: case 0x081e:
463		case 0x081f:
464			return true;
465		}
466
467		break;
468	default:
469		return false;
470	}
471
472	return false;
473}
474
475static bool i10nm_mc_decode_available(struct mce *mce)
476{
477#define ICX_IMCx_CHy		0x06666000
478	u8 bank;
479
480	if (!decoding_via_mca || mem_cfg_2lm)
481		return false;
482
483	if ((mce->status & (MCI_STATUS_MISCV | MCI_STATUS_ADDRV))
484			!= (MCI_STATUS_MISCV | MCI_STATUS_ADDRV))
485		return false;
486
487	bank = mce->bank;
488
489	switch (res_cfg->type) {
490	case I10NM:
491		/* Check whether the bank is one of {13,14,17,18,21,22,25,26} */
492		if (!(ICX_IMCx_CHy & (1 << bank)))
493			return false;
494		break;
495	case SPR:
496		if (bank < 13 || bank > 20)
497			return false;
498		break;
499	default:
500		return false;
501	}
502
503	/* DDRT errors can't be decoded from MCA bank registers */
504	if (MCI_MISC_ECC_MODE(mce->misc) == MCI_MISC_ECC_DDRT)
505		return false;
506
507	if (i10nm_mscod_is_ddrt(MCI_STATUS_MSCOD(mce->status)))
508		return false;
509
510	return true;
511}
512
513static bool i10nm_mc_decode(struct decoded_addr *res)
514{
515	struct mce *m = res->mce;
516	struct skx_dev *d;
517	u8 bank;
518
519	if (!i10nm_mc_decode_available(m))
520		return false;
521
522	list_for_each_entry(d, i10nm_edac_list, list) {
523		if (d->imc[0].src_id == m->socketid) {
524			res->socket = m->socketid;
525			res->dev = d;
526			break;
527		}
528	}
529
530	switch (res_cfg->type) {
531	case I10NM:
532		bank              = m->bank - 13;
533		res->imc          = bank / 4;
534		res->channel      = bank % 2;
535		res->column       = GET_BITFIELD(m->misc, 9, 18) << 2;
536		res->row          = GET_BITFIELD(m->misc, 19, 39);
537		res->bank_group   = GET_BITFIELD(m->misc, 40, 41);
538		res->bank_address = GET_BITFIELD(m->misc, 42, 43);
539		res->bank_group  |= GET_BITFIELD(m->misc, 44, 44) << 2;
540		res->rank         = GET_BITFIELD(m->misc, 56, 58);
541		res->dimm         = res->rank >> 2;
542		res->rank         = res->rank % 4;
543		break;
544	case SPR:
545		bank              = m->bank - 13;
546		res->imc          = bank / 2;
547		res->channel      = bank % 2;
548		res->column       = GET_BITFIELD(m->misc, 9, 18) << 2;
549		res->row          = GET_BITFIELD(m->misc, 19, 36);
550		res->bank_group   = GET_BITFIELD(m->misc, 37, 38);
551		res->bank_address = GET_BITFIELD(m->misc, 39, 40);
552		res->bank_group  |= GET_BITFIELD(m->misc, 41, 41) << 2;
553		res->rank         = GET_BITFIELD(m->misc, 57, 57);
554		res->dimm         = GET_BITFIELD(m->misc, 58, 58);
555		break;
556	default:
557		return false;
558	}
559
560	if (!res->dev) {
561		skx_printk(KERN_ERR, "No device for src_id %d imc %d\n",
562			   m->socketid, res->imc);
563		return false;
564	}
565
566	return true;
567}
568
569/**
570 * get_gnr_mdev() - Get the PCI device of the @logical_idx-th DDR memory controller.
571 *
572 * @d            : The pointer to the structure of CPU socket EDAC device.
573 * @logical_idx  : The logical index of the present memory controller (0 ~ max present MC# - 1).
574 * @physical_idx : To store the corresponding physical index of @logical_idx.
575 *
576 * RETURNS       : The PCI device of the @logical_idx-th DDR memory controller, NULL on failure.
577 */
578static struct pci_dev *get_gnr_mdev(struct skx_dev *d, int logical_idx, int *physical_idx)
579{
580#define GNR_MAX_IMC_PCI_CNT	28
581
582	struct pci_dev *mdev;
583	int i, logical = 0;
584
585	/*
586	 * Detect present memory controllers from { PCI device: 8-5, function 7-1 }
587	 */
588	for (i = 0; i < GNR_MAX_IMC_PCI_CNT; i++) {
589		mdev = pci_get_dev_wrapper(d->seg,
590					   d->bus[res_cfg->ddr_mdev_bdf.bus],
591					   res_cfg->ddr_mdev_bdf.dev + i / 7,
592					   res_cfg->ddr_mdev_bdf.fun + i % 7);
593
594		if (mdev) {
595			if (logical == logical_idx) {
596				*physical_idx = i;
597				return mdev;
598			}
599
600			pci_dev_put(mdev);
601			logical++;
602		}
603	}
604
605	return NULL;
606}
607
608/**
609 * get_ddr_munit() - Get the resource of the i-th DDR memory controller.
610 *
611 * @d      : The pointer to the structure of CPU socket EDAC device.
612 * @i      : The index of the CPU socket relative DDR memory controller.
613 * @offset : To store the MMIO offset of the i-th DDR memory controller.
614 * @size   : To store the MMIO size of the i-th DDR memory controller.
615 *
616 * RETURNS : The PCI device of the i-th DDR memory controller, NULL on failure.
617 */
618static struct pci_dev *get_ddr_munit(struct skx_dev *d, int i, u32 *offset, unsigned long *size)
619{
620	struct pci_dev *mdev;
621	int physical_idx;
622	u32 reg;
623
624	switch (res_cfg->type) {
625	case GNR:
626		if (I10NM_GET_IMC_BAR(d, 0, reg)) {
627			i10nm_printk(KERN_ERR, "Failed to get mc0 bar\n");
628			return NULL;
629		}
630
631		mdev = get_gnr_mdev(d, i, &physical_idx);
632		if (!mdev)
633			return NULL;
634
635		*offset = I10NM_GET_IMC_MMIO_OFFSET(reg) +
636			  I10NM_GNR_IMC_MMIO_OFFSET +
637			  physical_idx * I10NM_GNR_IMC_MMIO_SIZE;
638		*size   = I10NM_GNR_IMC_MMIO_SIZE;
639
640		break;
641	default:
642		if (I10NM_GET_IMC_BAR(d, i, reg)) {
643			i10nm_printk(KERN_ERR, "Failed to get mc%d bar\n", i);
644			return NULL;
645		}
646
647		mdev = pci_get_dev_wrapper(d->seg,
648					   d->bus[res_cfg->ddr_mdev_bdf.bus],
649					   res_cfg->ddr_mdev_bdf.dev + i,
650					   res_cfg->ddr_mdev_bdf.fun);
651		if (!mdev)
652			return NULL;
653
654		*offset  = I10NM_GET_IMC_MMIO_OFFSET(reg);
655		*size    = I10NM_GET_IMC_MMIO_SIZE(reg);
656	}
657
658	return mdev;
659}
660
661/**
662 * i10nm_imc_absent() - Check whether the memory controller @imc is absent
663 *
664 * @imc    : The pointer to the structure of memory controller EDAC device.
665 *
666 * RETURNS : true if the memory controller EDAC device is absent, false otherwise.
667 */
668static bool i10nm_imc_absent(struct skx_imc *imc)
669{
670	u32 mcmtr;
671	int i;
672
673	switch (res_cfg->type) {
674	case SPR:
675		for (i = 0; i < res_cfg->ddr_chan_num; i++) {
676			mcmtr = I10NM_GET_MCMTR(imc, i);
677			edac_dbg(1, "ch%d mcmtr reg %x\n", i, mcmtr);
678			if (mcmtr != ~0)
679				return false;
680		}
681
682		/*
683		 * Some workstations' absent memory controllers still
684		 * appear as PCIe devices, misleading the EDAC driver.
685		 * By observing that the MMIO registers of these absent
686		 * memory controllers consistently hold the value of ~0.
687		 *
688		 * We identify a memory controller as absent by checking
689		 * if its MMIO register "mcmtr" == ~0 in all its channels.
690		 */
691		return true;
692	default:
693		return false;
694	}
695}
696
697static int i10nm_get_ddr_munits(void)
698{
699	struct pci_dev *mdev;
700	void __iomem *mbase;
701	unsigned long size;
702	struct skx_dev *d;
703	int i, lmc, j = 0;
704	u32 reg, off;
705	u64 base;
706
707	list_for_each_entry(d, i10nm_edac_list, list) {
708		d->util_all = pci_get_dev_wrapper(d->seg, d->bus[res_cfg->util_all_bdf.bus],
709						  res_cfg->util_all_bdf.dev,
710						  res_cfg->util_all_bdf.fun);
711		if (!d->util_all)
712			return -ENODEV;
713
714		d->uracu = pci_get_dev_wrapper(d->seg, d->bus[res_cfg->uracu_bdf.bus],
715					       res_cfg->uracu_bdf.dev,
716					       res_cfg->uracu_bdf.fun);
717		if (!d->uracu)
718			return -ENODEV;
719
720		if (I10NM_GET_SCK_BAR(d, reg)) {
721			i10nm_printk(KERN_ERR, "Failed to socket bar\n");
722			return -ENODEV;
723		}
724
725		base = I10NM_GET_SCK_MMIO_BASE(reg);
726		edac_dbg(2, "socket%d mmio base 0x%llx (reg 0x%x)\n",
727			 j++, base, reg);
728
729		for (lmc = 0, i = 0; i < res_cfg->ddr_imc_num; i++) {
730			mdev = get_ddr_munit(d, i, &off, &size);
731
732			if (i == 0 && !mdev) {
733				i10nm_printk(KERN_ERR, "No IMC found\n");
734				return -ENODEV;
735			}
736			if (!mdev)
737				continue;
738
739			edac_dbg(2, "mc%d mmio base 0x%llx size 0x%lx (reg 0x%x)\n",
740				 i, base + off, size, reg);
741
742			mbase = ioremap(base + off, size);
743			if (!mbase) {
744				i10nm_printk(KERN_ERR, "Failed to ioremap 0x%llx\n",
745					     base + off);
746				return -ENODEV;
747			}
748
749			d->imc[lmc].mbase = mbase;
750			if (i10nm_imc_absent(&d->imc[lmc])) {
751				pci_dev_put(mdev);
752				iounmap(mbase);
753				d->imc[lmc].mbase = NULL;
754				edac_dbg(2, "Skip absent mc%d\n", i);
755				continue;
756			} else {
757				d->imc[lmc].mdev = mdev;
758				lmc++;
759			}
760		}
761	}
762
763	return 0;
764}
765
766static bool i10nm_check_hbm_imc(struct skx_dev *d)
767{
768	u32 reg;
769
770	if (I10NM_GET_CAPID3_CFG(d, reg)) {
771		i10nm_printk(KERN_ERR, "Failed to get capid3_cfg\n");
772		return false;
773	}
774
775	return I10NM_IS_HBM_PRESENT(reg) != 0;
776}
777
778static int i10nm_get_hbm_munits(void)
779{
780	struct pci_dev *mdev;
781	void __iomem *mbase;
782	u32 reg, off, mcmtr;
783	struct skx_dev *d;
784	int i, lmc;
785	u64 base;
786
787	list_for_each_entry(d, i10nm_edac_list, list) {
788		if (!d->pcu_cr3)
789			return -ENODEV;
790
791		if (!i10nm_check_hbm_imc(d)) {
792			i10nm_printk(KERN_DEBUG, "No hbm memory\n");
793			return -ENODEV;
794		}
795
796		if (I10NM_GET_SCK_BAR(d, reg)) {
797			i10nm_printk(KERN_ERR, "Failed to get socket bar\n");
798			return -ENODEV;
799		}
800		base = I10NM_GET_SCK_MMIO_BASE(reg);
801
802		if (I10NM_GET_HBM_IMC_BAR(d, reg)) {
803			i10nm_printk(KERN_ERR, "Failed to get hbm mc bar\n");
804			return -ENODEV;
805		}
806		base += I10NM_GET_HBM_IMC_MMIO_OFFSET(reg);
807
808		lmc = res_cfg->ddr_imc_num;
809
810		for (i = 0; i < res_cfg->hbm_imc_num; i++) {
811			mdev = pci_get_dev_wrapper(d->seg, d->bus[res_cfg->hbm_mdev_bdf.bus],
812						   res_cfg->hbm_mdev_bdf.dev + i / 4,
813						   res_cfg->hbm_mdev_bdf.fun + i % 4);
814
815			if (i == 0 && !mdev) {
816				i10nm_printk(KERN_ERR, "No hbm mc found\n");
817				return -ENODEV;
818			}
819			if (!mdev)
820				continue;
821
822			d->imc[lmc].mdev = mdev;
823			off = i * I10NM_HBM_IMC_MMIO_SIZE;
824
825			edac_dbg(2, "hbm mc%d mmio base 0x%llx size 0x%x\n",
826				 lmc, base + off, I10NM_HBM_IMC_MMIO_SIZE);
827
828			mbase = ioremap(base + off, I10NM_HBM_IMC_MMIO_SIZE);
829			if (!mbase) {
830				pci_dev_put(d->imc[lmc].mdev);
831				d->imc[lmc].mdev = NULL;
832
833				i10nm_printk(KERN_ERR, "Failed to ioremap for hbm mc 0x%llx\n",
834					     base + off);
835				return -ENOMEM;
836			}
837
838			d->imc[lmc].mbase = mbase;
839			d->imc[lmc].hbm_mc = true;
840
841			mcmtr = I10NM_GET_MCMTR(&d->imc[lmc], 0);
842			if (!I10NM_IS_HBM_IMC(mcmtr)) {
843				iounmap(d->imc[lmc].mbase);
844				d->imc[lmc].mbase = NULL;
845				d->imc[lmc].hbm_mc = false;
846				pci_dev_put(d->imc[lmc].mdev);
847				d->imc[lmc].mdev = NULL;
848
849				i10nm_printk(KERN_ERR, "This isn't an hbm mc!\n");
850				return -ENODEV;
851			}
852
853			lmc++;
854		}
855	}
856
857	return 0;
858}
859
860static struct res_config i10nm_cfg0 = {
861	.type			= I10NM,
862	.decs_did		= 0x3452,
863	.busno_cfg_offset	= 0xcc,
864	.ddr_imc_num		= 4,
865	.ddr_chan_num		= 2,
866	.ddr_dimm_num		= 2,
867	.ddr_chan_mmio_sz	= 0x4000,
868	.sad_all_bdf		= {1, 29, 0},
869	.pcu_cr3_bdf		= {1, 30, 3},
870	.util_all_bdf		= {1, 29, 1},
871	.uracu_bdf		= {0, 0, 1},
872	.ddr_mdev_bdf		= {0, 12, 0},
873	.hbm_mdev_bdf		= {0, 12, 1},
874	.sad_all_offset		= 0x108,
875	.offsets_scrub		= offsets_scrub_icx,
876	.offsets_demand		= offsets_demand_icx,
877};
878
879static struct res_config i10nm_cfg1 = {
880	.type			= I10NM,
881	.decs_did		= 0x3452,
882	.busno_cfg_offset	= 0xd0,
883	.ddr_imc_num		= 4,
884	.ddr_chan_num		= 2,
885	.ddr_dimm_num		= 2,
886	.ddr_chan_mmio_sz	= 0x4000,
887	.sad_all_bdf		= {1, 29, 0},
888	.pcu_cr3_bdf		= {1, 30, 3},
889	.util_all_bdf		= {1, 29, 1},
890	.uracu_bdf		= {0, 0, 1},
891	.ddr_mdev_bdf		= {0, 12, 0},
892	.hbm_mdev_bdf		= {0, 12, 1},
893	.sad_all_offset		= 0x108,
894	.offsets_scrub		= offsets_scrub_icx,
895	.offsets_demand		= offsets_demand_icx,
896};
897
898static struct res_config spr_cfg = {
899	.type			= SPR,
900	.decs_did		= 0x3252,
901	.busno_cfg_offset	= 0xd0,
902	.ddr_imc_num		= 4,
903	.ddr_chan_num		= 2,
904	.ddr_dimm_num		= 2,
905	.hbm_imc_num		= 16,
906	.hbm_chan_num		= 2,
907	.hbm_dimm_num		= 1,
908	.ddr_chan_mmio_sz	= 0x8000,
909	.hbm_chan_mmio_sz	= 0x4000,
910	.support_ddr5		= true,
911	.sad_all_bdf		= {1, 10, 0},
912	.pcu_cr3_bdf		= {1, 30, 3},
913	.util_all_bdf		= {1, 29, 1},
914	.uracu_bdf		= {0, 0, 1},
915	.ddr_mdev_bdf		= {0, 12, 0},
916	.hbm_mdev_bdf		= {0, 12, 1},
917	.sad_all_offset		= 0x300,
918	.offsets_scrub		= offsets_scrub_spr,
919	.offsets_scrub_hbm0	= offsets_scrub_spr_hbm0,
920	.offsets_scrub_hbm1	= offsets_scrub_spr_hbm1,
921	.offsets_demand		= offsets_demand_spr,
922	.offsets_demand2	= offsets_demand2_spr,
923	.offsets_demand_hbm0	= offsets_demand_spr_hbm0,
924	.offsets_demand_hbm1	= offsets_demand_spr_hbm1,
925};
926
927static struct res_config gnr_cfg = {
928	.type			= GNR,
929	.decs_did		= 0x3252,
930	.busno_cfg_offset	= 0xd0,
931	.ddr_imc_num		= 12,
932	.ddr_chan_num		= 1,
933	.ddr_dimm_num		= 2,
934	.ddr_chan_mmio_sz	= 0x4000,
935	.support_ddr5		= true,
936	.sad_all_bdf		= {0, 13, 0},
937	.pcu_cr3_bdf		= {0, 5, 0},
938	.util_all_bdf		= {0, 13, 1},
939	.uracu_bdf		= {0, 0, 1},
940	.ddr_mdev_bdf		= {0, 5, 1},
941	.sad_all_offset		= 0x300,
942};
943
944static const struct x86_cpu_id i10nm_cpuids[] = {
945	X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(ATOM_TREMONT_D,	X86_STEPPINGS(0x0, 0x3), &i10nm_cfg0),
946	X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(ATOM_TREMONT_D,	X86_STEPPINGS(0x4, 0xf), &i10nm_cfg1),
947	X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(ICELAKE_X,		X86_STEPPINGS(0x0, 0x3), &i10nm_cfg0),
948	X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(ICELAKE_X,		X86_STEPPINGS(0x4, 0xf), &i10nm_cfg1),
949	X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(ICELAKE_D,		X86_STEPPINGS(0x0, 0xf), &i10nm_cfg1),
950	X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(SAPPHIRERAPIDS_X,	X86_STEPPINGS(0x0, 0xf), &spr_cfg),
951	X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(EMERALDRAPIDS_X,	X86_STEPPINGS(0x0, 0xf), &spr_cfg),
952	X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(GRANITERAPIDS_X,	X86_STEPPINGS(0x0, 0xf), &gnr_cfg),
953	X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(ATOM_CRESTMONT_X,	X86_STEPPINGS(0x0, 0xf), &gnr_cfg),
954	{}
955};
956MODULE_DEVICE_TABLE(x86cpu, i10nm_cpuids);
957
958static bool i10nm_check_ecc(struct skx_imc *imc, int chan)
959{
960	u32 mcmtr;
961
962	mcmtr = I10NM_GET_MCMTR(imc, chan);
963	edac_dbg(1, "ch%d mcmtr reg %x\n", chan, mcmtr);
964
965	return !!GET_BITFIELD(mcmtr, 2, 2);
966}
967
968static int i10nm_get_dimm_config(struct mem_ctl_info *mci,
969				 struct res_config *cfg)
970{
971	struct skx_pvt *pvt = mci->pvt_info;
972	struct skx_imc *imc = pvt->imc;
973	u32 mtr, amap, mcddrtcfg = 0;
974	struct dimm_info *dimm;
975	int i, j, ndimms;
976
977	for (i = 0; i < imc->num_channels; i++) {
978		if (!imc->mbase)
979			continue;
980
981		ndimms = 0;
982		amap = I10NM_GET_AMAP(imc, i);
983
984		if (res_cfg->type != GNR)
985			mcddrtcfg = I10NM_GET_MCDDRTCFG(imc, i);
986
987		for (j = 0; j < imc->num_dimms; j++) {
988			dimm = edac_get_dimm(mci, i, j, 0);
989			mtr = I10NM_GET_DIMMMTR(imc, i, j);
990			edac_dbg(1, "dimmmtr 0x%x mcddrtcfg 0x%x (mc%d ch%d dimm%d)\n",
991				 mtr, mcddrtcfg, imc->mc, i, j);
992
993			if (IS_DIMM_PRESENT(mtr))
994				ndimms += skx_get_dimm_info(mtr, 0, amap, dimm,
995							    imc, i, j, cfg);
996			else if (IS_NVDIMM_PRESENT(mcddrtcfg, j))
997				ndimms += skx_get_nvdimm_info(dimm, imc, i, j,
998							      EDAC_MOD_STR);
999		}
1000		if (ndimms && !i10nm_check_ecc(imc, i)) {
1001			i10nm_printk(KERN_ERR, "ECC is disabled on imc %d channel %d\n",
1002				     imc->mc, i);
1003			return -ENODEV;
1004		}
1005	}
1006
1007	return 0;
1008}
1009
1010static struct notifier_block i10nm_mce_dec = {
1011	.notifier_call	= skx_mce_check_error,
1012	.priority	= MCE_PRIO_EDAC,
1013};
1014
1015#ifdef CONFIG_EDAC_DEBUG
1016/*
1017 * Debug feature.
1018 * Exercise the address decode logic by writing an address to
1019 * /sys/kernel/debug/edac/i10nm_test/addr.
1020 */
1021static struct dentry *i10nm_test;
1022
1023static int debugfs_u64_set(void *data, u64 val)
1024{
1025	struct mce m;
1026
1027	pr_warn_once("Fake error to 0x%llx injected via debugfs\n", val);
1028
1029	memset(&m, 0, sizeof(m));
1030	/* ADDRV + MemRd + Unknown channel */
1031	m.status = MCI_STATUS_ADDRV + 0x90;
1032	/* One corrected error */
1033	m.status |= BIT_ULL(MCI_STATUS_CEC_SHIFT);
1034	m.addr = val;
1035	skx_mce_check_error(NULL, 0, &m);
1036
1037	return 0;
1038}
1039DEFINE_SIMPLE_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
1040
1041static void setup_i10nm_debug(void)
1042{
1043	i10nm_test = edac_debugfs_create_dir("i10nm_test");
1044	if (!i10nm_test)
1045		return;
1046
1047	if (!edac_debugfs_create_file("addr", 0200, i10nm_test,
1048				      NULL, &fops_u64_wo)) {
1049		debugfs_remove(i10nm_test);
1050		i10nm_test = NULL;
1051	}
1052}
1053
1054static void teardown_i10nm_debug(void)
1055{
1056	debugfs_remove_recursive(i10nm_test);
1057}
1058#else
1059static inline void setup_i10nm_debug(void) {}
1060static inline void teardown_i10nm_debug(void) {}
1061#endif /*CONFIG_EDAC_DEBUG*/
1062
1063static int __init i10nm_init(void)
1064{
1065	u8 mc = 0, src_id = 0, node_id = 0;
1066	const struct x86_cpu_id *id;
1067	struct res_config *cfg;
1068	const char *owner;
1069	struct skx_dev *d;
1070	int rc, i, off[3] = {0xd0, 0xc8, 0xcc};
1071	u64 tolm, tohm;
1072	int imc_num;
1073
1074	edac_dbg(2, "\n");
1075
1076	if (ghes_get_devices())
1077		return -EBUSY;
1078
1079	owner = edac_get_owner();
1080	if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
1081		return -EBUSY;
1082
1083	if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
1084		return -ENODEV;
1085
1086	id = x86_match_cpu(i10nm_cpuids);
1087	if (!id)
1088		return -ENODEV;
1089
1090	cfg = (struct res_config *)id->driver_data;
1091	res_cfg = cfg;
1092
1093	rc = skx_get_hi_lo(0x09a2, off, &tolm, &tohm);
1094	if (rc)
1095		return rc;
1096
1097	rc = skx_get_all_bus_mappings(cfg, &i10nm_edac_list);
1098	if (rc < 0)
1099		goto fail;
1100	if (rc == 0) {
1101		i10nm_printk(KERN_ERR, "No memory controllers found\n");
1102		return -ENODEV;
1103	}
1104
1105	rc = i10nm_get_imc_num(cfg);
1106	if (rc < 0)
1107		goto fail;
1108
1109	mem_cfg_2lm = i10nm_check_2lm(cfg);
1110	skx_set_mem_cfg(mem_cfg_2lm);
1111
1112	rc = i10nm_get_ddr_munits();
1113
1114	if (i10nm_get_hbm_munits() && rc)
1115		goto fail;
1116
1117	imc_num = res_cfg->ddr_imc_num + res_cfg->hbm_imc_num;
1118
1119	list_for_each_entry(d, i10nm_edac_list, list) {
1120		rc = skx_get_src_id(d, 0xf8, &src_id);
1121		if (rc < 0)
1122			goto fail;
1123
1124		rc = skx_get_node_id(d, &node_id);
1125		if (rc < 0)
1126			goto fail;
1127
1128		edac_dbg(2, "src_id = %d node_id = %d\n", src_id, node_id);
1129		for (i = 0; i < imc_num; i++) {
1130			if (!d->imc[i].mdev)
1131				continue;
1132
1133			d->imc[i].mc  = mc++;
1134			d->imc[i].lmc = i;
1135			d->imc[i].src_id  = src_id;
1136			d->imc[i].node_id = node_id;
1137			if (d->imc[i].hbm_mc) {
1138				d->imc[i].chan_mmio_sz = cfg->hbm_chan_mmio_sz;
1139				d->imc[i].num_channels = cfg->hbm_chan_num;
1140				d->imc[i].num_dimms    = cfg->hbm_dimm_num;
1141			} else {
1142				d->imc[i].chan_mmio_sz = cfg->ddr_chan_mmio_sz;
1143				d->imc[i].num_channels = cfg->ddr_chan_num;
1144				d->imc[i].num_dimms    = cfg->ddr_dimm_num;
1145			}
1146
1147			rc = skx_register_mci(&d->imc[i], d->imc[i].mdev,
1148					      "Intel_10nm Socket", EDAC_MOD_STR,
1149					      i10nm_get_dimm_config, cfg);
1150			if (rc < 0)
1151				goto fail;
1152		}
1153	}
1154
1155	rc = skx_adxl_get();
1156	if (rc)
1157		goto fail;
1158
1159	opstate_init();
1160	mce_register_decode_chain(&i10nm_mce_dec);
1161	setup_i10nm_debug();
1162
1163	if (retry_rd_err_log && res_cfg->offsets_scrub && res_cfg->offsets_demand) {
1164		skx_set_decode(i10nm_mc_decode, show_retry_rd_err_log);
1165		if (retry_rd_err_log == 2)
1166			enable_retry_rd_err_log(true);
1167	} else {
1168		skx_set_decode(i10nm_mc_decode, NULL);
1169	}
1170
1171	i10nm_printk(KERN_INFO, "%s\n", I10NM_REVISION);
1172
1173	return 0;
1174fail:
1175	skx_remove();
1176	return rc;
1177}
1178
1179static void __exit i10nm_exit(void)
1180{
1181	edac_dbg(2, "\n");
1182
1183	if (retry_rd_err_log && res_cfg->offsets_scrub && res_cfg->offsets_demand) {
1184		skx_set_decode(NULL, NULL);
1185		if (retry_rd_err_log == 2)
1186			enable_retry_rd_err_log(false);
1187	}
1188
1189	teardown_i10nm_debug();
1190	mce_unregister_decode_chain(&i10nm_mce_dec);
1191	skx_adxl_put();
1192	skx_remove();
1193}
1194
1195module_init(i10nm_init);
1196module_exit(i10nm_exit);
1197
1198static int set_decoding_via_mca(const char *buf, const struct kernel_param *kp)
1199{
1200	unsigned long val;
1201	int ret;
1202
1203	ret = kstrtoul(buf, 0, &val);
1204
1205	if (ret || val > 1)
1206		return -EINVAL;
1207
1208	if (val && mem_cfg_2lm) {
1209		i10nm_printk(KERN_NOTICE, "Decoding errors via MCA banks for 2LM isn't supported yet\n");
1210		return -EIO;
1211	}
1212
1213	ret = param_set_int(buf, kp);
1214
1215	return ret;
1216}
1217
1218static const struct kernel_param_ops decoding_via_mca_param_ops = {
1219	.set = set_decoding_via_mca,
1220	.get = param_get_int,
1221};
1222
1223module_param_cb(decoding_via_mca, &decoding_via_mca_param_ops, &decoding_via_mca, 0644);
1224MODULE_PARM_DESC(decoding_via_mca, "decoding_via_mca: 0=off(default), 1=enable");
1225
1226module_param(retry_rd_err_log, int, 0444);
1227MODULE_PARM_DESC(retry_rd_err_log, "retry_rd_err_log: 0=off(default), 1=bios(Linux doesn't reset any control bits, but just reports values.), 2=linux(Linux tries to take control and resets mode bits, clear valid/UC bits after reading.)");
1228
1229MODULE_LICENSE("GPL v2");
1230MODULE_DESCRIPTION("MC Driver for Intel 10nm server processors");
1231