aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYork Sun <york.sun@nxp.com>2016-08-23 18:14:03 -0400
committerBorislav Petkov <bp@suse.de>2016-09-01 04:28:03 -0400
commiteeb3d68b6c83abdb80bc0823cbb77cd49484793c (patch)
tree63a36dddad3521e7e0e734503eedf9fcbed00304
parent55764ed37eec48ad1c1cb6784166055e06dcb9df (diff)
EDAC, layerscape: Add Layerscape EDAC support
Add DDR EDAC driver for ARM-based compatible controllers. Both big-endian and little-endian are supported, as specified in device tree. Signed-off-by: York Sun <york.sun@nxp.com> Cc: linux-arm-kernel@lists.infradead.org Cc: linux-edac <linux-edac@vger.kernel.org> Link: http://lkml.kernel.org/r/1471990465-27443-1-git-send-email-york.sun@nxp.com Signed-off-by: Borislav Petkov <bp@suse.de>
-rw-r--r--arch/arm64/Kconfig.platforms1
-rw-r--r--drivers/edac/Kconfig7
-rw-r--r--drivers/edac/Makefile3
-rw-r--r--drivers/edac/fsl_ddr_edac.c2
-rw-r--r--drivers/edac/layerscape_edac.c73
5 files changed, 85 insertions, 1 deletions
diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms
index bb2616b16157..52f30a62e6e5 100644
--- a/arch/arm64/Kconfig.platforms
+++ b/arch/arm64/Kconfig.platforms
@@ -55,6 +55,7 @@ config ARCH_EXYNOS
55 55
56config ARCH_LAYERSCAPE 56config ARCH_LAYERSCAPE
57 bool "ARMv8 based Freescale Layerscape SoC family" 57 bool "ARMv8 based Freescale Layerscape SoC family"
58 select EDAC_SUPPORT
58 help 59 help
59 This enables support for the Freescale Layerscape SoC family. 60 This enables support for the Freescale Layerscape SoC family.
60 61
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig
index 394cd16dd58f..49d79002f69c 100644
--- a/drivers/edac/Kconfig
+++ b/drivers/edac/Kconfig
@@ -258,6 +258,13 @@ config EDAC_MPC85XX
258 Support for error detection and correction on the Freescale 258 Support for error detection and correction on the Freescale
259 MPC8349, MPC8560, MPC8540, MPC8548, T4240 259 MPC8349, MPC8560, MPC8540, MPC8548, T4240
260 260
261config EDAC_LAYERSCAPE
262 tristate "Freescale Layerscape DDR"
263 depends on EDAC_MM_EDAC && ARCH_LAYERSCAPE
264 help
265 Support for error detection and correction on Freescale memory
266 controllers on Layerscape SoCs.
267
261config EDAC_MV64X60 268config EDAC_MV64X60
262 tristate "Marvell MV64x60" 269 tristate "Marvell MV64x60"
263 depends on EDAC_MM_EDAC && MV64X60 270 depends on EDAC_MM_EDAC && MV64X60
diff --git a/drivers/edac/Makefile b/drivers/edac/Makefile
index ee047a415722..910dc83d3629 100644
--- a/drivers/edac/Makefile
+++ b/drivers/edac/Makefile
@@ -54,6 +54,9 @@ obj-$(CONFIG_EDAC_PASEMI) += pasemi_edac.o
54mpc85xx_edac_mod-y := fsl_ddr_edac.o mpc85xx_edac.o 54mpc85xx_edac_mod-y := fsl_ddr_edac.o mpc85xx_edac.o
55obj-$(CONFIG_EDAC_MPC85XX) += mpc85xx_edac_mod.o 55obj-$(CONFIG_EDAC_MPC85XX) += mpc85xx_edac_mod.o
56 56
57layerscape_edac_mod-y := fsl_ddr_edac.o layerscape_edac.o
58obj-$(CONFIG_EDAC_LAYERSCAPE) += layerscape_edac_mod.o
59
57obj-$(CONFIG_EDAC_MV64X60) += mv64x60_edac.o 60obj-$(CONFIG_EDAC_MV64X60) += mv64x60_edac.o
58obj-$(CONFIG_EDAC_CELL) += cell_edac.o 61obj-$(CONFIG_EDAC_CELL) += cell_edac.o
59obj-$(CONFIG_EDAC_PPC4XX) += ppc4xx_edac.o 62obj-$(CONFIG_EDAC_PPC4XX) += ppc4xx_edac.o
diff --git a/drivers/edac/fsl_ddr_edac.c b/drivers/edac/fsl_ddr_edac.c
index d8ce1f635c38..afade14c3e93 100644
--- a/drivers/edac/fsl_ddr_edac.c
+++ b/drivers/edac/fsl_ddr_edac.c
@@ -26,6 +26,7 @@
26 26
27#include <linux/of_platform.h> 27#include <linux/of_platform.h>
28#include <linux/of_device.h> 28#include <linux/of_device.h>
29#include <linux/of_address.h>
29#include "edac_module.h" 30#include "edac_module.h"
30#include "edac_core.h" 31#include "edac_core.h"
31#include "fsl_ddr_edac.h" 32#include "fsl_ddr_edac.h"
@@ -478,7 +479,6 @@ int fsl_mc_err_probe(struct platform_device *op)
478 479
479 pdata = mci->pvt_info; 480 pdata = mci->pvt_info;
480 pdata->name = "fsl_mc_err"; 481 pdata->name = "fsl_mc_err";
481 pdata->irq = NO_IRQ;
482 mci->pdev = &op->dev; 482 mci->pdev = &op->dev;
483 pdata->edac_idx = edac_mc_idx++; 483 pdata->edac_idx = edac_mc_idx++;
484 dev_set_drvdata(mci->pdev, mci); 484 dev_set_drvdata(mci->pdev, mci);
diff --git a/drivers/edac/layerscape_edac.c b/drivers/edac/layerscape_edac.c
new file mode 100644
index 000000000000..6c59d897ad12
--- /dev/null
+++ b/drivers/edac/layerscape_edac.c
@@ -0,0 +1,73 @@
1/*
2 * Freescale Memory Controller kernel module
3 *
4 * Author: York Sun <york.sun@nxp.com>
5 *
6 * Copyright 2016 NXP Semiconductor
7 *
8 * Derived from mpc85xx_edac.c
9 * Author: Dave Jiang <djiang@mvista.com>
10 *
11 * 2006-2007 (c) MontaVista Software, Inc. This file is licensed under
12 * the terms of the GNU General Public License version 2. This program
13 * is licensed "as is" without any warranty of any kind, whether express
14 * or implied.
15 */
16
17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
19#include "edac_core.h"
20#include "fsl_ddr_edac.h"
21
22static const struct of_device_id fsl_ddr_mc_err_of_match[] = {
23 { .compatible = "fsl,qoriq-memory-controller", },
24 {},
25};
26MODULE_DEVICE_TABLE(of, fsl_ddr_mc_err_of_match);
27
28static struct platform_driver fsl_ddr_mc_err_driver = {
29 .probe = fsl_mc_err_probe,
30 .remove = fsl_mc_err_remove,
31 .driver = {
32 .name = "fsl_ddr_mc_err",
33 .of_match_table = fsl_ddr_mc_err_of_match,
34 },
35};
36
37static int __init fsl_ddr_mc_init(void)
38{
39 int res;
40
41 /* make sure error reporting method is sane */
42 switch (edac_op_state) {
43 case EDAC_OPSTATE_POLL:
44 case EDAC_OPSTATE_INT:
45 break;
46 default:
47 edac_op_state = EDAC_OPSTATE_INT;
48 break;
49 }
50
51 res = platform_driver_register(&fsl_ddr_mc_err_driver);
52 if (res) {
53 pr_err("MC fails to register\n");
54 return res;
55 }
56
57 return 0;
58}
59
60module_init(fsl_ddr_mc_init);
61
62static void __exit fsl_ddr_mc_exit(void)
63{
64 platform_driver_unregister(&fsl_ddr_mc_err_driver);
65}
66
67module_exit(fsl_ddr_mc_exit);
68
69MODULE_LICENSE("GPL");
70MODULE_AUTHOR("NXP Semiconductor");
71module_param(edac_op_state, int, 0444);
72MODULE_PARM_DESC(edac_op_state,
73 "EDAC Error Reporting state: 0=Poll, 2=Interrupt");