* [PATCH] dma-mapping: tidy up dma_parms default handling
@ 2015-01-09 16:56 ` Robin Murphy
0 siblings, 0 replies; 17+ messages in thread
From: Robin Murphy @ 2014-12-19 17:39 UTC (permalink / raw)
To: vinod.koul, dmaengine, linux-kernel
Cc: linux-arm-kernel, dan.j.williams, lars, liviu.dudau, andrew.jackson
Many DMA controllers and other devices set max_segment_size to
indicate their scatter-gather capability, but have no interest in
segment_boundary_mask. However, the existence of a dma_parms structure
precludes the use of any default value, leaving them as zeros (assuming
a properly kzalloc'ed structure). If a well-behaved IOMMU (or SWIOTLB)
then tries to respect this by ensuring a mapped segment does not cross
a zero-byte boundary, hilarity ensues.
Since zero is a nonsensical value for either parameter, treat it as an
indicator for "default", as might be expected. In the process, clean up
a bit by replacing the bare constants with slightly more meaningful
macros and removing the superfluous "else" statements.
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
---
Hi Vinod, dmaengine folks,
This isn't strictly a dmaengine patch, but get_maintainer.pl pointed at you,
and there do happen to be more dmaengine drivers potentially affected by this
than anything else - the current PL330 driver blows up arm64's SWIOTLB when
running dmatest on the Juno platform, which is what brought the underlying
problem to light.
include/linux/dma-mapping.h | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index c3007cb..99ba736 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -141,7 +141,9 @@ static inline void arch_teardown_dma_ops(struct device *dev) { }
static inline unsigned int dma_get_max_seg_size(struct device *dev)
{
- return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
+ if (dev->dma_parms && dev->dma_parms->max_segment_size)
+ return dev->dma_parms->max_segment_size;
+ return SZ_64K;
}
static inline unsigned int dma_set_max_seg_size(struct device *dev,
@@ -150,14 +152,15 @@ static inline unsigned int dma_set_max_seg_size(struct device *dev,
if (dev->dma_parms) {
dev->dma_parms->max_segment_size = size;
return 0;
- } else
- return -EIO;
+ }
+ return -EIO;
}
static inline unsigned long dma_get_seg_boundary(struct device *dev)
{
- return dev->dma_parms ?
- dev->dma_parms->segment_boundary_mask : 0xffffffff;
+ if (dev->dma_parms && dev->dma_parms->segment_boundary_mask)
+ return dev->dma_parms->segment_boundary_mask;
+ return DMA_BIT_MASK(32);
}
static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
@@ -165,8 +168,8 @@ static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
if (dev->dma_parms) {
dev->dma_parms->segment_boundary_mask = mask;
return 0;
- } else
- return -EIO;
+ }
+ return -EIO;
}
#ifndef dma_max_pfn
--
1.9.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH] dma-mapping: tidy up dma_parms default handling
2015-01-09 16:56 ` [PATCH RESEND] " Robin Murphy
@ 2014-12-22 15:25 ` Vinod Koul
-1 siblings, 0 replies; 17+ messages in thread
From: Vinod Koul @ 2014-12-22 15:25 UTC (permalink / raw)
To: Robin Murphy, Will Deacon
Cc: dmaengine, linux-kernel, linux-arm-kernel, dan.j.williams, lars,
liviu.dudau, andrew.jackson
On Fri, Dec 19, 2014 at 05:39:09PM +0000, Robin Murphy wrote:
> Many DMA controllers and other devices set max_segment_size to
> indicate their scatter-gather capability, but have no interest in
> segment_boundary_mask. However, the existence of a dma_parms structure
> precludes the use of any default value, leaving them as zeros (assuming
> a properly kzalloc'ed structure). If a well-behaved IOMMU (or SWIOTLB)
> then tries to respect this by ensuring a mapped segment does not cross
> a zero-byte boundary, hilarity ensues.
>
> Since zero is a nonsensical value for either parameter, treat it as an
> indicator for "default", as might be expected. In the process, clean up
> a bit by replacing the bare constants with slightly more meaningful
> macros and removing the superfluous "else" statements.
>
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
> ---
>
> Hi Vinod, dmaengine folks,
>
> This isn't strictly a dmaengine patch, but get_maintainer.pl pointed at you,
> and there do happen to be more dmaengine drivers potentially affected by this
> than anything else - the current PL330 driver blows up arm64's SWIOTLB when
> running dmatest on the Juno platform, which is what brought the underlying
> problem to light.
That's due to include/linux/dma*, I will fix that up.
I think arm folks should be able to help review this... Last few commit
point to Will Decon carrying these
--
~Vinod
>
> include/linux/dma-mapping.h | 17 ++++++++++-------
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
> index c3007cb..99ba736 100644
> --- a/include/linux/dma-mapping.h
> +++ b/include/linux/dma-mapping.h
> @@ -141,7 +141,9 @@ static inline void arch_teardown_dma_ops(struct device *dev) { }
>
> static inline unsigned int dma_get_max_seg_size(struct device *dev)
> {
> - return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
> + if (dev->dma_parms && dev->dma_parms->max_segment_size)
> + return dev->dma_parms->max_segment_size;
> + return SZ_64K;
> }
>
> static inline unsigned int dma_set_max_seg_size(struct device *dev,
> @@ -150,14 +152,15 @@ static inline unsigned int dma_set_max_seg_size(struct device *dev,
> if (dev->dma_parms) {
> dev->dma_parms->max_segment_size = size;
> return 0;
> - } else
> - return -EIO;
> + }
> + return -EIO;
> }
>
> static inline unsigned long dma_get_seg_boundary(struct device *dev)
> {
> - return dev->dma_parms ?
> - dev->dma_parms->segment_boundary_mask : 0xffffffff;
> + if (dev->dma_parms && dev->dma_parms->segment_boundary_mask)
> + return dev->dma_parms->segment_boundary_mask;
> + return DMA_BIT_MASK(32);
> }
>
> static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
> @@ -165,8 +168,8 @@ static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
> if (dev->dma_parms) {
> dev->dma_parms->segment_boundary_mask = mask;
> return 0;
> - } else
> - return -EIO;
> + }
> + return -EIO;
> }
>
> #ifndef dma_max_pfn
> --
> 1.9.1
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe dmaengine" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH] dma-mapping: tidy up dma_parms default handling
@ 2014-12-22 15:25 ` Vinod Koul
0 siblings, 0 replies; 17+ messages in thread
From: Vinod Koul @ 2014-12-22 15:25 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Dec 19, 2014 at 05:39:09PM +0000, Robin Murphy wrote:
> Many DMA controllers and other devices set max_segment_size to
> indicate their scatter-gather capability, but have no interest in
> segment_boundary_mask. However, the existence of a dma_parms structure
> precludes the use of any default value, leaving them as zeros (assuming
> a properly kzalloc'ed structure). If a well-behaved IOMMU (or SWIOTLB)
> then tries to respect this by ensuring a mapped segment does not cross
> a zero-byte boundary, hilarity ensues.
>
> Since zero is a nonsensical value for either parameter, treat it as an
> indicator for "default", as might be expected. In the process, clean up
> a bit by replacing the bare constants with slightly more meaningful
> macros and removing the superfluous "else" statements.
>
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
> ---
>
> Hi Vinod, dmaengine folks,
>
> This isn't strictly a dmaengine patch, but get_maintainer.pl pointed at you,
> and there do happen to be more dmaengine drivers potentially affected by this
> than anything else - the current PL330 driver blows up arm64's SWIOTLB when
> running dmatest on the Juno platform, which is what brought the underlying
> problem to light.
That's due to include/linux/dma*, I will fix that up.
I think arm folks should be able to help review this... Last few commit
point to Will Decon carrying these
--
~Vinod
>
> include/linux/dma-mapping.h | 17 ++++++++++-------
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
> index c3007cb..99ba736 100644
> --- a/include/linux/dma-mapping.h
> +++ b/include/linux/dma-mapping.h
> @@ -141,7 +141,9 @@ static inline void arch_teardown_dma_ops(struct device *dev) { }
>
> static inline unsigned int dma_get_max_seg_size(struct device *dev)
> {
> - return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
> + if (dev->dma_parms && dev->dma_parms->max_segment_size)
> + return dev->dma_parms->max_segment_size;
> + return SZ_64K;
> }
>
> static inline unsigned int dma_set_max_seg_size(struct device *dev,
> @@ -150,14 +152,15 @@ static inline unsigned int dma_set_max_seg_size(struct device *dev,
> if (dev->dma_parms) {
> dev->dma_parms->max_segment_size = size;
> return 0;
> - } else
> - return -EIO;
> + }
> + return -EIO;
> }
>
> static inline unsigned long dma_get_seg_boundary(struct device *dev)
> {
> - return dev->dma_parms ?
> - dev->dma_parms->segment_boundary_mask : 0xffffffff;
> + if (dev->dma_parms && dev->dma_parms->segment_boundary_mask)
> + return dev->dma_parms->segment_boundary_mask;
> + return DMA_BIT_MASK(32);
> }
>
> static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
> @@ -165,8 +168,8 @@ static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
> if (dev->dma_parms) {
> dev->dma_parms->segment_boundary_mask = mask;
> return 0;
> - } else
> - return -EIO;
> + }
> + return -EIO;
> }
>
> #ifndef dma_max_pfn
> --
> 1.9.1
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe dmaengine" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
@ 2015-01-09 16:56 ` Robin Murphy
0 siblings, 0 replies; 17+ messages in thread
From: Robin Murphy @ 2015-01-09 16:56 UTC (permalink / raw)
To: linux-arm-kernel
Many DMA controllers and other devices set max_segment_size to
indicate their scatter-gather capability, but have no interest in
segment_boundary_mask. However, the existence of a dma_parms structure
precludes the use of any default value, leaving them as zeros (assuming
a properly kzalloc'ed structure). If a well-behaved IOMMU (or SWIOTLB)
then tries to respect this by ensuring a mapped segment does not cross
a zero-byte boundary, hilarity ensues.
Since zero is a nonsensical value for either parameter, treat it as an
indicator for "default", as might be expected. In the process, clean up
a bit by replacing the bare constants with slightly more meaningful
macros and removing the superfluous "else" statements.
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
---
Hi, various maintainers from Git logs ;)
This one's a bit tricky to find a home for - I think technically it's
probably an IOMMU patch, but then the long-underlying problem doesn't
seem to have blown up anything until arm64, and my motivation is to
make bits of Juno work, which seems to nudge it towards arm64/arm-soc
territory. Could anyone suggest which tree is most appropriate?
Thanks,
Robin.
include/linux/dma-mapping.h | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index c3007cb..99ba736 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -141,7 +141,9 @@ static inline void arch_teardown_dma_ops(struct device *dev) { }
static inline unsigned int dma_get_max_seg_size(struct device *dev)
{
- return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
+ if (dev->dma_parms && dev->dma_parms->max_segment_size)
+ return dev->dma_parms->max_segment_size;
+ return SZ_64K;
}
static inline unsigned int dma_set_max_seg_size(struct device *dev,
@@ -150,14 +152,15 @@ static inline unsigned int dma_set_max_seg_size(struct device *dev,
if (dev->dma_parms) {
dev->dma_parms->max_segment_size = size;
return 0;
- } else
- return -EIO;
+ }
+ return -EIO;
}
static inline unsigned long dma_get_seg_boundary(struct device *dev)
{
- return dev->dma_parms ?
- dev->dma_parms->segment_boundary_mask : 0xffffffff;
+ if (dev->dma_parms && dev->dma_parms->segment_boundary_mask)
+ return dev->dma_parms->segment_boundary_mask;
+ return DMA_BIT_MASK(32);
}
static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
@@ -165,8 +168,8 @@ static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
if (dev->dma_parms) {
dev->dma_parms->segment_boundary_mask = mask;
return 0;
- } else
- return -EIO;
+ }
+ return -EIO;
}
#ifndef dma_max_pfn
--
1.9.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
2015-01-09 16:56 ` [PATCH RESEND] " Robin Murphy
@ 2015-01-09 19:45 ` Arnd Bergmann
-1 siblings, 0 replies; 17+ messages in thread
From: Arnd Bergmann @ 2015-01-09 19:45 UTC (permalink / raw)
To: Robin Murphy
Cc: will.deacon, m.szyprowski, bhelgaas, joro, gregkh, iommu,
linux-kernel, linux-arm-kernel
On Friday 09 January 2015 16:56:03 Robin Murphy wrote:
>
> This one's a bit tricky to find a home for - I think technically it's
> probably an IOMMU patch, but then the long-underlying problem doesn't
> seem to have blown up anything until arm64, and my motivation is to
> make bits of Juno work, which seems to nudge it towards arm64/arm-soc
> territory. Could anyone suggest which tree is most appropriate?
I have a set of patches touching various dma-mapping.h related bits
across architectures and in ARM in particular. Your patch fits into
that series, and I guess we could either have it in my asm-generic
tree or in Andrew Morton's mm tree. Possibly also arm-soc for practical
reasons, although it really doesn't belong in there.
Arnd
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
@ 2015-01-09 19:45 ` Arnd Bergmann
0 siblings, 0 replies; 17+ messages in thread
From: Arnd Bergmann @ 2015-01-09 19:45 UTC (permalink / raw)
To: linux-arm-kernel
On Friday 09 January 2015 16:56:03 Robin Murphy wrote:
>
> This one's a bit tricky to find a home for - I think technically it's
> probably an IOMMU patch, but then the long-underlying problem doesn't
> seem to have blown up anything until arm64, and my motivation is to
> make bits of Juno work, which seems to nudge it towards arm64/arm-soc
> territory. Could anyone suggest which tree is most appropriate?
I have a set of patches touching various dma-mapping.h related bits
across architectures and in ARM in particular. Your patch fits into
that series, and I guess we could either have it in my asm-generic
tree or in Andrew Morton's mm tree. Possibly also arm-soc for practical
reasons, although it really doesn't belong in there.
Arnd
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
2015-01-09 19:45 ` Arnd Bergmann
(?)
@ 2015-01-12 13:00 ` Will Deacon
-1 siblings, 0 replies; 17+ messages in thread
From: Will Deacon @ 2015-01-12 13:00 UTC (permalink / raw)
To: Arnd Bergmann
Cc: Robin Murphy, m.szyprowski, bhelgaas, joro, gregkh, iommu,
linux-kernel, linux-arm-kernel
On Fri, Jan 09, 2015 at 07:45:49PM +0000, Arnd Bergmann wrote:
> On Friday 09 January 2015 16:56:03 Robin Murphy wrote:
> >
> > This one's a bit tricky to find a home for - I think technically it's
> > probably an IOMMU patch, but then the long-underlying problem doesn't
> > seem to have blown up anything until arm64, and my motivation is to
> > make bits of Juno work, which seems to nudge it towards arm64/arm-soc
> > territory. Could anyone suggest which tree is most appropriate?
>
> I have a set of patches touching various dma-mapping.h related bits
> across architectures and in ARM in particular. Your patch fits into
> that series, and I guess we could either have it in my asm-generic
> tree or in Andrew Morton's mm tree. Possibly also arm-soc for practical
> reasons, although it really doesn't belong in there.
I also have a couple of fixes for issues found by Laurent for tearing
down the IOMMU dma ops, so you could include those too.
I'll send them out this afternoon.
Will
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
@ 2015-01-12 13:00 ` Will Deacon
0 siblings, 0 replies; 17+ messages in thread
From: Will Deacon @ 2015-01-12 13:00 UTC (permalink / raw)
To: Arnd Bergmann
Cc: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, Robin Murphy,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
On Fri, Jan 09, 2015 at 07:45:49PM +0000, Arnd Bergmann wrote:
> On Friday 09 January 2015 16:56:03 Robin Murphy wrote:
> >
> > This one's a bit tricky to find a home for - I think technically it's
> > probably an IOMMU patch, but then the long-underlying problem doesn't
> > seem to have blown up anything until arm64, and my motivation is to
> > make bits of Juno work, which seems to nudge it towards arm64/arm-soc
> > territory. Could anyone suggest which tree is most appropriate?
>
> I have a set of patches touching various dma-mapping.h related bits
> across architectures and in ARM in particular. Your patch fits into
> that series, and I guess we could either have it in my asm-generic
> tree or in Andrew Morton's mm tree. Possibly also arm-soc for practical
> reasons, although it really doesn't belong in there.
I also have a couple of fixes for issues found by Laurent for tearing
down the IOMMU dma ops, so you could include those too.
I'll send them out this afternoon.
Will
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
@ 2015-01-12 13:00 ` Will Deacon
0 siblings, 0 replies; 17+ messages in thread
From: Will Deacon @ 2015-01-12 13:00 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Jan 09, 2015 at 07:45:49PM +0000, Arnd Bergmann wrote:
> On Friday 09 January 2015 16:56:03 Robin Murphy wrote:
> >
> > This one's a bit tricky to find a home for - I think technically it's
> > probably an IOMMU patch, but then the long-underlying problem doesn't
> > seem to have blown up anything until arm64, and my motivation is to
> > make bits of Juno work, which seems to nudge it towards arm64/arm-soc
> > territory. Could anyone suggest which tree is most appropriate?
>
> I have a set of patches touching various dma-mapping.h related bits
> across architectures and in ARM in particular. Your patch fits into
> that series, and I guess we could either have it in my asm-generic
> tree or in Andrew Morton's mm tree. Possibly also arm-soc for practical
> reasons, although it really doesn't belong in there.
I also have a couple of fixes for issues found by Laurent for tearing
down the IOMMU dma ops, so you could include those too.
I'll send them out this afternoon.
Will
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
2015-01-09 19:45 ` Arnd Bergmann
(?)
@ 2015-01-12 13:07 ` Robin Murphy
-1 siblings, 0 replies; 17+ messages in thread
From: Robin Murphy @ 2015-01-12 13:07 UTC (permalink / raw)
To: Arnd Bergmann
Cc: Will Deacon, m.szyprowski, bhelgaas, joro, gregkh, iommu,
linux-kernel, linux-arm-kernel
On 09/01/15 19:45, Arnd Bergmann wrote:
> On Friday 09 January 2015 16:56:03 Robin Murphy wrote:
>>
>> This one's a bit tricky to find a home for - I think technically it's
>> probably an IOMMU patch, but then the long-underlying problem doesn't
>> seem to have blown up anything until arm64, and my motivation is to
>> make bits of Juno work, which seems to nudge it towards arm64/arm-soc
>> territory. Could anyone suggest which tree is most appropriate?
>
> I have a set of patches touching various dma-mapping.h related bits
> across architectures and in ARM in particular. Your patch fits into
> that series, and I guess we could either have it in my asm-generic
> tree or in Andrew Morton's mm tree. Possibly also arm-soc for practical
> reasons, although it really doesn't belong in there.
>
Thanks Arnd, I'd agree asm-generic or mm sound the most sensible - If
you're happy to carry this patch with your series that'd be really helpful.
Robin.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
@ 2015-01-12 13:07 ` Robin Murphy
0 siblings, 0 replies; 17+ messages in thread
From: Robin Murphy @ 2015-01-12 13:07 UTC (permalink / raw)
To: Arnd Bergmann
Cc: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, Will Deacon,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
On 09/01/15 19:45, Arnd Bergmann wrote:
> On Friday 09 January 2015 16:56:03 Robin Murphy wrote:
>>
>> This one's a bit tricky to find a home for - I think technically it's
>> probably an IOMMU patch, but then the long-underlying problem doesn't
>> seem to have blown up anything until arm64, and my motivation is to
>> make bits of Juno work, which seems to nudge it towards arm64/arm-soc
>> territory. Could anyone suggest which tree is most appropriate?
>
> I have a set of patches touching various dma-mapping.h related bits
> across architectures and in ARM in particular. Your patch fits into
> that series, and I guess we could either have it in my asm-generic
> tree or in Andrew Morton's mm tree. Possibly also arm-soc for practical
> reasons, although it really doesn't belong in there.
>
Thanks Arnd, I'd agree asm-generic or mm sound the most sensible - If
you're happy to carry this patch with your series that'd be really helpful.
Robin.
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
@ 2015-01-12 13:07 ` Robin Murphy
0 siblings, 0 replies; 17+ messages in thread
From: Robin Murphy @ 2015-01-12 13:07 UTC (permalink / raw)
To: linux-arm-kernel
On 09/01/15 19:45, Arnd Bergmann wrote:
> On Friday 09 January 2015 16:56:03 Robin Murphy wrote:
>>
>> This one's a bit tricky to find a home for - I think technically it's
>> probably an IOMMU patch, but then the long-underlying problem doesn't
>> seem to have blown up anything until arm64, and my motivation is to
>> make bits of Juno work, which seems to nudge it towards arm64/arm-soc
>> territory. Could anyone suggest which tree is most appropriate?
>
> I have a set of patches touching various dma-mapping.h related bits
> across architectures and in ARM in particular. Your patch fits into
> that series, and I guess we could either have it in my asm-generic
> tree or in Andrew Morton's mm tree. Possibly also arm-soc for practical
> reasons, although it really doesn't belong in there.
>
Thanks Arnd, I'd agree asm-generic or mm sound the most sensible - If
you're happy to carry this patch with your series that'd be really helpful.
Robin.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
@ 2015-01-13 11:19 ` Marek Szyprowski
0 siblings, 0 replies; 17+ messages in thread
From: Marek Szyprowski @ 2015-01-13 11:19 UTC (permalink / raw)
To: Robin Murphy, will.deacon, arnd, bhelgaas, joro, gregkh
Cc: iommu, linux-kernel, linux-arm-kernel
Hello,
On 2015-01-09 17:56, Robin Murphy wrote:
> Many DMA controllers and other devices set max_segment_size to
> indicate their scatter-gather capability, but have no interest in
> segment_boundary_mask. However, the existence of a dma_parms structure
> precludes the use of any default value, leaving them as zeros (assuming
> a properly kzalloc'ed structure). If a well-behaved IOMMU (or SWIOTLB)
> then tries to respect this by ensuring a mapped segment does not cross
> a zero-byte boundary, hilarity ensues.
>
> Since zero is a nonsensical value for either parameter, treat it as an
> indicator for "default", as might be expected. In the process, clean up
> a bit by replacing the bare constants with slightly more meaningful
> macros and removing the superfluous "else" statements.
>
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
> ---
>
> Hi, various maintainers from Git logs ;)
>
> This one's a bit tricky to find a home for - I think technically it's
> probably an IOMMU patch, but then the long-underlying problem doesn't
> seem to have blown up anything until arm64, and my motivation is to
> make bits of Juno work, which seems to nudge it towards arm64/arm-soc
> territory. Could anyone suggest which tree is most appropriate?
>
> Thanks,
> Robin.
>
> include/linux/dma-mapping.h | 17 ++++++++++-------
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
> index c3007cb..99ba736 100644
> --- a/include/linux/dma-mapping.h
> +++ b/include/linux/dma-mapping.h
> @@ -141,7 +141,9 @@ static inline void arch_teardown_dma_ops(struct device *dev) { }
>
> static inline unsigned int dma_get_max_seg_size(struct device *dev)
> {
> - return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
> + if (dev->dma_parms && dev->dma_parms->max_segment_size)
> + return dev->dma_parms->max_segment_size;
> + return SZ_64K;
> }
>
> static inline unsigned int dma_set_max_seg_size(struct device *dev,
> @@ -150,14 +152,15 @@ static inline unsigned int dma_set_max_seg_size(struct device *dev,
> if (dev->dma_parms) {
> dev->dma_parms->max_segment_size = size;
> return 0;
> - } else
> - return -EIO;
> + }
> + return -EIO;
> }
>
> static inline unsigned long dma_get_seg_boundary(struct device *dev)
> {
> - return dev->dma_parms ?
> - dev->dma_parms->segment_boundary_mask : 0xffffffff;
> + if (dev->dma_parms && dev->dma_parms->segment_boundary_mask)
> + return dev->dma_parms->segment_boundary_mask;
> + return DMA_BIT_MASK(32);
> }
>
> static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
> @@ -165,8 +168,8 @@ static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
> if (dev->dma_parms) {
> dev->dma_parms->segment_boundary_mask = mask;
> return 0;
> - } else
> - return -EIO;
> + }
> + return -EIO;
> }
>
> #ifndef dma_max_pfn
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
@ 2015-01-13 11:19 ` Marek Szyprowski
0 siblings, 0 replies; 17+ messages in thread
From: Marek Szyprowski @ 2015-01-13 11:19 UTC (permalink / raw)
To: Robin Murphy, will.deacon-5wv7dgnIgG8, arnd-r2nGTMty4D4,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, joro-zLv9SwRftAIdnm+yROfE0A,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r
Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
Hello,
On 2015-01-09 17:56, Robin Murphy wrote:
> Many DMA controllers and other devices set max_segment_size to
> indicate their scatter-gather capability, but have no interest in
> segment_boundary_mask. However, the existence of a dma_parms structure
> precludes the use of any default value, leaving them as zeros (assuming
> a properly kzalloc'ed structure). If a well-behaved IOMMU (or SWIOTLB)
> then tries to respect this by ensuring a mapped segment does not cross
> a zero-byte boundary, hilarity ensues.
>
> Since zero is a nonsensical value for either parameter, treat it as an
> indicator for "default", as might be expected. In the process, clean up
> a bit by replacing the bare constants with slightly more meaningful
> macros and removing the superfluous "else" statements.
>
> Signed-off-by: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
Acked-by: Marek Szyprowski <m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
> ---
>
> Hi, various maintainers from Git logs ;)
>
> This one's a bit tricky to find a home for - I think technically it's
> probably an IOMMU patch, but then the long-underlying problem doesn't
> seem to have blown up anything until arm64, and my motivation is to
> make bits of Juno work, which seems to nudge it towards arm64/arm-soc
> territory. Could anyone suggest which tree is most appropriate?
>
> Thanks,
> Robin.
>
> include/linux/dma-mapping.h | 17 ++++++++++-------
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
> index c3007cb..99ba736 100644
> --- a/include/linux/dma-mapping.h
> +++ b/include/linux/dma-mapping.h
> @@ -141,7 +141,9 @@ static inline void arch_teardown_dma_ops(struct device *dev) { }
>
> static inline unsigned int dma_get_max_seg_size(struct device *dev)
> {
> - return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
> + if (dev->dma_parms && dev->dma_parms->max_segment_size)
> + return dev->dma_parms->max_segment_size;
> + return SZ_64K;
> }
>
> static inline unsigned int dma_set_max_seg_size(struct device *dev,
> @@ -150,14 +152,15 @@ static inline unsigned int dma_set_max_seg_size(struct device *dev,
> if (dev->dma_parms) {
> dev->dma_parms->max_segment_size = size;
> return 0;
> - } else
> - return -EIO;
> + }
> + return -EIO;
> }
>
> static inline unsigned long dma_get_seg_boundary(struct device *dev)
> {
> - return dev->dma_parms ?
> - dev->dma_parms->segment_boundary_mask : 0xffffffff;
> + if (dev->dma_parms && dev->dma_parms->segment_boundary_mask)
> + return dev->dma_parms->segment_boundary_mask;
> + return DMA_BIT_MASK(32);
> }
>
> static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
> @@ -165,8 +168,8 @@ static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
> if (dev->dma_parms) {
> dev->dma_parms->segment_boundary_mask = mask;
> return 0;
> - } else
> - return -EIO;
> + }
> + return -EIO;
> }
>
> #ifndef dma_max_pfn
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
@ 2015-01-13 11:19 ` Marek Szyprowski
0 siblings, 0 replies; 17+ messages in thread
From: Marek Szyprowski @ 2015-01-13 11:19 UTC (permalink / raw)
To: linux-arm-kernel
Hello,
On 2015-01-09 17:56, Robin Murphy wrote:
> Many DMA controllers and other devices set max_segment_size to
> indicate their scatter-gather capability, but have no interest in
> segment_boundary_mask. However, the existence of a dma_parms structure
> precludes the use of any default value, leaving them as zeros (assuming
> a properly kzalloc'ed structure). If a well-behaved IOMMU (or SWIOTLB)
> then tries to respect this by ensuring a mapped segment does not cross
> a zero-byte boundary, hilarity ensues.
>
> Since zero is a nonsensical value for either parameter, treat it as an
> indicator for "default", as might be expected. In the process, clean up
> a bit by replacing the bare constants with slightly more meaningful
> macros and removing the superfluous "else" statements.
>
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
> ---
>
> Hi, various maintainers from Git logs ;)
>
> This one's a bit tricky to find a home for - I think technically it's
> probably an IOMMU patch, but then the long-underlying problem doesn't
> seem to have blown up anything until arm64, and my motivation is to
> make bits of Juno work, which seems to nudge it towards arm64/arm-soc
> territory. Could anyone suggest which tree is most appropriate?
>
> Thanks,
> Robin.
>
> include/linux/dma-mapping.h | 17 ++++++++++-------
> 1 file changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
> index c3007cb..99ba736 100644
> --- a/include/linux/dma-mapping.h
> +++ b/include/linux/dma-mapping.h
> @@ -141,7 +141,9 @@ static inline void arch_teardown_dma_ops(struct device *dev) { }
>
> static inline unsigned int dma_get_max_seg_size(struct device *dev)
> {
> - return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
> + if (dev->dma_parms && dev->dma_parms->max_segment_size)
> + return dev->dma_parms->max_segment_size;
> + return SZ_64K;
> }
>
> static inline unsigned int dma_set_max_seg_size(struct device *dev,
> @@ -150,14 +152,15 @@ static inline unsigned int dma_set_max_seg_size(struct device *dev,
> if (dev->dma_parms) {
> dev->dma_parms->max_segment_size = size;
> return 0;
> - } else
> - return -EIO;
> + }
> + return -EIO;
> }
>
> static inline unsigned long dma_get_seg_boundary(struct device *dev)
> {
> - return dev->dma_parms ?
> - dev->dma_parms->segment_boundary_mask : 0xffffffff;
> + if (dev->dma_parms && dev->dma_parms->segment_boundary_mask)
> + return dev->dma_parms->segment_boundary_mask;
> + return DMA_BIT_MASK(32);
> }
>
> static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
> @@ -165,8 +168,8 @@ static inline int dma_set_seg_boundary(struct device *dev, unsigned long mask)
> if (dev->dma_parms) {
> dev->dma_parms->segment_boundary_mask = mask;
> return 0;
> - } else
> - return -EIO;
> + }
> + return -EIO;
> }
>
> #ifndef dma_max_pfn
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
2015-01-13 11:19 ` Marek Szyprowski
@ 2015-01-22 3:45 ` Sumit Semwal
-1 siblings, 0 replies; 17+ messages in thread
From: Sumit Semwal @ 2015-01-22 3:45 UTC (permalink / raw)
To: Marek Szyprowski
Cc: Robin Murphy, Will Deacon, Arnd Bergmann, Bjorn Helgaas, joro,
Greg Kroah-Hartman, iommu, LKML, linux-arm-kernel
Hi Robin,
On 13 January 2015 at 16:49, Marek Szyprowski <m.szyprowski@samsung.com> wrote:
> Hello,
>
> On 2015-01-09 17:56, Robin Murphy wrote:
>>
>> Many DMA controllers and other devices set max_segment_size to
>> indicate their scatter-gather capability, but have no interest in
>> segment_boundary_mask. However, the existence of a dma_parms structure
>> precludes the use of any default value, leaving them as zeros (assuming
>> a properly kzalloc'ed structure). If a well-behaved IOMMU (or SWIOTLB)
>> then tries to respect this by ensuring a mapped segment does not cross
>> a zero-byte boundary, hilarity ensues.
>>
>> Since zero is a nonsensical value for either parameter, treat it as an
>> indicator for "default", as might be expected. In the process, clean up
>> a bit by replacing the bare constants with slightly more meaningful
>> macros and removing the superfluous "else" statements.
>>
>> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
>
>
> Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
Please feel free to add my
Reviewed-by: Sumit Semwal <sumit.semwal@linaro.org>
>
>> ---
>>
>> Hi, various maintainers from Git logs ;)
>>
>> This one's a bit tricky to find a home for - I think technically it's
>> probably an IOMMU patch, but then the long-underlying problem doesn't
>> seem to have blown up anything until arm64, and my motivation is to
>> make bits of Juno work, which seems to nudge it towards arm64/arm-soc
>> territory. Could anyone suggest which tree is most appropriate?
>>
>> Thanks,
>> Robin.
>>
>>
>> include/linux/dma-mapping.h | 17 ++++++++++-------
>> 1 file changed, 10 insertions(+), 7 deletions(-)
>>
>> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
>> index c3007cb..99ba736 100644
>> --- a/include/linux/dma-mapping.h
>> +++ b/include/linux/dma-mapping.h
>> @@ -141,7 +141,9 @@ static inline void arch_teardown_dma_ops(struct device
>> *dev) { }
>> static inline unsigned int dma_get_max_seg_size(struct device *dev)
>> {
>> - return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
>> + if (dev->dma_parms && dev->dma_parms->max_segment_size)
>> + return dev->dma_parms->max_segment_size;
>> + return SZ_64K;
>> }
>> static inline unsigned int dma_set_max_seg_size(struct device *dev,
>> @@ -150,14 +152,15 @@ static inline unsigned int
>> dma_set_max_seg_size(struct device *dev,
>> if (dev->dma_parms) {
>> dev->dma_parms->max_segment_size = size;
>> return 0;
>> - } else
>> - return -EIO;
>> + }
>> + return -EIO;
>> }
>> static inline unsigned long dma_get_seg_boundary(struct device *dev)
>> {
>> - return dev->dma_parms ?
>> - dev->dma_parms->segment_boundary_mask : 0xffffffff;
>> + if (dev->dma_parms && dev->dma_parms->segment_boundary_mask)
>> + return dev->dma_parms->segment_boundary_mask;
>> + return DMA_BIT_MASK(32);
>> }
>> static inline int dma_set_seg_boundary(struct device *dev, unsigned
>> long mask)
>> @@ -165,8 +168,8 @@ static inline int dma_set_seg_boundary(struct device
>> *dev, unsigned long mask)
>> if (dev->dma_parms) {
>> dev->dma_parms->segment_boundary_mask = mask;
>> return 0;
>> - } else
>> - return -EIO;
>> + }
>> + return -EIO;
>> }
>> #ifndef dma_max_pfn
>
>
> Best regards
> --
> Marek Szyprowski, PhD
> Samsung R&D Institute Poland
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
--
Thanks and regards,
Sumit Semwal
Kernel Team Lead - Linaro Mobile Group
Linaro.org │ Open source software for ARM SoCs
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH RESEND] dma-mapping: tidy up dma_parms default handling
@ 2015-01-22 3:45 ` Sumit Semwal
0 siblings, 0 replies; 17+ messages in thread
From: Sumit Semwal @ 2015-01-22 3:45 UTC (permalink / raw)
To: linux-arm-kernel
Hi Robin,
On 13 January 2015 at 16:49, Marek Szyprowski <m.szyprowski@samsung.com> wrote:
> Hello,
>
> On 2015-01-09 17:56, Robin Murphy wrote:
>>
>> Many DMA controllers and other devices set max_segment_size to
>> indicate their scatter-gather capability, but have no interest in
>> segment_boundary_mask. However, the existence of a dma_parms structure
>> precludes the use of any default value, leaving them as zeros (assuming
>> a properly kzalloc'ed structure). If a well-behaved IOMMU (or SWIOTLB)
>> then tries to respect this by ensuring a mapped segment does not cross
>> a zero-byte boundary, hilarity ensues.
>>
>> Since zero is a nonsensical value for either parameter, treat it as an
>> indicator for "default", as might be expected. In the process, clean up
>> a bit by replacing the bare constants with slightly more meaningful
>> macros and removing the superfluous "else" statements.
>>
>> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
>
>
> Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
Please feel free to add my
Reviewed-by: Sumit Semwal <sumit.semwal@linaro.org>
>
>> ---
>>
>> Hi, various maintainers from Git logs ;)
>>
>> This one's a bit tricky to find a home for - I think technically it's
>> probably an IOMMU patch, but then the long-underlying problem doesn't
>> seem to have blown up anything until arm64, and my motivation is to
>> make bits of Juno work, which seems to nudge it towards arm64/arm-soc
>> territory. Could anyone suggest which tree is most appropriate?
>>
>> Thanks,
>> Robin.
>>
>>
>> include/linux/dma-mapping.h | 17 ++++++++++-------
>> 1 file changed, 10 insertions(+), 7 deletions(-)
>>
>> diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
>> index c3007cb..99ba736 100644
>> --- a/include/linux/dma-mapping.h
>> +++ b/include/linux/dma-mapping.h
>> @@ -141,7 +141,9 @@ static inline void arch_teardown_dma_ops(struct device
>> *dev) { }
>> static inline unsigned int dma_get_max_seg_size(struct device *dev)
>> {
>> - return dev->dma_parms ? dev->dma_parms->max_segment_size : 65536;
>> + if (dev->dma_parms && dev->dma_parms->max_segment_size)
>> + return dev->dma_parms->max_segment_size;
>> + return SZ_64K;
>> }
>> static inline unsigned int dma_set_max_seg_size(struct device *dev,
>> @@ -150,14 +152,15 @@ static inline unsigned int
>> dma_set_max_seg_size(struct device *dev,
>> if (dev->dma_parms) {
>> dev->dma_parms->max_segment_size = size;
>> return 0;
>> - } else
>> - return -EIO;
>> + }
>> + return -EIO;
>> }
>> static inline unsigned long dma_get_seg_boundary(struct device *dev)
>> {
>> - return dev->dma_parms ?
>> - dev->dma_parms->segment_boundary_mask : 0xffffffff;
>> + if (dev->dma_parms && dev->dma_parms->segment_boundary_mask)
>> + return dev->dma_parms->segment_boundary_mask;
>> + return DMA_BIT_MASK(32);
>> }
>> static inline int dma_set_seg_boundary(struct device *dev, unsigned
>> long mask)
>> @@ -165,8 +168,8 @@ static inline int dma_set_seg_boundary(struct device
>> *dev, unsigned long mask)
>> if (dev->dma_parms) {
>> dev->dma_parms->segment_boundary_mask = mask;
>> return 0;
>> - } else
>> - return -EIO;
>> + }
>> + return -EIO;
>> }
>> #ifndef dma_max_pfn
>
>
> Best regards
> --
> Marek Szyprowski, PhD
> Samsung R&D Institute Poland
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
--
Thanks and regards,
Sumit Semwal
Kernel Team Lead - Linaro Mobile Group
Linaro.org ? Open source software for ARM SoCs
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2015-01-22 3:45 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-12-19 17:39 [PATCH] dma-mapping: tidy up dma_parms default handling Robin Murphy
2015-01-09 16:56 ` [PATCH RESEND] " Robin Murphy
2014-12-22 15:25 ` [PATCH] " Vinod Koul
2014-12-22 15:25 ` Vinod Koul
2015-01-09 19:45 ` [PATCH RESEND] " Arnd Bergmann
2015-01-09 19:45 ` Arnd Bergmann
2015-01-12 13:00 ` Will Deacon
2015-01-12 13:00 ` Will Deacon
2015-01-12 13:00 ` Will Deacon
2015-01-12 13:07 ` Robin Murphy
2015-01-12 13:07 ` Robin Murphy
2015-01-12 13:07 ` Robin Murphy
2015-01-13 11:19 ` Marek Szyprowski
2015-01-13 11:19 ` Marek Szyprowski
2015-01-13 11:19 ` Marek Szyprowski
2015-01-22 3:45 ` Sumit Semwal
2015-01-22 3:45 ` Sumit Semwal
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.