From 52ec070ea65539d7c3929b72da8db73780d2d0d2 Mon Sep 17 00:00:00 2001 From: Dave Jiang Date: Fri, 25 Jul 2008 01:49:14 -0700 Subject: [PATCH] --- yaml --- r: 106054 b: refs/heads/master c: fcb19171d196172a4f57e056f7a60e6d1e2e8c85 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/edac/mv64x60_edac.c | 35 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 0a4707050b6e..fdb774d4f08e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 596d3941035d4d4b484c820f10f57fd4816c6615 +refs/heads/master: fcb19171d196172a4f57e056f7a60e6d1e2e8c85 diff --git a/trunk/drivers/edac/mv64x60_edac.c b/trunk/drivers/edac/mv64x60_edac.c index de69163ff5b3..083ce8d0c63d 100644 --- a/trunk/drivers/edac/mv64x60_edac.c +++ b/trunk/drivers/edac/mv64x60_edac.c @@ -71,6 +71,35 @@ static irqreturn_t mv64x60_pci_isr(int irq, void *dev_id) return IRQ_HANDLED; } +/* + * Bit 0 of MV64x60_PCIx_ERR_MASK does not exist on the 64360 and because of + * errata FEr-#11 and FEr-##16 for the 64460, it should be 0 on that chip as + * well. IOW, don't set bit 0. + */ + +/* Erratum FEr PCI-#16: clear bit 0 of PCI SERRn Mask reg. */ +static int __init mv64x60_pci_fixup(struct platform_device *pdev) +{ + struct resource *r; + void __iomem *pci_serr; + + r = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (!r) { + printk(KERN_ERR "%s: Unable to get resource for " + "PCI err regs\n", __func__); + return -ENOENT; + } + + pci_serr = ioremap(r->start, r->end - r->start + 1); + if (!pci_serr) + return -ENOMEM; + + out_le32(pci_serr, in_le32(pci_serr) & ~0x1); + iounmap(pci_serr); + + return 0; +} + static int __devinit mv64x60_pci_err_probe(struct platform_device *pdev) { struct edac_pci_ctl_info *pci; @@ -128,6 +157,12 @@ static int __devinit mv64x60_pci_err_probe(struct platform_device *pdev) goto err; } + res = mv64x60_pci_fixup(pdev); + if (res < 0) { + printk(KERN_ERR "%s: PCI fixup failed\n", __func__); + goto err; + } + out_le32(pdata->pci_vbase + MV64X60_PCI_ERROR_CAUSE, 0); out_le32(pdata->pci_vbase + MV64X60_PCI_ERROR_MASK, 0); out_le32(pdata->pci_vbase + MV64X60_PCI_ERROR_MASK,