From: Robin Murphy <robin.murphy@arm.com>
To: Will Deacon <will.deacon@arm.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"iommu@lists.linux-foundation.org"
<iommu@lists.linux-foundation.org>,
"m.szyprowski@samsung.com" <m.szyprowski@samsung.com>
Cc: "jroedel@suse.de" <jroedel@suse.de>,
"arnd@arndb.de" <arnd@arndb.de>,
"thierry.reding@gmail.com" <thierry.reding@gmail.com>,
"laurent.pinchart@ideasonboard.com"
<laurent.pinchart@ideasonboard.com>,
"Varun.Sethi@freescale.com" <Varun.Sethi@freescale.com>,
"dwmw2@infradead.org" <dwmw2@infradead.org>,
"hdoyu@nvidia.com" <hdoyu@nvidia.com>
Subject: Re: [RFC PATCH v4 6/8] dma-mapping: set dma segment properties in of_dma_configure
Date: Tue, 25 Nov 2014 13:05:36 +0000 [thread overview]
Message-ID: <54747EA0.1020001@arm.com> (raw)
In-Reply-To: <1415991397-9618-7-git-send-email-will.deacon@arm.com>
Hi Will,
On 14/11/14 18:56, Will Deacon wrote:
> of_dma_configure determines the size of the DMA range for a device by
> either parsing the dma-ranges property or inspecting the coherent DMA
> mask. This same information can be used to initialise the max segment
> size and boundary_mask to a default value.
>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
Sadly, NAK on this one. After a thorough investigation and testing,
generic code really shouldn't be touching dma_parms like this, and I
have some corrupted files on my USB filesystem to prove it ;) It seems
it's a bad idea to effectively change the default segment size
universally unless you really want to go through the entire block layer
(and who-knows-what-else) to find and fix everything that relies on it
being 64k.
Simply dropping this patch and letting the existing defaults in
dma_set_max_seg_size and dma_get_seg_boundary stand seems like the
correct action.
Marek, I believe you may have some use case for this - if so, as I
understand it your individual drivers should be setting up their own
dma_parms directly, to tell the IOMMU they can handle it merging
scatterlists into arbitrarily long segments, without affecting the other
drivers that assume they'll never see >64k segments and go wrong if they
do (including the generic USB stack, apparently).
Robin.
> ---
> drivers/of/platform.c | 4 ++++
> include/linux/amba/bus.h | 1 +
> include/linux/platform_device.h | 2 ++
> 3 files changed, 7 insertions(+)
>
> diff --git a/drivers/of/platform.c b/drivers/of/platform.c
> index b89caf8c7586..0a2842d91db4 100644
> --- a/drivers/of/platform.c
> +++ b/drivers/of/platform.c
> @@ -191,6 +191,8 @@ static void of_dma_configure(struct device *dev)
> dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", dev->dma_pfn_offset);
> }
> dev->dma_pfn_offset = offset;
> + dma_set_max_seg_size(dev, size);
> + dma_set_seg_boundary(dev, size);
>
> coherent = of_dma_is_coherent(dev->of_node);
> dev_dbg(dev, "device is%sdma coherent\n",
> @@ -236,6 +238,7 @@ static struct platform_device *of_platform_device_create_pdata(
>
> dev->dev.bus = &platform_bus_type;
> dev->dev.platform_data = platform_data;
> + dev->dev.dma_parms = &dev->dma_parms;
> of_dma_configure(&dev->dev);
>
> if (of_device_add(dev) != 0) {
> @@ -295,6 +298,7 @@ static struct amba_device *of_amba_device_create(struct device_node *node,
> dev->dev.of_node = of_node_get(node);
> dev->dev.parent = parent;
> dev->dev.platform_data = platform_data;
> + dev->dev.dma_parms = &dev->dma_parms;
> if (bus_id)
> dev_set_name(&dev->dev, "%s", bus_id);
> else
> diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h
> index c324f5700d1a..9b232eeb6c20 100644
> --- a/include/linux/amba/bus.h
> +++ b/include/linux/amba/bus.h
> @@ -32,6 +32,7 @@ struct amba_device {
> struct clk *pclk;
> unsigned int periphid;
> unsigned int irq[AMBA_NR_IRQS];
> + struct device_dma_parameters dma_parms;
> };
>
> struct amba_driver {
> diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h
> index 153d303af7eb..8dc48487b34b 100644
> --- a/include/linux/platform_device.h
> +++ b/include/linux/platform_device.h
> @@ -27,6 +27,8 @@ struct platform_device {
> u32 num_resources;
> struct resource *resource;
>
> + struct device_dma_parameters dma_parms;
> +
> const struct platform_device_id *id_entry;
> char *driver_override; /* Driver name to force a match */
>
>
WARNING: multiple messages have this Message-ID (diff)
From: robin.murphy@arm.com (Robin Murphy)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH v4 6/8] dma-mapping: set dma segment properties in of_dma_configure
Date: Tue, 25 Nov 2014 13:05:36 +0000 [thread overview]
Message-ID: <54747EA0.1020001@arm.com> (raw)
In-Reply-To: <1415991397-9618-7-git-send-email-will.deacon@arm.com>
Hi Will,
On 14/11/14 18:56, Will Deacon wrote:
> of_dma_configure determines the size of the DMA range for a device by
> either parsing the dma-ranges property or inspecting the coherent DMA
> mask. This same information can be used to initialise the max segment
> size and boundary_mask to a default value.
>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
Sadly, NAK on this one. After a thorough investigation and testing,
generic code really shouldn't be touching dma_parms like this, and I
have some corrupted files on my USB filesystem to prove it ;) It seems
it's a bad idea to effectively change the default segment size
universally unless you really want to go through the entire block layer
(and who-knows-what-else) to find and fix everything that relies on it
being 64k.
Simply dropping this patch and letting the existing defaults in
dma_set_max_seg_size and dma_get_seg_boundary stand seems like the
correct action.
Marek, I believe you may have some use case for this - if so, as I
understand it your individual drivers should be setting up their own
dma_parms directly, to tell the IOMMU they can handle it merging
scatterlists into arbitrarily long segments, without affecting the other
drivers that assume they'll never see >64k segments and go wrong if they
do (including the generic USB stack, apparently).
Robin.
> ---
> drivers/of/platform.c | 4 ++++
> include/linux/amba/bus.h | 1 +
> include/linux/platform_device.h | 2 ++
> 3 files changed, 7 insertions(+)
>
> diff --git a/drivers/of/platform.c b/drivers/of/platform.c
> index b89caf8c7586..0a2842d91db4 100644
> --- a/drivers/of/platform.c
> +++ b/drivers/of/platform.c
> @@ -191,6 +191,8 @@ static void of_dma_configure(struct device *dev)
> dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", dev->dma_pfn_offset);
> }
> dev->dma_pfn_offset = offset;
> + dma_set_max_seg_size(dev, size);
> + dma_set_seg_boundary(dev, size);
>
> coherent = of_dma_is_coherent(dev->of_node);
> dev_dbg(dev, "device is%sdma coherent\n",
> @@ -236,6 +238,7 @@ static struct platform_device *of_platform_device_create_pdata(
>
> dev->dev.bus = &platform_bus_type;
> dev->dev.platform_data = platform_data;
> + dev->dev.dma_parms = &dev->dma_parms;
> of_dma_configure(&dev->dev);
>
> if (of_device_add(dev) != 0) {
> @@ -295,6 +298,7 @@ static struct amba_device *of_amba_device_create(struct device_node *node,
> dev->dev.of_node = of_node_get(node);
> dev->dev.parent = parent;
> dev->dev.platform_data = platform_data;
> + dev->dev.dma_parms = &dev->dma_parms;
> if (bus_id)
> dev_set_name(&dev->dev, "%s", bus_id);
> else
> diff --git a/include/linux/amba/bus.h b/include/linux/amba/bus.h
> index c324f5700d1a..9b232eeb6c20 100644
> --- a/include/linux/amba/bus.h
> +++ b/include/linux/amba/bus.h
> @@ -32,6 +32,7 @@ struct amba_device {
> struct clk *pclk;
> unsigned int periphid;
> unsigned int irq[AMBA_NR_IRQS];
> + struct device_dma_parameters dma_parms;
> };
>
> struct amba_driver {
> diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h
> index 153d303af7eb..8dc48487b34b 100644
> --- a/include/linux/platform_device.h
> +++ b/include/linux/platform_device.h
> @@ -27,6 +27,8 @@ struct platform_device {
> u32 num_resources;
> struct resource *resource;
>
> + struct device_dma_parameters dma_parms;
> +
> const struct platform_device_id *id_entry;
> char *driver_override; /* Driver name to force a match */
>
>
next prev parent reply other threads:[~2014-11-25 13:05 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-14 18:56 [RFC PATCH v4 0/8] Introduce automatic DMA configuration for IOMMU masters Will Deacon
2014-11-14 18:56 ` Will Deacon
[not found] ` <1415991397-9618-1-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org>
2014-11-14 18:56 ` [RFC PATCH v4 1/8] iommu: provide early initialisation hook for IOMMU drivers Will Deacon
2014-11-14 18:56 ` Will Deacon
[not found] ` <1415991397-9618-2-git-send-email-will.deacon-5wv7dgnIgG8@public.gmane.org>
2014-11-18 12:28 ` Marek Szyprowski
2014-11-18 12:28 ` Marek Szyprowski
2014-11-14 18:56 ` [RFC PATCH v4 2/8] dma-mapping: replace set_arch_dma_coherent_ops with arch_setup_dma_ops Will Deacon
2014-11-14 18:56 ` Will Deacon
2014-11-14 18:56 ` [RFC PATCH v4 3/8] iommu: add new iommu_ops callback for adding an OF device Will Deacon
2014-11-14 18:56 ` Will Deacon
2014-11-14 18:56 ` [RFC PATCH v4 4/8] iommu: provide helper function to configure an IOMMU for an of master Will Deacon
2014-11-14 18:56 ` Will Deacon
2014-11-14 18:56 ` [RFC PATCH v4 5/8] dma-mapping: detect and configure IOMMU in of_dma_configure Will Deacon
2014-11-14 18:56 ` Will Deacon
2014-11-14 18:56 ` [RFC PATCH v4 6/8] dma-mapping: set dma segment properties " Will Deacon
2014-11-14 18:56 ` Will Deacon
2014-11-25 13:05 ` Robin Murphy [this message]
2014-11-25 13:05 ` Robin Murphy
[not found] ` <54747EA0.1020001-5wv7dgnIgG8@public.gmane.org>
2014-11-26 11:37 ` Will Deacon
2014-11-26 11:37 ` Will Deacon
2014-11-14 18:56 ` [RFC PATCH v4 7/8] arm: call iommu_init before of_platform_populate Will Deacon
2014-11-14 18:56 ` Will Deacon
2014-11-14 18:56 ` [RFC PATCH v4 8/8] arm: dma-mapping: plumb our iommu mapping ops into arch_setup_dma_ops Will Deacon
2014-11-14 18:56 ` Will Deacon
2014-11-17 11:29 ` Robin Murphy
2014-11-17 11:29 ` Robin Murphy
[not found] ` <5469DC13.6040700-5wv7dgnIgG8@public.gmane.org>
2014-11-17 11:41 ` Will Deacon
2014-11-17 11:41 ` Will Deacon
2014-11-14 19:11 ` [RFC PATCH v4 0/8] Introduce automatic DMA configuration for IOMMU masters Arnd Bergmann
2014-11-14 19:11 ` Arnd Bergmann
2014-11-14 19:27 ` Will Deacon
2014-11-14 19:27 ` Will Deacon
[not found] ` <20141114192754.GB9291-5wv7dgnIgG8@public.gmane.org>
2014-11-14 20:01 ` Arnd Bergmann
2014-11-14 20:01 ` Arnd Bergmann
2015-01-19 16:06 ` Will Deacon
2015-01-19 16:06 ` Will Deacon
[not found] ` <20150119160620.GB2373-5wv7dgnIgG8@public.gmane.org>
2015-01-20 16:56 ` Laurent Pinchart
2015-01-20 16:56 ` Laurent Pinchart
2015-01-21 14:48 ` Will Deacon
2015-01-21 14:48 ` Will Deacon
2015-01-21 15:02 ` Laurent Pinchart
2015-01-21 15:02 ` Laurent Pinchart
2014-11-19 11:21 ` Marek Szyprowski
2014-11-19 11:21 ` Marek Szyprowski
[not found] ` <546C7D36.7030400-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-11-19 11:41 ` Will Deacon
2014-11-19 11:41 ` Will Deacon
[not found] ` <20141119114150.GD15985-5wv7dgnIgG8@public.gmane.org>
2014-11-25 7:35 ` Marek Szyprowski
2014-11-25 7:35 ` Marek Szyprowski
[not found] ` <54743139.2020804-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-11-26 17:47 ` Will Deacon
2014-11-26 17:47 ` Will Deacon
[not found] ` <20141126174707.GO14866-5wv7dgnIgG8@public.gmane.org>
2014-11-28 13:03 ` jroedel-l3A5Bk7waGM
2014-11-28 13:03 ` jroedel at suse.de
[not found] ` <20141128130336.GF3156-l3A5Bk7waGM@public.gmane.org>
2014-11-28 13:19 ` Will Deacon
2014-11-28 13:19 ` Will Deacon
2014-12-15 17:21 ` Laurent Pinchart
2014-12-15 17:21 ` Laurent Pinchart
2014-12-15 17:34 ` Will Deacon
2014-12-15 17:34 ` Will Deacon
[not found] ` <20141215173416.GS20738-5wv7dgnIgG8@public.gmane.org>
2014-12-15 17:55 ` Laurent Pinchart
2014-12-15 17:55 ` Laurent Pinchart
2014-11-25 13:15 ` Robin Murphy
2014-11-25 13:15 ` Robin Murphy
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=54747EA0.1020001@arm.com \
--to=robin.murphy@arm.com \
--cc=Varun.Sethi@freescale.com \
--cc=arnd@arndb.de \
--cc=dwmw2@infradead.org \
--cc=hdoyu@nvidia.com \
--cc=iommu@lists.linux-foundation.org \
--cc=jroedel@suse.de \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=m.szyprowski@samsung.com \
--cc=thierry.reding@gmail.com \
--cc=will.deacon@arm.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.