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