aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac/altera_edac.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/edac/altera_edac.c')
-rw-r--r--drivers/edac/altera_edac.c381
1 files changed, 242 insertions, 139 deletions
diff --git a/drivers/edac/altera_edac.c b/drivers/edac/altera_edac.c
index 3c4929fda9d5..23ef0917483c 100644
--- a/drivers/edac/altera_edac.c
+++ b/drivers/edac/altera_edac.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright Altera Corporation (C) 2014. All rights reserved. 2 * Copyright Altera Corporation (C) 2014-2015. All rights reserved.
3 * Copyright 2011-2012 Calxeda, Inc. 3 * Copyright 2011-2012 Calxeda, Inc.
4 * 4 *
5 * This program is free software; you can redistribute it and/or modify it 5 * This program is free software; you can redistribute it and/or modify it
@@ -28,113 +28,92 @@
28#include <linux/types.h> 28#include <linux/types.h>
29#include <linux/uaccess.h> 29#include <linux/uaccess.h>
30 30
31#include "altera_edac.h"
31#include "edac_core.h" 32#include "edac_core.h"
32#include "edac_module.h" 33#include "edac_module.h"
33 34
34#define EDAC_MOD_STR "altera_edac" 35#define EDAC_MOD_STR "altera_edac"
35#define EDAC_VERSION "1" 36#define EDAC_VERSION "1"
36 37
37/* SDRAM Controller CtrlCfg Register */ 38static const struct altr_sdram_prv_data c5_data = {
38#define CTLCFG_OFST 0x00 39 .ecc_ctrl_offset = CV_CTLCFG_OFST,
39 40 .ecc_ctl_en_mask = CV_CTLCFG_ECC_AUTO_EN,
40/* SDRAM Controller CtrlCfg Register Bit Masks */ 41 .ecc_stat_offset = CV_DRAMSTS_OFST,
41#define CTLCFG_ECC_EN 0x400 42 .ecc_stat_ce_mask = CV_DRAMSTS_SBEERR,
42#define CTLCFG_ECC_CORR_EN 0x800 43 .ecc_stat_ue_mask = CV_DRAMSTS_DBEERR,
43#define CTLCFG_GEN_SB_ERR 0x2000 44 .ecc_saddr_offset = CV_ERRADDR_OFST,
44#define CTLCFG_GEN_DB_ERR 0x4000 45 .ecc_daddr_offset = CV_ERRADDR_OFST,
45 46 .ecc_cecnt_offset = CV_SBECOUNT_OFST,
46#define CTLCFG_ECC_AUTO_EN (CTLCFG_ECC_EN | \ 47 .ecc_uecnt_offset = CV_DBECOUNT_OFST,
47 CTLCFG_ECC_CORR_EN) 48 .ecc_irq_en_offset = CV_DRAMINTR_OFST,
48 49 .ecc_irq_en_mask = CV_DRAMINTR_INTREN,
49/* SDRAM Controller Address Width Register */ 50 .ecc_irq_clr_offset = CV_DRAMINTR_OFST,
50#define DRAMADDRW_OFST 0x2C 51 .ecc_irq_clr_mask = (CV_DRAMINTR_INTRCLR | CV_DRAMINTR_INTREN),
51 52 .ecc_cnt_rst_offset = CV_DRAMINTR_OFST,
52/* SDRAM Controller Address Widths Field Register */ 53 .ecc_cnt_rst_mask = CV_DRAMINTR_INTRCLR,
53#define DRAMADDRW_COLBIT_MASK 0x001F 54#ifdef CONFIG_EDAC_DEBUG
54#define DRAMADDRW_COLBIT_SHIFT 0 55 .ce_ue_trgr_offset = CV_CTLCFG_OFST,
55#define DRAMADDRW_ROWBIT_MASK 0x03E0 56 .ce_set_mask = CV_CTLCFG_GEN_SB_ERR,
56#define DRAMADDRW_ROWBIT_SHIFT 5 57 .ue_set_mask = CV_CTLCFG_GEN_DB_ERR,
57#define DRAMADDRW_BANKBIT_MASK 0x1C00 58#endif
58#define DRAMADDRW_BANKBIT_SHIFT 10 59};
59#define DRAMADDRW_CSBIT_MASK 0xE000
60#define DRAMADDRW_CSBIT_SHIFT 13
61
62/* SDRAM Controller Interface Data Width Register */
63#define DRAMIFWIDTH_OFST 0x30
64
65/* SDRAM Controller Interface Data Width Defines */
66#define DRAMIFWIDTH_16B_ECC 24
67#define DRAMIFWIDTH_32B_ECC 40
68
69/* SDRAM Controller DRAM Status Register */
70#define DRAMSTS_OFST 0x38
71
72/* SDRAM Controller DRAM Status Register Bit Masks */
73#define DRAMSTS_SBEERR 0x04
74#define DRAMSTS_DBEERR 0x08
75#define DRAMSTS_CORR_DROP 0x10
76
77/* SDRAM Controller DRAM IRQ Register */
78#define DRAMINTR_OFST 0x3C
79
80/* SDRAM Controller DRAM IRQ Register Bit Masks */
81#define DRAMINTR_INTREN 0x01
82#define DRAMINTR_SBEMASK 0x02
83#define DRAMINTR_DBEMASK 0x04
84#define DRAMINTR_CORRDROPMASK 0x08
85#define DRAMINTR_INTRCLR 0x10
86
87/* SDRAM Controller Single Bit Error Count Register */
88#define SBECOUNT_OFST 0x40
89
90/* SDRAM Controller Single Bit Error Count Register Bit Masks */
91#define SBECOUNT_MASK 0x0F
92
93/* SDRAM Controller Double Bit Error Count Register */
94#define DBECOUNT_OFST 0x44
95
96/* SDRAM Controller Double Bit Error Count Register Bit Masks */
97#define DBECOUNT_MASK 0x0F
98
99/* SDRAM Controller ECC Error Address Register */
100#define ERRADDR_OFST 0x48
101
102/* SDRAM Controller ECC Error Address Register Bit Masks */
103#define ERRADDR_MASK 0xFFFFFFFF
104 60
105/* Altera SDRAM Memory Controller data */ 61static const struct altr_sdram_prv_data a10_data = {
106struct altr_sdram_mc_data { 62 .ecc_ctrl_offset = A10_ECCCTRL1_OFST,
107 struct regmap *mc_vbase; 63 .ecc_ctl_en_mask = A10_ECCCTRL1_ECC_EN,
64 .ecc_stat_offset = A10_INTSTAT_OFST,
65 .ecc_stat_ce_mask = A10_INTSTAT_SBEERR,
66 .ecc_stat_ue_mask = A10_INTSTAT_DBEERR,
67 .ecc_saddr_offset = A10_SERRADDR_OFST,
68 .ecc_daddr_offset = A10_DERRADDR_OFST,
69 .ecc_irq_en_offset = A10_ERRINTEN_OFST,
70 .ecc_irq_en_mask = A10_ECC_IRQ_EN_MASK,
71 .ecc_irq_clr_offset = A10_INTSTAT_OFST,
72 .ecc_irq_clr_mask = (A10_INTSTAT_SBEERR | A10_INTSTAT_DBEERR),
73 .ecc_cnt_rst_offset = A10_ECCCTRL1_OFST,
74 .ecc_cnt_rst_mask = A10_ECC_CNT_RESET_MASK,
75#ifdef CONFIG_EDAC_DEBUG
76 .ce_ue_trgr_offset = A10_DIAGINTTEST_OFST,
77 .ce_set_mask = A10_DIAGINT_TSERRA_MASK,
78 .ue_set_mask = A10_DIAGINT_TDERRA_MASK,
79#endif
108}; 80};
109 81
110static irqreturn_t altr_sdram_mc_err_handler(int irq, void *dev_id) 82static irqreturn_t altr_sdram_mc_err_handler(int irq, void *dev_id)
111{ 83{
112 struct mem_ctl_info *mci = dev_id; 84 struct mem_ctl_info *mci = dev_id;
113 struct altr_sdram_mc_data *drvdata = mci->pvt_info; 85 struct altr_sdram_mc_data *drvdata = mci->pvt_info;
114 u32 status, err_count, err_addr; 86 const struct altr_sdram_prv_data *priv = drvdata->data;
87 u32 status, err_count = 1, err_addr;
115 88
116 /* Error Address is shared by both SBE & DBE */ 89 regmap_read(drvdata->mc_vbase, priv->ecc_stat_offset, &status);
117 regmap_read(drvdata->mc_vbase, ERRADDR_OFST, &err_addr);
118 90
119 regmap_read(drvdata->mc_vbase, DRAMSTS_OFST, &status); 91 if (status & priv->ecc_stat_ue_mask) {
120 92 regmap_read(drvdata->mc_vbase, priv->ecc_daddr_offset,
121 if (status & DRAMSTS_DBEERR) { 93 &err_addr);
122 regmap_read(drvdata->mc_vbase, DBECOUNT_OFST, &err_count); 94 if (priv->ecc_uecnt_offset)
95 regmap_read(drvdata->mc_vbase, priv->ecc_uecnt_offset,
96 &err_count);
123 panic("\nEDAC: [%d Uncorrectable errors @ 0x%08X]\n", 97 panic("\nEDAC: [%d Uncorrectable errors @ 0x%08X]\n",
124 err_count, err_addr); 98 err_count, err_addr);
125 } 99 }
126 if (status & DRAMSTS_SBEERR) { 100 if (status & priv->ecc_stat_ce_mask) {
127 regmap_read(drvdata->mc_vbase, SBECOUNT_OFST, &err_count); 101 regmap_read(drvdata->mc_vbase, priv->ecc_saddr_offset,
102 &err_addr);
103 if (priv->ecc_uecnt_offset)
104 regmap_read(drvdata->mc_vbase, priv->ecc_cecnt_offset,
105 &err_count);
128 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, err_count, 106 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, err_count,
129 err_addr >> PAGE_SHIFT, 107 err_addr >> PAGE_SHIFT,
130 err_addr & ~PAGE_MASK, 0, 108 err_addr & ~PAGE_MASK, 0,
131 0, 0, -1, mci->ctl_name, ""); 109 0, 0, -1, mci->ctl_name, "");
132 } 110 /* Clear IRQ to resume */
133 111 regmap_write(drvdata->mc_vbase, priv->ecc_irq_clr_offset,
134 regmap_write(drvdata->mc_vbase, DRAMINTR_OFST, 112 priv->ecc_irq_clr_mask);
135 (DRAMINTR_INTRCLR | DRAMINTR_INTREN));
136 113
137 return IRQ_HANDLED; 114 return IRQ_HANDLED;
115 }
116 return IRQ_NONE;
138} 117}
139 118
140#ifdef CONFIG_EDAC_DEBUG 119#ifdef CONFIG_EDAC_DEBUG
@@ -144,6 +123,7 @@ static ssize_t altr_sdr_mc_err_inject_write(struct file *file,
144{ 123{
145 struct mem_ctl_info *mci = file->private_data; 124 struct mem_ctl_info *mci = file->private_data;
146 struct altr_sdram_mc_data *drvdata = mci->pvt_info; 125 struct altr_sdram_mc_data *drvdata = mci->pvt_info;
126 const struct altr_sdram_prv_data *priv = drvdata->data;
147 u32 *ptemp; 127 u32 *ptemp;
148 dma_addr_t dma_handle; 128 dma_addr_t dma_handle;
149 u32 reg, read_reg; 129 u32 reg, read_reg;
@@ -156,8 +136,9 @@ static ssize_t altr_sdr_mc_err_inject_write(struct file *file,
156 return -ENOMEM; 136 return -ENOMEM;
157 } 137 }
158 138
159 regmap_read(drvdata->mc_vbase, CTLCFG_OFST, &read_reg); 139 regmap_read(drvdata->mc_vbase, priv->ce_ue_trgr_offset,
160 read_reg &= ~(CTLCFG_GEN_SB_ERR | CTLCFG_GEN_DB_ERR); 140 &read_reg);
141 read_reg &= ~(priv->ce_set_mask | priv->ue_set_mask);
161 142
162 /* Error are injected by writing a word while the SBE or DBE 143 /* Error are injected by writing a word while the SBE or DBE
163 * bit in the CTLCFG register is set. Reading the word will 144 * bit in the CTLCFG register is set. Reading the word will
@@ -166,20 +147,20 @@ static ssize_t altr_sdr_mc_err_inject_write(struct file *file,
166 if (count == 3) { 147 if (count == 3) {
167 edac_printk(KERN_ALERT, EDAC_MC, 148 edac_printk(KERN_ALERT, EDAC_MC,
168 "Inject Double bit error\n"); 149 "Inject Double bit error\n");
169 regmap_write(drvdata->mc_vbase, CTLCFG_OFST, 150 regmap_write(drvdata->mc_vbase, priv->ce_ue_trgr_offset,
170 (read_reg | CTLCFG_GEN_DB_ERR)); 151 (read_reg | priv->ue_set_mask));
171 } else { 152 } else {
172 edac_printk(KERN_ALERT, EDAC_MC, 153 edac_printk(KERN_ALERT, EDAC_MC,
173 "Inject Single bit error\n"); 154 "Inject Single bit error\n");
174 regmap_write(drvdata->mc_vbase, CTLCFG_OFST, 155 regmap_write(drvdata->mc_vbase, priv->ce_ue_trgr_offset,
175 (read_reg | CTLCFG_GEN_SB_ERR)); 156 (read_reg | priv->ce_set_mask));
176 } 157 }
177 158
178 ptemp[0] = 0x5A5A5A5A; 159 ptemp[0] = 0x5A5A5A5A;
179 ptemp[1] = 0xA5A5A5A5; 160 ptemp[1] = 0xA5A5A5A5;
180 161
181 /* Clear the error injection bits */ 162 /* Clear the error injection bits */
182 regmap_write(drvdata->mc_vbase, CTLCFG_OFST, read_reg); 163 regmap_write(drvdata->mc_vbase, priv->ce_ue_trgr_offset, read_reg);
183 /* Ensure it has been written out */ 164 /* Ensure it has been written out */
184 wmb(); 165 wmb();
185 166
@@ -219,50 +200,106 @@ static void altr_sdr_mc_create_debugfs_nodes(struct mem_ctl_info *mci)
219{} 200{}
220#endif 201#endif
221 202
222/* Get total memory size in bytes */ 203/* Get total memory size from Open Firmware DTB */
223static u32 altr_sdram_get_total_mem_size(struct regmap *mc_vbase) 204static unsigned long get_total_mem(void)
224{ 205{
225 u32 size, read_reg, row, bank, col, cs, width; 206 struct device_node *np = NULL;
226 207 const unsigned int *reg, *reg_end;
227 if (regmap_read(mc_vbase, DRAMADDRW_OFST, &read_reg) < 0) 208 int len, sw, aw;
228 return 0; 209 unsigned long start, size, total_mem = 0;
229 210
230 if (regmap_read(mc_vbase, DRAMIFWIDTH_OFST, &width) < 0) 211 for_each_node_by_type(np, "memory") {
231 return 0; 212 aw = of_n_addr_cells(np);
232 213 sw = of_n_size_cells(np);
233 col = (read_reg & DRAMADDRW_COLBIT_MASK) >> 214 reg = (const unsigned int *)of_get_property(np, "reg", &len);
234 DRAMADDRW_COLBIT_SHIFT; 215 reg_end = reg + (len / sizeof(u32));
235 row = (read_reg & DRAMADDRW_ROWBIT_MASK) >> 216
236 DRAMADDRW_ROWBIT_SHIFT; 217 total_mem = 0;
237 bank = (read_reg & DRAMADDRW_BANKBIT_MASK) >> 218 do {
238 DRAMADDRW_BANKBIT_SHIFT; 219 start = of_read_number(reg, aw);
239 cs = (read_reg & DRAMADDRW_CSBIT_MASK) >> 220 reg += aw;
240 DRAMADDRW_CSBIT_SHIFT; 221 size = of_read_number(reg, sw);
241 222 reg += sw;
242 /* Correct for ECC as its not addressible */ 223 total_mem += size;
243 if (width == DRAMIFWIDTH_32B_ECC) 224 } while (reg < reg_end);
244 width = 32; 225 }
245 if (width == DRAMIFWIDTH_16B_ECC) 226 edac_dbg(0, "total_mem 0x%lx\n", total_mem);
246 width = 16; 227 return total_mem;
247 228}
248 /* calculate the SDRAM size base on this info */ 229
249 size = 1 << (row + bank + col); 230static const struct of_device_id altr_sdram_ctrl_of_match[] = {
250 size = size * cs * (width / 8); 231 { .compatible = "altr,sdram-edac", .data = (void *)&c5_data},
251 return size; 232 { .compatible = "altr,sdram-edac-a10", .data = (void *)&a10_data},
233 {},
234};
235MODULE_DEVICE_TABLE(of, altr_sdram_ctrl_of_match);
236
237static int a10_init(struct regmap *mc_vbase)
238{
239 if (regmap_update_bits(mc_vbase, A10_INTMODE_OFST,
240 A10_INTMODE_SB_INT, A10_INTMODE_SB_INT)) {
241 edac_printk(KERN_ERR, EDAC_MC,
242 "Error setting SB IRQ mode\n");
243 return -ENODEV;
244 }
245
246 if (regmap_write(mc_vbase, A10_SERRCNTREG_OFST, 1)) {
247 edac_printk(KERN_ERR, EDAC_MC,
248 "Error setting trigger count\n");
249 return -ENODEV;
250 }
251
252 return 0;
253}
254
255static int a10_unmask_irq(struct platform_device *pdev, u32 mask)
256{
257 void __iomem *sm_base;
258 int ret = 0;
259
260 if (!request_mem_region(A10_SYMAN_INTMASK_CLR, sizeof(u32),
261 dev_name(&pdev->dev))) {
262 edac_printk(KERN_ERR, EDAC_MC,
263 "Unable to request mem region\n");
264 return -EBUSY;
265 }
266
267 sm_base = ioremap(A10_SYMAN_INTMASK_CLR, sizeof(u32));
268 if (!sm_base) {
269 edac_printk(KERN_ERR, EDAC_MC,
270 "Unable to ioremap device\n");
271
272 ret = -ENOMEM;
273 goto release;
274 }
275
276 iowrite32(mask, sm_base);
277
278 iounmap(sm_base);
279
280release:
281 release_mem_region(A10_SYMAN_INTMASK_CLR, sizeof(u32));
282
283 return ret;
252} 284}
253 285
254static int altr_sdram_probe(struct platform_device *pdev) 286static int altr_sdram_probe(struct platform_device *pdev)
255{ 287{
288 const struct of_device_id *id;
256 struct edac_mc_layer layers[2]; 289 struct edac_mc_layer layers[2];
257 struct mem_ctl_info *mci; 290 struct mem_ctl_info *mci;
258 struct altr_sdram_mc_data *drvdata; 291 struct altr_sdram_mc_data *drvdata;
292 const struct altr_sdram_prv_data *priv;
259 struct regmap *mc_vbase; 293 struct regmap *mc_vbase;
260 struct dimm_info *dimm; 294 struct dimm_info *dimm;
261 u32 read_reg, mem_size; 295 u32 read_reg;
262 int irq; 296 int irq, irq2, res = 0;
263 int res = 0; 297 unsigned long mem_size, irqflags = 0;
298
299 id = of_match_device(altr_sdram_ctrl_of_match, &pdev->dev);
300 if (!id)
301 return -ENODEV;
264 302
265 /* Validate the SDRAM controller has ECC enabled */
266 /* Grab the register range from the sdr controller in device tree */ 303 /* Grab the register range from the sdr controller in device tree */
267 mc_vbase = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, 304 mc_vbase = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
268 "altr,sdr-syscon"); 305 "altr,sdr-syscon");
@@ -272,25 +309,46 @@ static int altr_sdram_probe(struct platform_device *pdev)
272 return -ENODEV; 309 return -ENODEV;
273 } 310 }
274 311
275 if (regmap_read(mc_vbase, CTLCFG_OFST, &read_reg) || 312 /* Check specific dependencies for the module */
276 ((read_reg & CTLCFG_ECC_AUTO_EN) != CTLCFG_ECC_AUTO_EN)) { 313 priv = of_match_node(altr_sdram_ctrl_of_match,
314 pdev->dev.of_node)->data;
315
316 /* Validate the SDRAM controller has ECC enabled */
317 if (regmap_read(mc_vbase, priv->ecc_ctrl_offset, &read_reg) ||
318 ((read_reg & priv->ecc_ctl_en_mask) != priv->ecc_ctl_en_mask)) {
277 edac_printk(KERN_ERR, EDAC_MC, 319 edac_printk(KERN_ERR, EDAC_MC,
278 "No ECC/ECC disabled [0x%08X]\n", read_reg); 320 "No ECC/ECC disabled [0x%08X]\n", read_reg);
279 return -ENODEV; 321 return -ENODEV;
280 } 322 }
281 323
282 /* Grab memory size from device tree. */ 324 /* Grab memory size from device tree. */
283 mem_size = altr_sdram_get_total_mem_size(mc_vbase); 325 mem_size = get_total_mem();
284 if (!mem_size) { 326 if (!mem_size) {
327 edac_printk(KERN_ERR, EDAC_MC, "Unable to calculate memory size\n");
328 return -ENODEV;
329 }
330
331 /* Ensure the SDRAM Interrupt is disabled */
332 if (regmap_update_bits(mc_vbase, priv->ecc_irq_en_offset,
333 priv->ecc_irq_en_mask, 0)) {
334 edac_printk(KERN_ERR, EDAC_MC,
335 "Error disabling SDRAM ECC IRQ\n");
336 return -ENODEV;
337 }
338
339 /* Toggle to clear the SDRAM Error count */
340 if (regmap_update_bits(mc_vbase, priv->ecc_cnt_rst_offset,
341 priv->ecc_cnt_rst_mask,
342 priv->ecc_cnt_rst_mask)) {
285 edac_printk(KERN_ERR, EDAC_MC, 343 edac_printk(KERN_ERR, EDAC_MC,
286 "Unable to calculate memory size\n"); 344 "Error clearing SDRAM ECC count\n");
287 return -ENODEV; 345 return -ENODEV;
288 } 346 }
289 347
290 /* Ensure the SDRAM Interrupt is disabled and cleared */ 348 if (regmap_update_bits(mc_vbase, priv->ecc_cnt_rst_offset,
291 if (regmap_write(mc_vbase, DRAMINTR_OFST, DRAMINTR_INTRCLR)) { 349 priv->ecc_cnt_rst_mask, 0)) {
292 edac_printk(KERN_ERR, EDAC_MC, 350 edac_printk(KERN_ERR, EDAC_MC,
293 "Error clearing SDRAM ECC IRQ\n"); 351 "Error clearing SDRAM ECC count\n");
294 return -ENODEV; 352 return -ENODEV;
295 } 353 }
296 354
@@ -301,6 +359,9 @@ static int altr_sdram_probe(struct platform_device *pdev)
301 return -ENODEV; 359 return -ENODEV;
302 } 360 }
303 361
362 /* Arria10 has a 2nd IRQ */
363 irq2 = platform_get_irq(pdev, 1);
364
304 layers[0].type = EDAC_MC_LAYER_CHIP_SELECT; 365 layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
305 layers[0].size = 1; 366 layers[0].size = 1;
306 layers[0].is_virt_csrow = true; 367 layers[0].is_virt_csrow = true;
@@ -315,9 +376,12 @@ static int altr_sdram_probe(struct platform_device *pdev)
315 mci->pdev = &pdev->dev; 376 mci->pdev = &pdev->dev;
316 drvdata = mci->pvt_info; 377 drvdata = mci->pvt_info;
317 drvdata->mc_vbase = mc_vbase; 378 drvdata->mc_vbase = mc_vbase;
379 drvdata->data = priv;
318 platform_set_drvdata(pdev, mci); 380 platform_set_drvdata(pdev, mci);
319 381
320 if (!devres_open_group(&pdev->dev, NULL, GFP_KERNEL)) { 382 if (!devres_open_group(&pdev->dev, NULL, GFP_KERNEL)) {
383 edac_printk(KERN_ERR, EDAC_MC,
384 "Unable to get managed device resource\n");
321 res = -ENOMEM; 385 res = -ENOMEM;
322 goto free; 386 goto free;
323 } 387 }
@@ -342,8 +406,32 @@ static int altr_sdram_probe(struct platform_device *pdev)
342 if (res < 0) 406 if (res < 0)
343 goto err; 407 goto err;
344 408
409 /* Only the Arria10 has separate IRQs */
410 if (irq2 > 0) {
411 /* Arria10 specific initialization */
412 res = a10_init(mc_vbase);
413 if (res < 0)
414 goto err2;
415
416 res = devm_request_irq(&pdev->dev, irq2,
417 altr_sdram_mc_err_handler,
418 IRQF_SHARED, dev_name(&pdev->dev), mci);
419 if (res < 0) {
420 edac_mc_printk(mci, KERN_ERR,
421 "Unable to request irq %d\n", irq2);
422 res = -ENODEV;
423 goto err2;
424 }
425
426 res = a10_unmask_irq(pdev, A10_DDR0_IRQ_MASK);
427 if (res < 0)
428 goto err2;
429
430 irqflags = IRQF_SHARED;
431 }
432
345 res = devm_request_irq(&pdev->dev, irq, altr_sdram_mc_err_handler, 433 res = devm_request_irq(&pdev->dev, irq, altr_sdram_mc_err_handler,
346 0, dev_name(&pdev->dev), mci); 434 irqflags, dev_name(&pdev->dev), mci);
347 if (res < 0) { 435 if (res < 0) {
348 edac_mc_printk(mci, KERN_ERR, 436 edac_mc_printk(mci, KERN_ERR,
349 "Unable to request irq %d\n", irq); 437 "Unable to request irq %d\n", irq);
@@ -351,8 +439,9 @@ static int altr_sdram_probe(struct platform_device *pdev)
351 goto err2; 439 goto err2;
352 } 440 }
353 441
354 if (regmap_write(drvdata->mc_vbase, DRAMINTR_OFST, 442 /* Infrastructure ready - enable the IRQ */
355 (DRAMINTR_INTRCLR | DRAMINTR_INTREN))) { 443 if (regmap_update_bits(drvdata->mc_vbase, priv->ecc_irq_en_offset,
444 priv->ecc_irq_en_mask, priv->ecc_irq_en_mask)) {
356 edac_mc_printk(mci, KERN_ERR, 445 edac_mc_printk(mci, KERN_ERR,
357 "Error enabling SDRAM ECC IRQ\n"); 446 "Error enabling SDRAM ECC IRQ\n");
358 res = -ENODEV; 447 res = -ENODEV;
@@ -388,17 +477,31 @@ static int altr_sdram_remove(struct platform_device *pdev)
388 return 0; 477 return 0;
389} 478}
390 479
391static const struct of_device_id altr_sdram_ctrl_of_match[] = { 480/*
392 { .compatible = "altr,sdram-edac", }, 481 * If you want to suspend, need to disable EDAC by removing it
393 {}, 482 * from the device tree or defconfig.
483 */
484#ifdef CONFIG_PM
485static int altr_sdram_prepare(struct device *dev)
486{
487 pr_err("Suspend not allowed when EDAC is enabled.\n");
488
489 return -EPERM;
490}
491
492static const struct dev_pm_ops altr_sdram_pm_ops = {
493 .prepare = altr_sdram_prepare,
394}; 494};
395MODULE_DEVICE_TABLE(of, altr_sdram_ctrl_of_match); 495#endif
396 496
397static struct platform_driver altr_sdram_edac_driver = { 497static struct platform_driver altr_sdram_edac_driver = {
398 .probe = altr_sdram_probe, 498 .probe = altr_sdram_probe,
399 .remove = altr_sdram_remove, 499 .remove = altr_sdram_remove,
400 .driver = { 500 .driver = {
401 .name = "altr_sdram_edac", 501 .name = "altr_sdram_edac",
502#ifdef CONFIG_PM
503 .pm = &altr_sdram_pm_ops,
504#endif
402 .of_match_table = altr_sdram_ctrl_of_match, 505 .of_match_table = altr_sdram_ctrl_of_match,
403 }, 506 },
404}; 507};