]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/edac/synopsys_edac.c
vsock: use new wait API for vsock_stream_sendmsg()
[karo-tx-linux.git] / drivers / edac / synopsys_edac.c
1 /*
2  * Synopsys DDR ECC Driver
3  * This driver is based on ppc4xx_edac.c drivers
4  *
5  * Copyright (C) 2012 - 2014 Xilinx, Inc.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * This file is subject to the terms and conditions of the GNU General Public
18  * License.  See the file "COPYING" in the main directory of this archive
19  * for more details
20  */
21
22 #include <linux/edac.h>
23 #include <linux/module.h>
24 #include <linux/platform_device.h>
25
26 #include "edac_module.h"
27
28 /* Number of cs_rows needed per memory controller */
29 #define SYNPS_EDAC_NR_CSROWS    1
30
31 /* Number of channels per memory controller */
32 #define SYNPS_EDAC_NR_CHANS     1
33
34 /* Granularity of reported error in bytes */
35 #define SYNPS_EDAC_ERR_GRAIN    1
36
37 #define SYNPS_EDAC_MSG_SIZE     256
38
39 #define SYNPS_EDAC_MOD_STRING   "synps_edac"
40 #define SYNPS_EDAC_MOD_VER      "1"
41
42 /* Synopsys DDR memory controller registers that are relevant to ECC */
43 #define CTRL_OFST               0x0
44 #define T_ZQ_OFST               0xA4
45
46 /* ECC control register */
47 #define ECC_CTRL_OFST           0xC4
48 /* ECC log register */
49 #define CE_LOG_OFST             0xC8
50 /* ECC address register */
51 #define CE_ADDR_OFST            0xCC
52 /* ECC data[31:0] register */
53 #define CE_DATA_31_0_OFST       0xD0
54
55 /* Uncorrectable error info registers */
56 #define UE_LOG_OFST             0xDC
57 #define UE_ADDR_OFST            0xE0
58 #define UE_DATA_31_0_OFST       0xE4
59
60 #define STAT_OFST               0xF0
61 #define SCRUB_OFST              0xF4
62
63 /* Control register bit field definitions */
64 #define CTRL_BW_MASK            0xC
65 #define CTRL_BW_SHIFT           2
66
67 #define DDRCTL_WDTH_16          1
68 #define DDRCTL_WDTH_32          0
69
70 /* ZQ register bit field definitions */
71 #define T_ZQ_DDRMODE_MASK       0x2
72
73 /* ECC control register bit field definitions */
74 #define ECC_CTRL_CLR_CE_ERR     0x2
75 #define ECC_CTRL_CLR_UE_ERR     0x1
76
77 /* ECC correctable/uncorrectable error log register definitions */
78 #define LOG_VALID               0x1
79 #define CE_LOG_BITPOS_MASK      0xFE
80 #define CE_LOG_BITPOS_SHIFT     1
81
82 /* ECC correctable/uncorrectable error address register definitions */
83 #define ADDR_COL_MASK           0xFFF
84 #define ADDR_ROW_MASK           0xFFFF000
85 #define ADDR_ROW_SHIFT          12
86 #define ADDR_BANK_MASK          0x70000000
87 #define ADDR_BANK_SHIFT         28
88
89 /* ECC statistic register definitions */
90 #define STAT_UECNT_MASK         0xFF
91 #define STAT_CECNT_MASK         0xFF00
92 #define STAT_CECNT_SHIFT        8
93
94 /* ECC scrub register definitions */
95 #define SCRUB_MODE_MASK         0x7
96 #define SCRUB_MODE_SECDED       0x4
97
98 /**
99  * struct ecc_error_info - ECC error log information
100  * @row:        Row number
101  * @col:        Column number
102  * @bank:       Bank number
103  * @bitpos:     Bit position
104  * @data:       Data causing the error
105  */
106 struct ecc_error_info {
107         u32 row;
108         u32 col;
109         u32 bank;
110         u32 bitpos;
111         u32 data;
112 };
113
114 /**
115  * struct synps_ecc_status - ECC status information to report
116  * @ce_cnt:     Correctable error count
117  * @ue_cnt:     Uncorrectable error count
118  * @ceinfo:     Correctable error log information
119  * @ueinfo:     Uncorrectable error log information
120  */
121 struct synps_ecc_status {
122         u32 ce_cnt;
123         u32 ue_cnt;
124         struct ecc_error_info ceinfo;
125         struct ecc_error_info ueinfo;
126 };
127
128 /**
129  * struct synps_edac_priv - DDR memory controller private instance data
130  * @baseaddr:   Base address of the DDR controller
131  * @message:    Buffer for framing the event specific info
132  * @stat:       ECC status information
133  * @ce_cnt:     Correctable Error count
134  * @ue_cnt:     Uncorrectable Error count
135  */
136 struct synps_edac_priv {
137         void __iomem *baseaddr;
138         char message[SYNPS_EDAC_MSG_SIZE];
139         struct synps_ecc_status stat;
140         u32 ce_cnt;
141         u32 ue_cnt;
142 };
143
144 /**
145  * synps_edac_geterror_info - Get the current ecc error info
146  * @base:       Pointer to the base address of the ddr memory controller
147  * @p:          Pointer to the synopsys ecc status structure
148  *
149  * Determines there is any ecc error or not
150  *
151  * Return: one if there is no error otherwise returns zero
152  */
153 static int synps_edac_geterror_info(void __iomem *base,
154                                     struct synps_ecc_status *p)
155 {
156         u32 regval, clearval = 0;
157
158         regval = readl(base + STAT_OFST);
159         if (!regval)
160                 return 1;
161
162         p->ce_cnt = (regval & STAT_CECNT_MASK) >> STAT_CECNT_SHIFT;
163         p->ue_cnt = regval & STAT_UECNT_MASK;
164
165         regval = readl(base + CE_LOG_OFST);
166         if (!(p->ce_cnt && (regval & LOG_VALID)))
167                 goto ue_err;
168
169         p->ceinfo.bitpos = (regval & CE_LOG_BITPOS_MASK) >> CE_LOG_BITPOS_SHIFT;
170         regval = readl(base + CE_ADDR_OFST);
171         p->ceinfo.row = (regval & ADDR_ROW_MASK) >> ADDR_ROW_SHIFT;
172         p->ceinfo.col = regval & ADDR_COL_MASK;
173         p->ceinfo.bank = (regval & ADDR_BANK_MASK) >> ADDR_BANK_SHIFT;
174         p->ceinfo.data = readl(base + CE_DATA_31_0_OFST);
175         edac_dbg(3, "ce bit position: %d data: %d\n", p->ceinfo.bitpos,
176                  p->ceinfo.data);
177         clearval = ECC_CTRL_CLR_CE_ERR;
178
179 ue_err:
180         regval = readl(base + UE_LOG_OFST);
181         if (!(p->ue_cnt && (regval & LOG_VALID)))
182                 goto out;
183
184         regval = readl(base + UE_ADDR_OFST);
185         p->ueinfo.row = (regval & ADDR_ROW_MASK) >> ADDR_ROW_SHIFT;
186         p->ueinfo.col = regval & ADDR_COL_MASK;
187         p->ueinfo.bank = (regval & ADDR_BANK_MASK) >> ADDR_BANK_SHIFT;
188         p->ueinfo.data = readl(base + UE_DATA_31_0_OFST);
189         clearval |= ECC_CTRL_CLR_UE_ERR;
190
191 out:
192         writel(clearval, base + ECC_CTRL_OFST);
193         writel(0x0, base + ECC_CTRL_OFST);
194
195         return 0;
196 }
197
198 /**
199  * synps_edac_handle_error - Handle controller error types CE and UE
200  * @mci:        Pointer to the edac memory controller instance
201  * @p:          Pointer to the synopsys ecc status structure
202  *
203  * Handles the controller ECC correctable and un correctable error.
204  */
205 static void synps_edac_handle_error(struct mem_ctl_info *mci,
206                                     struct synps_ecc_status *p)
207 {
208         struct synps_edac_priv *priv = mci->pvt_info;
209         struct ecc_error_info *pinf;
210
211         if (p->ce_cnt) {
212                 pinf = &p->ceinfo;
213                 snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
214                          "DDR ECC error type :%s Row %d Bank %d Col %d ",
215                          "CE", pinf->row, pinf->bank, pinf->col);
216                 edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci,
217                                      p->ce_cnt, 0, 0, 0, 0, 0, -1,
218                                      priv->message, "");
219         }
220
221         if (p->ue_cnt) {
222                 pinf = &p->ueinfo;
223                 snprintf(priv->message, SYNPS_EDAC_MSG_SIZE,
224                          "DDR ECC error type :%s Row %d Bank %d Col %d ",
225                          "UE", pinf->row, pinf->bank, pinf->col);
226                 edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci,
227                                      p->ue_cnt, 0, 0, 0, 0, 0, -1,
228                                      priv->message, "");
229         }
230
231         memset(p, 0, sizeof(*p));
232 }
233
234 /**
235  * synps_edac_check - Check controller for ECC errors
236  * @mci:        Pointer to the edac memory controller instance
237  *
238  * Used to check and post ECC errors. Called by the polling thread
239  */
240 static void synps_edac_check(struct mem_ctl_info *mci)
241 {
242         struct synps_edac_priv *priv = mci->pvt_info;
243         int status;
244
245         status = synps_edac_geterror_info(priv->baseaddr, &priv->stat);
246         if (status)
247                 return;
248
249         priv->ce_cnt += priv->stat.ce_cnt;
250         priv->ue_cnt += priv->stat.ue_cnt;
251         synps_edac_handle_error(mci, &priv->stat);
252
253         edac_dbg(3, "Total error count ce %d ue %d\n",
254                  priv->ce_cnt, priv->ue_cnt);
255 }
256
257 /**
258  * synps_edac_get_dtype - Return the controller memory width
259  * @base:       Pointer to the ddr memory controller base address
260  *
261  * Get the EDAC device type width appropriate for the current controller
262  * configuration.
263  *
264  * Return: a device type width enumeration.
265  */
266 static enum dev_type synps_edac_get_dtype(const void __iomem *base)
267 {
268         enum dev_type dt;
269         u32 width;
270
271         width = readl(base + CTRL_OFST);
272         width = (width & CTRL_BW_MASK) >> CTRL_BW_SHIFT;
273
274         switch (width) {
275         case DDRCTL_WDTH_16:
276                 dt = DEV_X2;
277                 break;
278         case DDRCTL_WDTH_32:
279                 dt = DEV_X4;
280                 break;
281         default:
282                 dt = DEV_UNKNOWN;
283         }
284
285         return dt;
286 }
287
288 /**
289  * synps_edac_get_eccstate - Return the controller ecc enable/disable status
290  * @base:       Pointer to the ddr memory controller base address
291  *
292  * Get the ECC enable/disable status for the controller
293  *
294  * Return: a ecc status boolean i.e true/false - enabled/disabled.
295  */
296 static bool synps_edac_get_eccstate(void __iomem *base)
297 {
298         enum dev_type dt;
299         u32 ecctype;
300         bool state = false;
301
302         dt = synps_edac_get_dtype(base);
303         if (dt == DEV_UNKNOWN)
304                 return state;
305
306         ecctype = readl(base + SCRUB_OFST) & SCRUB_MODE_MASK;
307         if ((ecctype == SCRUB_MODE_SECDED) && (dt == DEV_X2))
308                 state = true;
309
310         return state;
311 }
312
313 /**
314  * synps_edac_get_memsize - reads the size of the attached memory device
315  *
316  * Return: the memory size in bytes
317  */
318 static u32 synps_edac_get_memsize(void)
319 {
320         struct sysinfo inf;
321
322         si_meminfo(&inf);
323
324         return inf.totalram * inf.mem_unit;
325 }
326
327 /**
328  * synps_edac_get_mtype - Returns controller memory type
329  * @base:       pointer to the synopsys ecc status structure
330  *
331  * Get the EDAC memory type appropriate for the current controller
332  * configuration.
333  *
334  * Return: a memory type enumeration.
335  */
336 static enum mem_type synps_edac_get_mtype(const void __iomem *base)
337 {
338         enum mem_type mt;
339         u32 memtype;
340
341         memtype = readl(base + T_ZQ_OFST);
342
343         if (memtype & T_ZQ_DDRMODE_MASK)
344                 mt = MEM_DDR3;
345         else
346                 mt = MEM_DDR2;
347
348         return mt;
349 }
350
351 /**
352  * synps_edac_init_csrows - Initialize the cs row data
353  * @mci:        Pointer to the edac memory controller instance
354  *
355  * Initializes the chip select rows associated with the EDAC memory
356  * controller instance
357  *
358  * Return: Unconditionally 0.
359  */
360 static int synps_edac_init_csrows(struct mem_ctl_info *mci)
361 {
362         struct csrow_info *csi;
363         struct dimm_info *dimm;
364         struct synps_edac_priv *priv = mci->pvt_info;
365         u32 size;
366         int row, j;
367
368         for (row = 0; row < mci->nr_csrows; row++) {
369                 csi = mci->csrows[row];
370                 size = synps_edac_get_memsize();
371
372                 for (j = 0; j < csi->nr_channels; j++) {
373                         dimm            = csi->channels[j]->dimm;
374                         dimm->edac_mode = EDAC_FLAG_SECDED;
375                         dimm->mtype     = synps_edac_get_mtype(priv->baseaddr);
376                         dimm->nr_pages  = (size >> PAGE_SHIFT) / csi->nr_channels;
377                         dimm->grain     = SYNPS_EDAC_ERR_GRAIN;
378                         dimm->dtype     = synps_edac_get_dtype(priv->baseaddr);
379                 }
380         }
381
382         return 0;
383 }
384
385 /**
386  * synps_edac_mc_init - Initialize driver instance
387  * @mci:        Pointer to the edac memory controller instance
388  * @pdev:       Pointer to the platform_device struct
389  *
390  * Performs initialization of the EDAC memory controller instance and
391  * related driver-private data associated with the memory controller the
392  * instance is bound to.
393  *
394  * Return: Always zero.
395  */
396 static int synps_edac_mc_init(struct mem_ctl_info *mci,
397                                  struct platform_device *pdev)
398 {
399         int status;
400         struct synps_edac_priv *priv;
401
402         mci->pdev = &pdev->dev;
403         priv = mci->pvt_info;
404         platform_set_drvdata(pdev, mci);
405
406         /* Initialize controller capabilities and configuration */
407         mci->mtype_cap = MEM_FLAG_DDR3 | MEM_FLAG_DDR2;
408         mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
409         mci->scrub_cap = SCRUB_HW_SRC;
410         mci->scrub_mode = SCRUB_NONE;
411
412         mci->edac_cap = EDAC_FLAG_SECDED;
413         mci->ctl_name = "synps_ddr_controller";
414         mci->dev_name = SYNPS_EDAC_MOD_STRING;
415         mci->mod_name = SYNPS_EDAC_MOD_VER;
416         mci->mod_ver = "1";
417
418         edac_op_state = EDAC_OPSTATE_POLL;
419         mci->edac_check = synps_edac_check;
420         mci->ctl_page_to_phys = NULL;
421
422         status = synps_edac_init_csrows(mci);
423
424         return status;
425 }
426
427 /**
428  * synps_edac_mc_probe - Check controller and bind driver
429  * @pdev:       Pointer to the platform_device struct
430  *
431  * Probes a specific controller instance for binding with the driver.
432  *
433  * Return: 0 if the controller instance was successfully bound to the
434  * driver; otherwise, < 0 on error.
435  */
436 static int synps_edac_mc_probe(struct platform_device *pdev)
437 {
438         struct mem_ctl_info *mci;
439         struct edac_mc_layer layers[2];
440         struct synps_edac_priv *priv;
441         int rc;
442         struct resource *res;
443         void __iomem *baseaddr;
444
445         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
446         baseaddr = devm_ioremap_resource(&pdev->dev, res);
447         if (IS_ERR(baseaddr))
448                 return PTR_ERR(baseaddr);
449
450         if (!synps_edac_get_eccstate(baseaddr)) {
451                 edac_printk(KERN_INFO, EDAC_MC, "ECC not enabled\n");
452                 return -ENXIO;
453         }
454
455         layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
456         layers[0].size = SYNPS_EDAC_NR_CSROWS;
457         layers[0].is_virt_csrow = true;
458         layers[1].type = EDAC_MC_LAYER_CHANNEL;
459         layers[1].size = SYNPS_EDAC_NR_CHANS;
460         layers[1].is_virt_csrow = false;
461
462         mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers,
463                             sizeof(struct synps_edac_priv));
464         if (!mci) {
465                 edac_printk(KERN_ERR, EDAC_MC,
466                             "Failed memory allocation for mc instance\n");
467                 return -ENOMEM;
468         }
469
470         priv = mci->pvt_info;
471         priv->baseaddr = baseaddr;
472         rc = synps_edac_mc_init(mci, pdev);
473         if (rc) {
474                 edac_printk(KERN_ERR, EDAC_MC,
475                             "Failed to initialize instance\n");
476                 goto free_edac_mc;
477         }
478
479         rc = edac_mc_add_mc(mci);
480         if (rc) {
481                 edac_printk(KERN_ERR, EDAC_MC,
482                             "Failed to register with EDAC core\n");
483                 goto free_edac_mc;
484         }
485
486         /*
487          * Start capturing the correctable and uncorrectable errors. A write of
488          * 0 starts the counters.
489          */
490         writel(0x0, baseaddr + ECC_CTRL_OFST);
491         return rc;
492
493 free_edac_mc:
494         edac_mc_free(mci);
495
496         return rc;
497 }
498
499 /**
500  * synps_edac_mc_remove - Unbind driver from controller
501  * @pdev:       Pointer to the platform_device struct
502  *
503  * Return: Unconditionally 0
504  */
505 static int synps_edac_mc_remove(struct platform_device *pdev)
506 {
507         struct mem_ctl_info *mci = platform_get_drvdata(pdev);
508
509         edac_mc_del_mc(&pdev->dev);
510         edac_mc_free(mci);
511
512         return 0;
513 }
514
515 static const struct of_device_id synps_edac_match[] = {
516         { .compatible = "xlnx,zynq-ddrc-a05", },
517         { /* end of table */ }
518 };
519
520 MODULE_DEVICE_TABLE(of, synps_edac_match);
521
522 static struct platform_driver synps_edac_mc_driver = {
523         .driver = {
524                    .name = "synopsys-edac",
525                    .of_match_table = synps_edac_match,
526                    },
527         .probe = synps_edac_mc_probe,
528         .remove = synps_edac_mc_remove,
529 };
530
531 module_platform_driver(synps_edac_mc_driver);
532
533 MODULE_AUTHOR("Xilinx Inc");
534 MODULE_DESCRIPTION("Synopsys DDR ECC driver");
535 MODULE_LICENSE("GPL v2");