0001
0002
0003
0004
0005
0006
0007
0008 #include <asm/cacheflush.h>
0009 #include <linux/ctype.h>
0010 #include <linux/delay.h>
0011 #include <linux/edac.h>
0012 #include <linux/firmware/intel/stratix10-smc.h>
0013 #include <linux/genalloc.h>
0014 #include <linux/interrupt.h>
0015 #include <linux/irqchip/chained_irq.h>
0016 #include <linux/kernel.h>
0017 #include <linux/mfd/altera-sysmgr.h>
0018 #include <linux/mfd/syscon.h>
0019 #include <linux/notifier.h>
0020 #include <linux/of_address.h>
0021 #include <linux/of_irq.h>
0022 #include <linux/of_platform.h>
0023 #include <linux/panic_notifier.h>
0024 #include <linux/platform_device.h>
0025 #include <linux/regmap.h>
0026 #include <linux/types.h>
0027 #include <linux/uaccess.h>
0028
0029 #include "altera_edac.h"
0030 #include "edac_module.h"
0031
0032 #define EDAC_MOD_STR "altera_edac"
0033 #define EDAC_DEVICE "Altera"
0034
0035 #ifdef CONFIG_EDAC_ALTERA_SDRAM
0036 static const struct altr_sdram_prv_data c5_data = {
0037 .ecc_ctrl_offset = CV_CTLCFG_OFST,
0038 .ecc_ctl_en_mask = CV_CTLCFG_ECC_AUTO_EN,
0039 .ecc_stat_offset = CV_DRAMSTS_OFST,
0040 .ecc_stat_ce_mask = CV_DRAMSTS_SBEERR,
0041 .ecc_stat_ue_mask = CV_DRAMSTS_DBEERR,
0042 .ecc_saddr_offset = CV_ERRADDR_OFST,
0043 .ecc_daddr_offset = CV_ERRADDR_OFST,
0044 .ecc_cecnt_offset = CV_SBECOUNT_OFST,
0045 .ecc_uecnt_offset = CV_DBECOUNT_OFST,
0046 .ecc_irq_en_offset = CV_DRAMINTR_OFST,
0047 .ecc_irq_en_mask = CV_DRAMINTR_INTREN,
0048 .ecc_irq_clr_offset = CV_DRAMINTR_OFST,
0049 .ecc_irq_clr_mask = (CV_DRAMINTR_INTRCLR | CV_DRAMINTR_INTREN),
0050 .ecc_cnt_rst_offset = CV_DRAMINTR_OFST,
0051 .ecc_cnt_rst_mask = CV_DRAMINTR_INTRCLR,
0052 .ce_ue_trgr_offset = CV_CTLCFG_OFST,
0053 .ce_set_mask = CV_CTLCFG_GEN_SB_ERR,
0054 .ue_set_mask = CV_CTLCFG_GEN_DB_ERR,
0055 };
0056
0057 static const struct altr_sdram_prv_data a10_data = {
0058 .ecc_ctrl_offset = A10_ECCCTRL1_OFST,
0059 .ecc_ctl_en_mask = A10_ECCCTRL1_ECC_EN,
0060 .ecc_stat_offset = A10_INTSTAT_OFST,
0061 .ecc_stat_ce_mask = A10_INTSTAT_SBEERR,
0062 .ecc_stat_ue_mask = A10_INTSTAT_DBEERR,
0063 .ecc_saddr_offset = A10_SERRADDR_OFST,
0064 .ecc_daddr_offset = A10_DERRADDR_OFST,
0065 .ecc_irq_en_offset = A10_ERRINTEN_OFST,
0066 .ecc_irq_en_mask = A10_ECC_IRQ_EN_MASK,
0067 .ecc_irq_clr_offset = A10_INTSTAT_OFST,
0068 .ecc_irq_clr_mask = (A10_INTSTAT_SBEERR | A10_INTSTAT_DBEERR),
0069 .ecc_cnt_rst_offset = A10_ECCCTRL1_OFST,
0070 .ecc_cnt_rst_mask = A10_ECC_CNT_RESET_MASK,
0071 .ce_ue_trgr_offset = A10_DIAGINTTEST_OFST,
0072 .ce_set_mask = A10_DIAGINT_TSERRA_MASK,
0073 .ue_set_mask = A10_DIAGINT_TDERRA_MASK,
0074 };
0075
0076
0077
0078
0079
0080 static irqreturn_t altr_sdram_mc_err_handler(int irq, void *dev_id)
0081 {
0082 struct mem_ctl_info *mci = dev_id;
0083 struct altr_sdram_mc_data *drvdata = mci->pvt_info;
0084 const struct altr_sdram_prv_data *priv = drvdata->data;
0085 u32 status, err_count = 1, err_addr;
0086
0087 regmap_read(drvdata->mc_vbase, priv->ecc_stat_offset, &status);
0088
0089 if (status & priv->ecc_stat_ue_mask) {
0090 regmap_read(drvdata->mc_vbase, priv->ecc_daddr_offset,
0091 &err_addr);
0092 if (priv->ecc_uecnt_offset)
0093 regmap_read(drvdata->mc_vbase, priv->ecc_uecnt_offset,
0094 &err_count);
0095 panic("\nEDAC: [%d Uncorrectable errors @ 0x%08X]\n",
0096 err_count, err_addr);
0097 }
0098 if (status & priv->ecc_stat_ce_mask) {
0099 regmap_read(drvdata->mc_vbase, priv->ecc_saddr_offset,
0100 &err_addr);
0101 if (priv->ecc_uecnt_offset)
0102 regmap_read(drvdata->mc_vbase, priv->ecc_cecnt_offset,
0103 &err_count);
0104 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, err_count,
0105 err_addr >> PAGE_SHIFT,
0106 err_addr & ~PAGE_MASK, 0,
0107 0, 0, -1, mci->ctl_name, "");
0108
0109 regmap_write(drvdata->mc_vbase, priv->ecc_irq_clr_offset,
0110 priv->ecc_irq_clr_mask);
0111
0112 return IRQ_HANDLED;
0113 }
0114 return IRQ_NONE;
0115 }
0116
0117 static ssize_t altr_sdr_mc_err_inject_write(struct file *file,
0118 const char __user *data,
0119 size_t count, loff_t *ppos)
0120 {
0121 struct mem_ctl_info *mci = file->private_data;
0122 struct altr_sdram_mc_data *drvdata = mci->pvt_info;
0123 const struct altr_sdram_prv_data *priv = drvdata->data;
0124 u32 *ptemp;
0125 dma_addr_t dma_handle;
0126 u32 reg, read_reg;
0127
0128 ptemp = dma_alloc_coherent(mci->pdev, 16, &dma_handle, GFP_KERNEL);
0129 if (!ptemp) {
0130 dma_free_coherent(mci->pdev, 16, ptemp, dma_handle);
0131 edac_printk(KERN_ERR, EDAC_MC,
0132 "Inject: Buffer Allocation error\n");
0133 return -ENOMEM;
0134 }
0135
0136 regmap_read(drvdata->mc_vbase, priv->ce_ue_trgr_offset,
0137 &read_reg);
0138 read_reg &= ~(priv->ce_set_mask | priv->ue_set_mask);
0139
0140
0141
0142
0143
0144 if (count == 3) {
0145 edac_printk(KERN_ALERT, EDAC_MC,
0146 "Inject Double bit error\n");
0147 local_irq_disable();
0148 regmap_write(drvdata->mc_vbase, priv->ce_ue_trgr_offset,
0149 (read_reg | priv->ue_set_mask));
0150 local_irq_enable();
0151 } else {
0152 edac_printk(KERN_ALERT, EDAC_MC,
0153 "Inject Single bit error\n");
0154 local_irq_disable();
0155 regmap_write(drvdata->mc_vbase, priv->ce_ue_trgr_offset,
0156 (read_reg | priv->ce_set_mask));
0157 local_irq_enable();
0158 }
0159
0160 ptemp[0] = 0x5A5A5A5A;
0161 ptemp[1] = 0xA5A5A5A5;
0162
0163
0164 regmap_write(drvdata->mc_vbase, priv->ce_ue_trgr_offset, read_reg);
0165
0166 wmb();
0167
0168
0169
0170
0171
0172
0173
0174 reg = READ_ONCE(ptemp[0]);
0175 read_reg = READ_ONCE(ptemp[1]);
0176
0177 rmb();
0178
0179 edac_printk(KERN_ALERT, EDAC_MC, "Read Data [0x%X, 0x%X]\n",
0180 reg, read_reg);
0181
0182 dma_free_coherent(mci->pdev, 16, ptemp, dma_handle);
0183
0184 return count;
0185 }
0186
0187 static const struct file_operations altr_sdr_mc_debug_inject_fops = {
0188 .open = simple_open,
0189 .write = altr_sdr_mc_err_inject_write,
0190 .llseek = generic_file_llseek,
0191 };
0192
0193 static void altr_sdr_mc_create_debugfs_nodes(struct mem_ctl_info *mci)
0194 {
0195 if (!IS_ENABLED(CONFIG_EDAC_DEBUG))
0196 return;
0197
0198 if (!mci->debugfs)
0199 return;
0200
0201 edac_debugfs_create_file("altr_trigger", S_IWUSR, mci->debugfs, mci,
0202 &altr_sdr_mc_debug_inject_fops);
0203 }
0204
0205
0206 static unsigned long get_total_mem(void)
0207 {
0208 struct device_node *np = NULL;
0209 struct resource res;
0210 int ret;
0211 unsigned long total_mem = 0;
0212
0213 for_each_node_by_type(np, "memory") {
0214 ret = of_address_to_resource(np, 0, &res);
0215 if (ret)
0216 continue;
0217
0218 total_mem += resource_size(&res);
0219 }
0220 edac_dbg(0, "total_mem 0x%lx\n", total_mem);
0221 return total_mem;
0222 }
0223
0224 static const struct of_device_id altr_sdram_ctrl_of_match[] = {
0225 { .compatible = "altr,sdram-edac", .data = &c5_data},
0226 { .compatible = "altr,sdram-edac-a10", .data = &a10_data},
0227 {},
0228 };
0229 MODULE_DEVICE_TABLE(of, altr_sdram_ctrl_of_match);
0230
0231 static int a10_init(struct regmap *mc_vbase)
0232 {
0233 if (regmap_update_bits(mc_vbase, A10_INTMODE_OFST,
0234 A10_INTMODE_SB_INT, A10_INTMODE_SB_INT)) {
0235 edac_printk(KERN_ERR, EDAC_MC,
0236 "Error setting SB IRQ mode\n");
0237 return -ENODEV;
0238 }
0239
0240 if (regmap_write(mc_vbase, A10_SERRCNTREG_OFST, 1)) {
0241 edac_printk(KERN_ERR, EDAC_MC,
0242 "Error setting trigger count\n");
0243 return -ENODEV;
0244 }
0245
0246 return 0;
0247 }
0248
0249 static int a10_unmask_irq(struct platform_device *pdev, u32 mask)
0250 {
0251 void __iomem *sm_base;
0252 int ret = 0;
0253
0254 if (!request_mem_region(A10_SYMAN_INTMASK_CLR, sizeof(u32),
0255 dev_name(&pdev->dev))) {
0256 edac_printk(KERN_ERR, EDAC_MC,
0257 "Unable to request mem region\n");
0258 return -EBUSY;
0259 }
0260
0261 sm_base = ioremap(A10_SYMAN_INTMASK_CLR, sizeof(u32));
0262 if (!sm_base) {
0263 edac_printk(KERN_ERR, EDAC_MC,
0264 "Unable to ioremap device\n");
0265
0266 ret = -ENOMEM;
0267 goto release;
0268 }
0269
0270 iowrite32(mask, sm_base);
0271
0272 iounmap(sm_base);
0273
0274 release:
0275 release_mem_region(A10_SYMAN_INTMASK_CLR, sizeof(u32));
0276
0277 return ret;
0278 }
0279
0280 static int altr_sdram_probe(struct platform_device *pdev)
0281 {
0282 const struct of_device_id *id;
0283 struct edac_mc_layer layers[2];
0284 struct mem_ctl_info *mci;
0285 struct altr_sdram_mc_data *drvdata;
0286 const struct altr_sdram_prv_data *priv;
0287 struct regmap *mc_vbase;
0288 struct dimm_info *dimm;
0289 u32 read_reg;
0290 int irq, irq2, res = 0;
0291 unsigned long mem_size, irqflags = 0;
0292
0293 id = of_match_device(altr_sdram_ctrl_of_match, &pdev->dev);
0294 if (!id)
0295 return -ENODEV;
0296
0297
0298 mc_vbase = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
0299 "altr,sdr-syscon");
0300 if (IS_ERR(mc_vbase)) {
0301 edac_printk(KERN_ERR, EDAC_MC,
0302 "regmap for altr,sdr-syscon lookup failed.\n");
0303 return -ENODEV;
0304 }
0305
0306
0307 priv = of_match_node(altr_sdram_ctrl_of_match,
0308 pdev->dev.of_node)->data;
0309
0310
0311 if (regmap_read(mc_vbase, priv->ecc_ctrl_offset, &read_reg) ||
0312 ((read_reg & priv->ecc_ctl_en_mask) != priv->ecc_ctl_en_mask)) {
0313 edac_printk(KERN_ERR, EDAC_MC,
0314 "No ECC/ECC disabled [0x%08X]\n", read_reg);
0315 return -ENODEV;
0316 }
0317
0318
0319 mem_size = get_total_mem();
0320 if (!mem_size) {
0321 edac_printk(KERN_ERR, EDAC_MC, "Unable to calculate memory size\n");
0322 return -ENODEV;
0323 }
0324
0325
0326 if (regmap_update_bits(mc_vbase, priv->ecc_irq_en_offset,
0327 priv->ecc_irq_en_mask, 0)) {
0328 edac_printk(KERN_ERR, EDAC_MC,
0329 "Error disabling SDRAM ECC IRQ\n");
0330 return -ENODEV;
0331 }
0332
0333
0334 if (regmap_update_bits(mc_vbase, priv->ecc_cnt_rst_offset,
0335 priv->ecc_cnt_rst_mask,
0336 priv->ecc_cnt_rst_mask)) {
0337 edac_printk(KERN_ERR, EDAC_MC,
0338 "Error clearing SDRAM ECC count\n");
0339 return -ENODEV;
0340 }
0341
0342 if (regmap_update_bits(mc_vbase, priv->ecc_cnt_rst_offset,
0343 priv->ecc_cnt_rst_mask, 0)) {
0344 edac_printk(KERN_ERR, EDAC_MC,
0345 "Error clearing SDRAM ECC count\n");
0346 return -ENODEV;
0347 }
0348
0349 irq = platform_get_irq(pdev, 0);
0350 if (irq < 0) {
0351 edac_printk(KERN_ERR, EDAC_MC,
0352 "No irq %d in DT\n", irq);
0353 return irq;
0354 }
0355
0356
0357 irq2 = platform_get_irq(pdev, 1);
0358
0359 layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
0360 layers[0].size = 1;
0361 layers[0].is_virt_csrow = true;
0362 layers[1].type = EDAC_MC_LAYER_CHANNEL;
0363 layers[1].size = 1;
0364 layers[1].is_virt_csrow = false;
0365 mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers,
0366 sizeof(struct altr_sdram_mc_data));
0367 if (!mci)
0368 return -ENOMEM;
0369
0370 mci->pdev = &pdev->dev;
0371 drvdata = mci->pvt_info;
0372 drvdata->mc_vbase = mc_vbase;
0373 drvdata->data = priv;
0374 platform_set_drvdata(pdev, mci);
0375
0376 if (!devres_open_group(&pdev->dev, NULL, GFP_KERNEL)) {
0377 edac_printk(KERN_ERR, EDAC_MC,
0378 "Unable to get managed device resource\n");
0379 res = -ENOMEM;
0380 goto free;
0381 }
0382
0383 mci->mtype_cap = MEM_FLAG_DDR3;
0384 mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
0385 mci->edac_cap = EDAC_FLAG_SECDED;
0386 mci->mod_name = EDAC_MOD_STR;
0387 mci->ctl_name = dev_name(&pdev->dev);
0388 mci->scrub_mode = SCRUB_SW_SRC;
0389 mci->dev_name = dev_name(&pdev->dev);
0390
0391 dimm = *mci->dimms;
0392 dimm->nr_pages = ((mem_size - 1) >> PAGE_SHIFT) + 1;
0393 dimm->grain = 8;
0394 dimm->dtype = DEV_X8;
0395 dimm->mtype = MEM_DDR3;
0396 dimm->edac_mode = EDAC_SECDED;
0397
0398 res = edac_mc_add_mc(mci);
0399 if (res < 0)
0400 goto err;
0401
0402
0403 if (of_machine_is_compatible("altr,socfpga-arria10")) {
0404
0405 res = a10_init(mc_vbase);
0406 if (res < 0)
0407 goto err2;
0408
0409 res = devm_request_irq(&pdev->dev, irq2,
0410 altr_sdram_mc_err_handler,
0411 IRQF_SHARED, dev_name(&pdev->dev), mci);
0412 if (res < 0) {
0413 edac_mc_printk(mci, KERN_ERR,
0414 "Unable to request irq %d\n", irq2);
0415 res = -ENODEV;
0416 goto err2;
0417 }
0418
0419 res = a10_unmask_irq(pdev, A10_DDR0_IRQ_MASK);
0420 if (res < 0)
0421 goto err2;
0422
0423 irqflags = IRQF_SHARED;
0424 }
0425
0426 res = devm_request_irq(&pdev->dev, irq, altr_sdram_mc_err_handler,
0427 irqflags, dev_name(&pdev->dev), mci);
0428 if (res < 0) {
0429 edac_mc_printk(mci, KERN_ERR,
0430 "Unable to request irq %d\n", irq);
0431 res = -ENODEV;
0432 goto err2;
0433 }
0434
0435
0436 if (regmap_update_bits(drvdata->mc_vbase, priv->ecc_irq_en_offset,
0437 priv->ecc_irq_en_mask, priv->ecc_irq_en_mask)) {
0438 edac_mc_printk(mci, KERN_ERR,
0439 "Error enabling SDRAM ECC IRQ\n");
0440 res = -ENODEV;
0441 goto err2;
0442 }
0443
0444 altr_sdr_mc_create_debugfs_nodes(mci);
0445
0446 devres_close_group(&pdev->dev, NULL);
0447
0448 return 0;
0449
0450 err2:
0451 edac_mc_del_mc(&pdev->dev);
0452 err:
0453 devres_release_group(&pdev->dev, NULL);
0454 free:
0455 edac_mc_free(mci);
0456 edac_printk(KERN_ERR, EDAC_MC,
0457 "EDAC Probe Failed; Error %d\n", res);
0458
0459 return res;
0460 }
0461
0462 static int altr_sdram_remove(struct platform_device *pdev)
0463 {
0464 struct mem_ctl_info *mci = platform_get_drvdata(pdev);
0465
0466 edac_mc_del_mc(&pdev->dev);
0467 edac_mc_free(mci);
0468 platform_set_drvdata(pdev, NULL);
0469
0470 return 0;
0471 }
0472
0473
0474
0475
0476
0477 #ifdef CONFIG_PM
0478 static int altr_sdram_prepare(struct device *dev)
0479 {
0480 pr_err("Suspend not allowed when EDAC is enabled.\n");
0481
0482 return -EPERM;
0483 }
0484
0485 static const struct dev_pm_ops altr_sdram_pm_ops = {
0486 .prepare = altr_sdram_prepare,
0487 };
0488 #endif
0489
0490 static struct platform_driver altr_sdram_edac_driver = {
0491 .probe = altr_sdram_probe,
0492 .remove = altr_sdram_remove,
0493 .driver = {
0494 .name = "altr_sdram_edac",
0495 #ifdef CONFIG_PM
0496 .pm = &altr_sdram_pm_ops,
0497 #endif
0498 .of_match_table = altr_sdram_ctrl_of_match,
0499 },
0500 };
0501
0502 module_platform_driver(altr_sdram_edac_driver);
0503
0504 #endif
0505
0506
0507
0508 static const struct of_device_id altr_edac_device_of_match[];
0509
0510 static const struct of_device_id altr_edac_of_match[] = {
0511 { .compatible = "altr,socfpga-ecc-manager" },
0512 {},
0513 };
0514 MODULE_DEVICE_TABLE(of, altr_edac_of_match);
0515
0516 static int altr_edac_probe(struct platform_device *pdev)
0517 {
0518 of_platform_populate(pdev->dev.of_node, altr_edac_device_of_match,
0519 NULL, &pdev->dev);
0520 return 0;
0521 }
0522
0523 static struct platform_driver altr_edac_driver = {
0524 .probe = altr_edac_probe,
0525 .driver = {
0526 .name = "socfpga_ecc_manager",
0527 .of_match_table = altr_edac_of_match,
0528 },
0529 };
0530 module_platform_driver(altr_edac_driver);
0531
0532
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542 #ifdef CONFIG_EDAC_ALTERA_OCRAM
0543 static const struct edac_device_prv_data ocramecc_data;
0544 #endif
0545 #ifdef CONFIG_EDAC_ALTERA_L2C
0546 static const struct edac_device_prv_data l2ecc_data;
0547 #endif
0548 #ifdef CONFIG_EDAC_ALTERA_OCRAM
0549 static const struct edac_device_prv_data a10_ocramecc_data;
0550 #endif
0551 #ifdef CONFIG_EDAC_ALTERA_L2C
0552 static const struct edac_device_prv_data a10_l2ecc_data;
0553 #endif
0554
0555 static irqreturn_t altr_edac_device_handler(int irq, void *dev_id)
0556 {
0557 irqreturn_t ret_value = IRQ_NONE;
0558 struct edac_device_ctl_info *dci = dev_id;
0559 struct altr_edac_device_dev *drvdata = dci->pvt_info;
0560 const struct edac_device_prv_data *priv = drvdata->data;
0561
0562 if (irq == drvdata->sb_irq) {
0563 if (priv->ce_clear_mask)
0564 writel(priv->ce_clear_mask, drvdata->base);
0565 edac_device_handle_ce(dci, 0, 0, drvdata->edac_dev_name);
0566 ret_value = IRQ_HANDLED;
0567 } else if (irq == drvdata->db_irq) {
0568 if (priv->ue_clear_mask)
0569 writel(priv->ue_clear_mask, drvdata->base);
0570 edac_device_handle_ue(dci, 0, 0, drvdata->edac_dev_name);
0571 panic("\nEDAC:ECC_DEVICE[Uncorrectable errors]\n");
0572 ret_value = IRQ_HANDLED;
0573 } else {
0574 WARN_ON(1);
0575 }
0576
0577 return ret_value;
0578 }
0579
0580 static ssize_t __maybe_unused
0581 altr_edac_device_trig(struct file *file, const char __user *user_buf,
0582 size_t count, loff_t *ppos)
0583
0584 {
0585 u32 *ptemp, i, error_mask;
0586 int result = 0;
0587 u8 trig_type;
0588 unsigned long flags;
0589 struct edac_device_ctl_info *edac_dci = file->private_data;
0590 struct altr_edac_device_dev *drvdata = edac_dci->pvt_info;
0591 const struct edac_device_prv_data *priv = drvdata->data;
0592 void *generic_ptr = edac_dci->dev;
0593
0594 if (!user_buf || get_user(trig_type, user_buf))
0595 return -EFAULT;
0596
0597 if (!priv->alloc_mem)
0598 return -ENOMEM;
0599
0600
0601
0602
0603
0604 ptemp = priv->alloc_mem(priv->trig_alloc_sz, &generic_ptr);
0605 if (!ptemp) {
0606 edac_printk(KERN_ERR, EDAC_DEVICE,
0607 "Inject: Buffer Allocation error\n");
0608 return -ENOMEM;
0609 }
0610
0611 if (trig_type == ALTR_UE_TRIGGER_CHAR)
0612 error_mask = priv->ue_set_mask;
0613 else
0614 error_mask = priv->ce_set_mask;
0615
0616 edac_printk(KERN_ALERT, EDAC_DEVICE,
0617 "Trigger Error Mask (0x%X)\n", error_mask);
0618
0619 local_irq_save(flags);
0620
0621 for (i = 0; i < (priv->trig_alloc_sz / sizeof(*ptemp)); i++) {
0622
0623 rmb();
0624 if (READ_ONCE(ptemp[i]))
0625 result = -1;
0626
0627 writel(error_mask, (drvdata->base + priv->set_err_ofst));
0628 writel(priv->ecc_enable_mask, (drvdata->base +
0629 priv->set_err_ofst));
0630 ptemp[i] = i;
0631 }
0632
0633 wmb();
0634 local_irq_restore(flags);
0635
0636 if (result)
0637 edac_printk(KERN_ERR, EDAC_DEVICE, "Mem Not Cleared\n");
0638
0639
0640 for (i = 0; i < ALTR_TRIGGER_READ_WRD_CNT; i++)
0641 if (READ_ONCE(ptemp[i]) != i)
0642 edac_printk(KERN_ERR, EDAC_DEVICE,
0643 "Read doesn't match written data\n");
0644
0645 if (priv->free_mem)
0646 priv->free_mem(ptemp, priv->trig_alloc_sz, generic_ptr);
0647
0648 return count;
0649 }
0650
0651 static const struct file_operations altr_edac_device_inject_fops __maybe_unused = {
0652 .open = simple_open,
0653 .write = altr_edac_device_trig,
0654 .llseek = generic_file_llseek,
0655 };
0656
0657 static ssize_t __maybe_unused
0658 altr_edac_a10_device_trig(struct file *file, const char __user *user_buf,
0659 size_t count, loff_t *ppos);
0660
0661 static const struct file_operations altr_edac_a10_device_inject_fops __maybe_unused = {
0662 .open = simple_open,
0663 .write = altr_edac_a10_device_trig,
0664 .llseek = generic_file_llseek,
0665 };
0666
0667 static ssize_t __maybe_unused
0668 altr_edac_a10_device_trig2(struct file *file, const char __user *user_buf,
0669 size_t count, loff_t *ppos);
0670
0671 static const struct file_operations altr_edac_a10_device_inject2_fops __maybe_unused = {
0672 .open = simple_open,
0673 .write = altr_edac_a10_device_trig2,
0674 .llseek = generic_file_llseek,
0675 };
0676
0677 static void altr_create_edacdev_dbgfs(struct edac_device_ctl_info *edac_dci,
0678 const struct edac_device_prv_data *priv)
0679 {
0680 struct altr_edac_device_dev *drvdata = edac_dci->pvt_info;
0681
0682 if (!IS_ENABLED(CONFIG_EDAC_DEBUG))
0683 return;
0684
0685 drvdata->debugfs_dir = edac_debugfs_create_dir(drvdata->edac_dev_name);
0686 if (!drvdata->debugfs_dir)
0687 return;
0688
0689 if (!edac_debugfs_create_file("altr_trigger", S_IWUSR,
0690 drvdata->debugfs_dir, edac_dci,
0691 priv->inject_fops))
0692 debugfs_remove_recursive(drvdata->debugfs_dir);
0693 }
0694
0695 static const struct of_device_id altr_edac_device_of_match[] = {
0696 #ifdef CONFIG_EDAC_ALTERA_L2C
0697 { .compatible = "altr,socfpga-l2-ecc", .data = &l2ecc_data },
0698 #endif
0699 #ifdef CONFIG_EDAC_ALTERA_OCRAM
0700 { .compatible = "altr,socfpga-ocram-ecc", .data = &ocramecc_data },
0701 #endif
0702 {},
0703 };
0704 MODULE_DEVICE_TABLE(of, altr_edac_device_of_match);
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714 static int altr_edac_device_probe(struct platform_device *pdev)
0715 {
0716 struct edac_device_ctl_info *dci;
0717 struct altr_edac_device_dev *drvdata;
0718 struct resource *r;
0719 int res = 0;
0720 struct device_node *np = pdev->dev.of_node;
0721 char *ecc_name = (char *)np->name;
0722 static int dev_instance;
0723
0724 if (!devres_open_group(&pdev->dev, NULL, GFP_KERNEL)) {
0725 edac_printk(KERN_ERR, EDAC_DEVICE,
0726 "Unable to open devm\n");
0727 return -ENOMEM;
0728 }
0729
0730 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
0731 if (!r) {
0732 edac_printk(KERN_ERR, EDAC_DEVICE,
0733 "Unable to get mem resource\n");
0734 res = -ENODEV;
0735 goto fail;
0736 }
0737
0738 if (!devm_request_mem_region(&pdev->dev, r->start, resource_size(r),
0739 dev_name(&pdev->dev))) {
0740 edac_printk(KERN_ERR, EDAC_DEVICE,
0741 "%s:Error requesting mem region\n", ecc_name);
0742 res = -EBUSY;
0743 goto fail;
0744 }
0745
0746 dci = edac_device_alloc_ctl_info(sizeof(*drvdata), ecc_name,
0747 1, ecc_name, 1, 0, NULL, 0,
0748 dev_instance++);
0749
0750 if (!dci) {
0751 edac_printk(KERN_ERR, EDAC_DEVICE,
0752 "%s: Unable to allocate EDAC device\n", ecc_name);
0753 res = -ENOMEM;
0754 goto fail;
0755 }
0756
0757 drvdata = dci->pvt_info;
0758 dci->dev = &pdev->dev;
0759 platform_set_drvdata(pdev, dci);
0760 drvdata->edac_dev_name = ecc_name;
0761
0762 drvdata->base = devm_ioremap(&pdev->dev, r->start, resource_size(r));
0763 if (!drvdata->base) {
0764 res = -ENOMEM;
0765 goto fail1;
0766 }
0767
0768
0769 drvdata->data = of_match_node(altr_edac_device_of_match, np)->data;
0770
0771
0772 if (drvdata->data->setup) {
0773 res = drvdata->data->setup(drvdata);
0774 if (res)
0775 goto fail1;
0776 }
0777
0778 drvdata->sb_irq = platform_get_irq(pdev, 0);
0779 res = devm_request_irq(&pdev->dev, drvdata->sb_irq,
0780 altr_edac_device_handler,
0781 0, dev_name(&pdev->dev), dci);
0782 if (res)
0783 goto fail1;
0784
0785 drvdata->db_irq = platform_get_irq(pdev, 1);
0786 res = devm_request_irq(&pdev->dev, drvdata->db_irq,
0787 altr_edac_device_handler,
0788 0, dev_name(&pdev->dev), dci);
0789 if (res)
0790 goto fail1;
0791
0792 dci->mod_name = "Altera ECC Manager";
0793 dci->dev_name = drvdata->edac_dev_name;
0794
0795 res = edac_device_add_device(dci);
0796 if (res)
0797 goto fail1;
0798
0799 altr_create_edacdev_dbgfs(dci, drvdata->data);
0800
0801 devres_close_group(&pdev->dev, NULL);
0802
0803 return 0;
0804
0805 fail1:
0806 edac_device_free_ctl_info(dci);
0807 fail:
0808 devres_release_group(&pdev->dev, NULL);
0809 edac_printk(KERN_ERR, EDAC_DEVICE,
0810 "%s:Error setting up EDAC device: %d\n", ecc_name, res);
0811
0812 return res;
0813 }
0814
0815 static int altr_edac_device_remove(struct platform_device *pdev)
0816 {
0817 struct edac_device_ctl_info *dci = platform_get_drvdata(pdev);
0818 struct altr_edac_device_dev *drvdata = dci->pvt_info;
0819
0820 debugfs_remove_recursive(drvdata->debugfs_dir);
0821 edac_device_del_device(&pdev->dev);
0822 edac_device_free_ctl_info(dci);
0823
0824 return 0;
0825 }
0826
0827 static struct platform_driver altr_edac_device_driver = {
0828 .probe = altr_edac_device_probe,
0829 .remove = altr_edac_device_remove,
0830 .driver = {
0831 .name = "altr_edac_device",
0832 .of_match_table = altr_edac_device_of_match,
0833 },
0834 };
0835 module_platform_driver(altr_edac_device_driver);
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845 static int __maybe_unused
0846 altr_check_ecc_deps(struct altr_edac_device_dev *device)
0847 {
0848 void __iomem *base = device->base;
0849 const struct edac_device_prv_data *prv = device->data;
0850
0851 if (readl(base + prv->ecc_en_ofst) & prv->ecc_enable_mask)
0852 return 0;
0853
0854 edac_printk(KERN_ERR, EDAC_DEVICE,
0855 "%s: No ECC present or ECC disabled.\n",
0856 device->edac_dev_name);
0857 return -ENODEV;
0858 }
0859
0860 static irqreturn_t __maybe_unused altr_edac_a10_ecc_irq(int irq, void *dev_id)
0861 {
0862 struct altr_edac_device_dev *dci = dev_id;
0863 void __iomem *base = dci->base;
0864
0865 if (irq == dci->sb_irq) {
0866 writel(ALTR_A10_ECC_SERRPENA,
0867 base + ALTR_A10_ECC_INTSTAT_OFST);
0868 edac_device_handle_ce(dci->edac_dev, 0, 0, dci->edac_dev_name);
0869
0870 return IRQ_HANDLED;
0871 } else if (irq == dci->db_irq) {
0872 writel(ALTR_A10_ECC_DERRPENA,
0873 base + ALTR_A10_ECC_INTSTAT_OFST);
0874 edac_device_handle_ue(dci->edac_dev, 0, 0, dci->edac_dev_name);
0875 if (dci->data->panic)
0876 panic("\nEDAC:ECC_DEVICE[Uncorrectable errors]\n");
0877
0878 return IRQ_HANDLED;
0879 }
0880
0881 WARN_ON(1);
0882
0883 return IRQ_NONE;
0884 }
0885
0886
0887
0888 static inline int a10_get_irq_mask(struct device_node *np)
0889 {
0890 int irq;
0891 const u32 *handle = of_get_property(np, "interrupts", NULL);
0892
0893 if (!handle)
0894 return -ENODEV;
0895 irq = be32_to_cpup(handle);
0896 return irq;
0897 }
0898
0899 static inline void ecc_set_bits(u32 bit_mask, void __iomem *ioaddr)
0900 {
0901 u32 value = readl(ioaddr);
0902
0903 value |= bit_mask;
0904 writel(value, ioaddr);
0905 }
0906
0907 static inline void ecc_clear_bits(u32 bit_mask, void __iomem *ioaddr)
0908 {
0909 u32 value = readl(ioaddr);
0910
0911 value &= ~bit_mask;
0912 writel(value, ioaddr);
0913 }
0914
0915 static inline int ecc_test_bits(u32 bit_mask, void __iomem *ioaddr)
0916 {
0917 u32 value = readl(ioaddr);
0918
0919 return (value & bit_mask) ? 1 : 0;
0920 }
0921
0922
0923
0924
0925
0926 static int __maybe_unused altr_init_memory_port(void __iomem *ioaddr, int port)
0927 {
0928 int limit = ALTR_A10_ECC_INIT_WATCHDOG_10US;
0929 u32 init_mask, stat_mask, clear_mask;
0930 int ret = 0;
0931
0932 if (port) {
0933 init_mask = ALTR_A10_ECC_INITB;
0934 stat_mask = ALTR_A10_ECC_INITCOMPLETEB;
0935 clear_mask = ALTR_A10_ECC_ERRPENB_MASK;
0936 } else {
0937 init_mask = ALTR_A10_ECC_INITA;
0938 stat_mask = ALTR_A10_ECC_INITCOMPLETEA;
0939 clear_mask = ALTR_A10_ECC_ERRPENA_MASK;
0940 }
0941
0942 ecc_set_bits(init_mask, (ioaddr + ALTR_A10_ECC_CTRL_OFST));
0943 while (limit--) {
0944 if (ecc_test_bits(stat_mask,
0945 (ioaddr + ALTR_A10_ECC_INITSTAT_OFST)))
0946 break;
0947 udelay(1);
0948 }
0949 if (limit < 0)
0950 ret = -EBUSY;
0951
0952
0953 writel(clear_mask, (ioaddr + ALTR_A10_ECC_INTSTAT_OFST));
0954
0955 return ret;
0956 }
0957
0958 static __init int __maybe_unused
0959 altr_init_a10_ecc_block(struct device_node *np, u32 irq_mask,
0960 u32 ecc_ctrl_en_mask, bool dual_port)
0961 {
0962 int ret = 0;
0963 void __iomem *ecc_block_base;
0964 struct regmap *ecc_mgr_map;
0965 char *ecc_name;
0966 struct device_node *np_eccmgr;
0967
0968 ecc_name = (char *)np->name;
0969
0970
0971 np_eccmgr = of_get_parent(np);
0972
0973 ecc_mgr_map =
0974 altr_sysmgr_regmap_lookup_by_phandle(np_eccmgr,
0975 "altr,sysmgr-syscon");
0976
0977 of_node_put(np_eccmgr);
0978 if (IS_ERR(ecc_mgr_map)) {
0979 edac_printk(KERN_ERR, EDAC_DEVICE,
0980 "Unable to get syscon altr,sysmgr-syscon\n");
0981 return -ENODEV;
0982 }
0983
0984
0985 ecc_block_base = of_iomap(np, 0);
0986 if (!ecc_block_base) {
0987 edac_printk(KERN_ERR, EDAC_DEVICE,
0988 "Unable to map %s ECC block\n", ecc_name);
0989 return -ENODEV;
0990 }
0991
0992
0993 regmap_write(ecc_mgr_map, A10_SYSMGR_ECC_INTMASK_SET_OFST, irq_mask);
0994 writel(ALTR_A10_ECC_SERRINTEN,
0995 (ecc_block_base + ALTR_A10_ECC_ERRINTENR_OFST));
0996 ecc_clear_bits(ecc_ctrl_en_mask,
0997 (ecc_block_base + ALTR_A10_ECC_CTRL_OFST));
0998
0999 wmb();
1000
1001 ret = altr_init_memory_port(ecc_block_base, 0);
1002 if (ret) {
1003 edac_printk(KERN_ERR, EDAC_DEVICE,
1004 "ECC: cannot init %s PORTA memory\n", ecc_name);
1005 goto out;
1006 }
1007
1008 if (dual_port) {
1009 ret = altr_init_memory_port(ecc_block_base, 1);
1010 if (ret) {
1011 edac_printk(KERN_ERR, EDAC_DEVICE,
1012 "ECC: cannot init %s PORTB memory\n",
1013 ecc_name);
1014 goto out;
1015 }
1016 }
1017
1018
1019 regmap_write(ecc_mgr_map, ALTR_A10_ECC_INTMODE_OFST,
1020 ALTR_A10_ECC_INTMODE);
1021
1022 ecc_set_bits(ecc_ctrl_en_mask, (ecc_block_base +
1023 ALTR_A10_ECC_CTRL_OFST));
1024 writel(ALTR_A10_ECC_SERRINTEN,
1025 (ecc_block_base + ALTR_A10_ECC_ERRINTENS_OFST));
1026 regmap_write(ecc_mgr_map, A10_SYSMGR_ECC_INTMASK_CLR_OFST, irq_mask);
1027
1028 wmb();
1029 out:
1030 iounmap(ecc_block_base);
1031 return ret;
1032 }
1033
1034 static int validate_parent_available(struct device_node *np);
1035 static const struct of_device_id altr_edac_a10_device_of_match[];
1036 static int __init __maybe_unused altr_init_a10_ecc_device_type(char *compat)
1037 {
1038 int irq;
1039 struct device_node *child, *np;
1040
1041 np = of_find_compatible_node(NULL, NULL,
1042 "altr,socfpga-a10-ecc-manager");
1043 if (!np) {
1044 edac_printk(KERN_ERR, EDAC_DEVICE, "ECC Manager not found\n");
1045 return -ENODEV;
1046 }
1047
1048 for_each_child_of_node(np, child) {
1049 const struct of_device_id *pdev_id;
1050 const struct edac_device_prv_data *prv;
1051
1052 if (!of_device_is_available(child))
1053 continue;
1054 if (!of_device_is_compatible(child, compat))
1055 continue;
1056
1057 if (validate_parent_available(child))
1058 continue;
1059
1060 irq = a10_get_irq_mask(child);
1061 if (irq < 0)
1062 continue;
1063
1064
1065 pdev_id = of_match_node(altr_edac_a10_device_of_match, child);
1066 if (IS_ERR_OR_NULL(pdev_id))
1067 continue;
1068
1069
1070 prv = pdev_id->data;
1071 if (!prv)
1072 continue;
1073
1074 altr_init_a10_ecc_block(child, BIT(irq),
1075 prv->ecc_enable_mask, 0);
1076 }
1077
1078 of_node_put(np);
1079 return 0;
1080 }
1081
1082
1083
1084 #ifdef CONFIG_EDAC_ALTERA_SDRAM
1085
1086
1087
1088
1089
1090
1091
1092 static int altr_s10_sdram_check_ecc_deps(struct altr_edac_device_dev *device)
1093 {
1094 const struct edac_device_prv_data *prv = device->data;
1095 unsigned long sdram_ecc_addr;
1096 struct arm_smccc_res result;
1097 struct device_node *np;
1098 phys_addr_t sdram_addr;
1099 u32 read_reg;
1100 int ret;
1101
1102 np = of_find_compatible_node(NULL, NULL, "altr,sdr-ctl");
1103 if (!np)
1104 goto sdram_err;
1105
1106 sdram_addr = of_translate_address(np, of_get_address(np, 0,
1107 NULL, NULL));
1108 of_node_put(np);
1109 sdram_ecc_addr = (unsigned long)sdram_addr + prv->ecc_en_ofst;
1110 arm_smccc_smc(INTEL_SIP_SMC_REG_READ, sdram_ecc_addr,
1111 0, 0, 0, 0, 0, 0, &result);
1112 read_reg = (unsigned int)result.a1;
1113 ret = (int)result.a0;
1114 if (!ret && (read_reg & prv->ecc_enable_mask))
1115 return 0;
1116
1117 sdram_err:
1118 edac_printk(KERN_ERR, EDAC_DEVICE,
1119 "%s: No ECC present or ECC disabled.\n",
1120 device->edac_dev_name);
1121 return -ENODEV;
1122 }
1123
1124 static const struct edac_device_prv_data s10_sdramecc_data = {
1125 .setup = altr_s10_sdram_check_ecc_deps,
1126 .ce_clear_mask = ALTR_S10_ECC_SERRPENA,
1127 .ue_clear_mask = ALTR_S10_ECC_DERRPENA,
1128 .ecc_enable_mask = ALTR_S10_ECC_EN,
1129 .ecc_en_ofst = ALTR_S10_ECC_CTRL_SDRAM_OFST,
1130 .ce_set_mask = ALTR_S10_ECC_TSERRA,
1131 .ue_set_mask = ALTR_S10_ECC_TDERRA,
1132 .set_err_ofst = ALTR_S10_ECC_INTTEST_OFST,
1133 .ecc_irq_handler = altr_edac_a10_ecc_irq,
1134 .inject_fops = &altr_edac_a10_device_inject_fops,
1135 };
1136 #endif
1137
1138
1139
1140 #ifdef CONFIG_EDAC_ALTERA_OCRAM
1141
1142 static void *ocram_alloc_mem(size_t size, void **other)
1143 {
1144 struct device_node *np;
1145 struct gen_pool *gp;
1146 void *sram_addr;
1147
1148 np = of_find_compatible_node(NULL, NULL, "altr,socfpga-ocram-ecc");
1149 if (!np)
1150 return NULL;
1151
1152 gp = of_gen_pool_get(np, "iram", 0);
1153 of_node_put(np);
1154 if (!gp)
1155 return NULL;
1156
1157 sram_addr = (void *)gen_pool_alloc(gp, size);
1158 if (!sram_addr)
1159 return NULL;
1160
1161 memset(sram_addr, 0, size);
1162
1163 wmb();
1164
1165
1166 *other = gp;
1167
1168 return sram_addr;
1169 }
1170
1171 static void ocram_free_mem(void *p, size_t size, void *other)
1172 {
1173 gen_pool_free((struct gen_pool *)other, (unsigned long)p, size);
1174 }
1175
1176 static const struct edac_device_prv_data ocramecc_data = {
1177 .setup = altr_check_ecc_deps,
1178 .ce_clear_mask = (ALTR_OCR_ECC_EN | ALTR_OCR_ECC_SERR),
1179 .ue_clear_mask = (ALTR_OCR_ECC_EN | ALTR_OCR_ECC_DERR),
1180 .alloc_mem = ocram_alloc_mem,
1181 .free_mem = ocram_free_mem,
1182 .ecc_enable_mask = ALTR_OCR_ECC_EN,
1183 .ecc_en_ofst = ALTR_OCR_ECC_REG_OFFSET,
1184 .ce_set_mask = (ALTR_OCR_ECC_EN | ALTR_OCR_ECC_INJS),
1185 .ue_set_mask = (ALTR_OCR_ECC_EN | ALTR_OCR_ECC_INJD),
1186 .set_err_ofst = ALTR_OCR_ECC_REG_OFFSET,
1187 .trig_alloc_sz = ALTR_TRIG_OCRAM_BYTE_SIZE,
1188 .inject_fops = &altr_edac_device_inject_fops,
1189 };
1190
1191 static int __maybe_unused
1192 altr_check_ocram_deps_init(struct altr_edac_device_dev *device)
1193 {
1194 void __iomem *base = device->base;
1195 int ret;
1196
1197 ret = altr_check_ecc_deps(device);
1198 if (ret)
1199 return ret;
1200
1201
1202 if (!ecc_test_bits(ALTR_A10_ECC_INITCOMPLETEA,
1203 (base + ALTR_A10_ECC_INITSTAT_OFST)))
1204 return -ENODEV;
1205
1206
1207 writel(ALTR_A10_ECC_SERRINTEN, (base + ALTR_A10_ECC_ERRINTENS_OFST));
1208
1209 wmb();
1210
1211 return 0;
1212 }
1213
1214 static const struct edac_device_prv_data a10_ocramecc_data = {
1215 .setup = altr_check_ocram_deps_init,
1216 .ce_clear_mask = ALTR_A10_ECC_SERRPENA,
1217 .ue_clear_mask = ALTR_A10_ECC_DERRPENA,
1218 .irq_status_mask = A10_SYSMGR_ECC_INTSTAT_OCRAM,
1219 .ecc_enable_mask = ALTR_A10_OCRAM_ECC_EN_CTL,
1220 .ecc_en_ofst = ALTR_A10_ECC_CTRL_OFST,
1221 .ce_set_mask = ALTR_A10_ECC_TSERRA,
1222 .ue_set_mask = ALTR_A10_ECC_TDERRA,
1223 .set_err_ofst = ALTR_A10_ECC_INTTEST_OFST,
1224 .ecc_irq_handler = altr_edac_a10_ecc_irq,
1225 .inject_fops = &altr_edac_a10_device_inject2_fops,
1226
1227
1228
1229
1230
1231 .panic = true,
1232 };
1233
1234 #endif
1235
1236
1237
1238 #ifdef CONFIG_EDAC_ALTERA_L2C
1239
1240 static void *l2_alloc_mem(size_t size, void **other)
1241 {
1242 struct device *dev = *other;
1243 void *ptemp = devm_kzalloc(dev, size, GFP_KERNEL);
1244
1245 if (!ptemp)
1246 return NULL;
1247
1248
1249 wmb();
1250
1251
1252
1253
1254
1255
1256 flush_cache_all();
1257
1258 return ptemp;
1259 }
1260
1261 static void l2_free_mem(void *p, size_t size, void *other)
1262 {
1263 struct device *dev = other;
1264
1265 if (dev && p)
1266 devm_kfree(dev, p);
1267 }
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277 static int altr_l2_check_deps(struct altr_edac_device_dev *device)
1278 {
1279 void __iomem *base = device->base;
1280 const struct edac_device_prv_data *prv = device->data;
1281
1282 if ((readl(base) & prv->ecc_enable_mask) ==
1283 prv->ecc_enable_mask)
1284 return 0;
1285
1286 edac_printk(KERN_ERR, EDAC_DEVICE,
1287 "L2: No ECC present, or ECC disabled\n");
1288 return -ENODEV;
1289 }
1290
1291 static irqreturn_t altr_edac_a10_l2_irq(int irq, void *dev_id)
1292 {
1293 struct altr_edac_device_dev *dci = dev_id;
1294
1295 if (irq == dci->sb_irq) {
1296 regmap_write(dci->edac->ecc_mgr_map,
1297 A10_SYSGMR_MPU_CLEAR_L2_ECC_OFST,
1298 A10_SYSGMR_MPU_CLEAR_L2_ECC_SB);
1299 edac_device_handle_ce(dci->edac_dev, 0, 0, dci->edac_dev_name);
1300
1301 return IRQ_HANDLED;
1302 } else if (irq == dci->db_irq) {
1303 regmap_write(dci->edac->ecc_mgr_map,
1304 A10_SYSGMR_MPU_CLEAR_L2_ECC_OFST,
1305 A10_SYSGMR_MPU_CLEAR_L2_ECC_MB);
1306 edac_device_handle_ue(dci->edac_dev, 0, 0, dci->edac_dev_name);
1307 panic("\nEDAC:ECC_DEVICE[Uncorrectable errors]\n");
1308
1309 return IRQ_HANDLED;
1310 }
1311
1312 WARN_ON(1);
1313
1314 return IRQ_NONE;
1315 }
1316
1317 static const struct edac_device_prv_data l2ecc_data = {
1318 .setup = altr_l2_check_deps,
1319 .ce_clear_mask = 0,
1320 .ue_clear_mask = 0,
1321 .alloc_mem = l2_alloc_mem,
1322 .free_mem = l2_free_mem,
1323 .ecc_enable_mask = ALTR_L2_ECC_EN,
1324 .ce_set_mask = (ALTR_L2_ECC_EN | ALTR_L2_ECC_INJS),
1325 .ue_set_mask = (ALTR_L2_ECC_EN | ALTR_L2_ECC_INJD),
1326 .set_err_ofst = ALTR_L2_ECC_REG_OFFSET,
1327 .trig_alloc_sz = ALTR_TRIG_L2C_BYTE_SIZE,
1328 .inject_fops = &altr_edac_device_inject_fops,
1329 };
1330
1331 static const struct edac_device_prv_data a10_l2ecc_data = {
1332 .setup = altr_l2_check_deps,
1333 .ce_clear_mask = ALTR_A10_L2_ECC_SERR_CLR,
1334 .ue_clear_mask = ALTR_A10_L2_ECC_MERR_CLR,
1335 .irq_status_mask = A10_SYSMGR_ECC_INTSTAT_L2,
1336 .alloc_mem = l2_alloc_mem,
1337 .free_mem = l2_free_mem,
1338 .ecc_enable_mask = ALTR_A10_L2_ECC_EN_CTL,
1339 .ce_set_mask = ALTR_A10_L2_ECC_CE_INJ_MASK,
1340 .ue_set_mask = ALTR_A10_L2_ECC_UE_INJ_MASK,
1341 .set_err_ofst = ALTR_A10_L2_ECC_INJ_OFST,
1342 .ecc_irq_handler = altr_edac_a10_l2_irq,
1343 .trig_alloc_sz = ALTR_TRIG_L2C_BYTE_SIZE,
1344 .inject_fops = &altr_edac_device_inject_fops,
1345 };
1346
1347 #endif
1348
1349
1350
1351 #ifdef CONFIG_EDAC_ALTERA_ETHERNET
1352
1353 static int __init socfpga_init_ethernet_ecc(struct altr_edac_device_dev *dev)
1354 {
1355 int ret;
1356
1357 ret = altr_init_a10_ecc_device_type("altr,socfpga-eth-mac-ecc");
1358 if (ret)
1359 return ret;
1360
1361 return altr_check_ecc_deps(dev);
1362 }
1363
1364 static const struct edac_device_prv_data a10_enetecc_data = {
1365 .setup = socfpga_init_ethernet_ecc,
1366 .ce_clear_mask = ALTR_A10_ECC_SERRPENA,
1367 .ue_clear_mask = ALTR_A10_ECC_DERRPENA,
1368 .ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
1369 .ecc_en_ofst = ALTR_A10_ECC_CTRL_OFST,
1370 .ce_set_mask = ALTR_A10_ECC_TSERRA,
1371 .ue_set_mask = ALTR_A10_ECC_TDERRA,
1372 .set_err_ofst = ALTR_A10_ECC_INTTEST_OFST,
1373 .ecc_irq_handler = altr_edac_a10_ecc_irq,
1374 .inject_fops = &altr_edac_a10_device_inject2_fops,
1375 };
1376
1377 #endif
1378
1379
1380
1381 #ifdef CONFIG_EDAC_ALTERA_NAND
1382
1383 static int __init socfpga_init_nand_ecc(struct altr_edac_device_dev *device)
1384 {
1385 int ret;
1386
1387 ret = altr_init_a10_ecc_device_type("altr,socfpga-nand-ecc");
1388 if (ret)
1389 return ret;
1390
1391 return altr_check_ecc_deps(device);
1392 }
1393
1394 static const struct edac_device_prv_data a10_nandecc_data = {
1395 .setup = socfpga_init_nand_ecc,
1396 .ce_clear_mask = ALTR_A10_ECC_SERRPENA,
1397 .ue_clear_mask = ALTR_A10_ECC_DERRPENA,
1398 .ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
1399 .ecc_en_ofst = ALTR_A10_ECC_CTRL_OFST,
1400 .ce_set_mask = ALTR_A10_ECC_TSERRA,
1401 .ue_set_mask = ALTR_A10_ECC_TDERRA,
1402 .set_err_ofst = ALTR_A10_ECC_INTTEST_OFST,
1403 .ecc_irq_handler = altr_edac_a10_ecc_irq,
1404 .inject_fops = &altr_edac_a10_device_inject_fops,
1405 };
1406
1407 #endif
1408
1409
1410
1411 #ifdef CONFIG_EDAC_ALTERA_DMA
1412
1413 static int __init socfpga_init_dma_ecc(struct altr_edac_device_dev *device)
1414 {
1415 int ret;
1416
1417 ret = altr_init_a10_ecc_device_type("altr,socfpga-dma-ecc");
1418 if (ret)
1419 return ret;
1420
1421 return altr_check_ecc_deps(device);
1422 }
1423
1424 static const struct edac_device_prv_data a10_dmaecc_data = {
1425 .setup = socfpga_init_dma_ecc,
1426 .ce_clear_mask = ALTR_A10_ECC_SERRPENA,
1427 .ue_clear_mask = ALTR_A10_ECC_DERRPENA,
1428 .ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
1429 .ecc_en_ofst = ALTR_A10_ECC_CTRL_OFST,
1430 .ce_set_mask = ALTR_A10_ECC_TSERRA,
1431 .ue_set_mask = ALTR_A10_ECC_TDERRA,
1432 .set_err_ofst = ALTR_A10_ECC_INTTEST_OFST,
1433 .ecc_irq_handler = altr_edac_a10_ecc_irq,
1434 .inject_fops = &altr_edac_a10_device_inject_fops,
1435 };
1436
1437 #endif
1438
1439
1440
1441 #ifdef CONFIG_EDAC_ALTERA_USB
1442
1443 static int __init socfpga_init_usb_ecc(struct altr_edac_device_dev *device)
1444 {
1445 int ret;
1446
1447 ret = altr_init_a10_ecc_device_type("altr,socfpga-usb-ecc");
1448 if (ret)
1449 return ret;
1450
1451 return altr_check_ecc_deps(device);
1452 }
1453
1454 static const struct edac_device_prv_data a10_usbecc_data = {
1455 .setup = socfpga_init_usb_ecc,
1456 .ce_clear_mask = ALTR_A10_ECC_SERRPENA,
1457 .ue_clear_mask = ALTR_A10_ECC_DERRPENA,
1458 .ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
1459 .ecc_en_ofst = ALTR_A10_ECC_CTRL_OFST,
1460 .ce_set_mask = ALTR_A10_ECC_TSERRA,
1461 .ue_set_mask = ALTR_A10_ECC_TDERRA,
1462 .set_err_ofst = ALTR_A10_ECC_INTTEST_OFST,
1463 .ecc_irq_handler = altr_edac_a10_ecc_irq,
1464 .inject_fops = &altr_edac_a10_device_inject2_fops,
1465 };
1466
1467 #endif
1468
1469
1470
1471 #ifdef CONFIG_EDAC_ALTERA_QSPI
1472
1473 static int __init socfpga_init_qspi_ecc(struct altr_edac_device_dev *device)
1474 {
1475 int ret;
1476
1477 ret = altr_init_a10_ecc_device_type("altr,socfpga-qspi-ecc");
1478 if (ret)
1479 return ret;
1480
1481 return altr_check_ecc_deps(device);
1482 }
1483
1484 static const struct edac_device_prv_data a10_qspiecc_data = {
1485 .setup = socfpga_init_qspi_ecc,
1486 .ce_clear_mask = ALTR_A10_ECC_SERRPENA,
1487 .ue_clear_mask = ALTR_A10_ECC_DERRPENA,
1488 .ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
1489 .ecc_en_ofst = ALTR_A10_ECC_CTRL_OFST,
1490 .ce_set_mask = ALTR_A10_ECC_TSERRA,
1491 .ue_set_mask = ALTR_A10_ECC_TDERRA,
1492 .set_err_ofst = ALTR_A10_ECC_INTTEST_OFST,
1493 .ecc_irq_handler = altr_edac_a10_ecc_irq,
1494 .inject_fops = &altr_edac_a10_device_inject_fops,
1495 };
1496
1497 #endif
1498
1499
1500
1501 #ifdef CONFIG_EDAC_ALTERA_SDMMC
1502
1503 static const struct edac_device_prv_data a10_sdmmceccb_data;
1504 static int altr_portb_setup(struct altr_edac_device_dev *device)
1505 {
1506 struct edac_device_ctl_info *dci;
1507 struct altr_edac_device_dev *altdev;
1508 char *ecc_name = "sdmmcb-ecc";
1509 int edac_idx, rc;
1510 struct device_node *np;
1511 const struct edac_device_prv_data *prv = &a10_sdmmceccb_data;
1512
1513 rc = altr_check_ecc_deps(device);
1514 if (rc)
1515 return rc;
1516
1517 np = of_find_compatible_node(NULL, NULL, "altr,socfpga-sdmmc-ecc");
1518 if (!np) {
1519 edac_printk(KERN_WARNING, EDAC_DEVICE, "SDMMC node not found\n");
1520 return -ENODEV;
1521 }
1522
1523
1524 edac_idx = edac_device_alloc_index();
1525 dci = edac_device_alloc_ctl_info(sizeof(*altdev), ecc_name, 1,
1526 ecc_name, 1, 0, NULL, 0, edac_idx);
1527 if (!dci) {
1528 edac_printk(KERN_ERR, EDAC_DEVICE,
1529 "%s: Unable to allocate PortB EDAC device\n",
1530 ecc_name);
1531 return -ENOMEM;
1532 }
1533
1534
1535 altdev = dci->pvt_info;
1536 *altdev = *device;
1537
1538 if (!devres_open_group(&altdev->ddev, altr_portb_setup, GFP_KERNEL))
1539 return -ENOMEM;
1540
1541
1542 altdev->edac_dev_name = ecc_name;
1543 altdev->edac_idx = edac_idx;
1544 altdev->edac_dev = dci;
1545 altdev->data = prv;
1546 dci->dev = &altdev->ddev;
1547 dci->ctl_name = "Altera ECC Manager";
1548 dci->mod_name = ecc_name;
1549 dci->dev_name = ecc_name;
1550
1551
1552
1553
1554
1555
1556
1557 #ifdef CONFIG_64BIT
1558 altdev->sb_irq = irq_of_parse_and_map(np, 1);
1559 #else
1560 altdev->sb_irq = irq_of_parse_and_map(np, 2);
1561 #endif
1562 if (!altdev->sb_irq) {
1563 edac_printk(KERN_ERR, EDAC_DEVICE, "Error PortB SBIRQ alloc\n");
1564 rc = -ENODEV;
1565 goto err_release_group_1;
1566 }
1567 rc = devm_request_irq(&altdev->ddev, altdev->sb_irq,
1568 prv->ecc_irq_handler,
1569 IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
1570 ecc_name, altdev);
1571 if (rc) {
1572 edac_printk(KERN_ERR, EDAC_DEVICE, "PortB SBERR IRQ error\n");
1573 goto err_release_group_1;
1574 }
1575
1576 #ifdef CONFIG_64BIT
1577
1578 rc = of_property_read_u32_index(np, "interrupts", 1, &altdev->db_irq);
1579 if (rc) {
1580 edac_printk(KERN_ERR, EDAC_DEVICE,
1581 "Error PortB DBIRQ alloc\n");
1582 goto err_release_group_1;
1583 }
1584 #else
1585 altdev->db_irq = irq_of_parse_and_map(np, 3);
1586 if (!altdev->db_irq) {
1587 edac_printk(KERN_ERR, EDAC_DEVICE, "Error PortB DBIRQ alloc\n");
1588 rc = -ENODEV;
1589 goto err_release_group_1;
1590 }
1591 rc = devm_request_irq(&altdev->ddev, altdev->db_irq,
1592 prv->ecc_irq_handler,
1593 IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
1594 ecc_name, altdev);
1595 if (rc) {
1596 edac_printk(KERN_ERR, EDAC_DEVICE, "PortB DBERR IRQ error\n");
1597 goto err_release_group_1;
1598 }
1599 #endif
1600
1601 rc = edac_device_add_device(dci);
1602 if (rc) {
1603 edac_printk(KERN_ERR, EDAC_DEVICE,
1604 "edac_device_add_device portB failed\n");
1605 rc = -ENOMEM;
1606 goto err_release_group_1;
1607 }
1608 altr_create_edacdev_dbgfs(dci, prv);
1609
1610 list_add(&altdev->next, &altdev->edac->a10_ecc_devices);
1611
1612 devres_remove_group(&altdev->ddev, altr_portb_setup);
1613
1614 return 0;
1615
1616 err_release_group_1:
1617 edac_device_free_ctl_info(dci);
1618 devres_release_group(&altdev->ddev, altr_portb_setup);
1619 edac_printk(KERN_ERR, EDAC_DEVICE,
1620 "%s:Error setting up EDAC device: %d\n", ecc_name, rc);
1621 return rc;
1622 }
1623
1624 static int __init socfpga_init_sdmmc_ecc(struct altr_edac_device_dev *device)
1625 {
1626 int rc = -ENODEV;
1627 struct device_node *child;
1628
1629 child = of_find_compatible_node(NULL, NULL, "altr,socfpga-sdmmc-ecc");
1630 if (!child)
1631 return -ENODEV;
1632
1633 if (!of_device_is_available(child))
1634 goto exit;
1635
1636 if (validate_parent_available(child))
1637 goto exit;
1638
1639
1640 rc = altr_init_a10_ecc_block(child, ALTR_A10_SDMMC_IRQ_MASK,
1641 a10_sdmmceccb_data.ecc_enable_mask, 1);
1642 if (rc)
1643 goto exit;
1644
1645
1646 return altr_portb_setup(device);
1647
1648 exit:
1649 of_node_put(child);
1650 return rc;
1651 }
1652
1653 static irqreturn_t altr_edac_a10_ecc_irq_portb(int irq, void *dev_id)
1654 {
1655 struct altr_edac_device_dev *ad = dev_id;
1656 void __iomem *base = ad->base;
1657 const struct edac_device_prv_data *priv = ad->data;
1658
1659 if (irq == ad->sb_irq) {
1660 writel(priv->ce_clear_mask,
1661 base + ALTR_A10_ECC_INTSTAT_OFST);
1662 edac_device_handle_ce(ad->edac_dev, 0, 0, ad->edac_dev_name);
1663 return IRQ_HANDLED;
1664 } else if (irq == ad->db_irq) {
1665 writel(priv->ue_clear_mask,
1666 base + ALTR_A10_ECC_INTSTAT_OFST);
1667 edac_device_handle_ue(ad->edac_dev, 0, 0, ad->edac_dev_name);
1668 return IRQ_HANDLED;
1669 }
1670
1671 WARN_ONCE(1, "Unhandled IRQ%d on Port B.", irq);
1672
1673 return IRQ_NONE;
1674 }
1675
1676 static const struct edac_device_prv_data a10_sdmmcecca_data = {
1677 .setup = socfpga_init_sdmmc_ecc,
1678 .ce_clear_mask = ALTR_A10_ECC_SERRPENA,
1679 .ue_clear_mask = ALTR_A10_ECC_DERRPENA,
1680 .ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
1681 .ecc_en_ofst = ALTR_A10_ECC_CTRL_OFST,
1682 .ce_set_mask = ALTR_A10_ECC_SERRPENA,
1683 .ue_set_mask = ALTR_A10_ECC_DERRPENA,
1684 .set_err_ofst = ALTR_A10_ECC_INTTEST_OFST,
1685 .ecc_irq_handler = altr_edac_a10_ecc_irq,
1686 .inject_fops = &altr_edac_a10_device_inject_fops,
1687 };
1688
1689 static const struct edac_device_prv_data a10_sdmmceccb_data = {
1690 .setup = socfpga_init_sdmmc_ecc,
1691 .ce_clear_mask = ALTR_A10_ECC_SERRPENB,
1692 .ue_clear_mask = ALTR_A10_ECC_DERRPENB,
1693 .ecc_enable_mask = ALTR_A10_COMMON_ECC_EN_CTL,
1694 .ecc_en_ofst = ALTR_A10_ECC_CTRL_OFST,
1695 .ce_set_mask = ALTR_A10_ECC_TSERRB,
1696 .ue_set_mask = ALTR_A10_ECC_TDERRB,
1697 .set_err_ofst = ALTR_A10_ECC_INTTEST_OFST,
1698 .ecc_irq_handler = altr_edac_a10_ecc_irq_portb,
1699 .inject_fops = &altr_edac_a10_device_inject_fops,
1700 };
1701
1702 #endif
1703
1704
1705 static const struct of_device_id altr_edac_a10_device_of_match[] = {
1706 #ifdef CONFIG_EDAC_ALTERA_L2C
1707 { .compatible = "altr,socfpga-a10-l2-ecc", .data = &a10_l2ecc_data },
1708 #endif
1709 #ifdef CONFIG_EDAC_ALTERA_OCRAM
1710 { .compatible = "altr,socfpga-a10-ocram-ecc",
1711 .data = &a10_ocramecc_data },
1712 #endif
1713 #ifdef CONFIG_EDAC_ALTERA_ETHERNET
1714 { .compatible = "altr,socfpga-eth-mac-ecc",
1715 .data = &a10_enetecc_data },
1716 #endif
1717 #ifdef CONFIG_EDAC_ALTERA_NAND
1718 { .compatible = "altr,socfpga-nand-ecc", .data = &a10_nandecc_data },
1719 #endif
1720 #ifdef CONFIG_EDAC_ALTERA_DMA
1721 { .compatible = "altr,socfpga-dma-ecc", .data = &a10_dmaecc_data },
1722 #endif
1723 #ifdef CONFIG_EDAC_ALTERA_USB
1724 { .compatible = "altr,socfpga-usb-ecc", .data = &a10_usbecc_data },
1725 #endif
1726 #ifdef CONFIG_EDAC_ALTERA_QSPI
1727 { .compatible = "altr,socfpga-qspi-ecc", .data = &a10_qspiecc_data },
1728 #endif
1729 #ifdef CONFIG_EDAC_ALTERA_SDMMC
1730 { .compatible = "altr,socfpga-sdmmc-ecc", .data = &a10_sdmmcecca_data },
1731 #endif
1732 #ifdef CONFIG_EDAC_ALTERA_SDRAM
1733 { .compatible = "altr,sdram-edac-s10", .data = &s10_sdramecc_data },
1734 #endif
1735 {},
1736 };
1737 MODULE_DEVICE_TABLE(of, altr_edac_a10_device_of_match);
1738
1739
1740
1741
1742
1743
1744
1745
1746 static ssize_t __maybe_unused
1747 altr_edac_a10_device_trig(struct file *file, const char __user *user_buf,
1748 size_t count, loff_t *ppos)
1749 {
1750 struct edac_device_ctl_info *edac_dci = file->private_data;
1751 struct altr_edac_device_dev *drvdata = edac_dci->pvt_info;
1752 const struct edac_device_prv_data *priv = drvdata->data;
1753 void __iomem *set_addr = (drvdata->base + priv->set_err_ofst);
1754 unsigned long flags;
1755 u8 trig_type;
1756
1757 if (!user_buf || get_user(trig_type, user_buf))
1758 return -EFAULT;
1759
1760 local_irq_save(flags);
1761 if (trig_type == ALTR_UE_TRIGGER_CHAR)
1762 writel(priv->ue_set_mask, set_addr);
1763 else
1764 writel(priv->ce_set_mask, set_addr);
1765
1766
1767 wmb();
1768 local_irq_restore(flags);
1769
1770 return count;
1771 }
1772
1773
1774
1775
1776
1777
1778 static ssize_t __maybe_unused
1779 altr_edac_a10_device_trig2(struct file *file, const char __user *user_buf,
1780 size_t count, loff_t *ppos)
1781 {
1782 struct edac_device_ctl_info *edac_dci = file->private_data;
1783 struct altr_edac_device_dev *drvdata = edac_dci->pvt_info;
1784 const struct edac_device_prv_data *priv = drvdata->data;
1785 void __iomem *set_addr = (drvdata->base + priv->set_err_ofst);
1786 unsigned long flags;
1787 u8 trig_type;
1788
1789 if (!user_buf || get_user(trig_type, user_buf))
1790 return -EFAULT;
1791
1792 local_irq_save(flags);
1793 if (trig_type == ALTR_UE_TRIGGER_CHAR) {
1794 writel(priv->ue_set_mask, set_addr);
1795 } else {
1796
1797 writel(ECC_WORD_WRITE, drvdata->base + ECC_BLK_DBYTECTRL_OFST);
1798
1799 writel(0, drvdata->base + ECC_BLK_ADDRESS_OFST);
1800
1801 writel(ECC_READ_EDOVR, drvdata->base + ECC_BLK_ACCCTRL_OFST);
1802
1803 writel(ECC_XACT_KICK, drvdata->base + ECC_BLK_STARTACC_OFST);
1804
1805 writel(readl(drvdata->base + ECC_BLK_RDATA0_OFST) ^ 0x1,
1806 drvdata->base + ECC_BLK_WDATA0_OFST);
1807 writel(readl(drvdata->base + ECC_BLK_RDATA1_OFST),
1808 drvdata->base + ECC_BLK_WDATA1_OFST);
1809 writel(readl(drvdata->base + ECC_BLK_RDATA2_OFST),
1810 drvdata->base + ECC_BLK_WDATA2_OFST);
1811 writel(readl(drvdata->base + ECC_BLK_RDATA3_OFST),
1812 drvdata->base + ECC_BLK_WDATA3_OFST);
1813
1814
1815 writel(readl(drvdata->base + ECC_BLK_RECC0_OFST),
1816 drvdata->base + ECC_BLK_WECC0_OFST);
1817 writel(readl(drvdata->base + ECC_BLK_RECC1_OFST),
1818 drvdata->base + ECC_BLK_WECC1_OFST);
1819
1820 writel(ECC_WRITE_EDOVR, drvdata->base + ECC_BLK_ACCCTRL_OFST);
1821
1822 writel(ECC_XACT_KICK, drvdata->base + ECC_BLK_STARTACC_OFST);
1823
1824 writel(ECC_READ_EDOVR, drvdata->base + ECC_BLK_ACCCTRL_OFST);
1825
1826 writel(ECC_XACT_KICK, drvdata->base + ECC_BLK_STARTACC_OFST);
1827 }
1828
1829
1830 wmb();
1831 local_irq_restore(flags);
1832
1833 return count;
1834 }
1835
1836 static void altr_edac_a10_irq_handler(struct irq_desc *desc)
1837 {
1838 int dberr, bit, sm_offset, irq_status;
1839 struct altr_arria10_edac *edac = irq_desc_get_handler_data(desc);
1840 struct irq_chip *chip = irq_desc_get_chip(desc);
1841 int irq = irq_desc_get_irq(desc);
1842 unsigned long bits;
1843
1844 dberr = (irq == edac->db_irq) ? 1 : 0;
1845 sm_offset = dberr ? A10_SYSMGR_ECC_INTSTAT_DERR_OFST :
1846 A10_SYSMGR_ECC_INTSTAT_SERR_OFST;
1847
1848 chained_irq_enter(chip, desc);
1849
1850 regmap_read(edac->ecc_mgr_map, sm_offset, &irq_status);
1851
1852 bits = irq_status;
1853 for_each_set_bit(bit, &bits, 32)
1854 generic_handle_domain_irq(edac->domain, dberr * 32 + bit);
1855
1856 chained_irq_exit(chip, desc);
1857 }
1858
1859 static int validate_parent_available(struct device_node *np)
1860 {
1861 struct device_node *parent;
1862 int ret = 0;
1863
1864
1865 if (of_device_is_compatible(np, "altr,sdram-edac-s10"))
1866 return 0;
1867
1868
1869 parent = of_parse_phandle(np, "altr,ecc-parent", 0);
1870 if (parent && !of_device_is_available(parent))
1871 ret = -ENODEV;
1872
1873 of_node_put(parent);
1874 return ret;
1875 }
1876
1877 static int get_s10_sdram_edac_resource(struct device_node *np,
1878 struct resource *res)
1879 {
1880 struct device_node *parent;
1881 int ret;
1882
1883 parent = of_parse_phandle(np, "altr,sdr-syscon", 0);
1884 if (!parent)
1885 return -ENODEV;
1886
1887 ret = of_address_to_resource(parent, 0, res);
1888 of_node_put(parent);
1889
1890 return ret;
1891 }
1892
1893 static int altr_edac_a10_device_add(struct altr_arria10_edac *edac,
1894 struct device_node *np)
1895 {
1896 struct edac_device_ctl_info *dci;
1897 struct altr_edac_device_dev *altdev;
1898 char *ecc_name = (char *)np->name;
1899 struct resource res;
1900 int edac_idx;
1901 int rc = 0;
1902 const struct edac_device_prv_data *prv;
1903
1904 const struct of_device_id *pdev_id =
1905 of_match_node(altr_edac_a10_device_of_match, np);
1906 if (IS_ERR_OR_NULL(pdev_id))
1907 return -ENODEV;
1908
1909
1910 prv = pdev_id->data;
1911 if (IS_ERR_OR_NULL(prv))
1912 return -ENODEV;
1913
1914 if (validate_parent_available(np))
1915 return -ENODEV;
1916
1917 if (!devres_open_group(edac->dev, altr_edac_a10_device_add, GFP_KERNEL))
1918 return -ENOMEM;
1919
1920 if (of_device_is_compatible(np, "altr,sdram-edac-s10"))
1921 rc = get_s10_sdram_edac_resource(np, &res);
1922 else
1923 rc = of_address_to_resource(np, 0, &res);
1924
1925 if (rc < 0) {
1926 edac_printk(KERN_ERR, EDAC_DEVICE,
1927 "%s: no resource address\n", ecc_name);
1928 goto err_release_group;
1929 }
1930
1931 edac_idx = edac_device_alloc_index();
1932 dci = edac_device_alloc_ctl_info(sizeof(*altdev), ecc_name,
1933 1, ecc_name, 1, 0, NULL, 0,
1934 edac_idx);
1935
1936 if (!dci) {
1937 edac_printk(KERN_ERR, EDAC_DEVICE,
1938 "%s: Unable to allocate EDAC device\n", ecc_name);
1939 rc = -ENOMEM;
1940 goto err_release_group;
1941 }
1942
1943 altdev = dci->pvt_info;
1944 dci->dev = edac->dev;
1945 altdev->edac_dev_name = ecc_name;
1946 altdev->edac_idx = edac_idx;
1947 altdev->edac = edac;
1948 altdev->edac_dev = dci;
1949 altdev->data = prv;
1950 altdev->ddev = *edac->dev;
1951 dci->dev = &altdev->ddev;
1952 dci->ctl_name = "Altera ECC Manager";
1953 dci->mod_name = ecc_name;
1954 dci->dev_name = ecc_name;
1955
1956 altdev->base = devm_ioremap_resource(edac->dev, &res);
1957 if (IS_ERR(altdev->base)) {
1958 rc = PTR_ERR(altdev->base);
1959 goto err_release_group1;
1960 }
1961
1962
1963 if (altdev->data->setup) {
1964 rc = altdev->data->setup(altdev);
1965 if (rc)
1966 goto err_release_group1;
1967 }
1968
1969 altdev->sb_irq = irq_of_parse_and_map(np, 0);
1970 if (!altdev->sb_irq) {
1971 edac_printk(KERN_ERR, EDAC_DEVICE, "Error allocating SBIRQ\n");
1972 rc = -ENODEV;
1973 goto err_release_group1;
1974 }
1975 rc = devm_request_irq(edac->dev, altdev->sb_irq, prv->ecc_irq_handler,
1976 IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
1977 ecc_name, altdev);
1978 if (rc) {
1979 edac_printk(KERN_ERR, EDAC_DEVICE, "No SBERR IRQ resource\n");
1980 goto err_release_group1;
1981 }
1982
1983 #ifdef CONFIG_64BIT
1984
1985 rc = of_property_read_u32_index(np, "interrupts", 0, &altdev->db_irq);
1986 if (rc) {
1987 edac_printk(KERN_ERR, EDAC_DEVICE,
1988 "Unable to parse DB IRQ index\n");
1989 goto err_release_group1;
1990 }
1991 #else
1992 altdev->db_irq = irq_of_parse_and_map(np, 1);
1993 if (!altdev->db_irq) {
1994 edac_printk(KERN_ERR, EDAC_DEVICE, "Error allocating DBIRQ\n");
1995 rc = -ENODEV;
1996 goto err_release_group1;
1997 }
1998 rc = devm_request_irq(edac->dev, altdev->db_irq, prv->ecc_irq_handler,
1999 IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
2000 ecc_name, altdev);
2001 if (rc) {
2002 edac_printk(KERN_ERR, EDAC_DEVICE, "No DBERR IRQ resource\n");
2003 goto err_release_group1;
2004 }
2005 #endif
2006
2007 rc = edac_device_add_device(dci);
2008 if (rc) {
2009 dev_err(edac->dev, "edac_device_add_device failed\n");
2010 rc = -ENOMEM;
2011 goto err_release_group1;
2012 }
2013
2014 altr_create_edacdev_dbgfs(dci, prv);
2015
2016 list_add(&altdev->next, &edac->a10_ecc_devices);
2017
2018 devres_remove_group(edac->dev, altr_edac_a10_device_add);
2019
2020 return 0;
2021
2022 err_release_group1:
2023 edac_device_free_ctl_info(dci);
2024 err_release_group:
2025 devres_release_group(edac->dev, NULL);
2026 edac_printk(KERN_ERR, EDAC_DEVICE,
2027 "%s:Error setting up EDAC device: %d\n", ecc_name, rc);
2028
2029 return rc;
2030 }
2031
2032 static void a10_eccmgr_irq_mask(struct irq_data *d)
2033 {
2034 struct altr_arria10_edac *edac = irq_data_get_irq_chip_data(d);
2035
2036 regmap_write(edac->ecc_mgr_map, A10_SYSMGR_ECC_INTMASK_SET_OFST,
2037 BIT(d->hwirq));
2038 }
2039
2040 static void a10_eccmgr_irq_unmask(struct irq_data *d)
2041 {
2042 struct altr_arria10_edac *edac = irq_data_get_irq_chip_data(d);
2043
2044 regmap_write(edac->ecc_mgr_map, A10_SYSMGR_ECC_INTMASK_CLR_OFST,
2045 BIT(d->hwirq));
2046 }
2047
2048 static int a10_eccmgr_irqdomain_map(struct irq_domain *d, unsigned int irq,
2049 irq_hw_number_t hwirq)
2050 {
2051 struct altr_arria10_edac *edac = d->host_data;
2052
2053 irq_set_chip_and_handler(irq, &edac->irq_chip, handle_simple_irq);
2054 irq_set_chip_data(irq, edac);
2055 irq_set_noprobe(irq);
2056
2057 return 0;
2058 }
2059
2060 static const struct irq_domain_ops a10_eccmgr_ic_ops = {
2061 .map = a10_eccmgr_irqdomain_map,
2062 .xlate = irq_domain_xlate_twocell,
2063 };
2064
2065
2066 #define to_a10edac(p, m) container_of(p, struct altr_arria10_edac, m)
2067
2068 #ifdef CONFIG_64BIT
2069
2070 extern int panic_timeout;
2071
2072
2073
2074
2075
2076 static int s10_edac_dberr_handler(struct notifier_block *this,
2077 unsigned long event, void *ptr)
2078 {
2079 struct altr_arria10_edac *edac = to_a10edac(this, panic_notifier);
2080 int err_addr, dberror;
2081
2082 regmap_read(edac->ecc_mgr_map, S10_SYSMGR_ECC_INTSTAT_DERR_OFST,
2083 &dberror);
2084 regmap_write(edac->ecc_mgr_map, S10_SYSMGR_UE_VAL_OFST, dberror);
2085 if (dberror & S10_DBE_IRQ_MASK) {
2086 struct list_head *position;
2087 struct altr_edac_device_dev *ed;
2088 struct arm_smccc_res result;
2089
2090
2091 list_for_each(position, &edac->a10_ecc_devices) {
2092 ed = list_entry(position, struct altr_edac_device_dev,
2093 next);
2094 if (!(BIT(ed->db_irq) & dberror))
2095 continue;
2096
2097 writel(ALTR_A10_ECC_DERRPENA,
2098 ed->base + ALTR_A10_ECC_INTSTAT_OFST);
2099 err_addr = readl(ed->base + ALTR_S10_DERR_ADDRA_OFST);
2100 regmap_write(edac->ecc_mgr_map,
2101 S10_SYSMGR_UE_ADDR_OFST, err_addr);
2102 edac_printk(KERN_ERR, EDAC_DEVICE,
2103 "EDAC: [Fatal DBE on %s @ 0x%08X]\n",
2104 ed->edac_dev_name, err_addr);
2105 break;
2106 }
2107
2108 panic_timeout = 1;
2109 arm_smccc_smc(INTEL_SIP_SMC_ECC_DBE, dberror, 0, 0, 0, 0,
2110 0, 0, &result);
2111 }
2112
2113 return NOTIFY_DONE;
2114 }
2115 #endif
2116
2117
2118 static int altr_edac_a10_probe(struct platform_device *pdev)
2119 {
2120 struct altr_arria10_edac *edac;
2121 struct device_node *child;
2122
2123 edac = devm_kzalloc(&pdev->dev, sizeof(*edac), GFP_KERNEL);
2124 if (!edac)
2125 return -ENOMEM;
2126
2127 edac->dev = &pdev->dev;
2128 platform_set_drvdata(pdev, edac);
2129 INIT_LIST_HEAD(&edac->a10_ecc_devices);
2130
2131 edac->ecc_mgr_map =
2132 altr_sysmgr_regmap_lookup_by_phandle(pdev->dev.of_node,
2133 "altr,sysmgr-syscon");
2134
2135 if (IS_ERR(edac->ecc_mgr_map)) {
2136 edac_printk(KERN_ERR, EDAC_DEVICE,
2137 "Unable to get syscon altr,sysmgr-syscon\n");
2138 return PTR_ERR(edac->ecc_mgr_map);
2139 }
2140
2141 edac->irq_chip.name = pdev->dev.of_node->name;
2142 edac->irq_chip.irq_mask = a10_eccmgr_irq_mask;
2143 edac->irq_chip.irq_unmask = a10_eccmgr_irq_unmask;
2144 edac->domain = irq_domain_add_linear(pdev->dev.of_node, 64,
2145 &a10_eccmgr_ic_ops, edac);
2146 if (!edac->domain) {
2147 dev_err(&pdev->dev, "Error adding IRQ domain\n");
2148 return -ENOMEM;
2149 }
2150
2151 edac->sb_irq = platform_get_irq(pdev, 0);
2152 if (edac->sb_irq < 0) {
2153 dev_err(&pdev->dev, "No SBERR IRQ resource\n");
2154 return edac->sb_irq;
2155 }
2156
2157 irq_set_chained_handler_and_data(edac->sb_irq,
2158 altr_edac_a10_irq_handler,
2159 edac);
2160
2161 #ifdef CONFIG_64BIT
2162 {
2163 int dberror, err_addr;
2164
2165 edac->panic_notifier.notifier_call = s10_edac_dberr_handler;
2166 atomic_notifier_chain_register(&panic_notifier_list,
2167 &edac->panic_notifier);
2168
2169
2170 regmap_read(edac->ecc_mgr_map, S10_SYSMGR_UE_VAL_OFST,
2171 &dberror);
2172 if (dberror) {
2173 regmap_read(edac->ecc_mgr_map, S10_SYSMGR_UE_ADDR_OFST,
2174 &err_addr);
2175 edac_printk(KERN_ERR, EDAC_DEVICE,
2176 "Previous Boot UE detected[0x%X] @ 0x%X\n",
2177 dberror, err_addr);
2178
2179 regmap_write(edac->ecc_mgr_map,
2180 S10_SYSMGR_UE_VAL_OFST, 0);
2181 regmap_write(edac->ecc_mgr_map,
2182 S10_SYSMGR_UE_ADDR_OFST, 0);
2183 }
2184 }
2185 #else
2186 edac->db_irq = platform_get_irq(pdev, 1);
2187 if (edac->db_irq < 0) {
2188 dev_err(&pdev->dev, "No DBERR IRQ resource\n");
2189 return edac->db_irq;
2190 }
2191 irq_set_chained_handler_and_data(edac->db_irq,
2192 altr_edac_a10_irq_handler, edac);
2193 #endif
2194
2195 for_each_child_of_node(pdev->dev.of_node, child) {
2196 if (!of_device_is_available(child))
2197 continue;
2198
2199 if (of_match_node(altr_edac_a10_device_of_match, child))
2200 altr_edac_a10_device_add(edac, child);
2201
2202 #ifdef CONFIG_EDAC_ALTERA_SDRAM
2203 else if (of_device_is_compatible(child, "altr,sdram-edac-a10"))
2204 of_platform_populate(pdev->dev.of_node,
2205 altr_sdram_ctrl_of_match,
2206 NULL, &pdev->dev);
2207 #endif
2208 }
2209
2210 return 0;
2211 }
2212
2213 static const struct of_device_id altr_edac_a10_of_match[] = {
2214 { .compatible = "altr,socfpga-a10-ecc-manager" },
2215 { .compatible = "altr,socfpga-s10-ecc-manager" },
2216 {},
2217 };
2218 MODULE_DEVICE_TABLE(of, altr_edac_a10_of_match);
2219
2220 static struct platform_driver altr_edac_a10_driver = {
2221 .probe = altr_edac_a10_probe,
2222 .driver = {
2223 .name = "socfpga_a10_ecc_manager",
2224 .of_match_table = altr_edac_a10_of_match,
2225 },
2226 };
2227 module_platform_driver(altr_edac_a10_driver);
2228
2229 MODULE_LICENSE("GPL v2");
2230 MODULE_AUTHOR("Thor Thayer");
2231 MODULE_DESCRIPTION("EDAC Driver for Altera Memories");