xref: /openbmc/linux/drivers/edac/xgene_edac.c (revision efe4a1ac)
1 /*
2  * APM X-Gene SoC EDAC (error detection and correction)
3  *
4  * Copyright (c) 2015, Applied Micro Circuits Corporation
5  * Author: Feng Kan <fkan@apm.com>
6  *         Loc Ho <lho@apm.com>
7  *
8  * This program is free software; you can redistribute  it and/or modify it
9  * under  the terms of  the GNU General  Public License as published by the
10  * Free Software Foundation;  either version 2 of the  License, or (at your
11  * option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20  */
21 
22 #include <linux/ctype.h>
23 #include <linux/edac.h>
24 #include <linux/interrupt.h>
25 #include <linux/mfd/syscon.h>
26 #include <linux/module.h>
27 #include <linux/of.h>
28 #include <linux/of_address.h>
29 #include <linux/regmap.h>
30 
31 #include "edac_module.h"
32 
33 #define EDAC_MOD_STR			"xgene_edac"
34 
35 /* Global error configuration status registers (CSR) */
36 #define PCPHPERRINTSTS			0x0000
37 #define PCPHPERRINTMSK			0x0004
38 #define  MCU_CTL_ERR_MASK		BIT(12)
39 #define  IOB_PA_ERR_MASK		BIT(11)
40 #define  IOB_BA_ERR_MASK		BIT(10)
41 #define  IOB_XGIC_ERR_MASK		BIT(9)
42 #define  IOB_RB_ERR_MASK		BIT(8)
43 #define  L3C_UNCORR_ERR_MASK		BIT(5)
44 #define  MCU_UNCORR_ERR_MASK		BIT(4)
45 #define  PMD3_MERR_MASK			BIT(3)
46 #define  PMD2_MERR_MASK			BIT(2)
47 #define  PMD1_MERR_MASK			BIT(1)
48 #define  PMD0_MERR_MASK			BIT(0)
49 #define PCPLPERRINTSTS			0x0008
50 #define PCPLPERRINTMSK			0x000C
51 #define  CSW_SWITCH_TRACE_ERR_MASK	BIT(2)
52 #define  L3C_CORR_ERR_MASK		BIT(1)
53 #define  MCU_CORR_ERR_MASK		BIT(0)
54 #define MEMERRINTSTS			0x0010
55 #define MEMERRINTMSK			0x0014
56 
57 struct xgene_edac {
58 	struct device		*dev;
59 	struct regmap		*csw_map;
60 	struct regmap		*mcba_map;
61 	struct regmap		*mcbb_map;
62 	struct regmap		*efuse_map;
63 	struct regmap		*rb_map;
64 	void __iomem		*pcp_csr;
65 	spinlock_t		lock;
66 	struct dentry           *dfs;
67 
68 	struct list_head	mcus;
69 	struct list_head	pmds;
70 	struct list_head	l3s;
71 	struct list_head	socs;
72 
73 	struct mutex		mc_lock;
74 	int			mc_active_mask;
75 	int			mc_registered_mask;
76 };
77 
78 static void xgene_edac_pcp_rd(struct xgene_edac *edac, u32 reg, u32 *val)
79 {
80 	*val = readl(edac->pcp_csr + reg);
81 }
82 
83 static void xgene_edac_pcp_clrbits(struct xgene_edac *edac, u32 reg,
84 				   u32 bits_mask)
85 {
86 	u32 val;
87 
88 	spin_lock(&edac->lock);
89 	val = readl(edac->pcp_csr + reg);
90 	val &= ~bits_mask;
91 	writel(val, edac->pcp_csr + reg);
92 	spin_unlock(&edac->lock);
93 }
94 
95 static void xgene_edac_pcp_setbits(struct xgene_edac *edac, u32 reg,
96 				   u32 bits_mask)
97 {
98 	u32 val;
99 
100 	spin_lock(&edac->lock);
101 	val = readl(edac->pcp_csr + reg);
102 	val |= bits_mask;
103 	writel(val, edac->pcp_csr + reg);
104 	spin_unlock(&edac->lock);
105 }
106 
107 /* Memory controller error CSR */
108 #define MCU_MAX_RANK			8
109 #define MCU_RANK_STRIDE			0x40
110 
111 #define MCUGECR				0x0110
112 #define  MCU_GECR_DEMANDUCINTREN_MASK	BIT(0)
113 #define  MCU_GECR_BACKUCINTREN_MASK	BIT(1)
114 #define  MCU_GECR_CINTREN_MASK		BIT(2)
115 #define  MUC_GECR_MCUADDRERREN_MASK	BIT(9)
116 #define MCUGESR				0x0114
117 #define  MCU_GESR_ADDRNOMATCH_ERR_MASK	BIT(7)
118 #define  MCU_GESR_ADDRMULTIMATCH_ERR_MASK	BIT(6)
119 #define  MCU_GESR_PHYP_ERR_MASK		BIT(3)
120 #define MCUESRR0			0x0314
121 #define  MCU_ESRR_MULTUCERR_MASK	BIT(3)
122 #define  MCU_ESRR_BACKUCERR_MASK	BIT(2)
123 #define  MCU_ESRR_DEMANDUCERR_MASK	BIT(1)
124 #define  MCU_ESRR_CERR_MASK		BIT(0)
125 #define MCUESRRA0			0x0318
126 #define MCUEBLRR0			0x031c
127 #define  MCU_EBLRR_ERRBANK_RD(src)	(((src) & 0x00000007) >> 0)
128 #define MCUERCRR0			0x0320
129 #define  MCU_ERCRR_ERRROW_RD(src)	(((src) & 0xFFFF0000) >> 16)
130 #define  MCU_ERCRR_ERRCOL_RD(src)	((src) & 0x00000FFF)
131 #define MCUSBECNT0			0x0324
132 #define MCU_SBECNT_COUNT(src)		((src) & 0xFFFF)
133 
134 #define CSW_CSWCR			0x0000
135 #define  CSW_CSWCR_DUALMCB_MASK		BIT(0)
136 
137 #define MCBADDRMR			0x0000
138 #define  MCBADDRMR_MCU_INTLV_MODE_MASK	BIT(3)
139 #define  MCBADDRMR_DUALMCU_MODE_MASK	BIT(2)
140 #define  MCBADDRMR_MCB_INTLV_MODE_MASK	BIT(1)
141 #define  MCBADDRMR_ADDRESS_MODE_MASK	BIT(0)
142 
143 struct xgene_edac_mc_ctx {
144 	struct list_head	next;
145 	char			*name;
146 	struct mem_ctl_info	*mci;
147 	struct xgene_edac	*edac;
148 	void __iomem		*mcu_csr;
149 	u32			mcu_id;
150 };
151 
152 static ssize_t xgene_edac_mc_err_inject_write(struct file *file,
153 					      const char __user *data,
154 					      size_t count, loff_t *ppos)
155 {
156 	struct mem_ctl_info *mci = file->private_data;
157 	struct xgene_edac_mc_ctx *ctx = mci->pvt_info;
158 	int i;
159 
160 	for (i = 0; i < MCU_MAX_RANK; i++) {
161 		writel(MCU_ESRR_MULTUCERR_MASK | MCU_ESRR_BACKUCERR_MASK |
162 		       MCU_ESRR_DEMANDUCERR_MASK | MCU_ESRR_CERR_MASK,
163 		       ctx->mcu_csr + MCUESRRA0 + i * MCU_RANK_STRIDE);
164 	}
165 	return count;
166 }
167 
168 static const struct file_operations xgene_edac_mc_debug_inject_fops = {
169 	.open = simple_open,
170 	.write = xgene_edac_mc_err_inject_write,
171 	.llseek = generic_file_llseek,
172 };
173 
174 static void xgene_edac_mc_create_debugfs_node(struct mem_ctl_info *mci)
175 {
176 	if (!IS_ENABLED(CONFIG_EDAC_DEBUG))
177 		return;
178 
179 	if (!mci->debugfs)
180 		return;
181 
182 	edac_debugfs_create_file("inject_ctrl", S_IWUSR, mci->debugfs, mci,
183 				 &xgene_edac_mc_debug_inject_fops);
184 }
185 
186 static void xgene_edac_mc_check(struct mem_ctl_info *mci)
187 {
188 	struct xgene_edac_mc_ctx *ctx = mci->pvt_info;
189 	unsigned int pcp_hp_stat;
190 	unsigned int pcp_lp_stat;
191 	u32 reg;
192 	u32 rank;
193 	u32 bank;
194 	u32 count;
195 	u32 col_row;
196 
197 	xgene_edac_pcp_rd(ctx->edac, PCPHPERRINTSTS, &pcp_hp_stat);
198 	xgene_edac_pcp_rd(ctx->edac, PCPLPERRINTSTS, &pcp_lp_stat);
199 	if (!((MCU_UNCORR_ERR_MASK & pcp_hp_stat) ||
200 	      (MCU_CTL_ERR_MASK & pcp_hp_stat) ||
201 	      (MCU_CORR_ERR_MASK & pcp_lp_stat)))
202 		return;
203 
204 	for (rank = 0; rank < MCU_MAX_RANK; rank++) {
205 		reg = readl(ctx->mcu_csr + MCUESRR0 + rank * MCU_RANK_STRIDE);
206 
207 		/* Detect uncorrectable memory error */
208 		if (reg & (MCU_ESRR_DEMANDUCERR_MASK |
209 			   MCU_ESRR_BACKUCERR_MASK)) {
210 			/* Detected uncorrectable memory error */
211 			edac_mc_chipset_printk(mci, KERN_ERR, "X-Gene",
212 				"MCU uncorrectable error at rank %d\n", rank);
213 
214 			edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci,
215 				1, 0, 0, 0, 0, 0, -1, mci->ctl_name, "");
216 		}
217 
218 		/* Detect correctable memory error */
219 		if (reg & MCU_ESRR_CERR_MASK) {
220 			bank = readl(ctx->mcu_csr + MCUEBLRR0 +
221 				     rank * MCU_RANK_STRIDE);
222 			col_row = readl(ctx->mcu_csr + MCUERCRR0 +
223 					rank * MCU_RANK_STRIDE);
224 			count = readl(ctx->mcu_csr + MCUSBECNT0 +
225 				      rank * MCU_RANK_STRIDE);
226 			edac_mc_chipset_printk(mci, KERN_WARNING, "X-Gene",
227 				"MCU correctable error at rank %d bank %d column %d row %d count %d\n",
228 				rank, MCU_EBLRR_ERRBANK_RD(bank),
229 				MCU_ERCRR_ERRCOL_RD(col_row),
230 				MCU_ERCRR_ERRROW_RD(col_row),
231 				MCU_SBECNT_COUNT(count));
232 
233 			edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci,
234 				1, 0, 0, 0, 0, 0, -1, mci->ctl_name, "");
235 		}
236 
237 		/* Clear all error registers */
238 		writel(0x0, ctx->mcu_csr + MCUEBLRR0 + rank * MCU_RANK_STRIDE);
239 		writel(0x0, ctx->mcu_csr + MCUERCRR0 + rank * MCU_RANK_STRIDE);
240 		writel(0x0, ctx->mcu_csr + MCUSBECNT0 +
241 		       rank * MCU_RANK_STRIDE);
242 		writel(reg, ctx->mcu_csr + MCUESRR0 + rank * MCU_RANK_STRIDE);
243 	}
244 
245 	/* Detect memory controller error */
246 	reg = readl(ctx->mcu_csr + MCUGESR);
247 	if (reg) {
248 		if (reg & MCU_GESR_ADDRNOMATCH_ERR_MASK)
249 			edac_mc_chipset_printk(mci, KERN_WARNING, "X-Gene",
250 				"MCU address miss-match error\n");
251 		if (reg & MCU_GESR_ADDRMULTIMATCH_ERR_MASK)
252 			edac_mc_chipset_printk(mci, KERN_WARNING, "X-Gene",
253 				"MCU address multi-match error\n");
254 
255 		writel(reg, ctx->mcu_csr + MCUGESR);
256 	}
257 }
258 
259 static void xgene_edac_mc_irq_ctl(struct mem_ctl_info *mci, bool enable)
260 {
261 	struct xgene_edac_mc_ctx *ctx = mci->pvt_info;
262 	unsigned int val;
263 
264 	if (edac_op_state != EDAC_OPSTATE_INT)
265 		return;
266 
267 	mutex_lock(&ctx->edac->mc_lock);
268 
269 	/*
270 	 * As there is only single bit for enable error and interrupt mask,
271 	 * we must only enable top level interrupt after all MCUs are
272 	 * registered. Otherwise, if there is an error and the corresponding
273 	 * MCU has not registered, the interrupt will never get cleared. To
274 	 * determine all MCU have registered, we will keep track of active
275 	 * MCUs and registered MCUs.
276 	 */
277 	if (enable) {
278 		/* Set registered MCU bit */
279 		ctx->edac->mc_registered_mask |= 1 << ctx->mcu_id;
280 
281 		/* Enable interrupt after all active MCU registered */
282 		if (ctx->edac->mc_registered_mask ==
283 		    ctx->edac->mc_active_mask) {
284 			/* Enable memory controller top level interrupt */
285 			xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK,
286 					       MCU_UNCORR_ERR_MASK |
287 					       MCU_CTL_ERR_MASK);
288 			xgene_edac_pcp_clrbits(ctx->edac, PCPLPERRINTMSK,
289 					       MCU_CORR_ERR_MASK);
290 		}
291 
292 		/* Enable MCU interrupt and error reporting */
293 		val = readl(ctx->mcu_csr + MCUGECR);
294 		val |= MCU_GECR_DEMANDUCINTREN_MASK |
295 		       MCU_GECR_BACKUCINTREN_MASK |
296 		       MCU_GECR_CINTREN_MASK |
297 		       MUC_GECR_MCUADDRERREN_MASK;
298 		writel(val, ctx->mcu_csr + MCUGECR);
299 	} else {
300 		/* Disable MCU interrupt */
301 		val = readl(ctx->mcu_csr + MCUGECR);
302 		val &= ~(MCU_GECR_DEMANDUCINTREN_MASK |
303 			 MCU_GECR_BACKUCINTREN_MASK |
304 			 MCU_GECR_CINTREN_MASK |
305 			 MUC_GECR_MCUADDRERREN_MASK);
306 		writel(val, ctx->mcu_csr + MCUGECR);
307 
308 		/* Disable memory controller top level interrupt */
309 		xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK,
310 				       MCU_UNCORR_ERR_MASK | MCU_CTL_ERR_MASK);
311 		xgene_edac_pcp_setbits(ctx->edac, PCPLPERRINTMSK,
312 				       MCU_CORR_ERR_MASK);
313 
314 		/* Clear registered MCU bit */
315 		ctx->edac->mc_registered_mask &= ~(1 << ctx->mcu_id);
316 	}
317 
318 	mutex_unlock(&ctx->edac->mc_lock);
319 }
320 
321 static int xgene_edac_mc_is_active(struct xgene_edac_mc_ctx *ctx, int mc_idx)
322 {
323 	unsigned int reg;
324 	u32 mcu_mask;
325 
326 	if (regmap_read(ctx->edac->csw_map, CSW_CSWCR, &reg))
327 		return 0;
328 
329 	if (reg & CSW_CSWCR_DUALMCB_MASK) {
330 		/*
331 		 * Dual MCB active - Determine if all 4 active or just MCU0
332 		 * and MCU2 active
333 		 */
334 		if (regmap_read(ctx->edac->mcbb_map, MCBADDRMR, &reg))
335 			return 0;
336 		mcu_mask = (reg & MCBADDRMR_DUALMCU_MODE_MASK) ? 0xF : 0x5;
337 	} else {
338 		/*
339 		 * Single MCB active - Determine if MCU0/MCU1 or just MCU0
340 		 * active
341 		 */
342 		if (regmap_read(ctx->edac->mcba_map, MCBADDRMR, &reg))
343 			return 0;
344 		mcu_mask = (reg & MCBADDRMR_DUALMCU_MODE_MASK) ? 0x3 : 0x1;
345 	}
346 
347 	/* Save active MC mask if hasn't set already */
348 	if (!ctx->edac->mc_active_mask)
349 		ctx->edac->mc_active_mask = mcu_mask;
350 
351 	return (mcu_mask & (1 << mc_idx)) ? 1 : 0;
352 }
353 
354 static int xgene_edac_mc_add(struct xgene_edac *edac, struct device_node *np)
355 {
356 	struct mem_ctl_info *mci;
357 	struct edac_mc_layer layers[2];
358 	struct xgene_edac_mc_ctx tmp_ctx;
359 	struct xgene_edac_mc_ctx *ctx;
360 	struct resource res;
361 	int rc;
362 
363 	memset(&tmp_ctx, 0, sizeof(tmp_ctx));
364 	tmp_ctx.edac = edac;
365 
366 	if (!devres_open_group(edac->dev, xgene_edac_mc_add, GFP_KERNEL))
367 		return -ENOMEM;
368 
369 	rc = of_address_to_resource(np, 0, &res);
370 	if (rc < 0) {
371 		dev_err(edac->dev, "no MCU resource address\n");
372 		goto err_group;
373 	}
374 	tmp_ctx.mcu_csr = devm_ioremap_resource(edac->dev, &res);
375 	if (IS_ERR(tmp_ctx.mcu_csr)) {
376 		dev_err(edac->dev, "unable to map MCU resource\n");
377 		rc = PTR_ERR(tmp_ctx.mcu_csr);
378 		goto err_group;
379 	}
380 
381 	/* Ignore non-active MCU */
382 	if (of_property_read_u32(np, "memory-controller", &tmp_ctx.mcu_id)) {
383 		dev_err(edac->dev, "no memory-controller property\n");
384 		rc = -ENODEV;
385 		goto err_group;
386 	}
387 	if (!xgene_edac_mc_is_active(&tmp_ctx, tmp_ctx.mcu_id)) {
388 		rc = -ENODEV;
389 		goto err_group;
390 	}
391 
392 	layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
393 	layers[0].size = 4;
394 	layers[0].is_virt_csrow = true;
395 	layers[1].type = EDAC_MC_LAYER_CHANNEL;
396 	layers[1].size = 2;
397 	layers[1].is_virt_csrow = false;
398 	mci = edac_mc_alloc(tmp_ctx.mcu_id, ARRAY_SIZE(layers), layers,
399 			    sizeof(*ctx));
400 	if (!mci) {
401 		rc = -ENOMEM;
402 		goto err_group;
403 	}
404 
405 	ctx = mci->pvt_info;
406 	*ctx = tmp_ctx;		/* Copy over resource value */
407 	ctx->name = "xgene_edac_mc_err";
408 	ctx->mci = mci;
409 	mci->pdev = &mci->dev;
410 	mci->ctl_name = ctx->name;
411 	mci->dev_name = ctx->name;
412 
413 	mci->mtype_cap = MEM_FLAG_RDDR | MEM_FLAG_RDDR2 | MEM_FLAG_RDDR3 |
414 			 MEM_FLAG_DDR | MEM_FLAG_DDR2 | MEM_FLAG_DDR3;
415 	mci->edac_ctl_cap = EDAC_FLAG_SECDED;
416 	mci->edac_cap = EDAC_FLAG_SECDED;
417 	mci->mod_name = EDAC_MOD_STR;
418 	mci->mod_ver = "0.1";
419 	mci->ctl_page_to_phys = NULL;
420 	mci->scrub_cap = SCRUB_FLAG_HW_SRC;
421 	mci->scrub_mode = SCRUB_HW_SRC;
422 
423 	if (edac_op_state == EDAC_OPSTATE_POLL)
424 		mci->edac_check = xgene_edac_mc_check;
425 
426 	if (edac_mc_add_mc(mci)) {
427 		dev_err(edac->dev, "edac_mc_add_mc failed\n");
428 		rc = -EINVAL;
429 		goto err_free;
430 	}
431 
432 	xgene_edac_mc_create_debugfs_node(mci);
433 
434 	list_add(&ctx->next, &edac->mcus);
435 
436 	xgene_edac_mc_irq_ctl(mci, true);
437 
438 	devres_remove_group(edac->dev, xgene_edac_mc_add);
439 
440 	dev_info(edac->dev, "X-Gene EDAC MC registered\n");
441 	return 0;
442 
443 err_free:
444 	edac_mc_free(mci);
445 err_group:
446 	devres_release_group(edac->dev, xgene_edac_mc_add);
447 	return rc;
448 }
449 
450 static int xgene_edac_mc_remove(struct xgene_edac_mc_ctx *mcu)
451 {
452 	xgene_edac_mc_irq_ctl(mcu->mci, false);
453 	edac_mc_del_mc(&mcu->mci->dev);
454 	edac_mc_free(mcu->mci);
455 	return 0;
456 }
457 
458 /* CPU L1/L2 error CSR */
459 #define MAX_CPU_PER_PMD				2
460 #define CPU_CSR_STRIDE				0x00100000
461 #define CPU_L2C_PAGE				0x000D0000
462 #define CPU_MEMERR_L2C_PAGE			0x000E0000
463 #define CPU_MEMERR_CPU_PAGE			0x000F0000
464 
465 #define MEMERR_CPU_ICFECR_PAGE_OFFSET		0x0000
466 #define MEMERR_CPU_ICFESR_PAGE_OFFSET		0x0004
467 #define  MEMERR_CPU_ICFESR_ERRWAY_RD(src)	(((src) & 0xFF000000) >> 24)
468 #define  MEMERR_CPU_ICFESR_ERRINDEX_RD(src)	(((src) & 0x003F0000) >> 16)
469 #define  MEMERR_CPU_ICFESR_ERRINFO_RD(src)	(((src) & 0x0000FF00) >> 8)
470 #define  MEMERR_CPU_ICFESR_ERRTYPE_RD(src)	(((src) & 0x00000070) >> 4)
471 #define  MEMERR_CPU_ICFESR_MULTCERR_MASK	BIT(2)
472 #define  MEMERR_CPU_ICFESR_CERR_MASK		BIT(0)
473 #define MEMERR_CPU_LSUESR_PAGE_OFFSET		0x000c
474 #define  MEMERR_CPU_LSUESR_ERRWAY_RD(src)	(((src) & 0xFF000000) >> 24)
475 #define  MEMERR_CPU_LSUESR_ERRINDEX_RD(src)	(((src) & 0x003F0000) >> 16)
476 #define  MEMERR_CPU_LSUESR_ERRINFO_RD(src)	(((src) & 0x0000FF00) >> 8)
477 #define  MEMERR_CPU_LSUESR_ERRTYPE_RD(src)	(((src) & 0x00000070) >> 4)
478 #define  MEMERR_CPU_LSUESR_MULTCERR_MASK	BIT(2)
479 #define  MEMERR_CPU_LSUESR_CERR_MASK		BIT(0)
480 #define MEMERR_CPU_LSUECR_PAGE_OFFSET		0x0008
481 #define MEMERR_CPU_MMUECR_PAGE_OFFSET		0x0010
482 #define MEMERR_CPU_MMUESR_PAGE_OFFSET		0x0014
483 #define  MEMERR_CPU_MMUESR_ERRWAY_RD(src)	(((src) & 0xFF000000) >> 24)
484 #define  MEMERR_CPU_MMUESR_ERRINDEX_RD(src)	(((src) & 0x007F0000) >> 16)
485 #define  MEMERR_CPU_MMUESR_ERRINFO_RD(src)	(((src) & 0x0000FF00) >> 8)
486 #define  MEMERR_CPU_MMUESR_ERRREQSTR_LSU_MASK	BIT(7)
487 #define  MEMERR_CPU_MMUESR_ERRTYPE_RD(src)	(((src) & 0x00000070) >> 4)
488 #define  MEMERR_CPU_MMUESR_MULTCERR_MASK	BIT(2)
489 #define  MEMERR_CPU_MMUESR_CERR_MASK		BIT(0)
490 #define MEMERR_CPU_ICFESRA_PAGE_OFFSET		0x0804
491 #define MEMERR_CPU_LSUESRA_PAGE_OFFSET		0x080c
492 #define MEMERR_CPU_MMUESRA_PAGE_OFFSET		0x0814
493 
494 #define MEMERR_L2C_L2ECR_PAGE_OFFSET		0x0000
495 #define MEMERR_L2C_L2ESR_PAGE_OFFSET		0x0004
496 #define  MEMERR_L2C_L2ESR_ERRSYN_RD(src)	(((src) & 0xFF000000) >> 24)
497 #define  MEMERR_L2C_L2ESR_ERRWAY_RD(src)	(((src) & 0x00FC0000) >> 18)
498 #define  MEMERR_L2C_L2ESR_ERRCPU_RD(src)	(((src) & 0x00020000) >> 17)
499 #define  MEMERR_L2C_L2ESR_ERRGROUP_RD(src)	(((src) & 0x0000E000) >> 13)
500 #define  MEMERR_L2C_L2ESR_ERRACTION_RD(src)	(((src) & 0x00001C00) >> 10)
501 #define  MEMERR_L2C_L2ESR_ERRTYPE_RD(src)	(((src) & 0x00000300) >> 8)
502 #define  MEMERR_L2C_L2ESR_MULTUCERR_MASK	BIT(3)
503 #define  MEMERR_L2C_L2ESR_MULTICERR_MASK	BIT(2)
504 #define  MEMERR_L2C_L2ESR_UCERR_MASK		BIT(1)
505 #define  MEMERR_L2C_L2ESR_ERR_MASK		BIT(0)
506 #define MEMERR_L2C_L2EALR_PAGE_OFFSET		0x0008
507 #define CPUX_L2C_L2RTOCR_PAGE_OFFSET		0x0010
508 #define MEMERR_L2C_L2EAHR_PAGE_OFFSET		0x000c
509 #define CPUX_L2C_L2RTOSR_PAGE_OFFSET		0x0014
510 #define  MEMERR_L2C_L2RTOSR_MULTERR_MASK	BIT(1)
511 #define  MEMERR_L2C_L2RTOSR_ERR_MASK		BIT(0)
512 #define CPUX_L2C_L2RTOALR_PAGE_OFFSET		0x0018
513 #define CPUX_L2C_L2RTOAHR_PAGE_OFFSET		0x001c
514 #define MEMERR_L2C_L2ESRA_PAGE_OFFSET		0x0804
515 
516 /*
517  * Processor Module Domain (PMD) context - Context for a pair of processsors.
518  * Each PMD consists of 2 CPUs and a shared L2 cache. Each CPU consists of
519  * its own L1 cache.
520  */
521 struct xgene_edac_pmd_ctx {
522 	struct list_head	next;
523 	struct device		ddev;
524 	char			*name;
525 	struct xgene_edac	*edac;
526 	struct edac_device_ctl_info *edac_dev;
527 	void __iomem		*pmd_csr;
528 	u32			pmd;
529 	int			version;
530 };
531 
532 static void xgene_edac_pmd_l1_check(struct edac_device_ctl_info *edac_dev,
533 				    int cpu_idx)
534 {
535 	struct xgene_edac_pmd_ctx *ctx = edac_dev->pvt_info;
536 	void __iomem *pg_f;
537 	u32 val;
538 
539 	pg_f = ctx->pmd_csr + cpu_idx * CPU_CSR_STRIDE + CPU_MEMERR_CPU_PAGE;
540 
541 	val = readl(pg_f + MEMERR_CPU_ICFESR_PAGE_OFFSET);
542 	if (!val)
543 		goto chk_lsu;
544 	dev_err(edac_dev->dev,
545 		"CPU%d L1 memory error ICF 0x%08X Way 0x%02X Index 0x%02X Info 0x%02X\n",
546 		ctx->pmd * MAX_CPU_PER_PMD + cpu_idx, val,
547 		MEMERR_CPU_ICFESR_ERRWAY_RD(val),
548 		MEMERR_CPU_ICFESR_ERRINDEX_RD(val),
549 		MEMERR_CPU_ICFESR_ERRINFO_RD(val));
550 	if (val & MEMERR_CPU_ICFESR_CERR_MASK)
551 		dev_err(edac_dev->dev, "One or more correctable error\n");
552 	if (val & MEMERR_CPU_ICFESR_MULTCERR_MASK)
553 		dev_err(edac_dev->dev, "Multiple correctable error\n");
554 	switch (MEMERR_CPU_ICFESR_ERRTYPE_RD(val)) {
555 	case 1:
556 		dev_err(edac_dev->dev, "L1 TLB multiple hit\n");
557 		break;
558 	case 2:
559 		dev_err(edac_dev->dev, "Way select multiple hit\n");
560 		break;
561 	case 3:
562 		dev_err(edac_dev->dev, "Physical tag parity error\n");
563 		break;
564 	case 4:
565 	case 5:
566 		dev_err(edac_dev->dev, "L1 data parity error\n");
567 		break;
568 	case 6:
569 		dev_err(edac_dev->dev, "L1 pre-decode parity error\n");
570 		break;
571 	}
572 
573 	/* Clear any HW errors */
574 	writel(val, pg_f + MEMERR_CPU_ICFESR_PAGE_OFFSET);
575 
576 	if (val & (MEMERR_CPU_ICFESR_CERR_MASK |
577 		   MEMERR_CPU_ICFESR_MULTCERR_MASK))
578 		edac_device_handle_ce(edac_dev, 0, 0, edac_dev->ctl_name);
579 
580 chk_lsu:
581 	val = readl(pg_f + MEMERR_CPU_LSUESR_PAGE_OFFSET);
582 	if (!val)
583 		goto chk_mmu;
584 	dev_err(edac_dev->dev,
585 		"CPU%d memory error LSU 0x%08X Way 0x%02X Index 0x%02X Info 0x%02X\n",
586 		ctx->pmd * MAX_CPU_PER_PMD + cpu_idx, val,
587 		MEMERR_CPU_LSUESR_ERRWAY_RD(val),
588 		MEMERR_CPU_LSUESR_ERRINDEX_RD(val),
589 		MEMERR_CPU_LSUESR_ERRINFO_RD(val));
590 	if (val & MEMERR_CPU_LSUESR_CERR_MASK)
591 		dev_err(edac_dev->dev, "One or more correctable error\n");
592 	if (val & MEMERR_CPU_LSUESR_MULTCERR_MASK)
593 		dev_err(edac_dev->dev, "Multiple correctable error\n");
594 	switch (MEMERR_CPU_LSUESR_ERRTYPE_RD(val)) {
595 	case 0:
596 		dev_err(edac_dev->dev, "Load tag error\n");
597 		break;
598 	case 1:
599 		dev_err(edac_dev->dev, "Load data error\n");
600 		break;
601 	case 2:
602 		dev_err(edac_dev->dev, "WSL multihit error\n");
603 		break;
604 	case 3:
605 		dev_err(edac_dev->dev, "Store tag error\n");
606 		break;
607 	case 4:
608 		dev_err(edac_dev->dev,
609 			"DTB multihit from load pipeline error\n");
610 		break;
611 	case 5:
612 		dev_err(edac_dev->dev,
613 			"DTB multihit from store pipeline error\n");
614 		break;
615 	}
616 
617 	/* Clear any HW errors */
618 	writel(val, pg_f + MEMERR_CPU_LSUESR_PAGE_OFFSET);
619 
620 	if (val & (MEMERR_CPU_LSUESR_CERR_MASK |
621 		   MEMERR_CPU_LSUESR_MULTCERR_MASK))
622 		edac_device_handle_ce(edac_dev, 0, 0, edac_dev->ctl_name);
623 
624 chk_mmu:
625 	val = readl(pg_f + MEMERR_CPU_MMUESR_PAGE_OFFSET);
626 	if (!val)
627 		return;
628 	dev_err(edac_dev->dev,
629 		"CPU%d memory error MMU 0x%08X Way 0x%02X Index 0x%02X Info 0x%02X %s\n",
630 		ctx->pmd * MAX_CPU_PER_PMD + cpu_idx, val,
631 		MEMERR_CPU_MMUESR_ERRWAY_RD(val),
632 		MEMERR_CPU_MMUESR_ERRINDEX_RD(val),
633 		MEMERR_CPU_MMUESR_ERRINFO_RD(val),
634 		val & MEMERR_CPU_MMUESR_ERRREQSTR_LSU_MASK ? "LSU" : "ICF");
635 	if (val & MEMERR_CPU_MMUESR_CERR_MASK)
636 		dev_err(edac_dev->dev, "One or more correctable error\n");
637 	if (val & MEMERR_CPU_MMUESR_MULTCERR_MASK)
638 		dev_err(edac_dev->dev, "Multiple correctable error\n");
639 	switch (MEMERR_CPU_MMUESR_ERRTYPE_RD(val)) {
640 	case 0:
641 		dev_err(edac_dev->dev, "Stage 1 UTB hit error\n");
642 		break;
643 	case 1:
644 		dev_err(edac_dev->dev, "Stage 1 UTB miss error\n");
645 		break;
646 	case 2:
647 		dev_err(edac_dev->dev, "Stage 1 UTB allocate error\n");
648 		break;
649 	case 3:
650 		dev_err(edac_dev->dev, "TMO operation single bank error\n");
651 		break;
652 	case 4:
653 		dev_err(edac_dev->dev, "Stage 2 UTB error\n");
654 		break;
655 	case 5:
656 		dev_err(edac_dev->dev, "Stage 2 UTB miss error\n");
657 		break;
658 	case 6:
659 		dev_err(edac_dev->dev, "Stage 2 UTB allocate error\n");
660 		break;
661 	case 7:
662 		dev_err(edac_dev->dev, "TMO operation multiple bank error\n");
663 		break;
664 	}
665 
666 	/* Clear any HW errors */
667 	writel(val, pg_f + MEMERR_CPU_MMUESR_PAGE_OFFSET);
668 
669 	edac_device_handle_ce(edac_dev, 0, 0, edac_dev->ctl_name);
670 }
671 
672 static void xgene_edac_pmd_l2_check(struct edac_device_ctl_info *edac_dev)
673 {
674 	struct xgene_edac_pmd_ctx *ctx = edac_dev->pvt_info;
675 	void __iomem *pg_d;
676 	void __iomem *pg_e;
677 	u32 val_hi;
678 	u32 val_lo;
679 	u32 val;
680 
681 	/* Check L2 */
682 	pg_e = ctx->pmd_csr + CPU_MEMERR_L2C_PAGE;
683 	val = readl(pg_e + MEMERR_L2C_L2ESR_PAGE_OFFSET);
684 	if (!val)
685 		goto chk_l2c;
686 	val_lo = readl(pg_e + MEMERR_L2C_L2EALR_PAGE_OFFSET);
687 	val_hi = readl(pg_e + MEMERR_L2C_L2EAHR_PAGE_OFFSET);
688 	dev_err(edac_dev->dev,
689 		"PMD%d memory error L2C L2ESR 0x%08X @ 0x%08X.%08X\n",
690 		ctx->pmd, val, val_hi, val_lo);
691 	dev_err(edac_dev->dev,
692 		"ErrSyndrome 0x%02X ErrWay 0x%02X ErrCpu %d ErrGroup 0x%02X ErrAction 0x%02X\n",
693 		MEMERR_L2C_L2ESR_ERRSYN_RD(val),
694 		MEMERR_L2C_L2ESR_ERRWAY_RD(val),
695 		MEMERR_L2C_L2ESR_ERRCPU_RD(val),
696 		MEMERR_L2C_L2ESR_ERRGROUP_RD(val),
697 		MEMERR_L2C_L2ESR_ERRACTION_RD(val));
698 
699 	if (val & MEMERR_L2C_L2ESR_ERR_MASK)
700 		dev_err(edac_dev->dev, "One or more correctable error\n");
701 	if (val & MEMERR_L2C_L2ESR_MULTICERR_MASK)
702 		dev_err(edac_dev->dev, "Multiple correctable error\n");
703 	if (val & MEMERR_L2C_L2ESR_UCERR_MASK)
704 		dev_err(edac_dev->dev, "One or more uncorrectable error\n");
705 	if (val & MEMERR_L2C_L2ESR_MULTUCERR_MASK)
706 		dev_err(edac_dev->dev, "Multiple uncorrectable error\n");
707 
708 	switch (MEMERR_L2C_L2ESR_ERRTYPE_RD(val)) {
709 	case 0:
710 		dev_err(edac_dev->dev, "Outbound SDB parity error\n");
711 		break;
712 	case 1:
713 		dev_err(edac_dev->dev, "Inbound SDB parity error\n");
714 		break;
715 	case 2:
716 		dev_err(edac_dev->dev, "Tag ECC error\n");
717 		break;
718 	case 3:
719 		dev_err(edac_dev->dev, "Data ECC error\n");
720 		break;
721 	}
722 
723 	/* Clear any HW errors */
724 	writel(val, pg_e + MEMERR_L2C_L2ESR_PAGE_OFFSET);
725 
726 	if (val & (MEMERR_L2C_L2ESR_ERR_MASK |
727 		   MEMERR_L2C_L2ESR_MULTICERR_MASK))
728 		edac_device_handle_ce(edac_dev, 0, 0, edac_dev->ctl_name);
729 	if (val & (MEMERR_L2C_L2ESR_UCERR_MASK |
730 		   MEMERR_L2C_L2ESR_MULTUCERR_MASK))
731 		edac_device_handle_ue(edac_dev, 0, 0, edac_dev->ctl_name);
732 
733 chk_l2c:
734 	/* Check if any memory request timed out on L2 cache */
735 	pg_d = ctx->pmd_csr + CPU_L2C_PAGE;
736 	val = readl(pg_d + CPUX_L2C_L2RTOSR_PAGE_OFFSET);
737 	if (val) {
738 		val_lo = readl(pg_d + CPUX_L2C_L2RTOALR_PAGE_OFFSET);
739 		val_hi = readl(pg_d + CPUX_L2C_L2RTOAHR_PAGE_OFFSET);
740 		dev_err(edac_dev->dev,
741 			"PMD%d L2C error L2C RTOSR 0x%08X @ 0x%08X.%08X\n",
742 			ctx->pmd, val, val_hi, val_lo);
743 		writel(val, pg_d + CPUX_L2C_L2RTOSR_PAGE_OFFSET);
744 	}
745 }
746 
747 static void xgene_edac_pmd_check(struct edac_device_ctl_info *edac_dev)
748 {
749 	struct xgene_edac_pmd_ctx *ctx = edac_dev->pvt_info;
750 	unsigned int pcp_hp_stat;
751 	int i;
752 
753 	xgene_edac_pcp_rd(ctx->edac, PCPHPERRINTSTS, &pcp_hp_stat);
754 	if (!((PMD0_MERR_MASK << ctx->pmd) & pcp_hp_stat))
755 		return;
756 
757 	/* Check CPU L1 error */
758 	for (i = 0; i < MAX_CPU_PER_PMD; i++)
759 		xgene_edac_pmd_l1_check(edac_dev, i);
760 
761 	/* Check CPU L2 error */
762 	xgene_edac_pmd_l2_check(edac_dev);
763 }
764 
765 static void xgene_edac_pmd_cpu_hw_cfg(struct edac_device_ctl_info *edac_dev,
766 				      int cpu)
767 {
768 	struct xgene_edac_pmd_ctx *ctx = edac_dev->pvt_info;
769 	void __iomem *pg_f = ctx->pmd_csr + cpu * CPU_CSR_STRIDE +
770 			     CPU_MEMERR_CPU_PAGE;
771 
772 	/*
773 	 * Enable CPU memory error:
774 	 *  MEMERR_CPU_ICFESRA, MEMERR_CPU_LSUESRA, and MEMERR_CPU_MMUESRA
775 	 */
776 	writel(0x00000301, pg_f + MEMERR_CPU_ICFECR_PAGE_OFFSET);
777 	writel(0x00000301, pg_f + MEMERR_CPU_LSUECR_PAGE_OFFSET);
778 	writel(0x00000101, pg_f + MEMERR_CPU_MMUECR_PAGE_OFFSET);
779 }
780 
781 static void xgene_edac_pmd_hw_cfg(struct edac_device_ctl_info *edac_dev)
782 {
783 	struct xgene_edac_pmd_ctx *ctx = edac_dev->pvt_info;
784 	void __iomem *pg_d = ctx->pmd_csr + CPU_L2C_PAGE;
785 	void __iomem *pg_e = ctx->pmd_csr + CPU_MEMERR_L2C_PAGE;
786 
787 	/* Enable PMD memory error - MEMERR_L2C_L2ECR and L2C_L2RTOCR */
788 	writel(0x00000703, pg_e + MEMERR_L2C_L2ECR_PAGE_OFFSET);
789 	/* Configure L2C HW request time out feature if supported */
790 	if (ctx->version > 1)
791 		writel(0x00000119, pg_d + CPUX_L2C_L2RTOCR_PAGE_OFFSET);
792 }
793 
794 static void xgene_edac_pmd_hw_ctl(struct edac_device_ctl_info *edac_dev,
795 				  bool enable)
796 {
797 	struct xgene_edac_pmd_ctx *ctx = edac_dev->pvt_info;
798 	int i;
799 
800 	/* Enable PMD error interrupt */
801 	if (edac_dev->op_state == OP_RUNNING_INTERRUPT) {
802 		if (enable)
803 			xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK,
804 					       PMD0_MERR_MASK << ctx->pmd);
805 		else
806 			xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK,
807 					       PMD0_MERR_MASK << ctx->pmd);
808 	}
809 
810 	if (enable) {
811 		xgene_edac_pmd_hw_cfg(edac_dev);
812 
813 		/* Two CPUs per a PMD */
814 		for (i = 0; i < MAX_CPU_PER_PMD; i++)
815 			xgene_edac_pmd_cpu_hw_cfg(edac_dev, i);
816 	}
817 }
818 
819 static ssize_t xgene_edac_pmd_l1_inject_ctrl_write(struct file *file,
820 						   const char __user *data,
821 						   size_t count, loff_t *ppos)
822 {
823 	struct edac_device_ctl_info *edac_dev = file->private_data;
824 	struct xgene_edac_pmd_ctx *ctx = edac_dev->pvt_info;
825 	void __iomem *cpux_pg_f;
826 	int i;
827 
828 	for (i = 0; i < MAX_CPU_PER_PMD; i++) {
829 		cpux_pg_f = ctx->pmd_csr + i * CPU_CSR_STRIDE +
830 			    CPU_MEMERR_CPU_PAGE;
831 
832 		writel(MEMERR_CPU_ICFESR_MULTCERR_MASK |
833 		       MEMERR_CPU_ICFESR_CERR_MASK,
834 		       cpux_pg_f + MEMERR_CPU_ICFESRA_PAGE_OFFSET);
835 		writel(MEMERR_CPU_LSUESR_MULTCERR_MASK |
836 		       MEMERR_CPU_LSUESR_CERR_MASK,
837 		       cpux_pg_f + MEMERR_CPU_LSUESRA_PAGE_OFFSET);
838 		writel(MEMERR_CPU_MMUESR_MULTCERR_MASK |
839 		       MEMERR_CPU_MMUESR_CERR_MASK,
840 		       cpux_pg_f + MEMERR_CPU_MMUESRA_PAGE_OFFSET);
841 	}
842 	return count;
843 }
844 
845 static ssize_t xgene_edac_pmd_l2_inject_ctrl_write(struct file *file,
846 						   const char __user *data,
847 						   size_t count, loff_t *ppos)
848 {
849 	struct edac_device_ctl_info *edac_dev = file->private_data;
850 	struct xgene_edac_pmd_ctx *ctx = edac_dev->pvt_info;
851 	void __iomem *pg_e = ctx->pmd_csr + CPU_MEMERR_L2C_PAGE;
852 
853 	writel(MEMERR_L2C_L2ESR_MULTUCERR_MASK |
854 	       MEMERR_L2C_L2ESR_MULTICERR_MASK |
855 	       MEMERR_L2C_L2ESR_UCERR_MASK |
856 	       MEMERR_L2C_L2ESR_ERR_MASK,
857 	       pg_e + MEMERR_L2C_L2ESRA_PAGE_OFFSET);
858 	return count;
859 }
860 
861 static const struct file_operations xgene_edac_pmd_debug_inject_fops[] = {
862 	{
863 	.open = simple_open,
864 	.write = xgene_edac_pmd_l1_inject_ctrl_write,
865 	.llseek = generic_file_llseek, },
866 	{
867 	.open = simple_open,
868 	.write = xgene_edac_pmd_l2_inject_ctrl_write,
869 	.llseek = generic_file_llseek, },
870 	{ }
871 };
872 
873 static void
874 xgene_edac_pmd_create_debugfs_nodes(struct edac_device_ctl_info *edac_dev)
875 {
876 	struct xgene_edac_pmd_ctx *ctx = edac_dev->pvt_info;
877 	struct dentry *dbgfs_dir;
878 	char name[10];
879 
880 	if (!IS_ENABLED(CONFIG_EDAC_DEBUG) || !ctx->edac->dfs)
881 		return;
882 
883 	snprintf(name, sizeof(name), "PMD%d", ctx->pmd);
884 	dbgfs_dir = edac_debugfs_create_dir_at(name, ctx->edac->dfs);
885 	if (!dbgfs_dir)
886 		return;
887 
888 	edac_debugfs_create_file("l1_inject_ctrl", S_IWUSR, dbgfs_dir, edac_dev,
889 				 &xgene_edac_pmd_debug_inject_fops[0]);
890 	edac_debugfs_create_file("l2_inject_ctrl", S_IWUSR, dbgfs_dir, edac_dev,
891 				 &xgene_edac_pmd_debug_inject_fops[1]);
892 }
893 
894 static int xgene_edac_pmd_available(u32 efuse, int pmd)
895 {
896 	return (efuse & (1 << pmd)) ? 0 : 1;
897 }
898 
899 static int xgene_edac_pmd_add(struct xgene_edac *edac, struct device_node *np,
900 			      int version)
901 {
902 	struct edac_device_ctl_info *edac_dev;
903 	struct xgene_edac_pmd_ctx *ctx;
904 	struct resource res;
905 	char edac_name[10];
906 	u32 pmd;
907 	int rc;
908 	u32 val;
909 
910 	if (!devres_open_group(edac->dev, xgene_edac_pmd_add, GFP_KERNEL))
911 		return -ENOMEM;
912 
913 	/* Determine if this PMD is disabled */
914 	if (of_property_read_u32(np, "pmd-controller", &pmd)) {
915 		dev_err(edac->dev, "no pmd-controller property\n");
916 		rc = -ENODEV;
917 		goto err_group;
918 	}
919 	rc = regmap_read(edac->efuse_map, 0, &val);
920 	if (rc)
921 		goto err_group;
922 	if (!xgene_edac_pmd_available(val, pmd)) {
923 		rc = -ENODEV;
924 		goto err_group;
925 	}
926 
927 	snprintf(edac_name, sizeof(edac_name), "l2c%d", pmd);
928 	edac_dev = edac_device_alloc_ctl_info(sizeof(*ctx),
929 					      edac_name, 1, "l2c", 1, 2, NULL,
930 					      0, edac_device_alloc_index());
931 	if (!edac_dev) {
932 		rc = -ENOMEM;
933 		goto err_group;
934 	}
935 
936 	ctx = edac_dev->pvt_info;
937 	ctx->name = "xgene_pmd_err";
938 	ctx->pmd = pmd;
939 	ctx->edac = edac;
940 	ctx->edac_dev = edac_dev;
941 	ctx->ddev = *edac->dev;
942 	ctx->version = version;
943 	edac_dev->dev = &ctx->ddev;
944 	edac_dev->ctl_name = ctx->name;
945 	edac_dev->dev_name = ctx->name;
946 	edac_dev->mod_name = EDAC_MOD_STR;
947 
948 	rc = of_address_to_resource(np, 0, &res);
949 	if (rc < 0) {
950 		dev_err(edac->dev, "no PMD resource address\n");
951 		goto err_free;
952 	}
953 	ctx->pmd_csr = devm_ioremap_resource(edac->dev, &res);
954 	if (IS_ERR(ctx->pmd_csr)) {
955 		dev_err(edac->dev,
956 			"devm_ioremap_resource failed for PMD resource address\n");
957 		rc = PTR_ERR(ctx->pmd_csr);
958 		goto err_free;
959 	}
960 
961 	if (edac_op_state == EDAC_OPSTATE_POLL)
962 		edac_dev->edac_check = xgene_edac_pmd_check;
963 
964 	xgene_edac_pmd_create_debugfs_nodes(edac_dev);
965 
966 	rc = edac_device_add_device(edac_dev);
967 	if (rc > 0) {
968 		dev_err(edac->dev, "edac_device_add_device failed\n");
969 		rc = -ENOMEM;
970 		goto err_free;
971 	}
972 
973 	if (edac_op_state == EDAC_OPSTATE_INT)
974 		edac_dev->op_state = OP_RUNNING_INTERRUPT;
975 
976 	list_add(&ctx->next, &edac->pmds);
977 
978 	xgene_edac_pmd_hw_ctl(edac_dev, 1);
979 
980 	devres_remove_group(edac->dev, xgene_edac_pmd_add);
981 
982 	dev_info(edac->dev, "X-Gene EDAC PMD%d registered\n", ctx->pmd);
983 	return 0;
984 
985 err_free:
986 	edac_device_free_ctl_info(edac_dev);
987 err_group:
988 	devres_release_group(edac->dev, xgene_edac_pmd_add);
989 	return rc;
990 }
991 
992 static int xgene_edac_pmd_remove(struct xgene_edac_pmd_ctx *pmd)
993 {
994 	struct edac_device_ctl_info *edac_dev = pmd->edac_dev;
995 
996 	xgene_edac_pmd_hw_ctl(edac_dev, 0);
997 	edac_device_del_device(edac_dev->dev);
998 	edac_device_free_ctl_info(edac_dev);
999 	return 0;
1000 }
1001 
1002 /* L3 Error device */
1003 #define L3C_ESR				(0x0A * 4)
1004 #define  L3C_ESR_DATATAG_MASK		BIT(9)
1005 #define  L3C_ESR_MULTIHIT_MASK		BIT(8)
1006 #define  L3C_ESR_UCEVICT_MASK		BIT(6)
1007 #define  L3C_ESR_MULTIUCERR_MASK	BIT(5)
1008 #define  L3C_ESR_MULTICERR_MASK		BIT(4)
1009 #define  L3C_ESR_UCERR_MASK		BIT(3)
1010 #define  L3C_ESR_CERR_MASK		BIT(2)
1011 #define  L3C_ESR_UCERRINTR_MASK		BIT(1)
1012 #define  L3C_ESR_CERRINTR_MASK		BIT(0)
1013 #define L3C_ECR				(0x0B * 4)
1014 #define  L3C_ECR_UCINTREN		BIT(3)
1015 #define  L3C_ECR_CINTREN		BIT(2)
1016 #define  L3C_UCERREN			BIT(1)
1017 #define  L3C_CERREN			BIT(0)
1018 #define L3C_ELR				(0x0C * 4)
1019 #define  L3C_ELR_ERRSYN(src)		((src & 0xFF800000) >> 23)
1020 #define  L3C_ELR_ERRWAY(src)		((src & 0x007E0000) >> 17)
1021 #define  L3C_ELR_AGENTID(src)		((src & 0x0001E000) >> 13)
1022 #define  L3C_ELR_ERRGRP(src)		((src & 0x00000F00) >> 8)
1023 #define  L3C_ELR_OPTYPE(src)		((src & 0x000000F0) >> 4)
1024 #define  L3C_ELR_PADDRHIGH(src)		(src & 0x0000000F)
1025 #define L3C_AELR			(0x0D * 4)
1026 #define L3C_BELR			(0x0E * 4)
1027 #define  L3C_BELR_BANK(src)		(src & 0x0000000F)
1028 
1029 struct xgene_edac_dev_ctx {
1030 	struct list_head	next;
1031 	struct device		ddev;
1032 	char			*name;
1033 	struct xgene_edac	*edac;
1034 	struct edac_device_ctl_info *edac_dev;
1035 	int			edac_idx;
1036 	void __iomem		*dev_csr;
1037 	int			version;
1038 };
1039 
1040 /*
1041  * Version 1 of the L3 controller has broken single bit correctable logic for
1042  * certain error syndromes. Log them as uncorrectable in that case.
1043  */
1044 static bool xgene_edac_l3_promote_to_uc_err(u32 l3cesr, u32 l3celr)
1045 {
1046 	if (l3cesr & L3C_ESR_DATATAG_MASK) {
1047 		switch (L3C_ELR_ERRSYN(l3celr)) {
1048 		case 0x13C:
1049 		case 0x0B4:
1050 		case 0x007:
1051 		case 0x00D:
1052 		case 0x00E:
1053 		case 0x019:
1054 		case 0x01A:
1055 		case 0x01C:
1056 		case 0x04E:
1057 		case 0x041:
1058 			return true;
1059 		}
1060 	} else if (L3C_ELR_ERRWAY(l3celr) == 9)
1061 		return true;
1062 
1063 	return false;
1064 }
1065 
1066 static void xgene_edac_l3_check(struct edac_device_ctl_info *edac_dev)
1067 {
1068 	struct xgene_edac_dev_ctx *ctx = edac_dev->pvt_info;
1069 	u32 l3cesr;
1070 	u32 l3celr;
1071 	u32 l3caelr;
1072 	u32 l3cbelr;
1073 
1074 	l3cesr = readl(ctx->dev_csr + L3C_ESR);
1075 	if (!(l3cesr & (L3C_ESR_UCERR_MASK | L3C_ESR_CERR_MASK)))
1076 		return;
1077 
1078 	if (l3cesr & L3C_ESR_UCERR_MASK)
1079 		dev_err(edac_dev->dev, "L3C uncorrectable error\n");
1080 	if (l3cesr & L3C_ESR_CERR_MASK)
1081 		dev_warn(edac_dev->dev, "L3C correctable error\n");
1082 
1083 	l3celr = readl(ctx->dev_csr + L3C_ELR);
1084 	l3caelr = readl(ctx->dev_csr + L3C_AELR);
1085 	l3cbelr = readl(ctx->dev_csr + L3C_BELR);
1086 	if (l3cesr & L3C_ESR_MULTIHIT_MASK)
1087 		dev_err(edac_dev->dev, "L3C multiple hit error\n");
1088 	if (l3cesr & L3C_ESR_UCEVICT_MASK)
1089 		dev_err(edac_dev->dev,
1090 			"L3C dropped eviction of line with error\n");
1091 	if (l3cesr & L3C_ESR_MULTIUCERR_MASK)
1092 		dev_err(edac_dev->dev, "L3C multiple uncorrectable error\n");
1093 	if (l3cesr & L3C_ESR_DATATAG_MASK)
1094 		dev_err(edac_dev->dev,
1095 			"L3C data error syndrome 0x%X group 0x%X\n",
1096 			L3C_ELR_ERRSYN(l3celr), L3C_ELR_ERRGRP(l3celr));
1097 	else
1098 		dev_err(edac_dev->dev,
1099 			"L3C tag error syndrome 0x%X Way of Tag 0x%X Agent ID 0x%X Operation type 0x%X\n",
1100 			L3C_ELR_ERRSYN(l3celr), L3C_ELR_ERRWAY(l3celr),
1101 			L3C_ELR_AGENTID(l3celr), L3C_ELR_OPTYPE(l3celr));
1102 	/*
1103 	 * NOTE: Address [41:38] in L3C_ELR_PADDRHIGH(l3celr).
1104 	 *       Address [37:6] in l3caelr. Lower 6 bits are zero.
1105 	 */
1106 	dev_err(edac_dev->dev, "L3C error address 0x%08X.%08X bank %d\n",
1107 		L3C_ELR_PADDRHIGH(l3celr) << 6 | (l3caelr >> 26),
1108 		(l3caelr & 0x3FFFFFFF) << 6, L3C_BELR_BANK(l3cbelr));
1109 	dev_err(edac_dev->dev,
1110 		"L3C error status register value 0x%X\n", l3cesr);
1111 
1112 	/* Clear L3C error interrupt */
1113 	writel(0, ctx->dev_csr + L3C_ESR);
1114 
1115 	if (ctx->version <= 1 &&
1116 	    xgene_edac_l3_promote_to_uc_err(l3cesr, l3celr)) {
1117 		edac_device_handle_ue(edac_dev, 0, 0, edac_dev->ctl_name);
1118 		return;
1119 	}
1120 	if (l3cesr & L3C_ESR_CERR_MASK)
1121 		edac_device_handle_ce(edac_dev, 0, 0, edac_dev->ctl_name);
1122 	if (l3cesr & L3C_ESR_UCERR_MASK)
1123 		edac_device_handle_ue(edac_dev, 0, 0, edac_dev->ctl_name);
1124 }
1125 
1126 static void xgene_edac_l3_hw_init(struct edac_device_ctl_info *edac_dev,
1127 				  bool enable)
1128 {
1129 	struct xgene_edac_dev_ctx *ctx = edac_dev->pvt_info;
1130 	u32 val;
1131 
1132 	val = readl(ctx->dev_csr + L3C_ECR);
1133 	val |= L3C_UCERREN | L3C_CERREN;
1134 	/* On disable, we just disable interrupt but keep error enabled */
1135 	if (edac_dev->op_state == OP_RUNNING_INTERRUPT) {
1136 		if (enable)
1137 			val |= L3C_ECR_UCINTREN | L3C_ECR_CINTREN;
1138 		else
1139 			val &= ~(L3C_ECR_UCINTREN | L3C_ECR_CINTREN);
1140 	}
1141 	writel(val, ctx->dev_csr + L3C_ECR);
1142 
1143 	if (edac_dev->op_state == OP_RUNNING_INTERRUPT) {
1144 		/* Enable/disable L3 error top level interrupt */
1145 		if (enable) {
1146 			xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK,
1147 					       L3C_UNCORR_ERR_MASK);
1148 			xgene_edac_pcp_clrbits(ctx->edac, PCPLPERRINTMSK,
1149 					       L3C_CORR_ERR_MASK);
1150 		} else {
1151 			xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK,
1152 					       L3C_UNCORR_ERR_MASK);
1153 			xgene_edac_pcp_setbits(ctx->edac, PCPLPERRINTMSK,
1154 					       L3C_CORR_ERR_MASK);
1155 		}
1156 	}
1157 }
1158 
1159 static ssize_t xgene_edac_l3_inject_ctrl_write(struct file *file,
1160 					       const char __user *data,
1161 					       size_t count, loff_t *ppos)
1162 {
1163 	struct edac_device_ctl_info *edac_dev = file->private_data;
1164 	struct xgene_edac_dev_ctx *ctx = edac_dev->pvt_info;
1165 
1166 	/* Generate all errors */
1167 	writel(0xFFFFFFFF, ctx->dev_csr + L3C_ESR);
1168 	return count;
1169 }
1170 
1171 static const struct file_operations xgene_edac_l3_debug_inject_fops = {
1172 	.open = simple_open,
1173 	.write = xgene_edac_l3_inject_ctrl_write,
1174 	.llseek = generic_file_llseek
1175 };
1176 
1177 static void
1178 xgene_edac_l3_create_debugfs_nodes(struct edac_device_ctl_info *edac_dev)
1179 {
1180 	struct xgene_edac_dev_ctx *ctx = edac_dev->pvt_info;
1181 	struct dentry *dbgfs_dir;
1182 	char name[10];
1183 
1184 	if (!IS_ENABLED(CONFIG_EDAC_DEBUG) || !ctx->edac->dfs)
1185 		return;
1186 
1187 	snprintf(name, sizeof(name), "l3c%d", ctx->edac_idx);
1188 	dbgfs_dir = edac_debugfs_create_dir_at(name, ctx->edac->dfs);
1189 	if (!dbgfs_dir)
1190 		return;
1191 
1192 	debugfs_create_file("l3_inject_ctrl", S_IWUSR, dbgfs_dir, edac_dev,
1193 			    &xgene_edac_l3_debug_inject_fops);
1194 }
1195 
1196 static int xgene_edac_l3_add(struct xgene_edac *edac, struct device_node *np,
1197 			     int version)
1198 {
1199 	struct edac_device_ctl_info *edac_dev;
1200 	struct xgene_edac_dev_ctx *ctx;
1201 	struct resource res;
1202 	void __iomem *dev_csr;
1203 	int edac_idx;
1204 	int rc = 0;
1205 
1206 	if (!devres_open_group(edac->dev, xgene_edac_l3_add, GFP_KERNEL))
1207 		return -ENOMEM;
1208 
1209 	rc = of_address_to_resource(np, 0, &res);
1210 	if (rc < 0) {
1211 		dev_err(edac->dev, "no L3 resource address\n");
1212 		goto err_release_group;
1213 	}
1214 	dev_csr = devm_ioremap_resource(edac->dev, &res);
1215 	if (IS_ERR(dev_csr)) {
1216 		dev_err(edac->dev,
1217 			"devm_ioremap_resource failed for L3 resource address\n");
1218 		rc = PTR_ERR(dev_csr);
1219 		goto err_release_group;
1220 	}
1221 
1222 	edac_idx = edac_device_alloc_index();
1223 	edac_dev = edac_device_alloc_ctl_info(sizeof(*ctx),
1224 					      "l3c", 1, "l3c", 1, 0, NULL, 0,
1225 					      edac_idx);
1226 	if (!edac_dev) {
1227 		rc = -ENOMEM;
1228 		goto err_release_group;
1229 	}
1230 
1231 	ctx = edac_dev->pvt_info;
1232 	ctx->dev_csr = dev_csr;
1233 	ctx->name = "xgene_l3_err";
1234 	ctx->edac_idx = edac_idx;
1235 	ctx->edac = edac;
1236 	ctx->edac_dev = edac_dev;
1237 	ctx->ddev = *edac->dev;
1238 	ctx->version = version;
1239 	edac_dev->dev = &ctx->ddev;
1240 	edac_dev->ctl_name = ctx->name;
1241 	edac_dev->dev_name = ctx->name;
1242 	edac_dev->mod_name = EDAC_MOD_STR;
1243 
1244 	if (edac_op_state == EDAC_OPSTATE_POLL)
1245 		edac_dev->edac_check = xgene_edac_l3_check;
1246 
1247 	xgene_edac_l3_create_debugfs_nodes(edac_dev);
1248 
1249 	rc = edac_device_add_device(edac_dev);
1250 	if (rc > 0) {
1251 		dev_err(edac->dev, "failed edac_device_add_device()\n");
1252 		rc = -ENOMEM;
1253 		goto err_ctl_free;
1254 	}
1255 
1256 	if (edac_op_state == EDAC_OPSTATE_INT)
1257 		edac_dev->op_state = OP_RUNNING_INTERRUPT;
1258 
1259 	list_add(&ctx->next, &edac->l3s);
1260 
1261 	xgene_edac_l3_hw_init(edac_dev, 1);
1262 
1263 	devres_remove_group(edac->dev, xgene_edac_l3_add);
1264 
1265 	dev_info(edac->dev, "X-Gene EDAC L3 registered\n");
1266 	return 0;
1267 
1268 err_ctl_free:
1269 	edac_device_free_ctl_info(edac_dev);
1270 err_release_group:
1271 	devres_release_group(edac->dev, xgene_edac_l3_add);
1272 	return rc;
1273 }
1274 
1275 static int xgene_edac_l3_remove(struct xgene_edac_dev_ctx *l3)
1276 {
1277 	struct edac_device_ctl_info *edac_dev = l3->edac_dev;
1278 
1279 	xgene_edac_l3_hw_init(edac_dev, 0);
1280 	edac_device_del_device(l3->edac->dev);
1281 	edac_device_free_ctl_info(edac_dev);
1282 	return 0;
1283 }
1284 
1285 /* SoC error device */
1286 #define IOBAXIS0TRANSERRINTSTS		0x0000
1287 #define  IOBAXIS0_M_ILLEGAL_ACCESS_MASK	BIT(1)
1288 #define  IOBAXIS0_ILLEGAL_ACCESS_MASK	BIT(0)
1289 #define IOBAXIS0TRANSERRINTMSK		0x0004
1290 #define IOBAXIS0TRANSERRREQINFOL	0x0008
1291 #define IOBAXIS0TRANSERRREQINFOH	0x000c
1292 #define  REQTYPE_RD(src)		(((src) & BIT(0)))
1293 #define  ERRADDRH_RD(src)		(((src) & 0xffc00000) >> 22)
1294 #define IOBAXIS1TRANSERRINTSTS		0x0010
1295 #define IOBAXIS1TRANSERRINTMSK		0x0014
1296 #define IOBAXIS1TRANSERRREQINFOL	0x0018
1297 #define IOBAXIS1TRANSERRREQINFOH	0x001c
1298 #define IOBPATRANSERRINTSTS		0x0020
1299 #define  IOBPA_M_REQIDRAM_CORRUPT_MASK	BIT(7)
1300 #define  IOBPA_REQIDRAM_CORRUPT_MASK	BIT(6)
1301 #define  IOBPA_M_TRANS_CORRUPT_MASK	BIT(5)
1302 #define  IOBPA_TRANS_CORRUPT_MASK	BIT(4)
1303 #define  IOBPA_M_WDATA_CORRUPT_MASK	BIT(3)
1304 #define  IOBPA_WDATA_CORRUPT_MASK	BIT(2)
1305 #define  IOBPA_M_RDATA_CORRUPT_MASK	BIT(1)
1306 #define  IOBPA_RDATA_CORRUPT_MASK	BIT(0)
1307 #define IOBBATRANSERRINTSTS		0x0030
1308 #define  M_ILLEGAL_ACCESS_MASK		BIT(15)
1309 #define  ILLEGAL_ACCESS_MASK		BIT(14)
1310 #define  M_WIDRAM_CORRUPT_MASK		BIT(13)
1311 #define  WIDRAM_CORRUPT_MASK		BIT(12)
1312 #define  M_RIDRAM_CORRUPT_MASK		BIT(11)
1313 #define  RIDRAM_CORRUPT_MASK		BIT(10)
1314 #define  M_TRANS_CORRUPT_MASK		BIT(9)
1315 #define  TRANS_CORRUPT_MASK		BIT(8)
1316 #define  M_WDATA_CORRUPT_MASK		BIT(7)
1317 #define  WDATA_CORRUPT_MASK		BIT(6)
1318 #define  M_RBM_POISONED_REQ_MASK	BIT(5)
1319 #define  RBM_POISONED_REQ_MASK		BIT(4)
1320 #define  M_XGIC_POISONED_REQ_MASK	BIT(3)
1321 #define  XGIC_POISONED_REQ_MASK		BIT(2)
1322 #define  M_WRERR_RESP_MASK		BIT(1)
1323 #define  WRERR_RESP_MASK		BIT(0)
1324 #define IOBBATRANSERRREQINFOL		0x0038
1325 #define IOBBATRANSERRREQINFOH		0x003c
1326 #define  REQTYPE_F2_RD(src)		((src) & BIT(0))
1327 #define  ERRADDRH_F2_RD(src)		(((src) & 0xffc00000) >> 22)
1328 #define IOBBATRANSERRCSWREQID		0x0040
1329 #define XGICTRANSERRINTSTS		0x0050
1330 #define  M_WR_ACCESS_ERR_MASK		BIT(3)
1331 #define  WR_ACCESS_ERR_MASK		BIT(2)
1332 #define  M_RD_ACCESS_ERR_MASK		BIT(1)
1333 #define  RD_ACCESS_ERR_MASK		BIT(0)
1334 #define XGICTRANSERRINTMSK		0x0054
1335 #define XGICTRANSERRREQINFO		0x0058
1336 #define  REQTYPE_MASK			BIT(26)
1337 #define  ERRADDR_RD(src)		((src) & 0x03ffffff)
1338 #define GLBL_ERR_STS			0x0800
1339 #define  MDED_ERR_MASK			BIT(3)
1340 #define  DED_ERR_MASK			BIT(2)
1341 #define  MSEC_ERR_MASK			BIT(1)
1342 #define  SEC_ERR_MASK			BIT(0)
1343 #define GLBL_SEC_ERRL			0x0810
1344 #define GLBL_SEC_ERRH			0x0818
1345 #define GLBL_MSEC_ERRL			0x0820
1346 #define GLBL_MSEC_ERRH			0x0828
1347 #define GLBL_DED_ERRL			0x0830
1348 #define GLBL_DED_ERRLMASK		0x0834
1349 #define GLBL_DED_ERRH			0x0838
1350 #define GLBL_DED_ERRHMASK		0x083c
1351 #define GLBL_MDED_ERRL			0x0840
1352 #define GLBL_MDED_ERRLMASK		0x0844
1353 #define GLBL_MDED_ERRH			0x0848
1354 #define GLBL_MDED_ERRHMASK		0x084c
1355 
1356 /* IO Bus Registers */
1357 #define RBCSR				0x0000
1358 #define STICKYERR_MASK			BIT(0)
1359 #define RBEIR				0x0008
1360 #define AGENT_OFFLINE_ERR_MASK		BIT(30)
1361 #define UNIMPL_RBPAGE_ERR_MASK		BIT(29)
1362 #define WORD_ALIGNED_ERR_MASK		BIT(28)
1363 #define PAGE_ACCESS_ERR_MASK		BIT(27)
1364 #define WRITE_ACCESS_MASK		BIT(26)
1365 #define RBERRADDR_RD(src)		((src) & 0x03FFFFFF)
1366 
1367 static const char * const soc_mem_err_v1[] = {
1368 	"10GbE0",
1369 	"10GbE1",
1370 	"Security",
1371 	"SATA45",
1372 	"SATA23/ETH23",
1373 	"SATA01/ETH01",
1374 	"USB1",
1375 	"USB0",
1376 	"QML",
1377 	"QM0",
1378 	"QM1 (XGbE01)",
1379 	"PCIE4",
1380 	"PCIE3",
1381 	"PCIE2",
1382 	"PCIE1",
1383 	"PCIE0",
1384 	"CTX Manager",
1385 	"OCM",
1386 	"1GbE",
1387 	"CLE",
1388 	"AHBC",
1389 	"PktDMA",
1390 	"GFC",
1391 	"MSLIM",
1392 	"10GbE2",
1393 	"10GbE3",
1394 	"QM2 (XGbE23)",
1395 	"IOB",
1396 	"unknown",
1397 	"unknown",
1398 	"unknown",
1399 	"unknown",
1400 };
1401 
1402 static void xgene_edac_iob_gic_report(struct edac_device_ctl_info *edac_dev)
1403 {
1404 	struct xgene_edac_dev_ctx *ctx = edac_dev->pvt_info;
1405 	u32 err_addr_lo;
1406 	u32 err_addr_hi;
1407 	u32 reg;
1408 	u32 info;
1409 
1410 	/* GIC transaction error interrupt */
1411 	reg = readl(ctx->dev_csr + XGICTRANSERRINTSTS);
1412 	if (!reg)
1413 		goto chk_iob_err;
1414 	dev_err(edac_dev->dev, "XGIC transaction error\n");
1415 	if (reg & RD_ACCESS_ERR_MASK)
1416 		dev_err(edac_dev->dev, "XGIC read size error\n");
1417 	if (reg & M_RD_ACCESS_ERR_MASK)
1418 		dev_err(edac_dev->dev, "Multiple XGIC read size error\n");
1419 	if (reg & WR_ACCESS_ERR_MASK)
1420 		dev_err(edac_dev->dev, "XGIC write size error\n");
1421 	if (reg & M_WR_ACCESS_ERR_MASK)
1422 		dev_err(edac_dev->dev, "Multiple XGIC write size error\n");
1423 	info = readl(ctx->dev_csr + XGICTRANSERRREQINFO);
1424 	dev_err(edac_dev->dev, "XGIC %s access @ 0x%08X (0x%08X)\n",
1425 		info & REQTYPE_MASK ? "read" : "write", ERRADDR_RD(info),
1426 		info);
1427 	writel(reg, ctx->dev_csr + XGICTRANSERRINTSTS);
1428 
1429 chk_iob_err:
1430 	/* IOB memory error */
1431 	reg = readl(ctx->dev_csr + GLBL_ERR_STS);
1432 	if (!reg)
1433 		return;
1434 	if (reg & SEC_ERR_MASK) {
1435 		err_addr_lo = readl(ctx->dev_csr + GLBL_SEC_ERRL);
1436 		err_addr_hi = readl(ctx->dev_csr + GLBL_SEC_ERRH);
1437 		dev_err(edac_dev->dev,
1438 			"IOB single-bit correctable memory at 0x%08X.%08X error\n",
1439 			err_addr_lo, err_addr_hi);
1440 		writel(err_addr_lo, ctx->dev_csr + GLBL_SEC_ERRL);
1441 		writel(err_addr_hi, ctx->dev_csr + GLBL_SEC_ERRH);
1442 	}
1443 	if (reg & MSEC_ERR_MASK) {
1444 		err_addr_lo = readl(ctx->dev_csr + GLBL_MSEC_ERRL);
1445 		err_addr_hi = readl(ctx->dev_csr + GLBL_MSEC_ERRH);
1446 		dev_err(edac_dev->dev,
1447 			"IOB multiple single-bit correctable memory at 0x%08X.%08X error\n",
1448 			err_addr_lo, err_addr_hi);
1449 		writel(err_addr_lo, ctx->dev_csr + GLBL_MSEC_ERRL);
1450 		writel(err_addr_hi, ctx->dev_csr + GLBL_MSEC_ERRH);
1451 	}
1452 	if (reg & (SEC_ERR_MASK | MSEC_ERR_MASK))
1453 		edac_device_handle_ce(edac_dev, 0, 0, edac_dev->ctl_name);
1454 
1455 	if (reg & DED_ERR_MASK) {
1456 		err_addr_lo = readl(ctx->dev_csr + GLBL_DED_ERRL);
1457 		err_addr_hi = readl(ctx->dev_csr + GLBL_DED_ERRH);
1458 		dev_err(edac_dev->dev,
1459 			"IOB double-bit uncorrectable memory at 0x%08X.%08X error\n",
1460 			err_addr_lo, err_addr_hi);
1461 		writel(err_addr_lo, ctx->dev_csr + GLBL_DED_ERRL);
1462 		writel(err_addr_hi, ctx->dev_csr + GLBL_DED_ERRH);
1463 	}
1464 	if (reg & MDED_ERR_MASK) {
1465 		err_addr_lo = readl(ctx->dev_csr + GLBL_MDED_ERRL);
1466 		err_addr_hi = readl(ctx->dev_csr + GLBL_MDED_ERRH);
1467 		dev_err(edac_dev->dev,
1468 			"Multiple IOB double-bit uncorrectable memory at 0x%08X.%08X error\n",
1469 			err_addr_lo, err_addr_hi);
1470 		writel(err_addr_lo, ctx->dev_csr + GLBL_MDED_ERRL);
1471 		writel(err_addr_hi, ctx->dev_csr + GLBL_MDED_ERRH);
1472 	}
1473 	if (reg & (DED_ERR_MASK | MDED_ERR_MASK))
1474 		edac_device_handle_ue(edac_dev, 0, 0, edac_dev->ctl_name);
1475 }
1476 
1477 static void xgene_edac_rb_report(struct edac_device_ctl_info *edac_dev)
1478 {
1479 	struct xgene_edac_dev_ctx *ctx = edac_dev->pvt_info;
1480 	u32 err_addr_lo;
1481 	u32 err_addr_hi;
1482 	u32 reg;
1483 
1484 	/* If the register bus resource isn't available, just skip it */
1485 	if (!ctx->edac->rb_map)
1486 		goto rb_skip;
1487 
1488 	/*
1489 	 * Check RB access errors
1490 	 * 1. Out of range
1491 	 * 2. Un-implemented page
1492 	 * 3. Un-aligned access
1493 	 * 4. Offline slave IP
1494 	 */
1495 	if (regmap_read(ctx->edac->rb_map, RBCSR, &reg))
1496 		return;
1497 	if (reg & STICKYERR_MASK) {
1498 		bool write;
1499 		u32 address;
1500 
1501 		dev_err(edac_dev->dev, "IOB bus access error(s)\n");
1502 		if (regmap_read(ctx->edac->rb_map, RBEIR, &reg))
1503 			return;
1504 		write = reg & WRITE_ACCESS_MASK ? 1 : 0;
1505 		address = RBERRADDR_RD(reg);
1506 		if (reg & AGENT_OFFLINE_ERR_MASK)
1507 			dev_err(edac_dev->dev,
1508 				"IOB bus %s access to offline agent error\n",
1509 				write ? "write" : "read");
1510 		if (reg & UNIMPL_RBPAGE_ERR_MASK)
1511 			dev_err(edac_dev->dev,
1512 				"IOB bus %s access to unimplemented page error\n",
1513 				write ? "write" : "read");
1514 		if (reg & WORD_ALIGNED_ERR_MASK)
1515 			dev_err(edac_dev->dev,
1516 				"IOB bus %s word aligned access error\n",
1517 				write ? "write" : "read");
1518 		if (reg & PAGE_ACCESS_ERR_MASK)
1519 			dev_err(edac_dev->dev,
1520 				"IOB bus %s to page out of range access error\n",
1521 				write ? "write" : "read");
1522 		if (regmap_write(ctx->edac->rb_map, RBEIR, 0))
1523 			return;
1524 		if (regmap_write(ctx->edac->rb_map, RBCSR, 0))
1525 			return;
1526 	}
1527 rb_skip:
1528 
1529 	/* IOB Bridge agent transaction error interrupt */
1530 	reg = readl(ctx->dev_csr + IOBBATRANSERRINTSTS);
1531 	if (!reg)
1532 		return;
1533 
1534 	dev_err(edac_dev->dev, "IOB bridge agent (BA) transaction error\n");
1535 	if (reg & WRERR_RESP_MASK)
1536 		dev_err(edac_dev->dev, "IOB BA write response error\n");
1537 	if (reg & M_WRERR_RESP_MASK)
1538 		dev_err(edac_dev->dev,
1539 			"Multiple IOB BA write response error\n");
1540 	if (reg & XGIC_POISONED_REQ_MASK)
1541 		dev_err(edac_dev->dev, "IOB BA XGIC poisoned write error\n");
1542 	if (reg & M_XGIC_POISONED_REQ_MASK)
1543 		dev_err(edac_dev->dev,
1544 			"Multiple IOB BA XGIC poisoned write error\n");
1545 	if (reg & RBM_POISONED_REQ_MASK)
1546 		dev_err(edac_dev->dev, "IOB BA RBM poisoned write error\n");
1547 	if (reg & M_RBM_POISONED_REQ_MASK)
1548 		dev_err(edac_dev->dev,
1549 			"Multiple IOB BA RBM poisoned write error\n");
1550 	if (reg & WDATA_CORRUPT_MASK)
1551 		dev_err(edac_dev->dev, "IOB BA write error\n");
1552 	if (reg & M_WDATA_CORRUPT_MASK)
1553 		dev_err(edac_dev->dev, "Multiple IOB BA write error\n");
1554 	if (reg & TRANS_CORRUPT_MASK)
1555 		dev_err(edac_dev->dev, "IOB BA transaction error\n");
1556 	if (reg & M_TRANS_CORRUPT_MASK)
1557 		dev_err(edac_dev->dev, "Multiple IOB BA transaction error\n");
1558 	if (reg & RIDRAM_CORRUPT_MASK)
1559 		dev_err(edac_dev->dev,
1560 			"IOB BA RDIDRAM read transaction ID error\n");
1561 	if (reg & M_RIDRAM_CORRUPT_MASK)
1562 		dev_err(edac_dev->dev,
1563 			"Multiple IOB BA RDIDRAM read transaction ID error\n");
1564 	if (reg & WIDRAM_CORRUPT_MASK)
1565 		dev_err(edac_dev->dev,
1566 			"IOB BA RDIDRAM write transaction ID error\n");
1567 	if (reg & M_WIDRAM_CORRUPT_MASK)
1568 		dev_err(edac_dev->dev,
1569 			"Multiple IOB BA RDIDRAM write transaction ID error\n");
1570 	if (reg & ILLEGAL_ACCESS_MASK)
1571 		dev_err(edac_dev->dev,
1572 			"IOB BA XGIC/RB illegal access error\n");
1573 	if (reg & M_ILLEGAL_ACCESS_MASK)
1574 		dev_err(edac_dev->dev,
1575 			"Multiple IOB BA XGIC/RB illegal access error\n");
1576 
1577 	err_addr_lo = readl(ctx->dev_csr + IOBBATRANSERRREQINFOL);
1578 	err_addr_hi = readl(ctx->dev_csr + IOBBATRANSERRREQINFOH);
1579 	dev_err(edac_dev->dev, "IOB BA %s access at 0x%02X.%08X (0x%08X)\n",
1580 		REQTYPE_F2_RD(err_addr_hi) ? "read" : "write",
1581 		ERRADDRH_F2_RD(err_addr_hi), err_addr_lo, err_addr_hi);
1582 	if (reg & WRERR_RESP_MASK)
1583 		dev_err(edac_dev->dev, "IOB BA requestor ID 0x%08X\n",
1584 			readl(ctx->dev_csr + IOBBATRANSERRCSWREQID));
1585 	writel(reg, ctx->dev_csr + IOBBATRANSERRINTSTS);
1586 }
1587 
1588 static void xgene_edac_pa_report(struct edac_device_ctl_info *edac_dev)
1589 {
1590 	struct xgene_edac_dev_ctx *ctx = edac_dev->pvt_info;
1591 	u32 err_addr_lo;
1592 	u32 err_addr_hi;
1593 	u32 reg;
1594 
1595 	/* IOB Processing agent transaction error interrupt */
1596 	reg = readl(ctx->dev_csr + IOBPATRANSERRINTSTS);
1597 	if (!reg)
1598 		goto chk_iob_axi0;
1599 	dev_err(edac_dev->dev, "IOB processing agent (PA) transaction error\n");
1600 	if (reg & IOBPA_RDATA_CORRUPT_MASK)
1601 		dev_err(edac_dev->dev, "IOB PA read data RAM error\n");
1602 	if (reg & IOBPA_M_RDATA_CORRUPT_MASK)
1603 		dev_err(edac_dev->dev,
1604 			"Multiple IOB PA read data RAM error\n");
1605 	if (reg & IOBPA_WDATA_CORRUPT_MASK)
1606 		dev_err(edac_dev->dev, "IOB PA write data RAM error\n");
1607 	if (reg & IOBPA_M_WDATA_CORRUPT_MASK)
1608 		dev_err(edac_dev->dev,
1609 			"Multiple IOB PA write data RAM error\n");
1610 	if (reg & IOBPA_TRANS_CORRUPT_MASK)
1611 		dev_err(edac_dev->dev, "IOB PA transaction error\n");
1612 	if (reg & IOBPA_M_TRANS_CORRUPT_MASK)
1613 		dev_err(edac_dev->dev, "Multiple IOB PA transaction error\n");
1614 	if (reg & IOBPA_REQIDRAM_CORRUPT_MASK)
1615 		dev_err(edac_dev->dev, "IOB PA transaction ID RAM error\n");
1616 	if (reg & IOBPA_M_REQIDRAM_CORRUPT_MASK)
1617 		dev_err(edac_dev->dev,
1618 			"Multiple IOB PA transaction ID RAM error\n");
1619 	writel(reg, ctx->dev_csr + IOBPATRANSERRINTSTS);
1620 
1621 chk_iob_axi0:
1622 	/* IOB AXI0 Error */
1623 	reg = readl(ctx->dev_csr + IOBAXIS0TRANSERRINTSTS);
1624 	if (!reg)
1625 		goto chk_iob_axi1;
1626 	err_addr_lo = readl(ctx->dev_csr + IOBAXIS0TRANSERRREQINFOL);
1627 	err_addr_hi = readl(ctx->dev_csr + IOBAXIS0TRANSERRREQINFOH);
1628 	dev_err(edac_dev->dev,
1629 		"%sAXI slave 0 illegal %s access @ 0x%02X.%08X (0x%08X)\n",
1630 		reg & IOBAXIS0_M_ILLEGAL_ACCESS_MASK ? "Multiple " : "",
1631 		REQTYPE_RD(err_addr_hi) ? "read" : "write",
1632 		ERRADDRH_RD(err_addr_hi), err_addr_lo, err_addr_hi);
1633 	writel(reg, ctx->dev_csr + IOBAXIS0TRANSERRINTSTS);
1634 
1635 chk_iob_axi1:
1636 	/* IOB AXI1 Error */
1637 	reg = readl(ctx->dev_csr + IOBAXIS1TRANSERRINTSTS);
1638 	if (!reg)
1639 		return;
1640 	err_addr_lo = readl(ctx->dev_csr + IOBAXIS1TRANSERRREQINFOL);
1641 	err_addr_hi = readl(ctx->dev_csr + IOBAXIS1TRANSERRREQINFOH);
1642 	dev_err(edac_dev->dev,
1643 		"%sAXI slave 1 illegal %s access @ 0x%02X.%08X (0x%08X)\n",
1644 		reg & IOBAXIS0_M_ILLEGAL_ACCESS_MASK ? "Multiple " : "",
1645 		REQTYPE_RD(err_addr_hi) ? "read" : "write",
1646 		ERRADDRH_RD(err_addr_hi), err_addr_lo, err_addr_hi);
1647 	writel(reg, ctx->dev_csr + IOBAXIS1TRANSERRINTSTS);
1648 }
1649 
1650 static void xgene_edac_soc_check(struct edac_device_ctl_info *edac_dev)
1651 {
1652 	struct xgene_edac_dev_ctx *ctx = edac_dev->pvt_info;
1653 	const char * const *soc_mem_err = NULL;
1654 	u32 pcp_hp_stat;
1655 	u32 pcp_lp_stat;
1656 	u32 reg;
1657 	int i;
1658 
1659 	xgene_edac_pcp_rd(ctx->edac, PCPHPERRINTSTS, &pcp_hp_stat);
1660 	xgene_edac_pcp_rd(ctx->edac, PCPLPERRINTSTS, &pcp_lp_stat);
1661 	xgene_edac_pcp_rd(ctx->edac, MEMERRINTSTS, &reg);
1662 	if (!((pcp_hp_stat & (IOB_PA_ERR_MASK | IOB_BA_ERR_MASK |
1663 			      IOB_XGIC_ERR_MASK | IOB_RB_ERR_MASK)) ||
1664 	      (pcp_lp_stat & CSW_SWITCH_TRACE_ERR_MASK) || reg))
1665 		return;
1666 
1667 	if (pcp_hp_stat & IOB_XGIC_ERR_MASK)
1668 		xgene_edac_iob_gic_report(edac_dev);
1669 
1670 	if (pcp_hp_stat & (IOB_RB_ERR_MASK | IOB_BA_ERR_MASK))
1671 		xgene_edac_rb_report(edac_dev);
1672 
1673 	if (pcp_hp_stat & IOB_PA_ERR_MASK)
1674 		xgene_edac_pa_report(edac_dev);
1675 
1676 	if (pcp_lp_stat & CSW_SWITCH_TRACE_ERR_MASK) {
1677 		dev_info(edac_dev->dev,
1678 			 "CSW switch trace correctable memory parity error\n");
1679 		edac_device_handle_ce(edac_dev, 0, 0, edac_dev->ctl_name);
1680 	}
1681 
1682 	if (!reg)
1683 		return;
1684 	if (ctx->version == 1)
1685 		soc_mem_err = soc_mem_err_v1;
1686 	if (!soc_mem_err) {
1687 		dev_err(edac_dev->dev, "SoC memory parity error 0x%08X\n",
1688 			reg);
1689 		edac_device_handle_ue(edac_dev, 0, 0, edac_dev->ctl_name);
1690 		return;
1691 	}
1692 	for (i = 0; i < 31; i++) {
1693 		if (reg & (1 << i)) {
1694 			dev_err(edac_dev->dev, "%s memory parity error\n",
1695 				soc_mem_err[i]);
1696 			edac_device_handle_ue(edac_dev, 0, 0,
1697 					      edac_dev->ctl_name);
1698 		}
1699 	}
1700 }
1701 
1702 static void xgene_edac_soc_hw_init(struct edac_device_ctl_info *edac_dev,
1703 				   bool enable)
1704 {
1705 	struct xgene_edac_dev_ctx *ctx = edac_dev->pvt_info;
1706 
1707 	/* Enable SoC IP error interrupt */
1708 	if (edac_dev->op_state == OP_RUNNING_INTERRUPT) {
1709 		if (enable) {
1710 			xgene_edac_pcp_clrbits(ctx->edac, PCPHPERRINTMSK,
1711 					       IOB_PA_ERR_MASK |
1712 					       IOB_BA_ERR_MASK |
1713 					       IOB_XGIC_ERR_MASK |
1714 					       IOB_RB_ERR_MASK);
1715 			xgene_edac_pcp_clrbits(ctx->edac, PCPLPERRINTMSK,
1716 					       CSW_SWITCH_TRACE_ERR_MASK);
1717 		} else {
1718 			xgene_edac_pcp_setbits(ctx->edac, PCPHPERRINTMSK,
1719 					       IOB_PA_ERR_MASK |
1720 					       IOB_BA_ERR_MASK |
1721 					       IOB_XGIC_ERR_MASK |
1722 					       IOB_RB_ERR_MASK);
1723 			xgene_edac_pcp_setbits(ctx->edac, PCPLPERRINTMSK,
1724 					       CSW_SWITCH_TRACE_ERR_MASK);
1725 		}
1726 
1727 		writel(enable ? 0x0 : 0xFFFFFFFF,
1728 		       ctx->dev_csr + IOBAXIS0TRANSERRINTMSK);
1729 		writel(enable ? 0x0 : 0xFFFFFFFF,
1730 		       ctx->dev_csr + IOBAXIS1TRANSERRINTMSK);
1731 		writel(enable ? 0x0 : 0xFFFFFFFF,
1732 		       ctx->dev_csr + XGICTRANSERRINTMSK);
1733 
1734 		xgene_edac_pcp_setbits(ctx->edac, MEMERRINTMSK,
1735 				       enable ? 0x0 : 0xFFFFFFFF);
1736 	}
1737 }
1738 
1739 static int xgene_edac_soc_add(struct xgene_edac *edac, struct device_node *np,
1740 			      int version)
1741 {
1742 	struct edac_device_ctl_info *edac_dev;
1743 	struct xgene_edac_dev_ctx *ctx;
1744 	void __iomem *dev_csr;
1745 	struct resource res;
1746 	int edac_idx;
1747 	int rc;
1748 
1749 	if (!devres_open_group(edac->dev, xgene_edac_soc_add, GFP_KERNEL))
1750 		return -ENOMEM;
1751 
1752 	rc = of_address_to_resource(np, 0, &res);
1753 	if (rc < 0) {
1754 		dev_err(edac->dev, "no SoC resource address\n");
1755 		goto err_release_group;
1756 	}
1757 	dev_csr = devm_ioremap_resource(edac->dev, &res);
1758 	if (IS_ERR(dev_csr)) {
1759 		dev_err(edac->dev,
1760 			"devm_ioremap_resource failed for soc resource address\n");
1761 		rc = PTR_ERR(dev_csr);
1762 		goto err_release_group;
1763 	}
1764 
1765 	edac_idx = edac_device_alloc_index();
1766 	edac_dev = edac_device_alloc_ctl_info(sizeof(*ctx),
1767 					      "SOC", 1, "SOC", 1, 2, NULL, 0,
1768 					      edac_idx);
1769 	if (!edac_dev) {
1770 		rc = -ENOMEM;
1771 		goto err_release_group;
1772 	}
1773 
1774 	ctx = edac_dev->pvt_info;
1775 	ctx->dev_csr = dev_csr;
1776 	ctx->name = "xgene_soc_err";
1777 	ctx->edac_idx = edac_idx;
1778 	ctx->edac = edac;
1779 	ctx->edac_dev = edac_dev;
1780 	ctx->ddev = *edac->dev;
1781 	ctx->version = version;
1782 	edac_dev->dev = &ctx->ddev;
1783 	edac_dev->ctl_name = ctx->name;
1784 	edac_dev->dev_name = ctx->name;
1785 	edac_dev->mod_name = EDAC_MOD_STR;
1786 
1787 	if (edac_op_state == EDAC_OPSTATE_POLL)
1788 		edac_dev->edac_check = xgene_edac_soc_check;
1789 
1790 	rc = edac_device_add_device(edac_dev);
1791 	if (rc > 0) {
1792 		dev_err(edac->dev, "failed edac_device_add_device()\n");
1793 		rc = -ENOMEM;
1794 		goto err_ctl_free;
1795 	}
1796 
1797 	if (edac_op_state == EDAC_OPSTATE_INT)
1798 		edac_dev->op_state = OP_RUNNING_INTERRUPT;
1799 
1800 	list_add(&ctx->next, &edac->socs);
1801 
1802 	xgene_edac_soc_hw_init(edac_dev, 1);
1803 
1804 	devres_remove_group(edac->dev, xgene_edac_soc_add);
1805 
1806 	dev_info(edac->dev, "X-Gene EDAC SoC registered\n");
1807 
1808 	return 0;
1809 
1810 err_ctl_free:
1811 	edac_device_free_ctl_info(edac_dev);
1812 err_release_group:
1813 	devres_release_group(edac->dev, xgene_edac_soc_add);
1814 	return rc;
1815 }
1816 
1817 static int xgene_edac_soc_remove(struct xgene_edac_dev_ctx *soc)
1818 {
1819 	struct edac_device_ctl_info *edac_dev = soc->edac_dev;
1820 
1821 	xgene_edac_soc_hw_init(edac_dev, 0);
1822 	edac_device_del_device(soc->edac->dev);
1823 	edac_device_free_ctl_info(edac_dev);
1824 	return 0;
1825 }
1826 
1827 static irqreturn_t xgene_edac_isr(int irq, void *dev_id)
1828 {
1829 	struct xgene_edac *ctx = dev_id;
1830 	struct xgene_edac_pmd_ctx *pmd;
1831 	struct xgene_edac_dev_ctx *node;
1832 	unsigned int pcp_hp_stat;
1833 	unsigned int pcp_lp_stat;
1834 
1835 	xgene_edac_pcp_rd(ctx, PCPHPERRINTSTS, &pcp_hp_stat);
1836 	xgene_edac_pcp_rd(ctx, PCPLPERRINTSTS, &pcp_lp_stat);
1837 	if ((MCU_UNCORR_ERR_MASK & pcp_hp_stat) ||
1838 	    (MCU_CTL_ERR_MASK & pcp_hp_stat) ||
1839 	    (MCU_CORR_ERR_MASK & pcp_lp_stat)) {
1840 		struct xgene_edac_mc_ctx *mcu;
1841 
1842 		list_for_each_entry(mcu, &ctx->mcus, next)
1843 			xgene_edac_mc_check(mcu->mci);
1844 	}
1845 
1846 	list_for_each_entry(pmd, &ctx->pmds, next) {
1847 		if ((PMD0_MERR_MASK << pmd->pmd) & pcp_hp_stat)
1848 			xgene_edac_pmd_check(pmd->edac_dev);
1849 	}
1850 
1851 	list_for_each_entry(node, &ctx->l3s, next)
1852 		xgene_edac_l3_check(node->edac_dev);
1853 
1854 	list_for_each_entry(node, &ctx->socs, next)
1855 		xgene_edac_soc_check(node->edac_dev);
1856 
1857 	return IRQ_HANDLED;
1858 }
1859 
1860 static int xgene_edac_probe(struct platform_device *pdev)
1861 {
1862 	struct xgene_edac *edac;
1863 	struct device_node *child;
1864 	struct resource *res;
1865 	int rc;
1866 
1867 	edac = devm_kzalloc(&pdev->dev, sizeof(*edac), GFP_KERNEL);
1868 	if (!edac)
1869 		return -ENOMEM;
1870 
1871 	edac->dev = &pdev->dev;
1872 	platform_set_drvdata(pdev, edac);
1873 	INIT_LIST_HEAD(&edac->mcus);
1874 	INIT_LIST_HEAD(&edac->pmds);
1875 	INIT_LIST_HEAD(&edac->l3s);
1876 	INIT_LIST_HEAD(&edac->socs);
1877 	spin_lock_init(&edac->lock);
1878 	mutex_init(&edac->mc_lock);
1879 
1880 	edac->csw_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1881 							"regmap-csw");
1882 	if (IS_ERR(edac->csw_map)) {
1883 		dev_err(edac->dev, "unable to get syscon regmap csw\n");
1884 		rc = PTR_ERR(edac->csw_map);
1885 		goto out_err;
1886 	}
1887 
1888 	edac->mcba_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1889 							 "regmap-mcba");
1890 	if (IS_ERR(edac->mcba_map)) {
1891 		dev_err(edac->dev, "unable to get syscon regmap mcba\n");
1892 		rc = PTR_ERR(edac->mcba_map);
1893 		goto out_err;
1894 	}
1895 
1896 	edac->mcbb_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1897 							 "regmap-mcbb");
1898 	if (IS_ERR(edac->mcbb_map)) {
1899 		dev_err(edac->dev, "unable to get syscon regmap mcbb\n");
1900 		rc = PTR_ERR(edac->mcbb_map);
1901 		goto out_err;
1902 	}
1903 	edac->efuse_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1904 							  "regmap-efuse");
1905 	if (IS_ERR(edac->efuse_map)) {
1906 		dev_err(edac->dev, "unable to get syscon regmap efuse\n");
1907 		rc = PTR_ERR(edac->efuse_map);
1908 		goto out_err;
1909 	}
1910 
1911 	/*
1912 	 * NOTE: The register bus resource is optional for compatibility
1913 	 * reason.
1914 	 */
1915 	edac->rb_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1916 						       "regmap-rb");
1917 	if (IS_ERR(edac->rb_map)) {
1918 		dev_warn(edac->dev, "missing syscon regmap rb\n");
1919 		edac->rb_map = NULL;
1920 	}
1921 
1922 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1923 	edac->pcp_csr = devm_ioremap_resource(&pdev->dev, res);
1924 	if (IS_ERR(edac->pcp_csr)) {
1925 		dev_err(&pdev->dev, "no PCP resource address\n");
1926 		rc = PTR_ERR(edac->pcp_csr);
1927 		goto out_err;
1928 	}
1929 
1930 	if (edac_op_state == EDAC_OPSTATE_INT) {
1931 		int irq;
1932 		int i;
1933 
1934 		for (i = 0; i < 3; i++) {
1935 			irq = platform_get_irq(pdev, i);
1936 			if (irq < 0) {
1937 				dev_err(&pdev->dev, "No IRQ resource\n");
1938 				rc = -EINVAL;
1939 				goto out_err;
1940 			}
1941 			rc = devm_request_irq(&pdev->dev, irq,
1942 					      xgene_edac_isr, IRQF_SHARED,
1943 					      dev_name(&pdev->dev), edac);
1944 			if (rc) {
1945 				dev_err(&pdev->dev,
1946 					"Could not request IRQ %d\n", irq);
1947 				goto out_err;
1948 			}
1949 		}
1950 	}
1951 
1952 	edac->dfs = edac_debugfs_create_dir(pdev->dev.kobj.name);
1953 
1954 	for_each_child_of_node(pdev->dev.of_node, child) {
1955 		if (!of_device_is_available(child))
1956 			continue;
1957 		if (of_device_is_compatible(child, "apm,xgene-edac-mc"))
1958 			xgene_edac_mc_add(edac, child);
1959 		if (of_device_is_compatible(child, "apm,xgene-edac-pmd"))
1960 			xgene_edac_pmd_add(edac, child, 1);
1961 		if (of_device_is_compatible(child, "apm,xgene-edac-pmd-v2"))
1962 			xgene_edac_pmd_add(edac, child, 2);
1963 		if (of_device_is_compatible(child, "apm,xgene-edac-l3"))
1964 			xgene_edac_l3_add(edac, child, 1);
1965 		if (of_device_is_compatible(child, "apm,xgene-edac-l3-v2"))
1966 			xgene_edac_l3_add(edac, child, 2);
1967 		if (of_device_is_compatible(child, "apm,xgene-edac-soc"))
1968 			xgene_edac_soc_add(edac, child, 0);
1969 		if (of_device_is_compatible(child, "apm,xgene-edac-soc-v1"))
1970 			xgene_edac_soc_add(edac, child, 1);
1971 	}
1972 
1973 	return 0;
1974 
1975 out_err:
1976 	return rc;
1977 }
1978 
1979 static int xgene_edac_remove(struct platform_device *pdev)
1980 {
1981 	struct xgene_edac *edac = dev_get_drvdata(&pdev->dev);
1982 	struct xgene_edac_mc_ctx *mcu;
1983 	struct xgene_edac_mc_ctx *temp_mcu;
1984 	struct xgene_edac_pmd_ctx *pmd;
1985 	struct xgene_edac_pmd_ctx *temp_pmd;
1986 	struct xgene_edac_dev_ctx *node;
1987 	struct xgene_edac_dev_ctx *temp_node;
1988 
1989 	list_for_each_entry_safe(mcu, temp_mcu, &edac->mcus, next)
1990 		xgene_edac_mc_remove(mcu);
1991 
1992 	list_for_each_entry_safe(pmd, temp_pmd, &edac->pmds, next)
1993 		xgene_edac_pmd_remove(pmd);
1994 
1995 	list_for_each_entry_safe(node, temp_node, &edac->l3s, next)
1996 		xgene_edac_l3_remove(node);
1997 
1998 	list_for_each_entry_safe(node, temp_node, &edac->socs, next)
1999 		xgene_edac_soc_remove(node);
2000 
2001 	return 0;
2002 }
2003 
2004 static const struct of_device_id xgene_edac_of_match[] = {
2005 	{ .compatible = "apm,xgene-edac" },
2006 	{},
2007 };
2008 MODULE_DEVICE_TABLE(of, xgene_edac_of_match);
2009 
2010 static struct platform_driver xgene_edac_driver = {
2011 	.probe = xgene_edac_probe,
2012 	.remove = xgene_edac_remove,
2013 	.driver = {
2014 		.name = "xgene-edac",
2015 		.of_match_table = xgene_edac_of_match,
2016 	},
2017 };
2018 
2019 static int __init xgene_edac_init(void)
2020 {
2021 	int rc;
2022 
2023 	/* Make sure error reporting method is sane */
2024 	switch (edac_op_state) {
2025 	case EDAC_OPSTATE_POLL:
2026 	case EDAC_OPSTATE_INT:
2027 		break;
2028 	default:
2029 		edac_op_state = EDAC_OPSTATE_INT;
2030 		break;
2031 	}
2032 
2033 	rc = platform_driver_register(&xgene_edac_driver);
2034 	if (rc) {
2035 		edac_printk(KERN_ERR, EDAC_MOD_STR,
2036 			    "EDAC fails to register\n");
2037 		goto reg_failed;
2038 	}
2039 
2040 	return 0;
2041 
2042 reg_failed:
2043 	return rc;
2044 }
2045 module_init(xgene_edac_init);
2046 
2047 static void __exit xgene_edac_exit(void)
2048 {
2049 	platform_driver_unregister(&xgene_edac_driver);
2050 }
2051 module_exit(xgene_edac_exit);
2052 
2053 MODULE_LICENSE("GPL");
2054 MODULE_AUTHOR("Feng Kan <fkan@apm.com>");
2055 MODULE_DESCRIPTION("APM X-Gene EDAC driver");
2056 module_param(edac_op_state, int, 0444);
2057 MODULE_PARM_DESC(edac_op_state,
2058 		 "EDAC error reporting state: 0=Poll, 2=Interrupt");
2059