2  * Freescale MPC85xx Memory Controller kenel module
 
   4  * Author: Dave Jiang <djiang@mvista.com>
 
   6  * 2006-2007 (c) MontaVista Software, Inc. This file is licensed under
 
   7  * the terms of the GNU General Public License version 2. This program
 
   8  * is licensed "as is" without any warranty of any kind, whether express
 
  12 #include <linux/module.h>
 
  13 #include <linux/init.h>
 
  14 #include <linux/slab.h>
 
  15 #include <linux/interrupt.h>
 
  16 #include <linux/ctype.h>
 
  18 #include <linux/mod_devicetable.h>
 
  19 #include <linux/edac.h>
 
  20 #include <linux/smp.h>
 
  22 #include <linux/of_platform.h>
 
  23 #include <linux/of_device.h>
 
  24 #include "edac_module.h"
 
  25 #include "edac_core.h"
 
  26 #include "mpc85xx_edac.h"
 
  28 static int edac_dev_idx;
 
  29 static int edac_pci_idx;
 
  30 static int edac_mc_idx;
 
  32 static u32 orig_ddr_err_disable;
 
  33 static u32 orig_ddr_err_sbe;
 
  39 static u32 orig_pci_err_cap_dr;
 
  40 static u32 orig_pci_err_en;
 
  43 static u32 orig_l2_err_disable;
 
  44 static u32 orig_hid1[2];
 
  46 /************************ MC SYSFS parts ***********************************/
 
  48 static ssize_t mpc85xx_mc_inject_data_hi_show(struct mem_ctl_info *mci,
 
  51         struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
 
  52         return sprintf(data, "0x%08x",
 
  53                        in_be32(pdata->mc_vbase +
 
  54                                MPC85XX_MC_DATA_ERR_INJECT_HI));
 
  57 static ssize_t mpc85xx_mc_inject_data_lo_show(struct mem_ctl_info *mci,
 
  60         struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
 
  61         return sprintf(data, "0x%08x",
 
  62                        in_be32(pdata->mc_vbase +
 
  63                                MPC85XX_MC_DATA_ERR_INJECT_LO));
 
  66 static ssize_t mpc85xx_mc_inject_ctrl_show(struct mem_ctl_info *mci, char *data)
 
  68         struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
 
  69         return sprintf(data, "0x%08x",
 
  70                        in_be32(pdata->mc_vbase + MPC85XX_MC_ECC_ERR_INJECT));
 
  73 static ssize_t mpc85xx_mc_inject_data_hi_store(struct mem_ctl_info *mci,
 
  74                                                const char *data, size_t count)
 
  76         struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
 
  78                 out_be32(pdata->mc_vbase + MPC85XX_MC_DATA_ERR_INJECT_HI,
 
  79                          simple_strtoul(data, NULL, 0));
 
  85 static ssize_t mpc85xx_mc_inject_data_lo_store(struct mem_ctl_info *mci,
 
  86                                                const char *data, size_t count)
 
  88         struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
 
  90                 out_be32(pdata->mc_vbase + MPC85XX_MC_DATA_ERR_INJECT_LO,
 
  91                          simple_strtoul(data, NULL, 0));
 
  97 static ssize_t mpc85xx_mc_inject_ctrl_store(struct mem_ctl_info *mci,
 
  98                                             const char *data, size_t count)
 
 100         struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
 
 101         if (isdigit(*data)) {
 
 102                 out_be32(pdata->mc_vbase + MPC85XX_MC_ECC_ERR_INJECT,
 
 103                          simple_strtoul(data, NULL, 0));
 
 109 static struct mcidev_sysfs_attribute mpc85xx_mc_sysfs_attributes[] = {
 
 112                   .name = "inject_data_hi",
 
 113                   .mode = (S_IRUGO | S_IWUSR)
 
 115          .show = mpc85xx_mc_inject_data_hi_show,
 
 116          .store = mpc85xx_mc_inject_data_hi_store},
 
 119                   .name = "inject_data_lo",
 
 120                   .mode = (S_IRUGO | S_IWUSR)
 
 122          .show = mpc85xx_mc_inject_data_lo_show,
 
 123          .store = mpc85xx_mc_inject_data_lo_store},
 
 126                   .name = "inject_ctrl",
 
 127                   .mode = (S_IRUGO | S_IWUSR)
 
 129          .show = mpc85xx_mc_inject_ctrl_show,
 
 130          .store = mpc85xx_mc_inject_ctrl_store},
 
 134          .attr = {.name = NULL}
 
 138 static void mpc85xx_set_mc_sysfs_attributes(struct mem_ctl_info *mci)
 
 140         mci->mc_driver_sysfs_attributes = mpc85xx_mc_sysfs_attributes;
 
 143 /**************************** PCI Err device ***************************/
 
 146 static void mpc85xx_pci_check(struct edac_pci_ctl_info *pci)
 
 148         struct mpc85xx_pci_pdata *pdata = pci->pvt_info;
 
 151         err_detect = in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR);
 
 153         /* master aborts can happen during PCI config cycles */
 
 154         if (!(err_detect & ~(PCI_EDE_MULTI_ERR | PCI_EDE_MST_ABRT))) {
 
 155                 out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, err_detect);
 
 159         printk(KERN_ERR "PCI error(s) detected\n");
 
 160         printk(KERN_ERR "PCI/X ERR_DR register: %#08x\n", err_detect);
 
 162         printk(KERN_ERR "PCI/X ERR_ATTRIB register: %#08x\n",
 
 163                in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ATTRIB));
 
 164         printk(KERN_ERR "PCI/X ERR_ADDR register: %#08x\n",
 
 165                in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_ADDR));
 
 166         printk(KERN_ERR "PCI/X ERR_EXT_ADDR register: %#08x\n",
 
 167                in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EXT_ADDR));
 
 168         printk(KERN_ERR "PCI/X ERR_DL register: %#08x\n",
 
 169                in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DL));
 
 170         printk(KERN_ERR "PCI/X ERR_DH register: %#08x\n",
 
 171                in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DH));
 
 173         /* clear error bits */
 
 174         out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, err_detect);
 
 176         if (err_detect & PCI_EDE_PERR_MASK)
 
 177                 edac_pci_handle_pe(pci, pci->ctl_name);
 
 179         if ((err_detect & ~PCI_EDE_MULTI_ERR) & ~PCI_EDE_PERR_MASK)
 
 180                 edac_pci_handle_npe(pci, pci->ctl_name);
 
 183 static irqreturn_t mpc85xx_pci_isr(int irq, void *dev_id)
 
 185         struct edac_pci_ctl_info *pci = dev_id;
 
 186         struct mpc85xx_pci_pdata *pdata = pci->pvt_info;
 
 189         err_detect = in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR);
 
 194         mpc85xx_pci_check(pci);
 
 199 static int __devinit mpc85xx_pci_err_probe(struct of_device *op,
 
 200                                            const struct of_device_id *match)
 
 202         struct edac_pci_ctl_info *pci;
 
 203         struct mpc85xx_pci_pdata *pdata;
 
 207         if (!devres_open_group(&op->dev, mpc85xx_pci_err_probe, GFP_KERNEL))
 
 210         pci = edac_pci_alloc_ctl_info(sizeof(*pdata), "mpc85xx_pci_err");
 
 214         pdata = pci->pvt_info;
 
 215         pdata->name = "mpc85xx_pci_err";
 
 217         dev_set_drvdata(&op->dev, pci);
 
 219         pci->mod_name = EDAC_MOD_STR;
 
 220         pci->ctl_name = pdata->name;
 
 221         pci->dev_name = op->dev.bus_id;
 
 223         if (edac_op_state == EDAC_OPSTATE_POLL)
 
 224                 pci->edac_check = mpc85xx_pci_check;
 
 226         pdata->edac_idx = edac_pci_idx++;
 
 228         res = of_address_to_resource(op->node, 0, &r);
 
 230                 printk(KERN_ERR "%s: Unable to get resource for "
 
 231                        "PCI err regs\n", __func__);
 
 235         /* we only need the error registers */
 
 238         if (!devm_request_mem_region(&op->dev, r.start,
 
 239                                         r.end - r.start + 1, pdata->name)) {
 
 240                 printk(KERN_ERR "%s: Error while requesting mem region\n",
 
 246         pdata->pci_vbase = devm_ioremap(&op->dev, r.start,
 
 247                                         r.end - r.start + 1);
 
 248         if (!pdata->pci_vbase) {
 
 249                 printk(KERN_ERR "%s: Unable to setup PCI err regs\n", __func__);
 
 254         orig_pci_err_cap_dr =
 
 255             in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR);
 
 257         /* PCI master abort is expected during config cycles */
 
 258         out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR, 0x40);
 
 260         orig_pci_err_en = in_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN);
 
 262         /* disable master abort reporting */
 
 263         out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, ~0x40);
 
 265         /* clear error bits */
 
 266         out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_DR, ~0);
 
 268         if (edac_pci_add_device(pci, pdata->edac_idx) > 0) {
 
 269                 debugf3("%s(): failed edac_pci_add_device()\n", __func__);
 
 273         if (edac_op_state == EDAC_OPSTATE_INT) {
 
 274                 pdata->irq = irq_of_parse_and_map(op->node, 0);
 
 275                 res = devm_request_irq(&op->dev, pdata->irq,
 
 276                                        mpc85xx_pci_isr, IRQF_DISABLED,
 
 277                                        "[EDAC] PCI err", pci);
 
 280                                "%s: Unable to requiest irq %d for "
 
 281                                "MPC85xx PCI err\n", __func__, pdata->irq);
 
 282                         irq_dispose_mapping(pdata->irq);
 
 287                 printk(KERN_INFO EDAC_MOD_STR " acquired irq %d for PCI Err\n",
 
 291         devres_remove_group(&op->dev, mpc85xx_pci_err_probe);
 
 292         debugf3("%s(): success\n", __func__);
 
 293         printk(KERN_INFO EDAC_MOD_STR " PCI err registered\n");
 
 298         edac_pci_del_device(&op->dev);
 
 300         edac_pci_free_ctl_info(pci);
 
 301         devres_release_group(&op->dev, mpc85xx_pci_err_probe);
 
 305 static int mpc85xx_pci_err_remove(struct of_device *op)
 
 307         struct edac_pci_ctl_info *pci = dev_get_drvdata(&op->dev);
 
 308         struct mpc85xx_pci_pdata *pdata = pci->pvt_info;
 
 310         debugf0("%s()\n", __func__);
 
 312         out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_CAP_DR,
 
 313                  orig_pci_err_cap_dr);
 
 315         out_be32(pdata->pci_vbase + MPC85XX_PCI_ERR_EN, orig_pci_err_en);
 
 317         edac_pci_del_device(pci->dev);
 
 319         if (edac_op_state == EDAC_OPSTATE_INT)
 
 320                 irq_dispose_mapping(pdata->irq);
 
 322         edac_pci_free_ctl_info(pci);
 
 327 static struct of_device_id mpc85xx_pci_err_of_match[] = {
 
 329          .compatible = "fsl,mpc8540-pcix",
 
 332          .compatible = "fsl,mpc8540-pci",
 
 337 static struct of_platform_driver mpc85xx_pci_err_driver = {
 
 338         .owner = THIS_MODULE,
 
 339         .name = "mpc85xx_pci_err",
 
 340         .match_table = mpc85xx_pci_err_of_match,
 
 341         .probe = mpc85xx_pci_err_probe,
 
 342         .remove = __devexit_p(mpc85xx_pci_err_remove),
 
 344                    .name = "mpc85xx_pci_err",
 
 345                    .owner = THIS_MODULE,
 
 349 #endif                          /* CONFIG_PCI */
 
 351 /**************************** L2 Err device ***************************/
 
 353 /************************ L2 SYSFS parts ***********************************/
 
 355 static ssize_t mpc85xx_l2_inject_data_hi_show(struct edac_device_ctl_info
 
 356                                               *edac_dev, char *data)
 
 358         struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
 
 359         return sprintf(data, "0x%08x",
 
 360                        in_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJHI));
 
 363 static ssize_t mpc85xx_l2_inject_data_lo_show(struct edac_device_ctl_info
 
 364                                               *edac_dev, char *data)
 
 366         struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
 
 367         return sprintf(data, "0x%08x",
 
 368                        in_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJLO));
 
 371 static ssize_t mpc85xx_l2_inject_ctrl_show(struct edac_device_ctl_info
 
 372                                            *edac_dev, char *data)
 
 374         struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
 
 375         return sprintf(data, "0x%08x",
 
 376                        in_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJCTL));
 
 379 static ssize_t mpc85xx_l2_inject_data_hi_store(struct edac_device_ctl_info
 
 380                                                *edac_dev, const char *data,
 
 383         struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
 
 384         if (isdigit(*data)) {
 
 385                 out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJHI,
 
 386                          simple_strtoul(data, NULL, 0));
 
 392 static ssize_t mpc85xx_l2_inject_data_lo_store(struct edac_device_ctl_info
 
 393                                                *edac_dev, const char *data,
 
 396         struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
 
 397         if (isdigit(*data)) {
 
 398                 out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJLO,
 
 399                          simple_strtoul(data, NULL, 0));
 
 405 static ssize_t mpc85xx_l2_inject_ctrl_store(struct edac_device_ctl_info
 
 406                                             *edac_dev, const char *data,
 
 409         struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
 
 410         if (isdigit(*data)) {
 
 411                 out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINJCTL,
 
 412                          simple_strtoul(data, NULL, 0));
 
 418 static struct edac_dev_sysfs_attribute mpc85xx_l2_sysfs_attributes[] = {
 
 421                   .name = "inject_data_hi",
 
 422                   .mode = (S_IRUGO | S_IWUSR)
 
 424          .show = mpc85xx_l2_inject_data_hi_show,
 
 425          .store = mpc85xx_l2_inject_data_hi_store},
 
 428                   .name = "inject_data_lo",
 
 429                   .mode = (S_IRUGO | S_IWUSR)
 
 431          .show = mpc85xx_l2_inject_data_lo_show,
 
 432          .store = mpc85xx_l2_inject_data_lo_store},
 
 435                   .name = "inject_ctrl",
 
 436                   .mode = (S_IRUGO | S_IWUSR)
 
 438          .show = mpc85xx_l2_inject_ctrl_show,
 
 439          .store = mpc85xx_l2_inject_ctrl_store},
 
 443          .attr = {.name = NULL}
 
 447 static void mpc85xx_set_l2_sysfs_attributes(struct edac_device_ctl_info
 
 450         edac_dev->sysfs_attributes = mpc85xx_l2_sysfs_attributes;
 
 453 /***************************** L2 ops ***********************************/
 
 455 static void mpc85xx_l2_check(struct edac_device_ctl_info *edac_dev)
 
 457         struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
 
 460         err_detect = in_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET);
 
 462         if (!(err_detect & L2_EDE_MASK))
 
 465         printk(KERN_ERR "ECC Error in CPU L2 cache\n");
 
 466         printk(KERN_ERR "L2 Error Detect Register: 0x%08x\n", err_detect);
 
 467         printk(KERN_ERR "L2 Error Capture Data High Register: 0x%08x\n",
 
 468                in_be32(pdata->l2_vbase + MPC85XX_L2_CAPTDATAHI));
 
 469         printk(KERN_ERR "L2 Error Capture Data Lo Register: 0x%08x\n",
 
 470                in_be32(pdata->l2_vbase + MPC85XX_L2_CAPTDATALO));
 
 471         printk(KERN_ERR "L2 Error Syndrome Register: 0x%08x\n",
 
 472                in_be32(pdata->l2_vbase + MPC85XX_L2_CAPTECC));
 
 473         printk(KERN_ERR "L2 Error Attributes Capture Register: 0x%08x\n",
 
 474                in_be32(pdata->l2_vbase + MPC85XX_L2_ERRATTR));
 
 475         printk(KERN_ERR "L2 Error Address Capture Register: 0x%08x\n",
 
 476                in_be32(pdata->l2_vbase + MPC85XX_L2_ERRADDR));
 
 478         /* clear error detect register */
 
 479         out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET, err_detect);
 
 481         if (err_detect & L2_EDE_CE_MASK)
 
 482                 edac_device_handle_ce(edac_dev, 0, 0, edac_dev->ctl_name);
 
 484         if (err_detect & L2_EDE_UE_MASK)
 
 485                 edac_device_handle_ue(edac_dev, 0, 0, edac_dev->ctl_name);
 
 488 static irqreturn_t mpc85xx_l2_isr(int irq, void *dev_id)
 
 490         struct edac_device_ctl_info *edac_dev = dev_id;
 
 491         struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
 
 494         err_detect = in_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET);
 
 496         if (!(err_detect & L2_EDE_MASK))
 
 499         mpc85xx_l2_check(edac_dev);
 
 504 static int __devinit mpc85xx_l2_err_probe(struct of_device *op,
 
 505                                           const struct of_device_id *match)
 
 507         struct edac_device_ctl_info *edac_dev;
 
 508         struct mpc85xx_l2_pdata *pdata;
 
 512         if (!devres_open_group(&op->dev, mpc85xx_l2_err_probe, GFP_KERNEL))
 
 515         edac_dev = edac_device_alloc_ctl_info(sizeof(*pdata),
 
 516                                               "cpu", 1, "L", 1, 2, NULL, 0,
 
 519                 devres_release_group(&op->dev, mpc85xx_l2_err_probe);
 
 523         pdata = edac_dev->pvt_info;
 
 524         pdata->name = "mpc85xx_l2_err";
 
 526         edac_dev->dev = &op->dev;
 
 527         dev_set_drvdata(edac_dev->dev, edac_dev);
 
 528         edac_dev->ctl_name = pdata->name;
 
 529         edac_dev->dev_name = pdata->name;
 
 531         res = of_address_to_resource(op->node, 0, &r);
 
 533                 printk(KERN_ERR "%s: Unable to get resource for "
 
 534                        "L2 err regs\n", __func__);
 
 538         /* we only need the error registers */
 
 541         if (!devm_request_mem_region(&op->dev, r.start,
 
 542                                      r.end - r.start + 1, pdata->name)) {
 
 543                 printk(KERN_ERR "%s: Error while requesting mem region\n",
 
 549         pdata->l2_vbase = devm_ioremap(&op->dev, r.start, r.end - r.start + 1);
 
 550         if (!pdata->l2_vbase) {
 
 551                 printk(KERN_ERR "%s: Unable to setup L2 err regs\n", __func__);
 
 556         out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDET, ~0);
 
 558         orig_l2_err_disable = in_be32(pdata->l2_vbase + MPC85XX_L2_ERRDIS);
 
 560         /* clear the err_dis */
 
 561         out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDIS, 0);
 
 563         edac_dev->mod_name = EDAC_MOD_STR;
 
 565         if (edac_op_state == EDAC_OPSTATE_POLL)
 
 566                 edac_dev->edac_check = mpc85xx_l2_check;
 
 568         mpc85xx_set_l2_sysfs_attributes(edac_dev);
 
 570         pdata->edac_idx = edac_dev_idx++;
 
 572         if (edac_device_add_device(edac_dev) > 0) {
 
 573                 debugf3("%s(): failed edac_device_add_device()\n", __func__);
 
 577         if (edac_op_state == EDAC_OPSTATE_INT) {
 
 578                 pdata->irq = irq_of_parse_and_map(op->node, 0);
 
 579                 res = devm_request_irq(&op->dev, pdata->irq,
 
 580                                        mpc85xx_l2_isr, IRQF_DISABLED,
 
 581                                        "[EDAC] L2 err", edac_dev);
 
 584                                "%s: Unable to requiest irq %d for "
 
 585                                "MPC85xx L2 err\n", __func__, pdata->irq);
 
 586                         irq_dispose_mapping(pdata->irq);
 
 591                 printk(KERN_INFO EDAC_MOD_STR " acquired irq %d for L2 Err\n",
 
 594                 edac_dev->op_state = OP_RUNNING_INTERRUPT;
 
 596                 out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINTEN, L2_EIE_MASK);
 
 599         devres_remove_group(&op->dev, mpc85xx_l2_err_probe);
 
 601         debugf3("%s(): success\n", __func__);
 
 602         printk(KERN_INFO EDAC_MOD_STR " L2 err registered\n");
 
 607         edac_device_del_device(&op->dev);
 
 609         devres_release_group(&op->dev, mpc85xx_l2_err_probe);
 
 610         edac_device_free_ctl_info(edac_dev);
 
 614 static int mpc85xx_l2_err_remove(struct of_device *op)
 
 616         struct edac_device_ctl_info *edac_dev = dev_get_drvdata(&op->dev);
 
 617         struct mpc85xx_l2_pdata *pdata = edac_dev->pvt_info;
 
 619         debugf0("%s()\n", __func__);
 
 621         if (edac_op_state == EDAC_OPSTATE_INT) {
 
 622                 out_be32(pdata->l2_vbase + MPC85XX_L2_ERRINTEN, 0);
 
 623                 irq_dispose_mapping(pdata->irq);
 
 626         out_be32(pdata->l2_vbase + MPC85XX_L2_ERRDIS, orig_l2_err_disable);
 
 627         edac_device_del_device(&op->dev);
 
 628         edac_device_free_ctl_info(edac_dev);
 
 632 static struct of_device_id mpc85xx_l2_err_of_match[] = {
 
 633 /* deprecate the fsl,85.. forms in the future, 2.6.30? */
 
 634         { .compatible = "fsl,8540-l2-cache-controller", },
 
 635         { .compatible = "fsl,8541-l2-cache-controller", },
 
 636         { .compatible = "fsl,8544-l2-cache-controller", },
 
 637         { .compatible = "fsl,8548-l2-cache-controller", },
 
 638         { .compatible = "fsl,8555-l2-cache-controller", },
 
 639         { .compatible = "fsl,8568-l2-cache-controller", },
 
 640         { .compatible = "fsl,mpc8536-l2-cache-controller", },
 
 641         { .compatible = "fsl,mpc8540-l2-cache-controller", },
 
 642         { .compatible = "fsl,mpc8541-l2-cache-controller", },
 
 643         { .compatible = "fsl,mpc8544-l2-cache-controller", },
 
 644         { .compatible = "fsl,mpc8548-l2-cache-controller", },
 
 645         { .compatible = "fsl,mpc8555-l2-cache-controller", },
 
 646         { .compatible = "fsl,mpc8560-l2-cache-controller", },
 
 647         { .compatible = "fsl,mpc8568-l2-cache-controller", },
 
 648         { .compatible = "fsl,mpc8572-l2-cache-controller", },
 
 652 static struct of_platform_driver mpc85xx_l2_err_driver = {
 
 653         .owner = THIS_MODULE,
 
 654         .name = "mpc85xx_l2_err",
 
 655         .match_table = mpc85xx_l2_err_of_match,
 
 656         .probe = mpc85xx_l2_err_probe,
 
 657         .remove = mpc85xx_l2_err_remove,
 
 659                    .name = "mpc85xx_l2_err",
 
 660                    .owner = THIS_MODULE,
 
 664 /**************************** MC Err device ***************************/
 
 666 static void mpc85xx_mc_check(struct mem_ctl_info *mci)
 
 668         struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
 
 669         struct csrow_info *csrow;
 
 676         err_detect = in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT);
 
 680         mpc85xx_mc_printk(mci, KERN_ERR, "Err Detect Register: %#8.8x\n",
 
 683         /* no more processing if not ECC bit errors */
 
 684         if (!(err_detect & (DDR_EDE_SBE | DDR_EDE_MBE))) {
 
 685                 out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT, err_detect);
 
 689         syndrome = in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_ECC);
 
 690         err_addr = in_be32(pdata->mc_vbase + MPC85XX_MC_CAPTURE_ADDRESS);
 
 691         pfn = err_addr >> PAGE_SHIFT;
 
 693         for (row_index = 0; row_index < mci->nr_csrows; row_index++) {
 
 694                 csrow = &mci->csrows[row_index];
 
 695                 if ((pfn >= csrow->first_page) && (pfn <= csrow->last_page))
 
 699         mpc85xx_mc_printk(mci, KERN_ERR, "Capture Data High: %#8.8x\n",
 
 700                           in_be32(pdata->mc_vbase +
 
 701                                   MPC85XX_MC_CAPTURE_DATA_HI));
 
 702         mpc85xx_mc_printk(mci, KERN_ERR, "Capture Data Low: %#8.8x\n",
 
 703                           in_be32(pdata->mc_vbase +
 
 704                                   MPC85XX_MC_CAPTURE_DATA_LO));
 
 705         mpc85xx_mc_printk(mci, KERN_ERR, "syndrome: %#8.8x\n", syndrome);
 
 706         mpc85xx_mc_printk(mci, KERN_ERR, "err addr: %#8.8x\n", err_addr);
 
 707         mpc85xx_mc_printk(mci, KERN_ERR, "PFN: %#8.8x\n", pfn);
 
 709         /* we are out of range */
 
 710         if (row_index == mci->nr_csrows)
 
 711                 mpc85xx_mc_printk(mci, KERN_ERR, "PFN out of range!\n");
 
 713         if (err_detect & DDR_EDE_SBE)
 
 714                 edac_mc_handle_ce(mci, pfn, err_addr & PAGE_MASK,
 
 715                                   syndrome, row_index, 0, mci->ctl_name);
 
 717         if (err_detect & DDR_EDE_MBE)
 
 718                 edac_mc_handle_ue(mci, pfn, err_addr & PAGE_MASK,
 
 719                                   row_index, mci->ctl_name);
 
 721         out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT, err_detect);
 
 724 static irqreturn_t mpc85xx_mc_isr(int irq, void *dev_id)
 
 726         struct mem_ctl_info *mci = dev_id;
 
 727         struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
 
 730         err_detect = in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT);
 
 734         mpc85xx_mc_check(mci);
 
 739 static void __devinit mpc85xx_init_csrows(struct mem_ctl_info *mci)
 
 741         struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
 
 742         struct csrow_info *csrow;
 
 749         sdram_ctl = in_be32(pdata->mc_vbase + MPC85XX_MC_DDR_SDRAM_CFG);
 
 751         sdtype = sdram_ctl & DSC_SDTYPE_MASK;
 
 752         if (sdram_ctl & DSC_RD_EN) {
 
 757                 case DSC_SDTYPE_DDR2:
 
 769                 case DSC_SDTYPE_DDR2:
 
 778         for (index = 0; index < mci->nr_csrows; index++) {
 
 782                 csrow = &mci->csrows[index];
 
 783                 cs_bnds = in_be32(pdata->mc_vbase + MPC85XX_MC_CS_BNDS_0 +
 
 784                                   (index * MPC85XX_MC_CS_BNDS_OFS));
 
 785                 start = (cs_bnds & 0xfff0000) << 4;
 
 786                 end = ((cs_bnds & 0xfff) << 20);
 
 793                         continue;       /* not populated */
 
 795                 csrow->first_page = start >> PAGE_SHIFT;
 
 796                 csrow->last_page = end >> PAGE_SHIFT;
 
 797                 csrow->nr_pages = csrow->last_page + 1 - csrow->first_page;
 
 799                 csrow->mtype = mtype;
 
 800                 csrow->dtype = DEV_UNKNOWN;
 
 801                 if (sdram_ctl & DSC_X32_EN)
 
 802                         csrow->dtype = DEV_X32;
 
 803                 csrow->edac_mode = EDAC_SECDED;
 
 807 static int __devinit mpc85xx_mc_err_probe(struct of_device *op,
 
 808                                           const struct of_device_id *match)
 
 810         struct mem_ctl_info *mci;
 
 811         struct mpc85xx_mc_pdata *pdata;
 
 816         if (!devres_open_group(&op->dev, mpc85xx_mc_err_probe, GFP_KERNEL))
 
 819         mci = edac_mc_alloc(sizeof(*pdata), 4, 1, edac_mc_idx);
 
 821                 devres_release_group(&op->dev, mpc85xx_mc_err_probe);
 
 825         pdata = mci->pvt_info;
 
 826         pdata->name = "mpc85xx_mc_err";
 
 829         pdata->edac_idx = edac_mc_idx++;
 
 830         dev_set_drvdata(mci->dev, mci);
 
 831         mci->ctl_name = pdata->name;
 
 832         mci->dev_name = pdata->name;
 
 834         res = of_address_to_resource(op->node, 0, &r);
 
 836                 printk(KERN_ERR "%s: Unable to get resource for MC err regs\n",
 
 841         if (!devm_request_mem_region(&op->dev, r.start,
 
 842                                      r.end - r.start + 1, pdata->name)) {
 
 843                 printk(KERN_ERR "%s: Error while requesting mem region\n",
 
 849         pdata->mc_vbase = devm_ioremap(&op->dev, r.start, r.end - r.start + 1);
 
 850         if (!pdata->mc_vbase) {
 
 851                 printk(KERN_ERR "%s: Unable to setup MC err regs\n", __func__);
 
 856         sdram_ctl = in_be32(pdata->mc_vbase + MPC85XX_MC_DDR_SDRAM_CFG);
 
 857         if (!(sdram_ctl & DSC_ECC_EN)) {
 
 859                 printk(KERN_WARNING "%s: No ECC DIMMs discovered\n", __func__);
 
 864         debugf3("%s(): init mci\n", __func__);
 
 865         mci->mtype_cap = MEM_FLAG_RDDR | MEM_FLAG_RDDR2 |
 
 866             MEM_FLAG_DDR | MEM_FLAG_DDR2;
 
 867         mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
 
 868         mci->edac_cap = EDAC_FLAG_SECDED;
 
 869         mci->mod_name = EDAC_MOD_STR;
 
 870         mci->mod_ver = MPC85XX_REVISION;
 
 872         if (edac_op_state == EDAC_OPSTATE_POLL)
 
 873                 mci->edac_check = mpc85xx_mc_check;
 
 875         mci->ctl_page_to_phys = NULL;
 
 877         mci->scrub_mode = SCRUB_SW_SRC;
 
 879         mpc85xx_set_mc_sysfs_attributes(mci);
 
 881         mpc85xx_init_csrows(mci);
 
 883 #ifdef CONFIG_EDAC_DEBUG
 
 884         edac_mc_register_mcidev_debug((struct attribute **)debug_attr);
 
 887         /* store the original error disable bits */
 
 888         orig_ddr_err_disable =
 
 889             in_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DISABLE);
 
 890         out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DISABLE, 0);
 
 892         /* clear all error bits */
 
 893         out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DETECT, ~0);
 
 895         if (edac_mc_add_mc(mci)) {
 
 896                 debugf3("%s(): failed edac_mc_add_mc()\n", __func__);
 
 900         if (edac_op_state == EDAC_OPSTATE_INT) {
 
 901                 out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_INT_EN,
 
 902                          DDR_EIE_MBEE | DDR_EIE_SBEE);
 
 904                 /* store the original error management threshold */
 
 905                 orig_ddr_err_sbe = in_be32(pdata->mc_vbase +
 
 906                                            MPC85XX_MC_ERR_SBE) & 0xff0000;
 
 908                 /* set threshold to 1 error per interrupt */
 
 909                 out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_SBE, 0x10000);
 
 911                 /* register interrupts */
 
 912                 pdata->irq = irq_of_parse_and_map(op->node, 0);
 
 913                 res = devm_request_irq(&op->dev, pdata->irq,
 
 915                                         IRQF_DISABLED | IRQF_SHARED,
 
 916                                        "[EDAC] MC err", mci);
 
 918                         printk(KERN_ERR "%s: Unable to request irq %d for "
 
 919                                "MPC85xx DRAM ERR\n", __func__, pdata->irq);
 
 920                         irq_dispose_mapping(pdata->irq);
 
 925                 printk(KERN_INFO EDAC_MOD_STR " acquired irq %d for MC\n",
 
 929         devres_remove_group(&op->dev, mpc85xx_mc_err_probe);
 
 930         debugf3("%s(): success\n", __func__);
 
 931         printk(KERN_INFO EDAC_MOD_STR " MC err registered\n");
 
 936         edac_mc_del_mc(&op->dev);
 
 938         devres_release_group(&op->dev, mpc85xx_mc_err_probe);
 
 943 static int mpc85xx_mc_err_remove(struct of_device *op)
 
 945         struct mem_ctl_info *mci = dev_get_drvdata(&op->dev);
 
 946         struct mpc85xx_mc_pdata *pdata = mci->pvt_info;
 
 948         debugf0("%s()\n", __func__);
 
 950         if (edac_op_state == EDAC_OPSTATE_INT) {
 
 951                 out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_INT_EN, 0);
 
 952                 irq_dispose_mapping(pdata->irq);
 
 955         out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_DISABLE,
 
 956                  orig_ddr_err_disable);
 
 957         out_be32(pdata->mc_vbase + MPC85XX_MC_ERR_SBE, orig_ddr_err_sbe);
 
 959         edac_mc_del_mc(&op->dev);
 
 964 static struct of_device_id mpc85xx_mc_err_of_match[] = {
 
 965 /* deprecate the fsl,85.. forms in the future, 2.6.30? */
 
 966         { .compatible = "fsl,8540-memory-controller", },
 
 967         { .compatible = "fsl,8541-memory-controller", },
 
 968         { .compatible = "fsl,8544-memory-controller", },
 
 969         { .compatible = "fsl,8548-memory-controller", },
 
 970         { .compatible = "fsl,8555-memory-controller", },
 
 971         { .compatible = "fsl,8568-memory-controller", },
 
 972         { .compatible = "fsl,mpc8536-memory-controller", },
 
 973         { .compatible = "fsl,mpc8540-memory-controller", },
 
 974         { .compatible = "fsl,mpc8541-memory-controller", },
 
 975         { .compatible = "fsl,mpc8544-memory-controller", },
 
 976         { .compatible = "fsl,mpc8548-memory-controller", },
 
 977         { .compatible = "fsl,mpc8555-memory-controller", },
 
 978         { .compatible = "fsl,mpc8560-memory-controller", },
 
 979         { .compatible = "fsl,mpc8568-memory-controller", },
 
 980         { .compatible = "fsl,mpc8572-memory-controller", },
 
 984 static struct of_platform_driver mpc85xx_mc_err_driver = {
 
 985         .owner = THIS_MODULE,
 
 986         .name = "mpc85xx_mc_err",
 
 987         .match_table = mpc85xx_mc_err_of_match,
 
 988         .probe = mpc85xx_mc_err_probe,
 
 989         .remove = mpc85xx_mc_err_remove,
 
 991                    .name = "mpc85xx_mc_err",
 
 992                    .owner = THIS_MODULE,
 
 997 static void __init mpc85xx_mc_clear_rfxe(void *data)
 
 999         orig_hid1[smp_processor_id()] = mfspr(SPRN_HID1);
 
1000         mtspr(SPRN_HID1, (orig_hid1[smp_processor_id()] & ~0x20000));
 
1004 static int __init mpc85xx_mc_init(void)
 
1008         printk(KERN_INFO "Freescale(R) MPC85xx EDAC driver, "
 
1009                "(C) 2006 Montavista Software\n");
 
1011         /* make sure error reporting method is sane */
 
1012         switch (edac_op_state) {
 
1013         case EDAC_OPSTATE_POLL:
 
1014         case EDAC_OPSTATE_INT:
 
1017                 edac_op_state = EDAC_OPSTATE_INT;
 
1021         res = of_register_platform_driver(&mpc85xx_mc_err_driver);
 
1023                 printk(KERN_WARNING EDAC_MOD_STR "MC fails to register\n");
 
1025         res = of_register_platform_driver(&mpc85xx_l2_err_driver);
 
1027                 printk(KERN_WARNING EDAC_MOD_STR "L2 fails to register\n");
 
1030         res = of_register_platform_driver(&mpc85xx_pci_err_driver);
 
1032                 printk(KERN_WARNING EDAC_MOD_STR "PCI fails to register\n");
 
1036          * need to clear HID1[RFXE] to disable machine check int
 
1037          * so we can catch it
 
1039         if (edac_op_state == EDAC_OPSTATE_INT)
 
1040                 on_each_cpu(mpc85xx_mc_clear_rfxe, NULL, 0);
 
1045 module_init(mpc85xx_mc_init);
 
1047 static void __exit mpc85xx_mc_restore_hid1(void *data)
 
1049         mtspr(SPRN_HID1, orig_hid1[smp_processor_id()]);
 
1052 static void __exit mpc85xx_mc_exit(void)
 
1054         on_each_cpu(mpc85xx_mc_restore_hid1, NULL, 0);
 
1056         of_unregister_platform_driver(&mpc85xx_pci_err_driver);
 
1058         of_unregister_platform_driver(&mpc85xx_l2_err_driver);
 
1059         of_unregister_platform_driver(&mpc85xx_mc_err_driver);
 
1062 module_exit(mpc85xx_mc_exit);
 
1064 MODULE_LICENSE("GPL");
 
1065 MODULE_AUTHOR("Montavista Software, Inc.");
 
1066 module_param(edac_op_state, int, 0444);
 
1067 MODULE_PARM_DESC(edac_op_state,
 
1068                  "EDAC Error Reporting state: 0=Poll, 2=Interrupt");