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