Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fcb19171 authored by Dave Jiang's avatar Dave Jiang Committed by Linus Torvalds
Browse files

edac: mv64x60 add pci fixup



Fixup of missing bit 0 on 64360 PCIx_ERR_MASK and errata FEr-#11 and
FEr-#16 for the 64460.  Bit 0 must remain 0.

Signed-off-by: default avatarDave Jiang <djiang@mvista.com>
Signed-off-by: Doug Thompson <dougthompson.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 596d3941
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -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,