devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thierry Reding <thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
Cc: Mikko Perttunen
	<mperttunen-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>,
	jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org,
	hch-jcswGhMUV9g@public.gmane.org,
	robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	"gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org"
	<gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>
Subject: Re: [PATCH 2/2] of: configure DMA for host1x devices
Date: Tue, 26 Sep 2017 13:27:03 +0200	[thread overview]
Message-ID: <20170926112703.GE23108@ulmo> (raw)
In-Reply-To: <dd8e9524-1d91-2c8b-a753-086d3ad9f9c9-5wv7dgnIgG8@public.gmane.org>

[-- Attachment #1: Type: text/plain, Size: 7385 bytes --]

On Mon, Sep 25, 2017 at 01:26:46PM +0100, Robin Murphy wrote:
> On 25/09/17 08:44, Thierry Reding wrote:
> > On Sun, Sep 24, 2017 at 12:04:54PM +0300, Mikko Perttunen wrote:
> >> Devices in the host1x bus rely on the old behavior of of_dma_configure
> >> to set up DMA ops. Add a check for them into of_dma_configure.
> >>
> >> We must do the check using a string comparison instead of using
> >> pointers since the host1x bus can be compiled into a module.
> >>
> >> Fixes: 723288836628 ("of: restrict DMA configuration")
> >> Signed-off-by: Mikko Perttunen <mperttunen-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
> >> ---
> >>  drivers/of/device.c | 3 +++
> >>  1 file changed, 3 insertions(+)
> >>
> >> diff --git a/drivers/of/device.c b/drivers/of/device.c
> >> index 64b710265d39..12368418cd33 100644
> >> --- a/drivers/of/device.c
> >> +++ b/drivers/of/device.c
> >> @@ -104,6 +104,9 @@ int of_dma_configure(struct device *dev, struct device_node *np)
> >>  		if (!dev_is_pci(dev) &&
> >>  #ifdef CONFIG_ARM_AMBA
> >>  		    dev->bus != &amba_bustype &&
> >> +#endif
> >> +#if IS_ENABLED(CONFIG_TEGRA_HOST1X)
> >> +		    !(dev->bus && !strcmp("host1x", dev->bus->name)) &&
> >>  #endif
> >>  		    dev->bus != &platform_bus_type)
> >>  			return ret == -ENODEV ? 0 : ret;
> > 
> > Maybe a slightly better solution would be to add a dev_is_host1x()
> > function that returns dev->bus == &host1x_bus_type if TEGRA_HOST1X is
> > enabled and returns false otherwise. That way we can have a "proper"
> > check for the bus type and avoid the #if in this file.
> > 
> > It's slightly more complicated because of the dependencies between the
> > DT and Tegra DRM trees, but I'm sure we can get Rob to either give his
> > Acked-by on the drivers/of/device.c change or carry the Tegra DRM patch
> > in the DT tree.
> 
> Alternatively (and modulo Greg's opinion, obviously) it would arguably be
> neatest to handle this at a slightly lower level as below - I only really
> considered this idea after writing the existing fix, but now that I have
> actually written it up I do rather like it.
> 
> Robin.
> 
> ----->8-----
> From: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
> Date: Mon, 25 Sep 2017 12:45:58 +0100
> Subject: [PATCH] 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, so we currently whitelist those to
> automatically opt in to dma_configure(), assuming a 1:1 mapping between
> the DMA address space and the physical address space.
> 
> 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. 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-5wv7dgnIgG8@public.gmane.org>
> ---
>  drivers/amba/bus.c       | 1 +
>  drivers/base/platform.c  | 1 +
>  drivers/gpu/host1x/bus.c | 1 +
>  drivers/of/device.c      | 8 +-------
>  drivers/pci/pci-driver.c | 1 +
>  include/linux/device.h   | 4 ++++
>  6 files changed, 9 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
> index e0f74ddc22b7..594c228d2f02 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 d1bd99271066..9c95c8db00f8 100644
> --- a/drivers/base/platform.c
> +++ b/drivers/base/platform.c
> @@ -1142,6 +1142,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 f9cde03030fd..ed03b3243195 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 64b710265d39..25bddf9c9fe1 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 11bd267fc137..38bdb97b6dc6 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);
>  
> diff --git a/include/linux/device.h b/include/linux/device.h
> index c6f27207dbe8..3a1efa56e7c4 100644
> --- a/include/linux/device.h
> +++ b/include/linux/device.h
> @@ -97,6 +97,8 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);
>   * @p:		The private data of the driver core, only the driver core can
>   *		touch this.
>   * @lock_key:	Lock class key for use by the lock validator
> + * @force_dma:	Assume devices on this bus should be set up by dma_configure()
> + * 		even if DMA capability is not explicitly described by firmware.
>   *
>   * A bus is a channel between the processor and one or more devices. For the
>   * purposes of the device model, all devices are connected via a bus, even if
> @@ -135,6 +137,8 @@ struct bus_type {
>  
>  	struct subsys_private *p;
>  	struct lock_class_key lock_key;
> +
> +	bool force_dma;

Maybe force_dma_setup to clarify that we're not trying to force DMA
usage, but rather setup of DMA properties.

Either way:

Acked-by: Thierry Reding <treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  parent reply	other threads:[~2017-09-26 11:27 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-24  9:04 [PATCH 1/2] gpu: host1x: Call of_dma_configure after setting bus Mikko Perttunen
     [not found] ` <20170924090454.28116-1-mperttunen-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2017-09-24  9:04   ` [PATCH 2/2] of: configure DMA for host1x devices Mikko Perttunen
     [not found]     ` <20170924090454.28116-2-mperttunen-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2017-09-25  7:44       ` Thierry Reding
     [not found]         ` <20170925074448.GB12494-m5CkvRiFyV9wFLYp8hBm2A@public.gmane.org>
2017-09-25 12:26           ` Robin Murphy
     [not found]             ` <dd8e9524-1d91-2c8b-a753-086d3ad9f9c9-5wv7dgnIgG8@public.gmane.org>
2017-09-25 12:47               ` Christoph Hellwig
2017-09-25 18:26               ` Mikko Perttunen
2017-09-26 11:27               ` Thierry Reding [this message]
2017-10-11 13:06               ` Rob Herring

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170926112703.GE23108@ulmo \
    --to=thierry.reding-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
    --cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
    --cc=hch-jcswGhMUV9g@public.gmane.org \
    --cc=jonathanh-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org \
    --cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
    --cc=linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=mperttunen-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org \
    --cc=robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
    --cc=robin.murphy-5wv7dgnIgG8@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).