| From 9fe373f9997b48fcd6222b95baf4a20c134b587a Mon Sep 17 00:00:00 2001 |
| From: Douglas Lehr <dllehr@us.ibm.com> |
| Date: Thu, 21 Aug 2014 09:26:52 +1000 |
| Subject: PCI: Increase IBM ipr SAS Crocodile BARs to at least system page size |
| |
| From: Douglas Lehr <dllehr@us.ibm.com> |
| |
| commit 9fe373f9997b48fcd6222b95baf4a20c134b587a upstream. |
| |
| The Crocodile chip occasionally comes up with 4k and 8k BAR sizes. Due to |
| an erratum, setting the SR-IOV page size causes the physical function BARs |
| to expand to the system page size. Since ppc64 uses 64k pages, when Linux |
| tries to assign the smaller resource sizes to the now 64k BARs the address |
| will be truncated and the BARs will overlap. |
| |
| Force Linux to allocate the resource as a full page, which avoids the |
| overlap. |
| |
| [bhelgaas: print expanded resource, too] |
| Signed-off-by: Douglas Lehr <dllehr@us.ibm.com> |
| Signed-off-by: Anton Blanchard <anton@samba.org> |
| Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> |
| Acked-by: Milton Miller <miltonm@us.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/pci/quirks.c | 20 ++++++++++++++++++++ |
| 1 file changed, 20 insertions(+) |
| |
| --- a/drivers/pci/quirks.c |
| +++ b/drivers/pci/quirks.c |
| @@ -24,6 +24,7 @@ |
| #include <linux/ioport.h> |
| #include <linux/sched.h> |
| #include <linux/ktime.h> |
| +#include <linux/mm.h> |
| #include <asm/dma.h> /* isa_dma_bridge_buggy */ |
| #include "pci.h" |
| |
| @@ -287,6 +288,25 @@ static void quirk_citrine(struct pci_dev |
| } |
| DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, quirk_citrine); |
| |
| +/* On IBM Crocodile ipr SAS adapters, expand BAR to system page size */ |
| +static void quirk_extend_bar_to_page(struct pci_dev *dev) |
| +{ |
| + int i; |
| + |
| + for (i = 0; i < PCI_STD_RESOURCE_END; i++) { |
| + struct resource *r = &dev->resource[i]; |
| + |
| + if (r->flags & IORESOURCE_MEM && resource_size(r) < PAGE_SIZE) { |
| + r->end = PAGE_SIZE - 1; |
| + r->start = 0; |
| + r->flags |= IORESOURCE_UNSET; |
| + dev_info(&dev->dev, "expanded BAR %d to page size: %pR\n", |
| + i, r); |
| + } |
| + } |
| +} |
| +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_IBM, 0x034a, quirk_extend_bar_to_page); |
| + |
| /* |
| * S3 868 and 968 chips report region size equal to 32M, but they decode 64M. |
| * If it's needed, re-allocate the region. |