Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Synopsys DDR ECC Driver
0004  * This driver is based on ppc4xx_edac.c drivers
0005  *
0006  * Copyright (C) 2012 - 2014 Xilinx, Inc.
0007  */
0008 
0009 #include <linux/edac.h>
0010 #include <linux/module.h>
0011 #include <linux/platform_device.h>
0012 #include <linux/interrupt.h>
0013 #include <linux/of.h>
0014 #include <linux/of_device.h>
0015 
0016 #include "edac_module.h"
0017 
0018 /* Number of cs_rows needed per memory controller */
0019 #define SYNPS_EDAC_NR_CSROWS        1
0020 
0021 /* Number of channels per memory controller */
0022 #define SYNPS_EDAC_NR_CHANS     1
0023 
0024 /* Granularity of reported error in bytes */
0025 #define SYNPS_EDAC_ERR_GRAIN        1
0026 
0027 #define SYNPS_EDAC_MSG_SIZE     256
0028 
0029 #define SYNPS_EDAC_MOD_STRING       "synps_edac"
0030 #define SYNPS_EDAC_MOD_VER      "1"
0031 
0032 /* Synopsys DDR memory controller registers that are relevant to ECC */
0033 #define CTRL_OFST           0x0
0034 #define T_ZQ_OFST           0xA4
0035 
0036 /* ECC control register */
0037 #define ECC_CTRL_OFST           0xC4
0038 /* ECC log register */
0039 #define CE_LOG_OFST         0xC8
0040 /* ECC address register */
0041 #define CE_ADDR_OFST            0xCC
0042 /* ECC data[31:0] register */
0043 #define CE_DATA_31_0_OFST       0xD0
0044 
0045 /* Uncorrectable error info registers */
0046 #define UE_LOG_OFST         0xDC
0047 #define UE_ADDR_OFST            0xE0
0048 #define UE_DATA_31_0_OFST       0xE4
0049 
0050 #define STAT_OFST           0xF0
0051 #define SCRUB_OFST          0xF4
0052 
0053 /* Control register bit field definitions */
0054 #define CTRL_BW_MASK            0xC
0055 #define CTRL_BW_SHIFT           2
0056 
0057 #define DDRCTL_WDTH_16          1
0058 #define DDRCTL_WDTH_32          0
0059 
0060 /* ZQ register bit field definitions */
0061 #define T_ZQ_DDRMODE_MASK       0x2
0062 
0063 /* ECC control register bit field definitions */
0064 #define ECC_CTRL_CLR_CE_ERR     0x2
0065 #define ECC_CTRL_CLR_UE_ERR     0x1
0066 
0067 /* ECC correctable/uncorrectable error log register definitions */
0068 #define LOG_VALID           0x1
0069 #define CE_LOG_BITPOS_MASK      0xFE
0070 #define CE_LOG_BITPOS_SHIFT     1
0071 
0072 /* ECC correctable/uncorrectable error address register definitions */
0073 #define ADDR_COL_MASK           0xFFF
0074 #define ADDR_ROW_MASK           0xFFFF000
0075 #define ADDR_ROW_SHIFT          12
0076 #define ADDR_BANK_MASK          0x70000000
0077 #define ADDR_BANK_SHIFT         28
0078 
0079 /* ECC statistic register definitions */
0080 #define STAT_UECNT_MASK         0xFF
0081 #define STAT_CECNT_MASK         0xFF00
0082 #define STAT_CECNT_SHIFT        8
0083 
0084 /* ECC scrub register definitions */
0085 #define SCRUB_MODE_MASK         0x7
0086 #define SCRUB_MODE_SECDED       0x4
0087 
0088 /* DDR ECC Quirks */
0089 #define DDR_ECC_INTR_SUPPORT        BIT(0)
0090 #define DDR_ECC_DATA_POISON_SUPPORT BIT(1)
0091 #define DDR_ECC_INTR_SELF_CLEAR     BIT(2)
0092 
0093 /* ZynqMP Enhanced DDR memory controller registers that are relevant to ECC */
0094 /* ECC Configuration Registers */
0095 #define ECC_CFG0_OFST           0x70
0096 #define ECC_CFG1_OFST           0x74
0097 
0098 /* ECC Status Register */
0099 #define ECC_STAT_OFST           0x78
0100 
0101 /* ECC Clear Register */
0102 #define ECC_CLR_OFST            0x7C
0103 
0104 /* ECC Error count Register */
0105 #define ECC_ERRCNT_OFST         0x80
0106 
0107 /* ECC Corrected Error Address Register */
0108 #define ECC_CEADDR0_OFST        0x84
0109 #define ECC_CEADDR1_OFST        0x88
0110 
0111 /* ECC Syndrome Registers */
0112 #define ECC_CSYND0_OFST         0x8C
0113 #define ECC_CSYND1_OFST         0x90
0114 #define ECC_CSYND2_OFST         0x94
0115 
0116 /* ECC Bit Mask0 Address Register */
0117 #define ECC_BITMASK0_OFST       0x98
0118 #define ECC_BITMASK1_OFST       0x9C
0119 #define ECC_BITMASK2_OFST       0xA0
0120 
0121 /* ECC UnCorrected Error Address Register */
0122 #define ECC_UEADDR0_OFST        0xA4
0123 #define ECC_UEADDR1_OFST        0xA8
0124 
0125 /* ECC Syndrome Registers */
0126 #define ECC_UESYND0_OFST        0xAC
0127 #define ECC_UESYND1_OFST        0xB0
0128 #define ECC_UESYND2_OFST        0xB4
0129 
0130 /* ECC Poison Address Reg */
0131 #define ECC_POISON0_OFST        0xB8
0132 #define ECC_POISON1_OFST        0xBC
0133 
0134 #define ECC_ADDRMAP0_OFFSET     0x200
0135 
0136 /* Control register bitfield definitions */
0137 #define ECC_CTRL_BUSWIDTH_MASK      0x3000
0138 #define ECC_CTRL_BUSWIDTH_SHIFT     12
0139 #define ECC_CTRL_CLR_CE_ERRCNT      BIT(2)
0140 #define ECC_CTRL_CLR_UE_ERRCNT      BIT(3)
0141 
0142 /* DDR Control Register width definitions  */
0143 #define DDRCTL_EWDTH_16         2
0144 #define DDRCTL_EWDTH_32         1
0145 #define DDRCTL_EWDTH_64         0
0146 
0147 /* ECC status register definitions */
0148 #define ECC_STAT_UECNT_MASK     0xF0000
0149 #define ECC_STAT_UECNT_SHIFT        16
0150 #define ECC_STAT_CECNT_MASK     0xF00
0151 #define ECC_STAT_CECNT_SHIFT        8
0152 #define ECC_STAT_BITNUM_MASK        0x7F
0153 
0154 /* ECC error count register definitions */
0155 #define ECC_ERRCNT_UECNT_MASK       0xFFFF0000
0156 #define ECC_ERRCNT_UECNT_SHIFT      16
0157 #define ECC_ERRCNT_CECNT_MASK       0xFFFF
0158 
0159 /* DDR QOS Interrupt register definitions */
0160 #define DDR_QOS_IRQ_STAT_OFST       0x20200
0161 #define DDR_QOSUE_MASK          0x4
0162 #define DDR_QOSCE_MASK          0x2
0163 #define ECC_CE_UE_INTR_MASK     0x6
0164 #define DDR_QOS_IRQ_EN_OFST     0x20208
0165 #define DDR_QOS_IRQ_DB_OFST     0x2020C
0166 
0167 /* DDR QOS Interrupt register definitions */
0168 #define DDR_UE_MASK         BIT(9)
0169 #define DDR_CE_MASK         BIT(8)
0170 
0171 /* ECC Corrected Error Register Mask and Shifts*/
0172 #define ECC_CEADDR0_RW_MASK     0x3FFFF
0173 #define ECC_CEADDR0_RNK_MASK        BIT(24)
0174 #define ECC_CEADDR1_BNKGRP_MASK     0x3000000
0175 #define ECC_CEADDR1_BNKNR_MASK      0x70000
0176 #define ECC_CEADDR1_BLKNR_MASK      0xFFF
0177 #define ECC_CEADDR1_BNKGRP_SHIFT    24
0178 #define ECC_CEADDR1_BNKNR_SHIFT     16
0179 
0180 /* ECC Poison register shifts */
0181 #define ECC_POISON0_RANK_SHIFT      24
0182 #define ECC_POISON0_RANK_MASK       BIT(24)
0183 #define ECC_POISON0_COLUMN_SHIFT    0
0184 #define ECC_POISON0_COLUMN_MASK     0xFFF
0185 #define ECC_POISON1_BG_SHIFT        28
0186 #define ECC_POISON1_BG_MASK     0x30000000
0187 #define ECC_POISON1_BANKNR_SHIFT    24
0188 #define ECC_POISON1_BANKNR_MASK     0x7000000
0189 #define ECC_POISON1_ROW_SHIFT       0
0190 #define ECC_POISON1_ROW_MASK        0x3FFFF
0191 
0192 /* DDR Memory type defines */
0193 #define MEM_TYPE_DDR3           0x1
0194 #define MEM_TYPE_LPDDR3         0x8
0195 #define MEM_TYPE_DDR2           0x4
0196 #define MEM_TYPE_DDR4           0x10
0197 #define MEM_TYPE_LPDDR4         0x20
0198 
0199 /* DDRC Software control register */
0200 #define DDRC_SWCTL          0x320
0201 
0202 /* DDRC ECC CE & UE poison mask */
0203 #define ECC_CEPOISON_MASK       0x3
0204 #define ECC_UEPOISON_MASK       0x1
0205 
0206 /* DDRC Device config masks */
0207 #define DDRC_MSTR_CFG_MASK      0xC0000000
0208 #define DDRC_MSTR_CFG_SHIFT     30
0209 #define DDRC_MSTR_CFG_X4_MASK       0x0
0210 #define DDRC_MSTR_CFG_X8_MASK       0x1
0211 #define DDRC_MSTR_CFG_X16_MASK      0x2
0212 #define DDRC_MSTR_CFG_X32_MASK      0x3
0213 
0214 #define DDR_MAX_ROW_SHIFT       18
0215 #define DDR_MAX_COL_SHIFT       14
0216 #define DDR_MAX_BANK_SHIFT      3
0217 #define DDR_MAX_BANKGRP_SHIFT       2
0218 
0219 #define ROW_MAX_VAL_MASK        0xF
0220 #define COL_MAX_VAL_MASK        0xF
0221 #define BANK_MAX_VAL_MASK       0x1F
0222 #define BANKGRP_MAX_VAL_MASK        0x1F
0223 #define RANK_MAX_VAL_MASK       0x1F
0224 
0225 #define ROW_B0_BASE         6
0226 #define ROW_B1_BASE         7
0227 #define ROW_B2_BASE         8
0228 #define ROW_B3_BASE         9
0229 #define ROW_B4_BASE         10
0230 #define ROW_B5_BASE         11
0231 #define ROW_B6_BASE         12
0232 #define ROW_B7_BASE         13
0233 #define ROW_B8_BASE         14
0234 #define ROW_B9_BASE         15
0235 #define ROW_B10_BASE            16
0236 #define ROW_B11_BASE            17
0237 #define ROW_B12_BASE            18
0238 #define ROW_B13_BASE            19
0239 #define ROW_B14_BASE            20
0240 #define ROW_B15_BASE            21
0241 #define ROW_B16_BASE            22
0242 #define ROW_B17_BASE            23
0243 
0244 #define COL_B2_BASE         2
0245 #define COL_B3_BASE         3
0246 #define COL_B4_BASE         4
0247 #define COL_B5_BASE         5
0248 #define COL_B6_BASE         6
0249 #define COL_B7_BASE         7
0250 #define COL_B8_BASE         8
0251 #define COL_B9_BASE         9
0252 #define COL_B10_BASE            10
0253 #define COL_B11_BASE            11
0254 #define COL_B12_BASE            12
0255 #define COL_B13_BASE            13
0256 
0257 #define BANK_B0_BASE            2
0258 #define BANK_B1_BASE            3
0259 #define BANK_B2_BASE            4
0260 
0261 #define BANKGRP_B0_BASE         2
0262 #define BANKGRP_B1_BASE         3
0263 
0264 #define RANK_B0_BASE            6
0265 
0266 /**
0267  * struct ecc_error_info - ECC error log information.
0268  * @row:    Row number.
0269  * @col:    Column number.
0270  * @bank:   Bank number.
0271  * @bitpos: Bit position.
0272  * @data:   Data causing the error.
0273  * @bankgrpnr:  Bank group number.
0274  * @blknr:  Block number.
0275  */
0276 struct ecc_error_info {
0277     u32 row;
0278     u32 col;
0279     u32 bank;
0280     u32 bitpos;
0281     u32 data;
0282     u32 bankgrpnr;
0283     u32 blknr;
0284 };
0285 
0286 /**
0287  * struct synps_ecc_status - ECC status information to report.
0288  * @ce_cnt: Correctable error count.
0289  * @ue_cnt: Uncorrectable error count.
0290  * @ceinfo: Correctable error log information.
0291  * @ueinfo: Uncorrectable error log information.
0292  */
0293 struct synps_ecc_status {
0294     u32 ce_cnt;
0295     u32 ue_cnt;
0296     struct ecc_error_info ceinfo;
0297     struct ecc_error_info ueinfo;
0298 };
0299 
0300 /**
0301  * struct synps_edac_priv - DDR memory controller private instance data.
0302  * @baseaddr:       Base address of the DDR controller.
0303  * @message:        Buffer for framing the event specific info.
0304  * @stat:       ECC status information.
0305  * @p_data:     Platform data.
0306  * @ce_cnt:     Correctable Error count.
0307  * @ue_cnt:     Uncorrectable Error count.
0308  * @poison_addr:    Data poison address.
0309  * @row_shift:      Bit shifts for row bit.
0310  * @col_shift:      Bit shifts for column bit.
0311  * @bank_shift:     Bit shifts for bank bit.
0312  * @bankgrp_shift:  Bit shifts for bank group bit.
0313  * @rank_shift:     Bit shifts for rank bit.
0314  */
0315 struct synps_edac_priv {
0316     void __iomem *baseaddr;
0317     char message[SYNPS_EDAC_MSG_SIZE];
0318     struct synps_ecc_status stat;
0319     const struct synps_platform_data *p_data;
0320     u32 ce_cnt;
0321     u32 ue_cnt;
0322 #ifdef CONFIG_EDAC_DEBUG
0323     ulong poison_addr;
0324     u32 row_shift[18];
0325     u32 col_shift[14];
0326     u32 bank_shift[3];
0327     u32 bankgrp_shift[2];
0328     u32 rank_shift[1];
0329 #endif
0330 };
0331 
0332 /**
0333  * struct synps_platform_data -  synps platform data structure.
0334  * @get_error_info: Get EDAC error info.
0335  * @get_mtype:      Get mtype.
0336  * @get_dtype:      Get dtype.
0337  * @get_ecc_state:  Get ECC state.
0338  * @quirks:     To differentiate IPs.
0339  */
0340 struct synps_platform_data {
0341     int (*get_error_info)(struct synps_edac_priv *priv);
0342     enum mem_type (*get_mtype)(const void __iomem *base);
0343     enum dev_type (*get_dtype)(const void __iomem *base);
0344     bool (*get_ecc_state)(void __iomem *base);
0345     int quirks;
0346 };
0347 
0348 /**
0349  * zynq_get_error_info - Get the current ECC error info.
0350  * @priv:   DDR memory controller private instance data.
0351  *
0352  * Return: one if there is no error, otherwise zero.
0353  */
0354 static int zynq_get_error_info(struct synps_edac_priv *priv)
0355 {
0356     struct synps_ecc_status *p;
0357     u32 regval, clearval = 0;
0358     void __iomem *base;
0359 
0360     base = priv->baseaddr;
0361     p = &priv->stat;
0362 
0363     regval = readl(base + STAT_OFST);
0364     if (!regval)
0365         return 1;
0366 
0367     p->ce_cnt = (regval & STAT_CECNT_MASK) >> STAT_CECNT_SHIFT;
0368     p->ue_cnt = regval & STAT_UECNT_MASK;
0369 
0370     regval = readl(base + CE_LOG_OFST);
0371     if (!(p->ce_cnt && (regval & LOG_VALID)))
0372         goto ue_err;
0373 
0374     p->ceinfo.bitpos = (regval & CE_LOG_BITPOS_MASK) >> CE_LOG_BITPOS_SHIFT;
0375     regval = readl(base + CE_ADDR_OFST);
0376     p->ceinfo.row = (regval & ADDR_ROW_MASK) >> ADDR_ROW_SHIFT;
0377     p->ceinfo.col = regval & ADDR_COL_MASK;
0378     p->ceinfo.bank = (regval & ADDR_BANK_MASK) >> ADDR_BANK_SHIFT;
0379     p->ceinfo.data = readl(base + CE_DATA_31_0_OFST);
0380     edac_dbg(3, "CE bit position: %d data: %d\n", p->ceinfo.bitpos,
0381          p->ceinfo.data);
0382     clearval = ECC_CTRL_CLR_CE_ERR;
0383 
0384 ue_err:
0385     regval = readl(base + UE_LOG_OFST);
0386     if (!(p->ue_cnt && (regval & LOG_VALID)))
0387         goto out;
0388 
0389     regval = readl(base + UE_ADDR_OFST);
0390     p->ueinfo.row = (regval & ADDR_ROW_MASK) >> ADDR_ROW_SHIFT;
0391     p->ueinfo.col = regval & ADDR_COL_MASK;
0392     p->ueinfo.bank = (regval & ADDR_BANK_MASK) >> ADDR_BANK_SHIFT;
0393     p->ueinfo.data = readl(base + UE_DATA_31_0_OFST);
0394     clearval |= ECC_CTRL_CLR_UE_ERR;
0395 
0396 out:
0397     writel(clearval, base + ECC_CTRL_OFST);
0398     writel(0x0, base + ECC_CTRL_OFST);
0399 
0400     return 0;
0401 }
0402 
0403 /**
0404  * zynqmp_get_error_info - Get the current ECC error info.
0405  * @priv:   DDR memory controller private instance data.
0406  *
0407  * Return: one if there is no error otherwise returns zero.
0408  */
0409 static int zynqmp_get_error_info(struct synps_edac_priv *priv)
0410 {
0411     struct synps_ecc_status *p;
0412     u32 regval, clearval = 0;
0413     void __iomem *base;
0414 
0415     base = priv->baseaddr;
0416     p = &priv->stat;
0417 
0418     regval = readl(base + ECC_ERRCNT_OFST);
0419     p->ce_cnt = regval & ECC_ERRCNT_CECNT_MASK;
0420     p->ue_cnt = (regval & ECC_ERRCNT_UECNT_MASK) >> ECC_ERRCNT_UECNT_SHIFT;
0421     if (!p->ce_cnt)
0422         goto ue_err;
0423 
0424     regval = readl(base + ECC_STAT_OFST);
0425     if (!regval)
0426         return 1;
0427 
0428     p->ceinfo.bitpos = (regval & ECC_STAT_BITNUM_MASK);
0429 
0430     regval = readl(base + ECC_CEADDR0_OFST);
0431     p->ceinfo.row = (regval & ECC_CEADDR0_RW_MASK);
0432     regval = readl(base + ECC_CEADDR1_OFST);
0433     p->ceinfo.bank = (regval & ECC_CEADDR1_BNKNR_MASK) >>
0434                     ECC_CEADDR1_BNKNR_SHIFT;
0435     p->ceinfo.bankgrpnr = (regval & ECC_CEADDR1_BNKGRP_MASK) >>
0436                     ECC_CEADDR1_BNKGRP_SHIFT;
0437     p->ceinfo.blknr = (regval & ECC_CEADDR1_BLKNR_MASK);
0438     p->ceinfo.data = readl(base + ECC_CSYND0_OFST);
0439     edac_dbg(2, "ECCCSYN0: 0x%08X ECCCSYN1: 0x%08X ECCCSYN2: 0x%08X\n",
0440          readl(base + ECC_CSYND0_OFST), readl(base + ECC_CSYND1_OFST),
0441          readl(base + ECC_CSYND2_OFST));
0442 ue_err:
0443     if (!p->ue_cnt)
0444         goto out;
0445 
0446     regval = readl(base + ECC_UEADDR0_OFST);
0447     p->ueinfo.row = (regval & ECC_CEADDR0_RW_MASK);
0448     regval = readl(base + ECC_UEADDR1_OFST);
0449     p->ueinfo.bankgrpnr = (regval & ECC_CEADDR1_BNKGRP_MASK) >>
0450                     ECC_CEADDR1_BNKGRP_SHIFT;
0451     p->ueinfo.bank = (regval & ECC_CEADDR1_BNKNR_MASK) >>
0452                     ECC_CEADDR1_BNKNR_SHIFT;
0453     p->ueinfo.blknr = (regval & ECC_CEADDR1_BLKNR_MASK);
0454     p->ueinfo.data = readl(base + ECC_UESYND0_OFST);
0455 out:
0456     clearval = ECC_CTRL_CLR_CE_ERR | ECC_CTRL_CLR_CE_ERRCNT;
0457     clearval |= ECC_CTRL_CLR_UE_ERR | ECC_CTRL_CLR_UE_ERRCNT;
0458     writel(clearval, base + ECC_CLR_OFST);
0459     writel(0x0, base + ECC_CLR_OFST);
0460 
0461     return 0;
0462 }
0463 
0464 /**
0465  * handle_error - Handle Correctable and Uncorrectable errors.
0466  * @mci:    EDAC memory controller instance.
0467  * @p:      Synopsys ECC status structure.
0468  *
0469  * Handles ECC correctable and uncorrectable errors.
0470  */
0471 static void handle_error(struct mem_ctl_info *mci, struct synps_ecc_status *p)
0472 {
0473     struct synps_edac_priv *priv = mci->pvt_info;
0474     struct ecc_error_info *pinf;
0475 
0476     if (p->ce_cnt) {
0477         pinf = &p->ceinfo;
0478         if (priv->p_data->quirks & DDR_ECC_INTR_SUPPORT) {
0479             snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
0480                  "DDR ECC error type:%s Row %d Bank %d BankGroup Number %d Block Number %d Bit Position: %d Data: 0x%08x",
0481                  "CE", pinf->row, pinf->bank,
0482                  pinf->bankgrpnr, pinf->blknr,
0483                  pinf->bitpos, pinf->data);
0484         } else {
0485             snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
0486                  "DDR ECC error type:%s Row %d Bank %d Col %d Bit Position: %d Data: 0x%08x",
0487                  "CE", pinf->row, pinf->bank, pinf->col,
0488                  pinf->bitpos, pinf->data);
0489         }
0490 
0491         edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci,
0492                      p->ce_cnt, 0, 0, 0, 0, 0, -1,
0493                      priv->message, "");
0494     }
0495 
0496     if (p->ue_cnt) {
0497         pinf = &p->ueinfo;
0498         if (priv->p_data->quirks & DDR_ECC_INTR_SUPPORT) {
0499             snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
0500                  "DDR ECC error type :%s Row %d Bank %d BankGroup Number %d Block Number %d",
0501                  "UE", pinf->row, pinf->bank,
0502                  pinf->bankgrpnr, pinf->blknr);
0503         } else {
0504             snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
0505                  "DDR ECC error type :%s Row %d Bank %d Col %d ",
0506                  "UE", pinf->row, pinf->bank, pinf->col);
0507         }
0508 
0509         edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci,
0510                      p->ue_cnt, 0, 0, 0, 0, 0, -1,
0511                      priv->message, "");
0512     }
0513 
0514     memset(p, 0, sizeof(*p));
0515 }
0516 
0517 static void enable_intr(struct synps_edac_priv *priv)
0518 {
0519     /* Enable UE/CE Interrupts */
0520     if (priv->p_data->quirks & DDR_ECC_INTR_SELF_CLEAR)
0521         writel(DDR_UE_MASK | DDR_CE_MASK,
0522                priv->baseaddr + ECC_CLR_OFST);
0523     else
0524         writel(DDR_QOSUE_MASK | DDR_QOSCE_MASK,
0525                priv->baseaddr + DDR_QOS_IRQ_EN_OFST);
0526 
0527 }
0528 
0529 static void disable_intr(struct synps_edac_priv *priv)
0530 {
0531     /* Disable UE/CE Interrupts */
0532     if (priv->p_data->quirks & DDR_ECC_INTR_SELF_CLEAR)
0533         writel(0x0, priv->baseaddr + ECC_CLR_OFST);
0534     else
0535         writel(DDR_QOSUE_MASK | DDR_QOSCE_MASK,
0536                priv->baseaddr + DDR_QOS_IRQ_DB_OFST);
0537 }
0538 
0539 /**
0540  * intr_handler - Interrupt Handler for ECC interrupts.
0541  * @irq:        IRQ number.
0542  * @dev_id:     Device ID.
0543  *
0544  * Return: IRQ_NONE, if interrupt not set or IRQ_HANDLED otherwise.
0545  */
0546 static irqreturn_t intr_handler(int irq, void *dev_id)
0547 {
0548     const struct synps_platform_data *p_data;
0549     struct mem_ctl_info *mci = dev_id;
0550     struct synps_edac_priv *priv;
0551     int status, regval;
0552 
0553     priv = mci->pvt_info;
0554     p_data = priv->p_data;
0555 
0556     /*
0557      * v3.0 of the controller has the ce/ue bits cleared automatically,
0558      * so this condition does not apply.
0559      */
0560     if (!(priv->p_data->quirks & DDR_ECC_INTR_SELF_CLEAR)) {
0561         regval = readl(priv->baseaddr + DDR_QOS_IRQ_STAT_OFST);
0562         regval &= (DDR_QOSCE_MASK | DDR_QOSUE_MASK);
0563         if (!(regval & ECC_CE_UE_INTR_MASK))
0564             return IRQ_NONE;
0565     }
0566 
0567     status = p_data->get_error_info(priv);
0568     if (status)
0569         return IRQ_NONE;
0570 
0571     priv->ce_cnt += priv->stat.ce_cnt;
0572     priv->ue_cnt += priv->stat.ue_cnt;
0573     handle_error(mci, &priv->stat);
0574 
0575     edac_dbg(3, "Total error count CE %d UE %d\n",
0576          priv->ce_cnt, priv->ue_cnt);
0577     /* v3.0 of the controller does not have this register */
0578     if (!(priv->p_data->quirks & DDR_ECC_INTR_SELF_CLEAR))
0579         writel(regval, priv->baseaddr + DDR_QOS_IRQ_STAT_OFST);
0580     else
0581         enable_intr(priv);
0582 
0583     return IRQ_HANDLED;
0584 }
0585 
0586 /**
0587  * check_errors - Check controller for ECC errors.
0588  * @mci:    EDAC memory controller instance.
0589  *
0590  * Check and post ECC errors. Called by the polling thread.
0591  */
0592 static void check_errors(struct mem_ctl_info *mci)
0593 {
0594     const struct synps_platform_data *p_data;
0595     struct synps_edac_priv *priv;
0596     int status;
0597 
0598     priv = mci->pvt_info;
0599     p_data = priv->p_data;
0600 
0601     status = p_data->get_error_info(priv);
0602     if (status)
0603         return;
0604 
0605     priv->ce_cnt += priv->stat.ce_cnt;
0606     priv->ue_cnt += priv->stat.ue_cnt;
0607     handle_error(mci, &priv->stat);
0608 
0609     edac_dbg(3, "Total error count CE %d UE %d\n",
0610          priv->ce_cnt, priv->ue_cnt);
0611 }
0612 
0613 /**
0614  * zynq_get_dtype - Return the controller memory width.
0615  * @base:   DDR memory controller base address.
0616  *
0617  * Get the EDAC device type width appropriate for the current controller
0618  * configuration.
0619  *
0620  * Return: a device type width enumeration.
0621  */
0622 static enum dev_type zynq_get_dtype(const void __iomem *base)
0623 {
0624     enum dev_type dt;
0625     u32 width;
0626 
0627     width = readl(base + CTRL_OFST);
0628     width = (width & CTRL_BW_MASK) >> CTRL_BW_SHIFT;
0629 
0630     switch (width) {
0631     case DDRCTL_WDTH_16:
0632         dt = DEV_X2;
0633         break;
0634     case DDRCTL_WDTH_32:
0635         dt = DEV_X4;
0636         break;
0637     default:
0638         dt = DEV_UNKNOWN;
0639     }
0640 
0641     return dt;
0642 }
0643 
0644 /**
0645  * zynqmp_get_dtype - Return the controller memory width.
0646  * @base:   DDR memory controller base address.
0647  *
0648  * Get the EDAC device type width appropriate for the current controller
0649  * configuration.
0650  *
0651  * Return: a device type width enumeration.
0652  */
0653 static enum dev_type zynqmp_get_dtype(const void __iomem *base)
0654 {
0655     enum dev_type dt;
0656     u32 width;
0657 
0658     width = readl(base + CTRL_OFST);
0659     width = (width & ECC_CTRL_BUSWIDTH_MASK) >> ECC_CTRL_BUSWIDTH_SHIFT;
0660     switch (width) {
0661     case DDRCTL_EWDTH_16:
0662         dt = DEV_X2;
0663         break;
0664     case DDRCTL_EWDTH_32:
0665         dt = DEV_X4;
0666         break;
0667     case DDRCTL_EWDTH_64:
0668         dt = DEV_X8;
0669         break;
0670     default:
0671         dt = DEV_UNKNOWN;
0672     }
0673 
0674     return dt;
0675 }
0676 
0677 /**
0678  * zynq_get_ecc_state - Return the controller ECC enable/disable status.
0679  * @base:   DDR memory controller base address.
0680  *
0681  * Get the ECC enable/disable status of the controller.
0682  *
0683  * Return: true if enabled, otherwise false.
0684  */
0685 static bool zynq_get_ecc_state(void __iomem *base)
0686 {
0687     enum dev_type dt;
0688     u32 ecctype;
0689 
0690     dt = zynq_get_dtype(base);
0691     if (dt == DEV_UNKNOWN)
0692         return false;
0693 
0694     ecctype = readl(base + SCRUB_OFST) & SCRUB_MODE_MASK;
0695     if ((ecctype == SCRUB_MODE_SECDED) && (dt == DEV_X2))
0696         return true;
0697 
0698     return false;
0699 }
0700 
0701 /**
0702  * zynqmp_get_ecc_state - Return the controller ECC enable/disable status.
0703  * @base:   DDR memory controller base address.
0704  *
0705  * Get the ECC enable/disable status for the controller.
0706  *
0707  * Return: a ECC status boolean i.e true/false - enabled/disabled.
0708  */
0709 static bool zynqmp_get_ecc_state(void __iomem *base)
0710 {
0711     enum dev_type dt;
0712     u32 ecctype;
0713 
0714     dt = zynqmp_get_dtype(base);
0715     if (dt == DEV_UNKNOWN)
0716         return false;
0717 
0718     ecctype = readl(base + ECC_CFG0_OFST) & SCRUB_MODE_MASK;
0719     if ((ecctype == SCRUB_MODE_SECDED) &&
0720         ((dt == DEV_X2) || (dt == DEV_X4) || (dt == DEV_X8)))
0721         return true;
0722 
0723     return false;
0724 }
0725 
0726 /**
0727  * get_memsize - Read the size of the attached memory device.
0728  *
0729  * Return: the memory size in bytes.
0730  */
0731 static u32 get_memsize(void)
0732 {
0733     struct sysinfo inf;
0734 
0735     si_meminfo(&inf);
0736 
0737     return inf.totalram * inf.mem_unit;
0738 }
0739 
0740 /**
0741  * zynq_get_mtype - Return the controller memory type.
0742  * @base:   Synopsys ECC status structure.
0743  *
0744  * Get the EDAC memory type appropriate for the current controller
0745  * configuration.
0746  *
0747  * Return: a memory type enumeration.
0748  */
0749 static enum mem_type zynq_get_mtype(const void __iomem *base)
0750 {
0751     enum mem_type mt;
0752     u32 memtype;
0753 
0754     memtype = readl(base + T_ZQ_OFST);
0755 
0756     if (memtype & T_ZQ_DDRMODE_MASK)
0757         mt = MEM_DDR3;
0758     else
0759         mt = MEM_DDR2;
0760 
0761     return mt;
0762 }
0763 
0764 /**
0765  * zynqmp_get_mtype - Returns controller memory type.
0766  * @base:   Synopsys ECC status structure.
0767  *
0768  * Get the EDAC memory type appropriate for the current controller
0769  * configuration.
0770  *
0771  * Return: a memory type enumeration.
0772  */
0773 static enum mem_type zynqmp_get_mtype(const void __iomem *base)
0774 {
0775     enum mem_type mt;
0776     u32 memtype;
0777 
0778     memtype = readl(base + CTRL_OFST);
0779 
0780     if ((memtype & MEM_TYPE_DDR3) || (memtype & MEM_TYPE_LPDDR3))
0781         mt = MEM_DDR3;
0782     else if (memtype & MEM_TYPE_DDR2)
0783         mt = MEM_RDDR2;
0784     else if ((memtype & MEM_TYPE_LPDDR4) || (memtype & MEM_TYPE_DDR4))
0785         mt = MEM_DDR4;
0786     else
0787         mt = MEM_EMPTY;
0788 
0789     return mt;
0790 }
0791 
0792 /**
0793  * init_csrows - Initialize the csrow data.
0794  * @mci:    EDAC memory controller instance.
0795  *
0796  * Initialize the chip select rows associated with the EDAC memory
0797  * controller instance.
0798  */
0799 static void init_csrows(struct mem_ctl_info *mci)
0800 {
0801     struct synps_edac_priv *priv = mci->pvt_info;
0802     const struct synps_platform_data *p_data;
0803     struct csrow_info *csi;
0804     struct dimm_info *dimm;
0805     u32 size, row;
0806     int j;
0807 
0808     p_data = priv->p_data;
0809 
0810     for (row = 0; row < mci->nr_csrows; row++) {
0811         csi = mci->csrows[row];
0812         size = get_memsize();
0813 
0814         for (j = 0; j < csi->nr_channels; j++) {
0815             dimm        = csi->channels[j]->dimm;
0816             dimm->edac_mode = EDAC_SECDED;
0817             dimm->mtype = p_data->get_mtype(priv->baseaddr);
0818             dimm->nr_pages  = (size >> PAGE_SHIFT) / csi->nr_channels;
0819             dimm->grain = SYNPS_EDAC_ERR_GRAIN;
0820             dimm->dtype = p_data->get_dtype(priv->baseaddr);
0821         }
0822     }
0823 }
0824 
0825 /**
0826  * mc_init - Initialize one driver instance.
0827  * @mci:    EDAC memory controller instance.
0828  * @pdev:   platform device.
0829  *
0830  * Perform initialization of the EDAC memory controller instance and
0831  * related driver-private data associated with the memory controller the
0832  * instance is bound to.
0833  */
0834 static void mc_init(struct mem_ctl_info *mci, struct platform_device *pdev)
0835 {
0836     struct synps_edac_priv *priv;
0837 
0838     mci->pdev = &pdev->dev;
0839     priv = mci->pvt_info;
0840     platform_set_drvdata(pdev, mci);
0841 
0842     /* Initialize controller capabilities and configuration */
0843     mci->mtype_cap = MEM_FLAG_DDR3 | MEM_FLAG_DDR2;
0844     mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
0845     mci->scrub_cap = SCRUB_HW_SRC;
0846     mci->scrub_mode = SCRUB_NONE;
0847 
0848     mci->edac_cap = EDAC_FLAG_SECDED;
0849     mci->ctl_name = "synps_ddr_controller";
0850     mci->dev_name = SYNPS_EDAC_MOD_STRING;
0851     mci->mod_name = SYNPS_EDAC_MOD_VER;
0852 
0853     if (priv->p_data->quirks & DDR_ECC_INTR_SUPPORT) {
0854         edac_op_state = EDAC_OPSTATE_INT;
0855     } else {
0856         edac_op_state = EDAC_OPSTATE_POLL;
0857         mci->edac_check = check_errors;
0858     }
0859 
0860     mci->ctl_page_to_phys = NULL;
0861 
0862     init_csrows(mci);
0863 }
0864 
0865 static int setup_irq(struct mem_ctl_info *mci,
0866              struct platform_device *pdev)
0867 {
0868     struct synps_edac_priv *priv = mci->pvt_info;
0869     int ret, irq;
0870 
0871     irq = platform_get_irq(pdev, 0);
0872     if (irq < 0) {
0873         edac_printk(KERN_ERR, EDAC_MC,
0874                 "No IRQ %d in DT\n", irq);
0875         return irq;
0876     }
0877 
0878     ret = devm_request_irq(&pdev->dev, irq, intr_handler,
0879                    0, dev_name(&pdev->dev), mci);
0880     if (ret < 0) {
0881         edac_printk(KERN_ERR, EDAC_MC, "Failed to request IRQ\n");
0882         return ret;
0883     }
0884 
0885     enable_intr(priv);
0886 
0887     return 0;
0888 }
0889 
0890 static const struct synps_platform_data zynq_edac_def = {
0891     .get_error_info = zynq_get_error_info,
0892     .get_mtype  = zynq_get_mtype,
0893     .get_dtype  = zynq_get_dtype,
0894     .get_ecc_state  = zynq_get_ecc_state,
0895     .quirks     = 0,
0896 };
0897 
0898 static const struct synps_platform_data zynqmp_edac_def = {
0899     .get_error_info = zynqmp_get_error_info,
0900     .get_mtype  = zynqmp_get_mtype,
0901     .get_dtype  = zynqmp_get_dtype,
0902     .get_ecc_state  = zynqmp_get_ecc_state,
0903     .quirks         = (DDR_ECC_INTR_SUPPORT
0904 #ifdef CONFIG_EDAC_DEBUG
0905               | DDR_ECC_DATA_POISON_SUPPORT
0906 #endif
0907               ),
0908 };
0909 
0910 static const struct synps_platform_data synopsys_edac_def = {
0911     .get_error_info = zynqmp_get_error_info,
0912     .get_mtype  = zynqmp_get_mtype,
0913     .get_dtype  = zynqmp_get_dtype,
0914     .get_ecc_state  = zynqmp_get_ecc_state,
0915     .quirks         = (DDR_ECC_INTR_SUPPORT | DDR_ECC_INTR_SELF_CLEAR
0916 #ifdef CONFIG_EDAC_DEBUG
0917               | DDR_ECC_DATA_POISON_SUPPORT
0918 #endif
0919               ),
0920 };
0921 
0922 
0923 static const struct of_device_id synps_edac_match[] = {
0924     {
0925         .compatible = "xlnx,zynq-ddrc-a05",
0926         .data = (void *)&zynq_edac_def
0927     },
0928     {
0929         .compatible = "xlnx,zynqmp-ddrc-2.40a",
0930         .data = (void *)&zynqmp_edac_def
0931     },
0932     {
0933         .compatible = "snps,ddrc-3.80a",
0934         .data = (void *)&synopsys_edac_def
0935     },
0936     {
0937         /* end of table */
0938     }
0939 };
0940 
0941 MODULE_DEVICE_TABLE(of, synps_edac_match);
0942 
0943 #ifdef CONFIG_EDAC_DEBUG
0944 #define to_mci(k) container_of(k, struct mem_ctl_info, dev)
0945 
0946 /**
0947  * ddr_poison_setup -   Update poison registers.
0948  * @priv:       DDR memory controller private instance data.
0949  *
0950  * Update poison registers as per DDR mapping.
0951  * Return: none.
0952  */
0953 static void ddr_poison_setup(struct synps_edac_priv *priv)
0954 {
0955     int col = 0, row = 0, bank = 0, bankgrp = 0, rank = 0, regval;
0956     int index;
0957     ulong hif_addr = 0;
0958 
0959     hif_addr = priv->poison_addr >> 3;
0960 
0961     for (index = 0; index < DDR_MAX_ROW_SHIFT; index++) {
0962         if (priv->row_shift[index])
0963             row |= (((hif_addr >> priv->row_shift[index]) &
0964                         BIT(0)) << index);
0965         else
0966             break;
0967     }
0968 
0969     for (index = 0; index < DDR_MAX_COL_SHIFT; index++) {
0970         if (priv->col_shift[index] || index < 3)
0971             col |= (((hif_addr >> priv->col_shift[index]) &
0972                         BIT(0)) << index);
0973         else
0974             break;
0975     }
0976 
0977     for (index = 0; index < DDR_MAX_BANK_SHIFT; index++) {
0978         if (priv->bank_shift[index])
0979             bank |= (((hif_addr >> priv->bank_shift[index]) &
0980                         BIT(0)) << index);
0981         else
0982             break;
0983     }
0984 
0985     for (index = 0; index < DDR_MAX_BANKGRP_SHIFT; index++) {
0986         if (priv->bankgrp_shift[index])
0987             bankgrp |= (((hif_addr >> priv->bankgrp_shift[index])
0988                         & BIT(0)) << index);
0989         else
0990             break;
0991     }
0992 
0993     if (priv->rank_shift[0])
0994         rank = (hif_addr >> priv->rank_shift[0]) & BIT(0);
0995 
0996     regval = (rank << ECC_POISON0_RANK_SHIFT) & ECC_POISON0_RANK_MASK;
0997     regval |= (col << ECC_POISON0_COLUMN_SHIFT) & ECC_POISON0_COLUMN_MASK;
0998     writel(regval, priv->baseaddr + ECC_POISON0_OFST);
0999 
1000     regval = (bankgrp << ECC_POISON1_BG_SHIFT) & ECC_POISON1_BG_MASK;
1001     regval |= (bank << ECC_POISON1_BANKNR_SHIFT) & ECC_POISON1_BANKNR_MASK;
1002     regval |= (row << ECC_POISON1_ROW_SHIFT) & ECC_POISON1_ROW_MASK;
1003     writel(regval, priv->baseaddr + ECC_POISON1_OFST);
1004 }
1005 
1006 static ssize_t inject_data_error_show(struct device *dev,
1007                       struct device_attribute *mattr,
1008                       char *data)
1009 {
1010     struct mem_ctl_info *mci = to_mci(dev);
1011     struct synps_edac_priv *priv = mci->pvt_info;
1012 
1013     return sprintf(data, "Poison0 Addr: 0x%08x\n\rPoison1 Addr: 0x%08x\n\r"
1014             "Error injection Address: 0x%lx\n\r",
1015             readl(priv->baseaddr + ECC_POISON0_OFST),
1016             readl(priv->baseaddr + ECC_POISON1_OFST),
1017             priv->poison_addr);
1018 }
1019 
1020 static ssize_t inject_data_error_store(struct device *dev,
1021                        struct device_attribute *mattr,
1022                        const char *data, size_t count)
1023 {
1024     struct mem_ctl_info *mci = to_mci(dev);
1025     struct synps_edac_priv *priv = mci->pvt_info;
1026 
1027     if (kstrtoul(data, 0, &priv->poison_addr))
1028         return -EINVAL;
1029 
1030     ddr_poison_setup(priv);
1031 
1032     return count;
1033 }
1034 
1035 static ssize_t inject_data_poison_show(struct device *dev,
1036                        struct device_attribute *mattr,
1037                        char *data)
1038 {
1039     struct mem_ctl_info *mci = to_mci(dev);
1040     struct synps_edac_priv *priv = mci->pvt_info;
1041 
1042     return sprintf(data, "Data Poisoning: %s\n\r",
1043             (((readl(priv->baseaddr + ECC_CFG1_OFST)) & 0x3) == 0x3)
1044             ? ("Correctable Error") : ("UnCorrectable Error"));
1045 }
1046 
1047 static ssize_t inject_data_poison_store(struct device *dev,
1048                     struct device_attribute *mattr,
1049                     const char *data, size_t count)
1050 {
1051     struct mem_ctl_info *mci = to_mci(dev);
1052     struct synps_edac_priv *priv = mci->pvt_info;
1053 
1054     writel(0, priv->baseaddr + DDRC_SWCTL);
1055     if (strncmp(data, "CE", 2) == 0)
1056         writel(ECC_CEPOISON_MASK, priv->baseaddr + ECC_CFG1_OFST);
1057     else
1058         writel(ECC_UEPOISON_MASK, priv->baseaddr + ECC_CFG1_OFST);
1059     writel(1, priv->baseaddr + DDRC_SWCTL);
1060 
1061     return count;
1062 }
1063 
1064 static DEVICE_ATTR_RW(inject_data_error);
1065 static DEVICE_ATTR_RW(inject_data_poison);
1066 
1067 static int edac_create_sysfs_attributes(struct mem_ctl_info *mci)
1068 {
1069     int rc;
1070 
1071     rc = device_create_file(&mci->dev, &dev_attr_inject_data_error);
1072     if (rc < 0)
1073         return rc;
1074     rc = device_create_file(&mci->dev, &dev_attr_inject_data_poison);
1075     if (rc < 0)
1076         return rc;
1077     return 0;
1078 }
1079 
1080 static void edac_remove_sysfs_attributes(struct mem_ctl_info *mci)
1081 {
1082     device_remove_file(&mci->dev, &dev_attr_inject_data_error);
1083     device_remove_file(&mci->dev, &dev_attr_inject_data_poison);
1084 }
1085 
1086 static void setup_row_address_map(struct synps_edac_priv *priv, u32 *addrmap)
1087 {
1088     u32 addrmap_row_b2_10;
1089     int index;
1090 
1091     priv->row_shift[0] = (addrmap[5] & ROW_MAX_VAL_MASK) + ROW_B0_BASE;
1092     priv->row_shift[1] = ((addrmap[5] >> 8) &
1093             ROW_MAX_VAL_MASK) + ROW_B1_BASE;
1094 
1095     addrmap_row_b2_10 = (addrmap[5] >> 16) & ROW_MAX_VAL_MASK;
1096     if (addrmap_row_b2_10 != ROW_MAX_VAL_MASK) {
1097         for (index = 2; index < 11; index++)
1098             priv->row_shift[index] = addrmap_row_b2_10 +
1099                 index + ROW_B0_BASE;
1100 
1101     } else {
1102         priv->row_shift[2] = (addrmap[9] &
1103                 ROW_MAX_VAL_MASK) + ROW_B2_BASE;
1104         priv->row_shift[3] = ((addrmap[9] >> 8) &
1105                 ROW_MAX_VAL_MASK) + ROW_B3_BASE;
1106         priv->row_shift[4] = ((addrmap[9] >> 16) &
1107                 ROW_MAX_VAL_MASK) + ROW_B4_BASE;
1108         priv->row_shift[5] = ((addrmap[9] >> 24) &
1109                 ROW_MAX_VAL_MASK) + ROW_B5_BASE;
1110         priv->row_shift[6] = (addrmap[10] &
1111                 ROW_MAX_VAL_MASK) + ROW_B6_BASE;
1112         priv->row_shift[7] = ((addrmap[10] >> 8) &
1113                 ROW_MAX_VAL_MASK) + ROW_B7_BASE;
1114         priv->row_shift[8] = ((addrmap[10] >> 16) &
1115                 ROW_MAX_VAL_MASK) + ROW_B8_BASE;
1116         priv->row_shift[9] = ((addrmap[10] >> 24) &
1117                 ROW_MAX_VAL_MASK) + ROW_B9_BASE;
1118         priv->row_shift[10] = (addrmap[11] &
1119                 ROW_MAX_VAL_MASK) + ROW_B10_BASE;
1120     }
1121 
1122     priv->row_shift[11] = (((addrmap[5] >> 24) & ROW_MAX_VAL_MASK) ==
1123                 ROW_MAX_VAL_MASK) ? 0 : (((addrmap[5] >> 24) &
1124                 ROW_MAX_VAL_MASK) + ROW_B11_BASE);
1125     priv->row_shift[12] = ((addrmap[6] & ROW_MAX_VAL_MASK) ==
1126                 ROW_MAX_VAL_MASK) ? 0 : ((addrmap[6] &
1127                 ROW_MAX_VAL_MASK) + ROW_B12_BASE);
1128     priv->row_shift[13] = (((addrmap[6] >> 8) & ROW_MAX_VAL_MASK) ==
1129                 ROW_MAX_VAL_MASK) ? 0 : (((addrmap[6] >> 8) &
1130                 ROW_MAX_VAL_MASK) + ROW_B13_BASE);
1131     priv->row_shift[14] = (((addrmap[6] >> 16) & ROW_MAX_VAL_MASK) ==
1132                 ROW_MAX_VAL_MASK) ? 0 : (((addrmap[6] >> 16) &
1133                 ROW_MAX_VAL_MASK) + ROW_B14_BASE);
1134     priv->row_shift[15] = (((addrmap[6] >> 24) & ROW_MAX_VAL_MASK) ==
1135                 ROW_MAX_VAL_MASK) ? 0 : (((addrmap[6] >> 24) &
1136                 ROW_MAX_VAL_MASK) + ROW_B15_BASE);
1137     priv->row_shift[16] = ((addrmap[7] & ROW_MAX_VAL_MASK) ==
1138                 ROW_MAX_VAL_MASK) ? 0 : ((addrmap[7] &
1139                 ROW_MAX_VAL_MASK) + ROW_B16_BASE);
1140     priv->row_shift[17] = (((addrmap[7] >> 8) & ROW_MAX_VAL_MASK) ==
1141                 ROW_MAX_VAL_MASK) ? 0 : (((addrmap[7] >> 8) &
1142                 ROW_MAX_VAL_MASK) + ROW_B17_BASE);
1143 }
1144 
1145 static void setup_column_address_map(struct synps_edac_priv *priv, u32 *addrmap)
1146 {
1147     u32 width, memtype;
1148     int index;
1149 
1150     memtype = readl(priv->baseaddr + CTRL_OFST);
1151     width = (memtype & ECC_CTRL_BUSWIDTH_MASK) >> ECC_CTRL_BUSWIDTH_SHIFT;
1152 
1153     priv->col_shift[0] = 0;
1154     priv->col_shift[1] = 1;
1155     priv->col_shift[2] = (addrmap[2] & COL_MAX_VAL_MASK) + COL_B2_BASE;
1156     priv->col_shift[3] = ((addrmap[2] >> 8) &
1157             COL_MAX_VAL_MASK) + COL_B3_BASE;
1158     priv->col_shift[4] = (((addrmap[2] >> 16) & COL_MAX_VAL_MASK) ==
1159             COL_MAX_VAL_MASK) ? 0 : (((addrmap[2] >> 16) &
1160                     COL_MAX_VAL_MASK) + COL_B4_BASE);
1161     priv->col_shift[5] = (((addrmap[2] >> 24) & COL_MAX_VAL_MASK) ==
1162             COL_MAX_VAL_MASK) ? 0 : (((addrmap[2] >> 24) &
1163                     COL_MAX_VAL_MASK) + COL_B5_BASE);
1164     priv->col_shift[6] = ((addrmap[3] & COL_MAX_VAL_MASK) ==
1165             COL_MAX_VAL_MASK) ? 0 : ((addrmap[3] &
1166                     COL_MAX_VAL_MASK) + COL_B6_BASE);
1167     priv->col_shift[7] = (((addrmap[3] >> 8) & COL_MAX_VAL_MASK) ==
1168             COL_MAX_VAL_MASK) ? 0 : (((addrmap[3] >> 8) &
1169                     COL_MAX_VAL_MASK) + COL_B7_BASE);
1170     priv->col_shift[8] = (((addrmap[3] >> 16) & COL_MAX_VAL_MASK) ==
1171             COL_MAX_VAL_MASK) ? 0 : (((addrmap[3] >> 16) &
1172                     COL_MAX_VAL_MASK) + COL_B8_BASE);
1173     priv->col_shift[9] = (((addrmap[3] >> 24) & COL_MAX_VAL_MASK) ==
1174             COL_MAX_VAL_MASK) ? 0 : (((addrmap[3] >> 24) &
1175                     COL_MAX_VAL_MASK) + COL_B9_BASE);
1176     if (width == DDRCTL_EWDTH_64) {
1177         if (memtype & MEM_TYPE_LPDDR3) {
1178             priv->col_shift[10] = ((addrmap[4] &
1179                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1180                 ((addrmap[4] & COL_MAX_VAL_MASK) +
1181                  COL_B10_BASE);
1182             priv->col_shift[11] = (((addrmap[4] >> 8) &
1183                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1184                 (((addrmap[4] >> 8) & COL_MAX_VAL_MASK) +
1185                  COL_B11_BASE);
1186         } else {
1187             priv->col_shift[11] = ((addrmap[4] &
1188                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1189                 ((addrmap[4] & COL_MAX_VAL_MASK) +
1190                  COL_B10_BASE);
1191             priv->col_shift[13] = (((addrmap[4] >> 8) &
1192                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1193                 (((addrmap[4] >> 8) & COL_MAX_VAL_MASK) +
1194                  COL_B11_BASE);
1195         }
1196     } else if (width == DDRCTL_EWDTH_32) {
1197         if (memtype & MEM_TYPE_LPDDR3) {
1198             priv->col_shift[10] = (((addrmap[3] >> 24) &
1199                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1200                 (((addrmap[3] >> 24) & COL_MAX_VAL_MASK) +
1201                  COL_B9_BASE);
1202             priv->col_shift[11] = ((addrmap[4] &
1203                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1204                 ((addrmap[4] & COL_MAX_VAL_MASK) +
1205                  COL_B10_BASE);
1206         } else {
1207             priv->col_shift[11] = (((addrmap[3] >> 24) &
1208                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1209                 (((addrmap[3] >> 24) & COL_MAX_VAL_MASK) +
1210                  COL_B9_BASE);
1211             priv->col_shift[13] = ((addrmap[4] &
1212                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1213                 ((addrmap[4] & COL_MAX_VAL_MASK) +
1214                  COL_B10_BASE);
1215         }
1216     } else {
1217         if (memtype & MEM_TYPE_LPDDR3) {
1218             priv->col_shift[10] = (((addrmap[3] >> 16) &
1219                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1220                 (((addrmap[3] >> 16) & COL_MAX_VAL_MASK) +
1221                  COL_B8_BASE);
1222             priv->col_shift[11] = (((addrmap[3] >> 24) &
1223                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1224                 (((addrmap[3] >> 24) & COL_MAX_VAL_MASK) +
1225                  COL_B9_BASE);
1226             priv->col_shift[13] = ((addrmap[4] &
1227                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1228                 ((addrmap[4] & COL_MAX_VAL_MASK) +
1229                  COL_B10_BASE);
1230         } else {
1231             priv->col_shift[11] = (((addrmap[3] >> 16) &
1232                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1233                 (((addrmap[3] >> 16) & COL_MAX_VAL_MASK) +
1234                  COL_B8_BASE);
1235             priv->col_shift[13] = (((addrmap[3] >> 24) &
1236                 COL_MAX_VAL_MASK) == COL_MAX_VAL_MASK) ? 0 :
1237                 (((addrmap[3] >> 24) & COL_MAX_VAL_MASK) +
1238                  COL_B9_BASE);
1239         }
1240     }
1241 
1242     if (width) {
1243         for (index = 9; index > width; index--) {
1244             priv->col_shift[index] = priv->col_shift[index - width];
1245             priv->col_shift[index - width] = 0;
1246         }
1247     }
1248 
1249 }
1250 
1251 static void setup_bank_address_map(struct synps_edac_priv *priv, u32 *addrmap)
1252 {
1253     priv->bank_shift[0] = (addrmap[1] & BANK_MAX_VAL_MASK) + BANK_B0_BASE;
1254     priv->bank_shift[1] = ((addrmap[1] >> 8) &
1255                 BANK_MAX_VAL_MASK) + BANK_B1_BASE;
1256     priv->bank_shift[2] = (((addrmap[1] >> 16) &
1257                 BANK_MAX_VAL_MASK) == BANK_MAX_VAL_MASK) ? 0 :
1258                 (((addrmap[1] >> 16) & BANK_MAX_VAL_MASK) +
1259                  BANK_B2_BASE);
1260 
1261 }
1262 
1263 static void setup_bg_address_map(struct synps_edac_priv *priv, u32 *addrmap)
1264 {
1265     priv->bankgrp_shift[0] = (addrmap[8] &
1266                 BANKGRP_MAX_VAL_MASK) + BANKGRP_B0_BASE;
1267     priv->bankgrp_shift[1] = (((addrmap[8] >> 8) & BANKGRP_MAX_VAL_MASK) ==
1268                 BANKGRP_MAX_VAL_MASK) ? 0 : (((addrmap[8] >> 8)
1269                 & BANKGRP_MAX_VAL_MASK) + BANKGRP_B1_BASE);
1270 
1271 }
1272 
1273 static void setup_rank_address_map(struct synps_edac_priv *priv, u32 *addrmap)
1274 {
1275     priv->rank_shift[0] = ((addrmap[0] & RANK_MAX_VAL_MASK) ==
1276                 RANK_MAX_VAL_MASK) ? 0 : ((addrmap[0] &
1277                 RANK_MAX_VAL_MASK) + RANK_B0_BASE);
1278 }
1279 
1280 /**
1281  * setup_address_map -  Set Address Map by querying ADDRMAP registers.
1282  * @priv:       DDR memory controller private instance data.
1283  *
1284  * Set Address Map by querying ADDRMAP registers.
1285  *
1286  * Return: none.
1287  */
1288 static void setup_address_map(struct synps_edac_priv *priv)
1289 {
1290     u32 addrmap[12];
1291     int index;
1292 
1293     for (index = 0; index < 12; index++) {
1294         u32 addrmap_offset;
1295 
1296         addrmap_offset = ECC_ADDRMAP0_OFFSET + (index * 4);
1297         addrmap[index] = readl(priv->baseaddr + addrmap_offset);
1298     }
1299 
1300     setup_row_address_map(priv, addrmap);
1301 
1302     setup_column_address_map(priv, addrmap);
1303 
1304     setup_bank_address_map(priv, addrmap);
1305 
1306     setup_bg_address_map(priv, addrmap);
1307 
1308     setup_rank_address_map(priv, addrmap);
1309 }
1310 #endif /* CONFIG_EDAC_DEBUG */
1311 
1312 /**
1313  * mc_probe - Check controller and bind driver.
1314  * @pdev:   platform device.
1315  *
1316  * Probe a specific controller instance for binding with the driver.
1317  *
1318  * Return: 0 if the controller instance was successfully bound to the
1319  * driver; otherwise, < 0 on error.
1320  */
1321 static int mc_probe(struct platform_device *pdev)
1322 {
1323     const struct synps_platform_data *p_data;
1324     struct edac_mc_layer layers[2];
1325     struct synps_edac_priv *priv;
1326     struct mem_ctl_info *mci;
1327     void __iomem *baseaddr;
1328     struct resource *res;
1329     int rc;
1330 
1331     res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1332     baseaddr = devm_ioremap_resource(&pdev->dev, res);
1333     if (IS_ERR(baseaddr))
1334         return PTR_ERR(baseaddr);
1335 
1336     p_data = of_device_get_match_data(&pdev->dev);
1337     if (!p_data)
1338         return -ENODEV;
1339 
1340     if (!p_data->get_ecc_state(baseaddr)) {
1341         edac_printk(KERN_INFO, EDAC_MC, "ECC not enabled\n");
1342         return -ENXIO;
1343     }
1344 
1345     layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
1346     layers[0].size = SYNPS_EDAC_NR_CSROWS;
1347     layers[0].is_virt_csrow = true;
1348     layers[1].type = EDAC_MC_LAYER_CHANNEL;
1349     layers[1].size = SYNPS_EDAC_NR_CHANS;
1350     layers[1].is_virt_csrow = false;
1351 
1352     mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers,
1353                 sizeof(struct synps_edac_priv));
1354     if (!mci) {
1355         edac_printk(KERN_ERR, EDAC_MC,
1356                 "Failed memory allocation for mc instance\n");
1357         return -ENOMEM;
1358     }
1359 
1360     priv = mci->pvt_info;
1361     priv->baseaddr = baseaddr;
1362     priv->p_data = p_data;
1363 
1364     mc_init(mci, pdev);
1365 
1366     if (priv->p_data->quirks & DDR_ECC_INTR_SUPPORT) {
1367         rc = setup_irq(mci, pdev);
1368         if (rc)
1369             goto free_edac_mc;
1370     }
1371 
1372     rc = edac_mc_add_mc(mci);
1373     if (rc) {
1374         edac_printk(KERN_ERR, EDAC_MC,
1375                 "Failed to register with EDAC core\n");
1376         goto free_edac_mc;
1377     }
1378 
1379 #ifdef CONFIG_EDAC_DEBUG
1380     if (priv->p_data->quirks & DDR_ECC_DATA_POISON_SUPPORT) {
1381         rc = edac_create_sysfs_attributes(mci);
1382         if (rc) {
1383             edac_printk(KERN_ERR, EDAC_MC,
1384                     "Failed to create sysfs entries\n");
1385             goto free_edac_mc;
1386         }
1387     }
1388 
1389     if (priv->p_data->quirks & DDR_ECC_INTR_SUPPORT)
1390         setup_address_map(priv);
1391 #endif
1392 
1393     /*
1394      * Start capturing the correctable and uncorrectable errors. A write of
1395      * 0 starts the counters.
1396      */
1397     if (!(priv->p_data->quirks & DDR_ECC_INTR_SUPPORT))
1398         writel(0x0, baseaddr + ECC_CTRL_OFST);
1399 
1400     return rc;
1401 
1402 free_edac_mc:
1403     edac_mc_free(mci);
1404 
1405     return rc;
1406 }
1407 
1408 /**
1409  * mc_remove - Unbind driver from controller.
1410  * @pdev:   Platform device.
1411  *
1412  * Return: Unconditionally 0
1413  */
1414 static int mc_remove(struct platform_device *pdev)
1415 {
1416     struct mem_ctl_info *mci = platform_get_drvdata(pdev);
1417     struct synps_edac_priv *priv = mci->pvt_info;
1418 
1419     if (priv->p_data->quirks & DDR_ECC_INTR_SUPPORT)
1420         disable_intr(priv);
1421 
1422 #ifdef CONFIG_EDAC_DEBUG
1423     if (priv->p_data->quirks & DDR_ECC_DATA_POISON_SUPPORT)
1424         edac_remove_sysfs_attributes(mci);
1425 #endif
1426 
1427     edac_mc_del_mc(&pdev->dev);
1428     edac_mc_free(mci);
1429 
1430     return 0;
1431 }
1432 
1433 static struct platform_driver synps_edac_mc_driver = {
1434     .driver = {
1435            .name = "synopsys-edac",
1436            .of_match_table = synps_edac_match,
1437            },
1438     .probe = mc_probe,
1439     .remove = mc_remove,
1440 };
1441 
1442 module_platform_driver(synps_edac_mc_driver);
1443 
1444 MODULE_AUTHOR("Xilinx Inc");
1445 MODULE_DESCRIPTION("Synopsys DDR ECC driver");
1446 MODULE_LICENSE("GPL v2");