]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
vme_tsi148: Fix PCI address mapping assumption
authorJoe Schultz <jschultz@xes-inc.com>
Thu, 3 Apr 2014 19:48:16 +0000 (14:48 -0500)
committerJiri Slaby <jslaby@suse.cz>
Wed, 19 Nov 2014 22:44:27 +0000 (23:44 +0100)
commit 226572b110ab6083cb8c1d6afb191166b4178179 upstream.

Previously, tsi148_master_set() assumed the address contained in its
PCI bus resource represented the actual PCI bus address. This is a fine
assumption on some platforms. However, on platforms that don't use a
1:1 (CPU:PCI) mapping this results in the tsi148 driver configuring an
invalid master window translation.

This patch updates the vme_tsi148 driver to first convert the address
contained in the PCI bus resource into a PCI bus address before using
it.

[asierra: account for pcibios_resource_to_bus() prototype change]
Signed-off-by: Joe Schultz <jschultz@xes-inc.com>
Signed-off-by: Aaron Sierra <asierra@xes-inc.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
drivers/vme/bridges/vme_tsi148.c

index 7db4e6395e23bd933bed0357c56d6dce9848e02a..6783ad0d1875b2f260b4b25d3a71afd106ed45a7 100644 (file)
@@ -910,11 +910,15 @@ static int tsi148_master_set(struct vme_master_resource *image, int enabled,
        unsigned long long pci_bound, vme_offset, pci_base;
        struct vme_bridge *tsi148_bridge;
        struct tsi148_driver *bridge;
+       struct pci_bus_region region;
+       struct pci_dev *pdev;
 
        tsi148_bridge = image->parent;
 
        bridge = tsi148_bridge->driver_priv;
 
+       pdev = container_of(tsi148_bridge->parent, struct pci_dev, dev);
+
        /* Verify input data */
        if (vme_base & 0xFFFF) {
                dev_err(tsi148_bridge->parent, "Invalid VME Window "
@@ -949,7 +953,9 @@ static int tsi148_master_set(struct vme_master_resource *image, int enabled,
                pci_bound = 0;
                vme_offset = 0;
        } else {
-               pci_base = (unsigned long long)image->bus_resource.start;
+               pcibios_resource_to_bus(pdev, &region,
+                                       &image->bus_resource);
+               pci_base = region.start;
 
                /*
                 * Bound address is a valid address for the window, adjust