xref: /openbmc/linux/drivers/edac/pnd2_edac.c (revision feac8c8b)
1 /*
2  * Driver for Pondicherry2 memory controller.
3  *
4  * Copyright (c) 2016, Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * [Derived from sb_edac.c]
16  *
17  * Translation of system physical addresses to DIMM addresses
18  * is a two stage process:
19  *
20  * First the Pondicherry 2 memory controller handles slice and channel interleaving
21  * in "sys2pmi()". This is (almost) completley common between platforms.
22  *
23  * Then a platform specific dunit (DIMM unit) completes the process to provide DIMM,
24  * rank, bank, row and column using the appropriate "dunit_ops" functions/parameters.
25  */
26 
27 #include <linux/module.h>
28 #include <linux/init.h>
29 #include <linux/pci.h>
30 #include <linux/pci_ids.h>
31 #include <linux/slab.h>
32 #include <linux/delay.h>
33 #include <linux/edac.h>
34 #include <linux/mmzone.h>
35 #include <linux/smp.h>
36 #include <linux/bitmap.h>
37 #include <linux/math64.h>
38 #include <linux/mod_devicetable.h>
39 #include <asm/cpu_device_id.h>
40 #include <asm/intel-family.h>
41 #include <asm/processor.h>
42 #include <asm/mce.h>
43 
44 #include "edac_mc.h"
45 #include "edac_module.h"
46 #include "pnd2_edac.h"
47 
48 #define EDAC_MOD_STR		"pnd2_edac"
49 
50 #define APL_NUM_CHANNELS	4
51 #define DNV_NUM_CHANNELS	2
52 #define DNV_MAX_DIMMS		2 /* Max DIMMs per channel */
53 
54 enum type {
55 	APL,
56 	DNV, /* All requests go to PMI CH0 on each slice (CH1 disabled) */
57 };
58 
59 struct dram_addr {
60 	int chan;
61 	int dimm;
62 	int rank;
63 	int bank;
64 	int row;
65 	int col;
66 };
67 
68 struct pnd2_pvt {
69 	int dimm_geom[APL_NUM_CHANNELS];
70 	u64 tolm, tohm;
71 };
72 
73 /*
74  * System address space is divided into multiple regions with
75  * different interleave rules in each. The as0/as1 regions
76  * have no interleaving at all. The as2 region is interleaved
77  * between two channels. The mot region is magic and may overlap
78  * other regions, with its interleave rules taking precedence.
79  * Addresses not in any of these regions are interleaved across
80  * all four channels.
81  */
82 static struct region {
83 	u64	base;
84 	u64	limit;
85 	u8	enabled;
86 } mot, as0, as1, as2;
87 
88 static struct dunit_ops {
89 	char *name;
90 	enum type type;
91 	int pmiaddr_shift;
92 	int pmiidx_shift;
93 	int channels;
94 	int dimms_per_channel;
95 	int (*rd_reg)(int port, int off, int op, void *data, size_t sz, char *name);
96 	int (*get_registers)(void);
97 	int (*check_ecc)(void);
98 	void (*mk_region)(char *name, struct region *rp, void *asym);
99 	void (*get_dimm_config)(struct mem_ctl_info *mci);
100 	int (*pmi2mem)(struct mem_ctl_info *mci, u64 pmiaddr, u32 pmiidx,
101 				   struct dram_addr *daddr, char *msg);
102 } *ops;
103 
104 static struct mem_ctl_info *pnd2_mci;
105 
106 #define PND2_MSG_SIZE	256
107 
108 /* Debug macros */
109 #define pnd2_printk(level, fmt, arg...)			\
110 	edac_printk(level, "pnd2", fmt, ##arg)
111 
112 #define pnd2_mc_printk(mci, level, fmt, arg...)	\
113 	edac_mc_chipset_printk(mci, level, "pnd2", fmt, ##arg)
114 
115 #define MOT_CHAN_INTLV_BIT_1SLC_2CH 12
116 #define MOT_CHAN_INTLV_BIT_2SLC_2CH 13
117 #define SELECTOR_DISABLED (-1)
118 #define _4GB (1ul << 32)
119 
120 #define PMI_ADDRESS_WIDTH	31
121 #define PND_MAX_PHYS_BIT	39
122 
123 #define APL_ASYMSHIFT		28
124 #define DNV_ASYMSHIFT		31
125 #define CH_HASH_MASK_LSB	6
126 #define SLICE_HASH_MASK_LSB	6
127 #define MOT_SLC_INTLV_BIT	12
128 #define LOG2_PMI_ADDR_GRANULARITY	5
129 #define MOT_SHIFT	24
130 
131 #define GET_BITFIELD(v, lo, hi)	(((v) & GENMASK_ULL(hi, lo)) >> (lo))
132 #define U64_LSHIFT(val, s)	((u64)(val) << (s))
133 
134 /*
135  * On Apollo Lake we access memory controller registers via a
136  * side-band mailbox style interface in a hidden PCI device
137  * configuration space.
138  */
139 static struct pci_bus	*p2sb_bus;
140 #define P2SB_DEVFN	PCI_DEVFN(0xd, 0)
141 #define P2SB_ADDR_OFF	0xd0
142 #define P2SB_DATA_OFF	0xd4
143 #define P2SB_STAT_OFF	0xd8
144 #define P2SB_ROUT_OFF	0xda
145 #define P2SB_EADD_OFF	0xdc
146 #define P2SB_HIDE_OFF	0xe1
147 
148 #define P2SB_BUSY	1
149 
150 #define P2SB_READ(size, off, ptr) \
151 	pci_bus_read_config_##size(p2sb_bus, P2SB_DEVFN, off, ptr)
152 #define P2SB_WRITE(size, off, val) \
153 	pci_bus_write_config_##size(p2sb_bus, P2SB_DEVFN, off, val)
154 
155 static bool p2sb_is_busy(u16 *status)
156 {
157 	P2SB_READ(word, P2SB_STAT_OFF, status);
158 
159 	return !!(*status & P2SB_BUSY);
160 }
161 
162 static int _apl_rd_reg(int port, int off, int op, u32 *data)
163 {
164 	int retries = 0xff, ret;
165 	u16 status;
166 	u8 hidden;
167 
168 	/* Unhide the P2SB device, if it's hidden */
169 	P2SB_READ(byte, P2SB_HIDE_OFF, &hidden);
170 	if (hidden)
171 		P2SB_WRITE(byte, P2SB_HIDE_OFF, 0);
172 
173 	if (p2sb_is_busy(&status)) {
174 		ret = -EAGAIN;
175 		goto out;
176 	}
177 
178 	P2SB_WRITE(dword, P2SB_ADDR_OFF, (port << 24) | off);
179 	P2SB_WRITE(dword, P2SB_DATA_OFF, 0);
180 	P2SB_WRITE(dword, P2SB_EADD_OFF, 0);
181 	P2SB_WRITE(word, P2SB_ROUT_OFF, 0);
182 	P2SB_WRITE(word, P2SB_STAT_OFF, (op << 8) | P2SB_BUSY);
183 
184 	while (p2sb_is_busy(&status)) {
185 		if (retries-- == 0) {
186 			ret = -EBUSY;
187 			goto out;
188 		}
189 	}
190 
191 	P2SB_READ(dword, P2SB_DATA_OFF, data);
192 	ret = (status >> 1) & 0x3;
193 out:
194 	/* Hide the P2SB device, if it was hidden before */
195 	if (hidden)
196 		P2SB_WRITE(byte, P2SB_HIDE_OFF, hidden);
197 
198 	return ret;
199 }
200 
201 static int apl_rd_reg(int port, int off, int op, void *data, size_t sz, char *name)
202 {
203 	int ret = 0;
204 
205 	edac_dbg(2, "Read %s port=%x off=%x op=%x\n", name, port, off, op);
206 	switch (sz) {
207 	case 8:
208 		ret = _apl_rd_reg(port, off + 4, op, (u32 *)(data + 4));
209 		/* fall through */
210 	case 4:
211 		ret |= _apl_rd_reg(port, off, op, (u32 *)data);
212 		pnd2_printk(KERN_DEBUG, "%s=%x%08x ret=%d\n", name,
213 					sz == 8 ? *((u32 *)(data + 4)) : 0, *((u32 *)data), ret);
214 		break;
215 	}
216 
217 	return ret;
218 }
219 
220 static u64 get_mem_ctrl_hub_base_addr(void)
221 {
222 	struct b_cr_mchbar_lo_pci lo;
223 	struct b_cr_mchbar_hi_pci hi;
224 	struct pci_dev *pdev;
225 
226 	pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x1980, NULL);
227 	if (pdev) {
228 		pci_read_config_dword(pdev, 0x48, (u32 *)&lo);
229 		pci_read_config_dword(pdev, 0x4c, (u32 *)&hi);
230 		pci_dev_put(pdev);
231 	} else {
232 		return 0;
233 	}
234 
235 	if (!lo.enable) {
236 		edac_dbg(2, "MMIO via memory controller hub base address is disabled!\n");
237 		return 0;
238 	}
239 
240 	return U64_LSHIFT(hi.base, 32) | U64_LSHIFT(lo.base, 15);
241 }
242 
243 static u64 get_sideband_reg_base_addr(void)
244 {
245 	struct pci_dev *pdev;
246 	u32 hi, lo;
247 	u8 hidden;
248 
249 	pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x19dd, NULL);
250 	if (pdev) {
251 		/* Unhide the P2SB device, if it's hidden */
252 		pci_read_config_byte(pdev, 0xe1, &hidden);
253 		if (hidden)
254 			pci_write_config_byte(pdev, 0xe1, 0);
255 
256 		pci_read_config_dword(pdev, 0x10, &lo);
257 		pci_read_config_dword(pdev, 0x14, &hi);
258 		lo &= 0xfffffff0;
259 
260 		/* Hide the P2SB device, if it was hidden before */
261 		if (hidden)
262 			pci_write_config_byte(pdev, 0xe1, hidden);
263 
264 		pci_dev_put(pdev);
265 		return (U64_LSHIFT(hi, 32) | U64_LSHIFT(lo, 0));
266 	} else {
267 		return 0xfd000000;
268 	}
269 }
270 
271 static int dnv_rd_reg(int port, int off, int op, void *data, size_t sz, char *name)
272 {
273 	struct pci_dev *pdev;
274 	char *base;
275 	u64 addr;
276 
277 	if (op == 4) {
278 		pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x1980, NULL);
279 		if (!pdev)
280 			return -ENODEV;
281 
282 		pci_read_config_dword(pdev, off, data);
283 		pci_dev_put(pdev);
284 	} else {
285 		/* MMIO via memory controller hub base address */
286 		if (op == 0 && port == 0x4c) {
287 			addr = get_mem_ctrl_hub_base_addr();
288 			if (!addr)
289 				return -ENODEV;
290 		} else {
291 			/* MMIO via sideband register base address */
292 			addr = get_sideband_reg_base_addr();
293 			if (!addr)
294 				return -ENODEV;
295 			addr += (port << 16);
296 		}
297 
298 		base = ioremap((resource_size_t)addr, 0x10000);
299 		if (!base)
300 			return -ENODEV;
301 
302 		if (sz == 8)
303 			*(u32 *)(data + 4) = *(u32 *)(base + off + 4);
304 		*(u32 *)data = *(u32 *)(base + off);
305 
306 		iounmap(base);
307 	}
308 
309 	edac_dbg(2, "Read %s=%.8x_%.8x\n", name,
310 			(sz == 8) ? *(u32 *)(data + 4) : 0, *(u32 *)data);
311 
312 	return 0;
313 }
314 
315 #define RD_REGP(regp, regname, port)	\
316 	ops->rd_reg(port,					\
317 		regname##_offset,				\
318 		regname##_r_opcode,				\
319 		regp, sizeof(struct regname),	\
320 		#regname)
321 
322 #define RD_REG(regp, regname)			\
323 	ops->rd_reg(regname ## _port,		\
324 		regname##_offset,				\
325 		regname##_r_opcode,				\
326 		regp, sizeof(struct regname),	\
327 		#regname)
328 
329 static u64 top_lm, top_hm;
330 static bool two_slices;
331 static bool two_channels; /* Both PMI channels in one slice enabled */
332 
333 static u8 sym_chan_mask;
334 static u8 asym_chan_mask;
335 static u8 chan_mask;
336 
337 static int slice_selector = -1;
338 static int chan_selector = -1;
339 static u64 slice_hash_mask;
340 static u64 chan_hash_mask;
341 
342 static void mk_region(char *name, struct region *rp, u64 base, u64 limit)
343 {
344 	rp->enabled = 1;
345 	rp->base = base;
346 	rp->limit = limit;
347 	edac_dbg(2, "Region:%s [%llx, %llx]\n", name, base, limit);
348 }
349 
350 static void mk_region_mask(char *name, struct region *rp, u64 base, u64 mask)
351 {
352 	if (mask == 0) {
353 		pr_info(FW_BUG "MOT mask cannot be zero\n");
354 		return;
355 	}
356 	if (mask != GENMASK_ULL(PND_MAX_PHYS_BIT, __ffs(mask))) {
357 		pr_info(FW_BUG "MOT mask not power of two\n");
358 		return;
359 	}
360 	if (base & ~mask) {
361 		pr_info(FW_BUG "MOT region base/mask alignment error\n");
362 		return;
363 	}
364 	rp->base = base;
365 	rp->limit = (base | ~mask) & GENMASK_ULL(PND_MAX_PHYS_BIT, 0);
366 	rp->enabled = 1;
367 	edac_dbg(2, "Region:%s [%llx, %llx]\n", name, base, rp->limit);
368 }
369 
370 static bool in_region(struct region *rp, u64 addr)
371 {
372 	if (!rp->enabled)
373 		return false;
374 
375 	return rp->base <= addr && addr <= rp->limit;
376 }
377 
378 static int gen_sym_mask(struct b_cr_slice_channel_hash *p)
379 {
380 	int mask = 0;
381 
382 	if (!p->slice_0_mem_disabled)
383 		mask |= p->sym_slice0_channel_enabled;
384 
385 	if (!p->slice_1_disabled)
386 		mask |= p->sym_slice1_channel_enabled << 2;
387 
388 	if (p->ch_1_disabled || p->enable_pmi_dual_data_mode)
389 		mask &= 0x5;
390 
391 	return mask;
392 }
393 
394 static int gen_asym_mask(struct b_cr_slice_channel_hash *p,
395 			 struct b_cr_asym_mem_region0_mchbar *as0,
396 			 struct b_cr_asym_mem_region1_mchbar *as1,
397 			 struct b_cr_asym_2way_mem_region_mchbar *as2way)
398 {
399 	const int intlv[] = { 0x5, 0xA, 0x3, 0xC };
400 	int mask = 0;
401 
402 	if (as2way->asym_2way_interleave_enable)
403 		mask = intlv[as2way->asym_2way_intlv_mode];
404 	if (as0->slice0_asym_enable)
405 		mask |= (1 << as0->slice0_asym_channel_select);
406 	if (as1->slice1_asym_enable)
407 		mask |= (4 << as1->slice1_asym_channel_select);
408 	if (p->slice_0_mem_disabled)
409 		mask &= 0xc;
410 	if (p->slice_1_disabled)
411 		mask &= 0x3;
412 	if (p->ch_1_disabled || p->enable_pmi_dual_data_mode)
413 		mask &= 0x5;
414 
415 	return mask;
416 }
417 
418 static struct b_cr_tolud_pci tolud;
419 static struct b_cr_touud_lo_pci touud_lo;
420 static struct b_cr_touud_hi_pci touud_hi;
421 static struct b_cr_asym_mem_region0_mchbar asym0;
422 static struct b_cr_asym_mem_region1_mchbar asym1;
423 static struct b_cr_asym_2way_mem_region_mchbar asym_2way;
424 static struct b_cr_mot_out_base_mchbar mot_base;
425 static struct b_cr_mot_out_mask_mchbar mot_mask;
426 static struct b_cr_slice_channel_hash chash;
427 
428 /* Apollo Lake dunit */
429 /*
430  * Validated on board with just two DIMMs in the [0] and [2] positions
431  * in this array. Other port number matches documentation, but caution
432  * advised.
433  */
434 static const int apl_dports[APL_NUM_CHANNELS] = { 0x18, 0x10, 0x11, 0x19 };
435 static struct d_cr_drp0 drp0[APL_NUM_CHANNELS];
436 
437 /* Denverton dunit */
438 static const int dnv_dports[DNV_NUM_CHANNELS] = { 0x10, 0x12 };
439 static struct d_cr_dsch dsch;
440 static struct d_cr_ecc_ctrl ecc_ctrl[DNV_NUM_CHANNELS];
441 static struct d_cr_drp drp[DNV_NUM_CHANNELS];
442 static struct d_cr_dmap dmap[DNV_NUM_CHANNELS];
443 static struct d_cr_dmap1 dmap1[DNV_NUM_CHANNELS];
444 static struct d_cr_dmap2 dmap2[DNV_NUM_CHANNELS];
445 static struct d_cr_dmap3 dmap3[DNV_NUM_CHANNELS];
446 static struct d_cr_dmap4 dmap4[DNV_NUM_CHANNELS];
447 static struct d_cr_dmap5 dmap5[DNV_NUM_CHANNELS];
448 
449 static void apl_mk_region(char *name, struct region *rp, void *asym)
450 {
451 	struct b_cr_asym_mem_region0_mchbar *a = asym;
452 
453 	mk_region(name, rp,
454 			  U64_LSHIFT(a->slice0_asym_base, APL_ASYMSHIFT),
455 			  U64_LSHIFT(a->slice0_asym_limit, APL_ASYMSHIFT) +
456 			  GENMASK_ULL(APL_ASYMSHIFT - 1, 0));
457 }
458 
459 static void dnv_mk_region(char *name, struct region *rp, void *asym)
460 {
461 	struct b_cr_asym_mem_region_denverton *a = asym;
462 
463 	mk_region(name, rp,
464 			  U64_LSHIFT(a->slice_asym_base, DNV_ASYMSHIFT),
465 			  U64_LSHIFT(a->slice_asym_limit, DNV_ASYMSHIFT) +
466 			  GENMASK_ULL(DNV_ASYMSHIFT - 1, 0));
467 }
468 
469 static int apl_get_registers(void)
470 {
471 	int ret = -ENODEV;
472 	int i;
473 
474 	if (RD_REG(&asym_2way, b_cr_asym_2way_mem_region_mchbar))
475 		return -ENODEV;
476 
477 	/*
478 	 * RD_REGP() will fail for unpopulated or non-existent
479 	 * DIMM slots. Return success if we find at least one DIMM.
480 	 */
481 	for (i = 0; i < APL_NUM_CHANNELS; i++)
482 		if (!RD_REGP(&drp0[i], d_cr_drp0, apl_dports[i]))
483 			ret = 0;
484 
485 	return ret;
486 }
487 
488 static int dnv_get_registers(void)
489 {
490 	int i;
491 
492 	if (RD_REG(&dsch, d_cr_dsch))
493 		return -ENODEV;
494 
495 	for (i = 0; i < DNV_NUM_CHANNELS; i++)
496 		if (RD_REGP(&ecc_ctrl[i], d_cr_ecc_ctrl, dnv_dports[i]) ||
497 			RD_REGP(&drp[i], d_cr_drp, dnv_dports[i]) ||
498 			RD_REGP(&dmap[i], d_cr_dmap, dnv_dports[i]) ||
499 			RD_REGP(&dmap1[i], d_cr_dmap1, dnv_dports[i]) ||
500 			RD_REGP(&dmap2[i], d_cr_dmap2, dnv_dports[i]) ||
501 			RD_REGP(&dmap3[i], d_cr_dmap3, dnv_dports[i]) ||
502 			RD_REGP(&dmap4[i], d_cr_dmap4, dnv_dports[i]) ||
503 			RD_REGP(&dmap5[i], d_cr_dmap5, dnv_dports[i]))
504 			return -ENODEV;
505 
506 	return 0;
507 }
508 
509 /*
510  * Read all the h/w config registers once here (they don't
511  * change at run time. Figure out which address ranges have
512  * which interleave characteristics.
513  */
514 static int get_registers(void)
515 {
516 	const int intlv[] = { 10, 11, 12, 12 };
517 
518 	if (RD_REG(&tolud, b_cr_tolud_pci) ||
519 		RD_REG(&touud_lo, b_cr_touud_lo_pci) ||
520 		RD_REG(&touud_hi, b_cr_touud_hi_pci) ||
521 		RD_REG(&asym0, b_cr_asym_mem_region0_mchbar) ||
522 		RD_REG(&asym1, b_cr_asym_mem_region1_mchbar) ||
523 		RD_REG(&mot_base, b_cr_mot_out_base_mchbar) ||
524 		RD_REG(&mot_mask, b_cr_mot_out_mask_mchbar) ||
525 		RD_REG(&chash, b_cr_slice_channel_hash))
526 		return -ENODEV;
527 
528 	if (ops->get_registers())
529 		return -ENODEV;
530 
531 	if (ops->type == DNV) {
532 		/* PMI channel idx (always 0) for asymmetric region */
533 		asym0.slice0_asym_channel_select = 0;
534 		asym1.slice1_asym_channel_select = 0;
535 		/* PMI channel bitmap (always 1) for symmetric region */
536 		chash.sym_slice0_channel_enabled = 0x1;
537 		chash.sym_slice1_channel_enabled = 0x1;
538 	}
539 
540 	if (asym0.slice0_asym_enable)
541 		ops->mk_region("as0", &as0, &asym0);
542 
543 	if (asym1.slice1_asym_enable)
544 		ops->mk_region("as1", &as1, &asym1);
545 
546 	if (asym_2way.asym_2way_interleave_enable) {
547 		mk_region("as2way", &as2,
548 				  U64_LSHIFT(asym_2way.asym_2way_base, APL_ASYMSHIFT),
549 				  U64_LSHIFT(asym_2way.asym_2way_limit, APL_ASYMSHIFT) +
550 				  GENMASK_ULL(APL_ASYMSHIFT - 1, 0));
551 	}
552 
553 	if (mot_base.imr_en) {
554 		mk_region_mask("mot", &mot,
555 					   U64_LSHIFT(mot_base.mot_out_base, MOT_SHIFT),
556 					   U64_LSHIFT(mot_mask.mot_out_mask, MOT_SHIFT));
557 	}
558 
559 	top_lm = U64_LSHIFT(tolud.tolud, 20);
560 	top_hm = U64_LSHIFT(touud_hi.touud, 32) | U64_LSHIFT(touud_lo.touud, 20);
561 
562 	two_slices = !chash.slice_1_disabled &&
563 				 !chash.slice_0_mem_disabled &&
564 				 (chash.sym_slice0_channel_enabled != 0) &&
565 				 (chash.sym_slice1_channel_enabled != 0);
566 	two_channels = !chash.ch_1_disabled &&
567 				 !chash.enable_pmi_dual_data_mode &&
568 				 ((chash.sym_slice0_channel_enabled == 3) ||
569 				 (chash.sym_slice1_channel_enabled == 3));
570 
571 	sym_chan_mask = gen_sym_mask(&chash);
572 	asym_chan_mask = gen_asym_mask(&chash, &asym0, &asym1, &asym_2way);
573 	chan_mask = sym_chan_mask | asym_chan_mask;
574 
575 	if (two_slices && !two_channels) {
576 		if (chash.hvm_mode)
577 			slice_selector = 29;
578 		else
579 			slice_selector = intlv[chash.interleave_mode];
580 	} else if (!two_slices && two_channels) {
581 		if (chash.hvm_mode)
582 			chan_selector = 29;
583 		else
584 			chan_selector = intlv[chash.interleave_mode];
585 	} else if (two_slices && two_channels) {
586 		if (chash.hvm_mode) {
587 			slice_selector = 29;
588 			chan_selector = 30;
589 		} else {
590 			slice_selector = intlv[chash.interleave_mode];
591 			chan_selector = intlv[chash.interleave_mode] + 1;
592 		}
593 	}
594 
595 	if (two_slices) {
596 		if (!chash.hvm_mode)
597 			slice_hash_mask = chash.slice_hash_mask << SLICE_HASH_MASK_LSB;
598 		if (!two_channels)
599 			slice_hash_mask |= BIT_ULL(slice_selector);
600 	}
601 
602 	if (two_channels) {
603 		if (!chash.hvm_mode)
604 			chan_hash_mask = chash.ch_hash_mask << CH_HASH_MASK_LSB;
605 		if (!two_slices)
606 			chan_hash_mask |= BIT_ULL(chan_selector);
607 	}
608 
609 	return 0;
610 }
611 
612 /* Get a contiguous memory address (remove the MMIO gap) */
613 static u64 remove_mmio_gap(u64 sys)
614 {
615 	return (sys < _4GB) ? sys : sys - (_4GB - top_lm);
616 }
617 
618 /* Squeeze out one address bit, shift upper part down to fill gap */
619 static void remove_addr_bit(u64 *addr, int bitidx)
620 {
621 	u64	mask;
622 
623 	if (bitidx == -1)
624 		return;
625 
626 	mask = (1ull << bitidx) - 1;
627 	*addr = ((*addr >> 1) & ~mask) | (*addr & mask);
628 }
629 
630 /* XOR all the bits from addr specified in mask */
631 static int hash_by_mask(u64 addr, u64 mask)
632 {
633 	u64 result = addr & mask;
634 
635 	result = (result >> 32) ^ result;
636 	result = (result >> 16) ^ result;
637 	result = (result >> 8) ^ result;
638 	result = (result >> 4) ^ result;
639 	result = (result >> 2) ^ result;
640 	result = (result >> 1) ^ result;
641 
642 	return (int)result & 1;
643 }
644 
645 /*
646  * First stage decode. Take the system address and figure out which
647  * second stage will deal with it based on interleave modes.
648  */
649 static int sys2pmi(const u64 addr, u32 *pmiidx, u64 *pmiaddr, char *msg)
650 {
651 	u64 contig_addr, contig_base, contig_offset, contig_base_adj;
652 	int mot_intlv_bit = two_slices ? MOT_CHAN_INTLV_BIT_2SLC_2CH :
653 						MOT_CHAN_INTLV_BIT_1SLC_2CH;
654 	int slice_intlv_bit_rm = SELECTOR_DISABLED;
655 	int chan_intlv_bit_rm = SELECTOR_DISABLED;
656 	/* Determine if address is in the MOT region. */
657 	bool mot_hit = in_region(&mot, addr);
658 	/* Calculate the number of symmetric regions enabled. */
659 	int sym_channels = hweight8(sym_chan_mask);
660 
661 	/*
662 	 * The amount we need to shift the asym base can be determined by the
663 	 * number of enabled symmetric channels.
664 	 * NOTE: This can only work because symmetric memory is not supposed
665 	 * to do a 3-way interleave.
666 	 */
667 	int sym_chan_shift = sym_channels >> 1;
668 
669 	/* Give up if address is out of range, or in MMIO gap */
670 	if (addr >= (1ul << PND_MAX_PHYS_BIT) ||
671 	   (addr >= top_lm && addr < _4GB) || addr >= top_hm) {
672 		snprintf(msg, PND2_MSG_SIZE, "Error address 0x%llx is not DRAM", addr);
673 		return -EINVAL;
674 	}
675 
676 	/* Get a contiguous memory address (remove the MMIO gap) */
677 	contig_addr = remove_mmio_gap(addr);
678 
679 	if (in_region(&as0, addr)) {
680 		*pmiidx = asym0.slice0_asym_channel_select;
681 
682 		contig_base = remove_mmio_gap(as0.base);
683 		contig_offset = contig_addr - contig_base;
684 		contig_base_adj = (contig_base >> sym_chan_shift) *
685 						  ((chash.sym_slice0_channel_enabled >> (*pmiidx & 1)) & 1);
686 		contig_addr = contig_offset + ((sym_channels > 0) ? contig_base_adj : 0ull);
687 	} else if (in_region(&as1, addr)) {
688 		*pmiidx = 2u + asym1.slice1_asym_channel_select;
689 
690 		contig_base = remove_mmio_gap(as1.base);
691 		contig_offset = contig_addr - contig_base;
692 		contig_base_adj = (contig_base >> sym_chan_shift) *
693 						  ((chash.sym_slice1_channel_enabled >> (*pmiidx & 1)) & 1);
694 		contig_addr = contig_offset + ((sym_channels > 0) ? contig_base_adj : 0ull);
695 	} else if (in_region(&as2, addr) && (asym_2way.asym_2way_intlv_mode == 0x3ul)) {
696 		bool channel1;
697 
698 		mot_intlv_bit = MOT_CHAN_INTLV_BIT_1SLC_2CH;
699 		*pmiidx = (asym_2way.asym_2way_intlv_mode & 1) << 1;
700 		channel1 = mot_hit ? ((bool)((addr >> mot_intlv_bit) & 1)) :
701 			hash_by_mask(contig_addr, chan_hash_mask);
702 		*pmiidx |= (u32)channel1;
703 
704 		contig_base = remove_mmio_gap(as2.base);
705 		chan_intlv_bit_rm = mot_hit ? mot_intlv_bit : chan_selector;
706 		contig_offset = contig_addr - contig_base;
707 		remove_addr_bit(&contig_offset, chan_intlv_bit_rm);
708 		contig_addr = (contig_base >> sym_chan_shift) + contig_offset;
709 	} else {
710 		/* Otherwise we're in normal, boring symmetric mode. */
711 		*pmiidx = 0u;
712 
713 		if (two_slices) {
714 			bool slice1;
715 
716 			if (mot_hit) {
717 				slice_intlv_bit_rm = MOT_SLC_INTLV_BIT;
718 				slice1 = (addr >> MOT_SLC_INTLV_BIT) & 1;
719 			} else {
720 				slice_intlv_bit_rm = slice_selector;
721 				slice1 = hash_by_mask(addr, slice_hash_mask);
722 			}
723 
724 			*pmiidx = (u32)slice1 << 1;
725 		}
726 
727 		if (two_channels) {
728 			bool channel1;
729 
730 			mot_intlv_bit = two_slices ? MOT_CHAN_INTLV_BIT_2SLC_2CH :
731 							MOT_CHAN_INTLV_BIT_1SLC_2CH;
732 
733 			if (mot_hit) {
734 				chan_intlv_bit_rm = mot_intlv_bit;
735 				channel1 = (addr >> mot_intlv_bit) & 1;
736 			} else {
737 				chan_intlv_bit_rm = chan_selector;
738 				channel1 = hash_by_mask(contig_addr, chan_hash_mask);
739 			}
740 
741 			*pmiidx |= (u32)channel1;
742 		}
743 	}
744 
745 	/* Remove the chan_selector bit first */
746 	remove_addr_bit(&contig_addr, chan_intlv_bit_rm);
747 	/* Remove the slice bit (we remove it second because it must be lower */
748 	remove_addr_bit(&contig_addr, slice_intlv_bit_rm);
749 	*pmiaddr = contig_addr;
750 
751 	return 0;
752 }
753 
754 /* Translate PMI address to memory (rank, row, bank, column) */
755 #define C(n) (0x10 | (n))	/* column */
756 #define B(n) (0x20 | (n))	/* bank */
757 #define R(n) (0x40 | (n))	/* row */
758 #define RS   (0x80)			/* rank */
759 
760 /* addrdec values */
761 #define AMAP_1KB	0
762 #define AMAP_2KB	1
763 #define AMAP_4KB	2
764 #define AMAP_RSVD	3
765 
766 /* dden values */
767 #define DEN_4Gb		0
768 #define DEN_8Gb		2
769 
770 /* dwid values */
771 #define X8		0
772 #define X16		1
773 
774 static struct dimm_geometry {
775 	u8	addrdec;
776 	u8	dden;
777 	u8	dwid;
778 	u8	rowbits, colbits;
779 	u16	bits[PMI_ADDRESS_WIDTH];
780 } dimms[] = {
781 	{
782 		.addrdec = AMAP_1KB, .dden = DEN_4Gb, .dwid = X16,
783 		.rowbits = 15, .colbits = 10,
784 		.bits = {
785 			C(2),  C(3),  C(4),  C(5),  C(6),  B(0),  B(1),  B(2),  R(0),
786 			R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),  R(8),  R(9),
787 			R(10), C(7),  C(8),  C(9),  R(11), RS,    R(12), R(13), R(14),
788 			0,     0,     0,     0
789 		}
790 	},
791 	{
792 		.addrdec = AMAP_1KB, .dden = DEN_4Gb, .dwid = X8,
793 		.rowbits = 16, .colbits = 10,
794 		.bits = {
795 			C(2),  C(3),  C(4),  C(5),  C(6),  B(0),  B(1),  B(2),  R(0),
796 			R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),  R(8),  R(9),
797 			R(10), C(7),  C(8),  C(9),  R(11), RS,    R(12), R(13), R(14),
798 			R(15), 0,     0,     0
799 		}
800 	},
801 	{
802 		.addrdec = AMAP_1KB, .dden = DEN_8Gb, .dwid = X16,
803 		.rowbits = 16, .colbits = 10,
804 		.bits = {
805 			C(2),  C(3),  C(4),  C(5),  C(6),  B(0),  B(1),  B(2),  R(0),
806 			R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),  R(8),  R(9),
807 			R(10), C(7),  C(8),  C(9),  R(11), RS,    R(12), R(13), R(14),
808 			R(15), 0,     0,     0
809 		}
810 	},
811 	{
812 		.addrdec = AMAP_1KB, .dden = DEN_8Gb, .dwid = X8,
813 		.rowbits = 16, .colbits = 11,
814 		.bits = {
815 			C(2),  C(3),  C(4),  C(5),  C(6),  B(0),  B(1),  B(2),  R(0),
816 			R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),  R(8),  R(9),
817 			R(10), C(7),  C(8),  C(9),  R(11), RS,    C(11), R(12), R(13),
818 			R(14), R(15), 0,     0
819 		}
820 	},
821 	{
822 		.addrdec = AMAP_2KB, .dden = DEN_4Gb, .dwid = X16,
823 		.rowbits = 15, .colbits = 10,
824 		.bits = {
825 			C(2),  C(3),  C(4),  C(5),  C(6),  C(7),  B(0),  B(1),  B(2),
826 			R(0),  R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),  R(8),
827 			R(9),  R(10), C(8),  C(9),  R(11), RS,    R(12), R(13), R(14),
828 			0,     0,     0,     0
829 		}
830 	},
831 	{
832 		.addrdec = AMAP_2KB, .dden = DEN_4Gb, .dwid = X8,
833 		.rowbits = 16, .colbits = 10,
834 		.bits = {
835 			C(2),  C(3),  C(4),  C(5),  C(6),  C(7),  B(0),  B(1),  B(2),
836 			R(0),  R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),  R(8),
837 			R(9),  R(10), C(8),  C(9),  R(11), RS,    R(12), R(13), R(14),
838 			R(15), 0,     0,     0
839 		}
840 	},
841 	{
842 		.addrdec = AMAP_2KB, .dden = DEN_8Gb, .dwid = X16,
843 		.rowbits = 16, .colbits = 10,
844 		.bits = {
845 			C(2),  C(3),  C(4),  C(5),  C(6),  C(7),  B(0),  B(1),  B(2),
846 			R(0),  R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),  R(8),
847 			R(9),  R(10), C(8),  C(9),  R(11), RS,    R(12), R(13), R(14),
848 			R(15), 0,     0,     0
849 		}
850 	},
851 	{
852 		.addrdec = AMAP_2KB, .dden = DEN_8Gb, .dwid = X8,
853 		.rowbits = 16, .colbits = 11,
854 		.bits = {
855 			C(2),  C(3),  C(4),  C(5),  C(6),  C(7),  B(0),  B(1),  B(2),
856 			R(0),  R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),  R(8),
857 			R(9),  R(10), C(8),  C(9),  R(11), RS,    C(11), R(12), R(13),
858 			R(14), R(15), 0,     0
859 		}
860 	},
861 	{
862 		.addrdec = AMAP_4KB, .dden = DEN_4Gb, .dwid = X16,
863 		.rowbits = 15, .colbits = 10,
864 		.bits = {
865 			C(2),  C(3),  C(4),  C(5),  C(6),  C(7),  C(8),  B(0),  B(1),
866 			B(2),  R(0),  R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),
867 			R(8),  R(9),  R(10), C(9),  R(11), RS,    R(12), R(13), R(14),
868 			0,     0,     0,     0
869 		}
870 	},
871 	{
872 		.addrdec = AMAP_4KB, .dden = DEN_4Gb, .dwid = X8,
873 		.rowbits = 16, .colbits = 10,
874 		.bits = {
875 			C(2),  C(3),  C(4),  C(5),  C(6),  C(7),  C(8),  B(0),  B(1),
876 			B(2),  R(0),  R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),
877 			R(8),  R(9),  R(10), C(9),  R(11), RS,    R(12), R(13), R(14),
878 			R(15), 0,     0,     0
879 		}
880 	},
881 	{
882 		.addrdec = AMAP_4KB, .dden = DEN_8Gb, .dwid = X16,
883 		.rowbits = 16, .colbits = 10,
884 		.bits = {
885 			C(2),  C(3),  C(4),  C(5),  C(6),  C(7),  C(8),  B(0),  B(1),
886 			B(2),  R(0),  R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),
887 			R(8),  R(9),  R(10), C(9),  R(11), RS,    R(12), R(13), R(14),
888 			R(15), 0,     0,     0
889 		}
890 	},
891 	{
892 		.addrdec = AMAP_4KB, .dden = DEN_8Gb, .dwid = X8,
893 		.rowbits = 16, .colbits = 11,
894 		.bits = {
895 			C(2),  C(3),  C(4),  C(5),  C(6),  C(7),  C(8),  B(0),  B(1),
896 			B(2),  R(0),  R(1),  R(2),  R(3),  R(4),  R(5),  R(6),  R(7),
897 			R(8),  R(9),  R(10), C(9),  R(11), RS,    C(11), R(12), R(13),
898 			R(14), R(15), 0,     0
899 		}
900 	}
901 };
902 
903 static int bank_hash(u64 pmiaddr, int idx, int shft)
904 {
905 	int bhash = 0;
906 
907 	switch (idx) {
908 	case 0:
909 		bhash ^= ((pmiaddr >> (12 + shft)) ^ (pmiaddr >> (9 + shft))) & 1;
910 		break;
911 	case 1:
912 		bhash ^= (((pmiaddr >> (10 + shft)) ^ (pmiaddr >> (8 + shft))) & 1) << 1;
913 		bhash ^= ((pmiaddr >> 22) & 1) << 1;
914 		break;
915 	case 2:
916 		bhash ^= (((pmiaddr >> (13 + shft)) ^ (pmiaddr >> (11 + shft))) & 1) << 2;
917 		break;
918 	}
919 
920 	return bhash;
921 }
922 
923 static int rank_hash(u64 pmiaddr)
924 {
925 	return ((pmiaddr >> 16) ^ (pmiaddr >> 10)) & 1;
926 }
927 
928 /* Second stage decode. Compute rank, bank, row & column. */
929 static int apl_pmi2mem(struct mem_ctl_info *mci, u64 pmiaddr, u32 pmiidx,
930 		       struct dram_addr *daddr, char *msg)
931 {
932 	struct d_cr_drp0 *cr_drp0 = &drp0[pmiidx];
933 	struct pnd2_pvt *pvt = mci->pvt_info;
934 	int g = pvt->dimm_geom[pmiidx];
935 	struct dimm_geometry *d = &dimms[g];
936 	int column = 0, bank = 0, row = 0, rank = 0;
937 	int i, idx, type, skiprs = 0;
938 
939 	for (i = 0; i < PMI_ADDRESS_WIDTH; i++) {
940 		int	bit = (pmiaddr >> i) & 1;
941 
942 		if (i + skiprs >= PMI_ADDRESS_WIDTH) {
943 			snprintf(msg, PND2_MSG_SIZE, "Bad dimm_geometry[] table\n");
944 			return -EINVAL;
945 		}
946 
947 		type = d->bits[i + skiprs] & ~0xf;
948 		idx = d->bits[i + skiprs] & 0xf;
949 
950 		/*
951 		 * On single rank DIMMs ignore the rank select bit
952 		 * and shift remainder of "bits[]" down one place.
953 		 */
954 		if (type == RS && (cr_drp0->rken0 + cr_drp0->rken1) == 1) {
955 			skiprs = 1;
956 			type = d->bits[i + skiprs] & ~0xf;
957 			idx = d->bits[i + skiprs] & 0xf;
958 		}
959 
960 		switch (type) {
961 		case C(0):
962 			column |= (bit << idx);
963 			break;
964 		case B(0):
965 			bank |= (bit << idx);
966 			if (cr_drp0->bahen)
967 				bank ^= bank_hash(pmiaddr, idx, d->addrdec);
968 			break;
969 		case R(0):
970 			row |= (bit << idx);
971 			break;
972 		case RS:
973 			rank = bit;
974 			if (cr_drp0->rsien)
975 				rank ^= rank_hash(pmiaddr);
976 			break;
977 		default:
978 			if (bit) {
979 				snprintf(msg, PND2_MSG_SIZE, "Bad translation\n");
980 				return -EINVAL;
981 			}
982 			goto done;
983 		}
984 	}
985 
986 done:
987 	daddr->col = column;
988 	daddr->bank = bank;
989 	daddr->row = row;
990 	daddr->rank = rank;
991 	daddr->dimm = 0;
992 
993 	return 0;
994 }
995 
996 /* Pluck bit "in" from pmiaddr and return value shifted to bit "out" */
997 #define dnv_get_bit(pmi, in, out) ((int)(((pmi) >> (in)) & 1u) << (out))
998 
999 static int dnv_pmi2mem(struct mem_ctl_info *mci, u64 pmiaddr, u32 pmiidx,
1000 					   struct dram_addr *daddr, char *msg)
1001 {
1002 	/* Rank 0 or 1 */
1003 	daddr->rank = dnv_get_bit(pmiaddr, dmap[pmiidx].rs0 + 13, 0);
1004 	/* Rank 2 or 3 */
1005 	daddr->rank |= dnv_get_bit(pmiaddr, dmap[pmiidx].rs1 + 13, 1);
1006 
1007 	/*
1008 	 * Normally ranks 0,1 are DIMM0, and 2,3 are DIMM1, but we
1009 	 * flip them if DIMM1 is larger than DIMM0.
1010 	 */
1011 	daddr->dimm = (daddr->rank >= 2) ^ drp[pmiidx].dimmflip;
1012 
1013 	daddr->bank = dnv_get_bit(pmiaddr, dmap[pmiidx].ba0 + 6, 0);
1014 	daddr->bank |= dnv_get_bit(pmiaddr, dmap[pmiidx].ba1 + 6, 1);
1015 	daddr->bank |= dnv_get_bit(pmiaddr, dmap[pmiidx].bg0 + 6, 2);
1016 	if (dsch.ddr4en)
1017 		daddr->bank |= dnv_get_bit(pmiaddr, dmap[pmiidx].bg1 + 6, 3);
1018 	if (dmap1[pmiidx].bxor) {
1019 		if (dsch.ddr4en) {
1020 			daddr->bank ^= dnv_get_bit(pmiaddr, dmap3[pmiidx].row6 + 6, 0);
1021 			daddr->bank ^= dnv_get_bit(pmiaddr, dmap3[pmiidx].row7 + 6, 1);
1022 			if (dsch.chan_width == 0)
1023 				/* 64/72 bit dram channel width */
1024 				daddr->bank ^= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca3 + 6, 2);
1025 			else
1026 				/* 32/40 bit dram channel width */
1027 				daddr->bank ^= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca4 + 6, 2);
1028 			daddr->bank ^= dnv_get_bit(pmiaddr, dmap2[pmiidx].row2 + 6, 3);
1029 		} else {
1030 			daddr->bank ^= dnv_get_bit(pmiaddr, dmap2[pmiidx].row2 + 6, 0);
1031 			daddr->bank ^= dnv_get_bit(pmiaddr, dmap3[pmiidx].row6 + 6, 1);
1032 			if (dsch.chan_width == 0)
1033 				daddr->bank ^= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca3 + 6, 2);
1034 			else
1035 				daddr->bank ^= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca4 + 6, 2);
1036 		}
1037 	}
1038 
1039 	daddr->row = dnv_get_bit(pmiaddr, dmap2[pmiidx].row0 + 6, 0);
1040 	daddr->row |= dnv_get_bit(pmiaddr, dmap2[pmiidx].row1 + 6, 1);
1041 	daddr->row |= dnv_get_bit(pmiaddr, dmap2[pmiidx].row2 + 6, 2);
1042 	daddr->row |= dnv_get_bit(pmiaddr, dmap2[pmiidx].row3 + 6, 3);
1043 	daddr->row |= dnv_get_bit(pmiaddr, dmap2[pmiidx].row4 + 6, 4);
1044 	daddr->row |= dnv_get_bit(pmiaddr, dmap2[pmiidx].row5 + 6, 5);
1045 	daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row6 + 6, 6);
1046 	daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row7 + 6, 7);
1047 	daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row8 + 6, 8);
1048 	daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row9 + 6, 9);
1049 	daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row10 + 6, 10);
1050 	daddr->row |= dnv_get_bit(pmiaddr, dmap3[pmiidx].row11 + 6, 11);
1051 	daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row12 + 6, 12);
1052 	daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row13 + 6, 13);
1053 	if (dmap4[pmiidx].row14 != 31)
1054 		daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row14 + 6, 14);
1055 	if (dmap4[pmiidx].row15 != 31)
1056 		daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row15 + 6, 15);
1057 	if (dmap4[pmiidx].row16 != 31)
1058 		daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row16 + 6, 16);
1059 	if (dmap4[pmiidx].row17 != 31)
1060 		daddr->row |= dnv_get_bit(pmiaddr, dmap4[pmiidx].row17 + 6, 17);
1061 
1062 	daddr->col = dnv_get_bit(pmiaddr, dmap5[pmiidx].ca3 + 6, 3);
1063 	daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca4 + 6, 4);
1064 	daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca5 + 6, 5);
1065 	daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca6 + 6, 6);
1066 	daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca7 + 6, 7);
1067 	daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca8 + 6, 8);
1068 	daddr->col |= dnv_get_bit(pmiaddr, dmap5[pmiidx].ca9 + 6, 9);
1069 	if (!dsch.ddr4en && dmap1[pmiidx].ca11 != 0x3f)
1070 		daddr->col |= dnv_get_bit(pmiaddr, dmap1[pmiidx].ca11 + 13, 11);
1071 
1072 	return 0;
1073 }
1074 
1075 static int check_channel(int ch)
1076 {
1077 	if (drp0[ch].dramtype != 0) {
1078 		pnd2_printk(KERN_INFO, "Unsupported DIMM in channel %d\n", ch);
1079 		return 1;
1080 	} else if (drp0[ch].eccen == 0) {
1081 		pnd2_printk(KERN_INFO, "ECC disabled on channel %d\n", ch);
1082 		return 1;
1083 	}
1084 	return 0;
1085 }
1086 
1087 static int apl_check_ecc_active(void)
1088 {
1089 	int	i, ret = 0;
1090 
1091 	/* Check dramtype and ECC mode for each present DIMM */
1092 	for (i = 0; i < APL_NUM_CHANNELS; i++)
1093 		if (chan_mask & BIT(i))
1094 			ret += check_channel(i);
1095 	return ret ? -EINVAL : 0;
1096 }
1097 
1098 #define DIMMS_PRESENT(d) ((d)->rken0 + (d)->rken1 + (d)->rken2 + (d)->rken3)
1099 
1100 static int check_unit(int ch)
1101 {
1102 	struct d_cr_drp *d = &drp[ch];
1103 
1104 	if (DIMMS_PRESENT(d) && !ecc_ctrl[ch].eccen) {
1105 		pnd2_printk(KERN_INFO, "ECC disabled on channel %d\n", ch);
1106 		return 1;
1107 	}
1108 	return 0;
1109 }
1110 
1111 static int dnv_check_ecc_active(void)
1112 {
1113 	int	i, ret = 0;
1114 
1115 	for (i = 0; i < DNV_NUM_CHANNELS; i++)
1116 		ret += check_unit(i);
1117 	return ret ? -EINVAL : 0;
1118 }
1119 
1120 static int get_memory_error_data(struct mem_ctl_info *mci, u64 addr,
1121 								 struct dram_addr *daddr, char *msg)
1122 {
1123 	u64	pmiaddr;
1124 	u32	pmiidx;
1125 	int	ret;
1126 
1127 	ret = sys2pmi(addr, &pmiidx, &pmiaddr, msg);
1128 	if (ret)
1129 		return ret;
1130 
1131 	pmiaddr >>= ops->pmiaddr_shift;
1132 	/* pmi channel idx to dimm channel idx */
1133 	pmiidx >>= ops->pmiidx_shift;
1134 	daddr->chan = pmiidx;
1135 
1136 	ret = ops->pmi2mem(mci, pmiaddr, pmiidx, daddr, msg);
1137 	if (ret)
1138 		return ret;
1139 
1140 	edac_dbg(0, "SysAddr=%llx PmiAddr=%llx Channel=%d DIMM=%d Rank=%d Bank=%d Row=%d Column=%d\n",
1141 			 addr, pmiaddr, daddr->chan, daddr->dimm, daddr->rank, daddr->bank, daddr->row, daddr->col);
1142 
1143 	return 0;
1144 }
1145 
1146 static void pnd2_mce_output_error(struct mem_ctl_info *mci, const struct mce *m,
1147 				  struct dram_addr *daddr)
1148 {
1149 	enum hw_event_mc_err_type tp_event;
1150 	char *optype, msg[PND2_MSG_SIZE];
1151 	bool ripv = m->mcgstatus & MCG_STATUS_RIPV;
1152 	bool overflow = m->status & MCI_STATUS_OVER;
1153 	bool uc_err = m->status & MCI_STATUS_UC;
1154 	bool recov = m->status & MCI_STATUS_S;
1155 	u32 core_err_cnt = GET_BITFIELD(m->status, 38, 52);
1156 	u32 mscod = GET_BITFIELD(m->status, 16, 31);
1157 	u32 errcode = GET_BITFIELD(m->status, 0, 15);
1158 	u32 optypenum = GET_BITFIELD(m->status, 4, 6);
1159 	int rc;
1160 
1161 	tp_event = uc_err ? (ripv ? HW_EVENT_ERR_FATAL : HW_EVENT_ERR_UNCORRECTED) :
1162 						 HW_EVENT_ERR_CORRECTED;
1163 
1164 	/*
1165 	 * According with Table 15-9 of the Intel Architecture spec vol 3A,
1166 	 * memory errors should fit in this mask:
1167 	 *	000f 0000 1mmm cccc (binary)
1168 	 * where:
1169 	 *	f = Correction Report Filtering Bit. If 1, subsequent errors
1170 	 *	    won't be shown
1171 	 *	mmm = error type
1172 	 *	cccc = channel
1173 	 * If the mask doesn't match, report an error to the parsing logic
1174 	 */
1175 	if (!((errcode & 0xef80) == 0x80)) {
1176 		optype = "Can't parse: it is not a mem";
1177 	} else {
1178 		switch (optypenum) {
1179 		case 0:
1180 			optype = "generic undef request error";
1181 			break;
1182 		case 1:
1183 			optype = "memory read error";
1184 			break;
1185 		case 2:
1186 			optype = "memory write error";
1187 			break;
1188 		case 3:
1189 			optype = "addr/cmd error";
1190 			break;
1191 		case 4:
1192 			optype = "memory scrubbing error";
1193 			break;
1194 		default:
1195 			optype = "reserved";
1196 			break;
1197 		}
1198 	}
1199 
1200 	/* Only decode errors with an valid address (ADDRV) */
1201 	if (!(m->status & MCI_STATUS_ADDRV))
1202 		return;
1203 
1204 	rc = get_memory_error_data(mci, m->addr, daddr, msg);
1205 	if (rc)
1206 		goto address_error;
1207 
1208 	snprintf(msg, sizeof(msg),
1209 		 "%s%s err_code:%04x:%04x channel:%d DIMM:%d rank:%d row:%d bank:%d col:%d",
1210 		 overflow ? " OVERFLOW" : "", (uc_err && recov) ? " recoverable" : "", mscod,
1211 		 errcode, daddr->chan, daddr->dimm, daddr->rank, daddr->row, daddr->bank, daddr->col);
1212 
1213 	edac_dbg(0, "%s\n", msg);
1214 
1215 	/* Call the helper to output message */
1216 	edac_mc_handle_error(tp_event, mci, core_err_cnt, m->addr >> PAGE_SHIFT,
1217 						 m->addr & ~PAGE_MASK, 0, daddr->chan, daddr->dimm, -1, optype, msg);
1218 
1219 	return;
1220 
1221 address_error:
1222 	edac_mc_handle_error(tp_event, mci, core_err_cnt, 0, 0, 0, -1, -1, -1, msg, "");
1223 }
1224 
1225 static void apl_get_dimm_config(struct mem_ctl_info *mci)
1226 {
1227 	struct pnd2_pvt	*pvt = mci->pvt_info;
1228 	struct dimm_info *dimm;
1229 	struct d_cr_drp0 *d;
1230 	u64	capacity;
1231 	int	i, g;
1232 
1233 	for (i = 0; i < APL_NUM_CHANNELS; i++) {
1234 		if (!(chan_mask & BIT(i)))
1235 			continue;
1236 
1237 		dimm = EDAC_DIMM_PTR(mci->layers, mci->dimms, mci->n_layers, i, 0, 0);
1238 		if (!dimm) {
1239 			edac_dbg(0, "No allocated DIMM for channel %d\n", i);
1240 			continue;
1241 		}
1242 
1243 		d = &drp0[i];
1244 		for (g = 0; g < ARRAY_SIZE(dimms); g++)
1245 			if (dimms[g].addrdec == d->addrdec &&
1246 			    dimms[g].dden == d->dden &&
1247 			    dimms[g].dwid == d->dwid)
1248 				break;
1249 
1250 		if (g == ARRAY_SIZE(dimms)) {
1251 			edac_dbg(0, "Channel %d: unrecognized DIMM\n", i);
1252 			continue;
1253 		}
1254 
1255 		pvt->dimm_geom[i] = g;
1256 		capacity = (d->rken0 + d->rken1) * 8 * (1ul << dimms[g].rowbits) *
1257 				   (1ul << dimms[g].colbits);
1258 		edac_dbg(0, "Channel %d: %lld MByte DIMM\n", i, capacity >> (20 - 3));
1259 		dimm->nr_pages = MiB_TO_PAGES(capacity >> (20 - 3));
1260 		dimm->grain = 32;
1261 		dimm->dtype = (d->dwid == 0) ? DEV_X8 : DEV_X16;
1262 		dimm->mtype = MEM_DDR3;
1263 		dimm->edac_mode = EDAC_SECDED;
1264 		snprintf(dimm->label, sizeof(dimm->label), "Slice#%d_Chan#%d", i / 2, i % 2);
1265 	}
1266 }
1267 
1268 static const int dnv_dtypes[] = {
1269 	DEV_X8, DEV_X4, DEV_X16, DEV_UNKNOWN
1270 };
1271 
1272 static void dnv_get_dimm_config(struct mem_ctl_info *mci)
1273 {
1274 	int	i, j, ranks_of_dimm[DNV_MAX_DIMMS], banks, rowbits, colbits, memtype;
1275 	struct dimm_info *dimm;
1276 	struct d_cr_drp *d;
1277 	u64	capacity;
1278 
1279 	if (dsch.ddr4en) {
1280 		memtype = MEM_DDR4;
1281 		banks = 16;
1282 		colbits = 10;
1283 	} else {
1284 		memtype = MEM_DDR3;
1285 		banks = 8;
1286 	}
1287 
1288 	for (i = 0; i < DNV_NUM_CHANNELS; i++) {
1289 		if (dmap4[i].row14 == 31)
1290 			rowbits = 14;
1291 		else if (dmap4[i].row15 == 31)
1292 			rowbits = 15;
1293 		else if (dmap4[i].row16 == 31)
1294 			rowbits = 16;
1295 		else if (dmap4[i].row17 == 31)
1296 			rowbits = 17;
1297 		else
1298 			rowbits = 18;
1299 
1300 		if (memtype == MEM_DDR3) {
1301 			if (dmap1[i].ca11 != 0x3f)
1302 				colbits = 12;
1303 			else
1304 				colbits = 10;
1305 		}
1306 
1307 		d = &drp[i];
1308 		/* DIMM0 is present if rank0 and/or rank1 is enabled */
1309 		ranks_of_dimm[0] = d->rken0 + d->rken1;
1310 		/* DIMM1 is present if rank2 and/or rank3 is enabled */
1311 		ranks_of_dimm[1] = d->rken2 + d->rken3;
1312 
1313 		for (j = 0; j < DNV_MAX_DIMMS; j++) {
1314 			if (!ranks_of_dimm[j])
1315 				continue;
1316 
1317 			dimm = EDAC_DIMM_PTR(mci->layers, mci->dimms, mci->n_layers, i, j, 0);
1318 			if (!dimm) {
1319 				edac_dbg(0, "No allocated DIMM for channel %d DIMM %d\n", i, j);
1320 				continue;
1321 			}
1322 
1323 			capacity = ranks_of_dimm[j] * banks * (1ul << rowbits) * (1ul << colbits);
1324 			edac_dbg(0, "Channel %d DIMM %d: %lld MByte DIMM\n", i, j, capacity >> (20 - 3));
1325 			dimm->nr_pages = MiB_TO_PAGES(capacity >> (20 - 3));
1326 			dimm->grain = 32;
1327 			dimm->dtype = dnv_dtypes[j ? d->dimmdwid0 : d->dimmdwid1];
1328 			dimm->mtype = memtype;
1329 			dimm->edac_mode = EDAC_SECDED;
1330 			snprintf(dimm->label, sizeof(dimm->label), "Chan#%d_DIMM#%d", i, j);
1331 		}
1332 	}
1333 }
1334 
1335 static int pnd2_register_mci(struct mem_ctl_info **ppmci)
1336 {
1337 	struct edac_mc_layer layers[2];
1338 	struct mem_ctl_info *mci;
1339 	struct pnd2_pvt *pvt;
1340 	int rc;
1341 
1342 	rc = ops->check_ecc();
1343 	if (rc < 0)
1344 		return rc;
1345 
1346 	/* Allocate a new MC control structure */
1347 	layers[0].type = EDAC_MC_LAYER_CHANNEL;
1348 	layers[0].size = ops->channels;
1349 	layers[0].is_virt_csrow = false;
1350 	layers[1].type = EDAC_MC_LAYER_SLOT;
1351 	layers[1].size = ops->dimms_per_channel;
1352 	layers[1].is_virt_csrow = true;
1353 	mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, sizeof(*pvt));
1354 	if (!mci)
1355 		return -ENOMEM;
1356 
1357 	pvt = mci->pvt_info;
1358 	memset(pvt, 0, sizeof(*pvt));
1359 
1360 	mci->mod_name = EDAC_MOD_STR;
1361 	mci->dev_name = ops->name;
1362 	mci->ctl_name = "Pondicherry2";
1363 
1364 	/* Get dimm basic config and the memory layout */
1365 	ops->get_dimm_config(mci);
1366 
1367 	if (edac_mc_add_mc(mci)) {
1368 		edac_dbg(0, "MC: failed edac_mc_add_mc()\n");
1369 		edac_mc_free(mci);
1370 		return -EINVAL;
1371 	}
1372 
1373 	*ppmci = mci;
1374 
1375 	return 0;
1376 }
1377 
1378 static void pnd2_unregister_mci(struct mem_ctl_info *mci)
1379 {
1380 	if (unlikely(!mci || !mci->pvt_info)) {
1381 		pnd2_printk(KERN_ERR, "Couldn't find mci handler\n");
1382 		return;
1383 	}
1384 
1385 	/* Remove MC sysfs nodes */
1386 	edac_mc_del_mc(NULL);
1387 	edac_dbg(1, "%s: free mci struct\n", mci->ctl_name);
1388 	edac_mc_free(mci);
1389 }
1390 
1391 /*
1392  * Callback function registered with core kernel mce code.
1393  * Called once for each logged error.
1394  */
1395 static int pnd2_mce_check_error(struct notifier_block *nb, unsigned long val, void *data)
1396 {
1397 	struct mce *mce = (struct mce *)data;
1398 	struct mem_ctl_info *mci;
1399 	struct dram_addr daddr;
1400 	char *type;
1401 
1402 	if (edac_get_report_status() == EDAC_REPORTING_DISABLED)
1403 		return NOTIFY_DONE;
1404 
1405 	mci = pnd2_mci;
1406 	if (!mci)
1407 		return NOTIFY_DONE;
1408 
1409 	/*
1410 	 * Just let mcelog handle it if the error is
1411 	 * outside the memory controller. A memory error
1412 	 * is indicated by bit 7 = 1 and bits = 8-11,13-15 = 0.
1413 	 * bit 12 has an special meaning.
1414 	 */
1415 	if ((mce->status & 0xefff) >> 7 != 1)
1416 		return NOTIFY_DONE;
1417 
1418 	if (mce->mcgstatus & MCG_STATUS_MCIP)
1419 		type = "Exception";
1420 	else
1421 		type = "Event";
1422 
1423 	pnd2_mc_printk(mci, KERN_INFO, "HANDLING MCE MEMORY ERROR\n");
1424 	pnd2_mc_printk(mci, KERN_INFO, "CPU %u: Machine Check %s: %llx Bank %u: %llx\n",
1425 				   mce->extcpu, type, mce->mcgstatus, mce->bank, mce->status);
1426 	pnd2_mc_printk(mci, KERN_INFO, "TSC %llx ", mce->tsc);
1427 	pnd2_mc_printk(mci, KERN_INFO, "ADDR %llx ", mce->addr);
1428 	pnd2_mc_printk(mci, KERN_INFO, "MISC %llx ", mce->misc);
1429 	pnd2_mc_printk(mci, KERN_INFO, "PROCESSOR %u:%x TIME %llu SOCKET %u APIC %x\n",
1430 				   mce->cpuvendor, mce->cpuid, mce->time, mce->socketid, mce->apicid);
1431 
1432 	pnd2_mce_output_error(mci, mce, &daddr);
1433 
1434 	/* Advice mcelog that the error were handled */
1435 	return NOTIFY_STOP;
1436 }
1437 
1438 static struct notifier_block pnd2_mce_dec = {
1439 	.notifier_call	= pnd2_mce_check_error,
1440 };
1441 
1442 #ifdef CONFIG_EDAC_DEBUG
1443 /*
1444  * Write an address to this file to exercise the address decode
1445  * logic in this driver.
1446  */
1447 static u64 pnd2_fake_addr;
1448 #define PND2_BLOB_SIZE 1024
1449 static char pnd2_result[PND2_BLOB_SIZE];
1450 static struct dentry *pnd2_test;
1451 static struct debugfs_blob_wrapper pnd2_blob = {
1452 	.data = pnd2_result,
1453 	.size = 0
1454 };
1455 
1456 static int debugfs_u64_set(void *data, u64 val)
1457 {
1458 	struct dram_addr daddr;
1459 	struct mce m;
1460 
1461 	*(u64 *)data = val;
1462 	m.mcgstatus = 0;
1463 	/* ADDRV + MemRd + Unknown channel */
1464 	m.status = MCI_STATUS_ADDRV + 0x9f;
1465 	m.addr = val;
1466 	pnd2_mce_output_error(pnd2_mci, &m, &daddr);
1467 	snprintf(pnd2_blob.data, PND2_BLOB_SIZE,
1468 			 "SysAddr=%llx Channel=%d DIMM=%d Rank=%d Bank=%d Row=%d Column=%d\n",
1469 			 m.addr, daddr.chan, daddr.dimm, daddr.rank, daddr.bank, daddr.row, daddr.col);
1470 	pnd2_blob.size = strlen(pnd2_blob.data);
1471 
1472 	return 0;
1473 }
1474 DEFINE_DEBUGFS_ATTRIBUTE(fops_u64_wo, NULL, debugfs_u64_set, "%llu\n");
1475 
1476 static void setup_pnd2_debug(void)
1477 {
1478 	pnd2_test = edac_debugfs_create_dir("pnd2_test");
1479 	edac_debugfs_create_file("pnd2_debug_addr", 0200, pnd2_test,
1480 							 &pnd2_fake_addr, &fops_u64_wo);
1481 	debugfs_create_blob("pnd2_debug_results", 0400, pnd2_test, &pnd2_blob);
1482 }
1483 
1484 static void teardown_pnd2_debug(void)
1485 {
1486 	debugfs_remove_recursive(pnd2_test);
1487 }
1488 #else
1489 static void setup_pnd2_debug(void)	{}
1490 static void teardown_pnd2_debug(void)	{}
1491 #endif /* CONFIG_EDAC_DEBUG */
1492 
1493 
1494 static int pnd2_probe(void)
1495 {
1496 	int rc;
1497 
1498 	edac_dbg(2, "\n");
1499 	rc = get_registers();
1500 	if (rc)
1501 		return rc;
1502 
1503 	return pnd2_register_mci(&pnd2_mci);
1504 }
1505 
1506 static void pnd2_remove(void)
1507 {
1508 	edac_dbg(0, "\n");
1509 	pnd2_unregister_mci(pnd2_mci);
1510 }
1511 
1512 static struct dunit_ops apl_ops = {
1513 		.name			= "pnd2/apl",
1514 		.type			= APL,
1515 		.pmiaddr_shift		= LOG2_PMI_ADDR_GRANULARITY,
1516 		.pmiidx_shift		= 0,
1517 		.channels		= APL_NUM_CHANNELS,
1518 		.dimms_per_channel	= 1,
1519 		.rd_reg			= apl_rd_reg,
1520 		.get_registers		= apl_get_registers,
1521 		.check_ecc		= apl_check_ecc_active,
1522 		.mk_region		= apl_mk_region,
1523 		.get_dimm_config	= apl_get_dimm_config,
1524 		.pmi2mem		= apl_pmi2mem,
1525 };
1526 
1527 static struct dunit_ops dnv_ops = {
1528 		.name			= "pnd2/dnv",
1529 		.type			= DNV,
1530 		.pmiaddr_shift		= 0,
1531 		.pmiidx_shift		= 1,
1532 		.channels		= DNV_NUM_CHANNELS,
1533 		.dimms_per_channel	= 2,
1534 		.rd_reg			= dnv_rd_reg,
1535 		.get_registers		= dnv_get_registers,
1536 		.check_ecc		= dnv_check_ecc_active,
1537 		.mk_region		= dnv_mk_region,
1538 		.get_dimm_config	= dnv_get_dimm_config,
1539 		.pmi2mem		= dnv_pmi2mem,
1540 };
1541 
1542 static const struct x86_cpu_id pnd2_cpuids[] = {
1543 	{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_GOLDMONT, 0, (kernel_ulong_t)&apl_ops },
1544 	{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_DENVERTON, 0, (kernel_ulong_t)&dnv_ops },
1545 	{ }
1546 };
1547 MODULE_DEVICE_TABLE(x86cpu, pnd2_cpuids);
1548 
1549 static int __init pnd2_init(void)
1550 {
1551 	const struct x86_cpu_id *id;
1552 	const char *owner;
1553 	int rc;
1554 
1555 	edac_dbg(2, "\n");
1556 
1557 	owner = edac_get_owner();
1558 	if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
1559 		return -EBUSY;
1560 
1561 	id = x86_match_cpu(pnd2_cpuids);
1562 	if (!id)
1563 		return -ENODEV;
1564 
1565 	ops = (struct dunit_ops *)id->driver_data;
1566 
1567 	if (ops->type == APL) {
1568 		p2sb_bus = pci_find_bus(0, 0);
1569 		if (!p2sb_bus)
1570 			return -ENODEV;
1571 	}
1572 
1573 	/* Ensure that the OPSTATE is set correctly for POLL or NMI */
1574 	opstate_init();
1575 
1576 	rc = pnd2_probe();
1577 	if (rc < 0) {
1578 		pnd2_printk(KERN_ERR, "Failed to register device with error %d.\n", rc);
1579 		return rc;
1580 	}
1581 
1582 	if (!pnd2_mci)
1583 		return -ENODEV;
1584 
1585 	mce_register_decode_chain(&pnd2_mce_dec);
1586 	setup_pnd2_debug();
1587 
1588 	return 0;
1589 }
1590 
1591 static void __exit pnd2_exit(void)
1592 {
1593 	edac_dbg(2, "\n");
1594 	teardown_pnd2_debug();
1595 	mce_unregister_decode_chain(&pnd2_mce_dec);
1596 	pnd2_remove();
1597 }
1598 
1599 module_init(pnd2_init);
1600 module_exit(pnd2_exit);
1601 
1602 module_param(edac_op_state, int, 0444);
1603 MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI");
1604 
1605 MODULE_LICENSE("GPL v2");
1606 MODULE_AUTHOR("Tony Luck");
1607 MODULE_DESCRIPTION("MC Driver for Intel SoC using Pondicherry memory controller");
1608