diff options
author | Robin Murphy <robin.murphy@arm.com> | 2017-10-12 16:56:14 +0100 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2017-10-19 16:34:52 +0200 |
commit | d89e2378a97fafdc74cbf997e7c88af75b81610a (patch) | |
tree | 1291cfc9e6a129e135f99449c007a59266f3a4d2 /drivers | |
parent | 33d930e59a98fa10a0db9f56c7fa2f21a4aef9b9 (diff) | |
download | linux-0-day-d89e2378a97fafdc74cbf997e7c88af75b81610a.tar.gz linux-0-day-d89e2378a97fafdc74cbf997e7c88af75b81610a.tar.xz |
drivers: flag buses which demand DMA configuration
We do not want the common dma_configure() pathway to apply
indiscriminately to all devices, since there are plenty of buses which
do not have DMA capability, and if their child devices were used for
DMA API calls it would only be indicative of a driver bug. However,
there are a number of buses for which DMA is implicitly expected even
when not described by firmware - those we whitelist with an automatic
opt-in to dma_configure(), assuming that the DMA address space and the
physical address space are equivalent if not otherwise specified.
Commit 723288836628 ("of: restrict DMA configuration") introduced a
short-term fix by comparing explicit bus types, but this approach is far
from pretty, doesn't scale well, and fails to cope at all with bus
drivers which may be built as modules, like host1x. Let's refine things
by making that opt-in a property of the bus type, which neatly addresses
those problems and lets the decision of whether firmware description of
DMA capability should be optional or mandatory stay internal to the bus
drivers themselves.
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Acked-by: Rob Herring <robh@kernel.org>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/amba/bus.c | 1 | ||||
-rw-r--r-- | drivers/base/platform.c | 1 | ||||
-rw-r--r-- | drivers/gpu/host1x/bus.c | 1 | ||||
-rw-r--r-- | drivers/of/device.c | 8 | ||||
-rw-r--r-- | drivers/pci/pci-driver.c | 1 |
5 files changed, 5 insertions, 7 deletions
diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index e0f74ddc22b73..594c228d2f021 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c @@ -195,6 +195,7 @@ struct bus_type amba_bustype = { .match = amba_match, .uevent = amba_uevent, .pm = &amba_pm, + .force_dma = true, }; static int __init amba_init(void) diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 9045c5f3734e8..c203fb90c1a01 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -1143,6 +1143,7 @@ struct bus_type platform_bus_type = { .match = platform_match, .uevent = platform_uevent, .pm = &platform_dev_pm_ops, + .force_dma = true, }; EXPORT_SYMBOL_GPL(platform_bus_type); diff --git a/drivers/gpu/host1x/bus.c b/drivers/gpu/host1x/bus.c index f9cde03030fd9..ed03b3243195b 100644 --- a/drivers/gpu/host1x/bus.c +++ b/drivers/gpu/host1x/bus.c @@ -320,6 +320,7 @@ struct bus_type host1x_bus_type = { .name = "host1x", .match = host1x_device_match, .pm = &host1x_device_pm_ops, + .force_dma = true, }; static void __host1x_device_del(struct host1x_device *device) diff --git a/drivers/of/device.c b/drivers/of/device.c index 64b710265d390..25bddf9c9fe1c 100644 --- a/drivers/of/device.c +++ b/drivers/of/device.c @@ -9,9 +9,7 @@ #include <linux/module.h> #include <linux/mod_devicetable.h> #include <linux/slab.h> -#include <linux/pci.h> #include <linux/platform_device.h> -#include <linux/amba/bus.h> #include <asm/errno.h> #include "of_private.h" @@ -101,11 +99,7 @@ int of_dma_configure(struct device *dev, struct device_node *np) * DMA configuration regardless of whether "dma-ranges" is * correctly specified or not. */ - if (!dev_is_pci(dev) && -#ifdef CONFIG_ARM_AMBA - dev->bus != &amba_bustype && -#endif - dev->bus != &platform_bus_type) + if (!dev->bus->force_dma) return ret == -ENODEV ? 0 : ret; dma_addr = offset = 0; diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 11bd267fc1371..38bdb97b6dc64 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -1466,6 +1466,7 @@ struct bus_type pci_bus_type = { .drv_groups = pci_drv_groups, .pm = PCI_PM_OPS_PTR, .num_vf = pci_bus_num_vf, + .force_dma = true, }; EXPORT_SYMBOL(pci_bus_type); |