PS3: Fix DMA scatter-gather
Subsystems (2)
PATCH 3/4 PS3: Fix DMA scatter-gather
Add the missing pieces to support DMA scatter-gather on the PS3 system bus.
---
USB mass storage works properly now.
arch/powerpc/platforms/ps3/system-bus.c | 23 +++++++++++++++++++++-- 1 files changed, 21 insertions(+), 2 deletions(-)
arch/powerpc/platforms/ps3/system-bus.c +21 -2
@@ -272,10 +272,29 @@ static void ps3_unmap_single(struct devistatic int ps3_map_sg (struct device *_dev,struct scatterlist *sg,int nents,enum dma_data_direction direction) { +struct ps3_system_bus_device *dev =to_ps3_system_bus_device (_dev); +int i; +#if defined(CONFIG_PS3_DYNAMIC_DMA )BUG_ON ("do" ); +return -EPERM ; +#else +for (i =0 ; i < nents; i++, sg++) { +int result =ps3_dma_map (dev->d_region, +page_to_phys (sg->page) + sg->offset, sg->length, + &sg->dma_address); + +if (result) { +pr_debug ("%s:%d: ps3_dma_map failed (%d)\n" , + __func__, __LINE__, result); +return -EINVAL ; + } + + sg->dma_length = sg->length; + } + +return nents;#endif -return 0 ; } static void ps3_unmap_sg(struct device *_dev, struct scatterlist *sg,
@@ -288,7 +307,7 @@ static void ps3_unmap_sg(struct device *static int ps3_dma_supported (struct device *_dev,u64 mask) { -return 1 ; +return mask >=DMA_32BIT_MASK ; }static struct dma_mapping_ops ps3_dma_ops = {
Quoted 2 lines · Geoff Levand
(quoted diff) +0
-0@@ -272,10 +272,29 @@ static void ps3_unmap_single(struct devi=A0static int ps3_map_sg(struct device
*_dev, struct scatterlist *sg, int=
nents,
Quoted 3 lines
=A0=A0=A0=A0=A0=A0=A0=A0enum
dma_data_directiondirection) =A0{
+=A0=A0=A0=A0=A0=A0=A0structps3_system_bus_device*dev =3D to_ps3_system=
_bus_device(_dev);
Quoted 6 lines
+=A0=A0=A0=A0=A0=A0=A0int i;
+
=A0#ifdefined(CONFIG_PS3_DYNAMIC_DMA)
=A0=A0=A0=A0=A0=A0=A0=A0BUG_ON("do");
+=A0=A0=A0=A0=A0=A0=A0return-EPERM;
+#else
Do you still need the #ifdef? Since there is no point executing this, would guess you can just as well keep only the other version, right?
Arnd <><
Quoted 3 lines · Arnd Bergmann
Quoted 2 lines · Geoff Levand
(quoted diff) +0
-0@@ -272,10 +272,29 @@ static void ps3_unmap_single(struct devi=EF=BF=BDstatic int ps3_map_sg(struct device
*_dev, struct scatterlist=
*sg, int nents,
Quoted 1 line
Quoted 1 line
=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=
enum dma_data_direction direction)
Quoted 2 lines
Quoted 2 lines
=EF=BF=BD{ +=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BDstruct=
ps3_system_bus_device *dev =3D to_ps3_system_bus_device(_dev);
Quoted 4 lines
Quoted 4 lines
+=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BDint i; +
=EF=BF=BD#ifdefined(CONFIG_PS3_DYNAMIC_DMA)=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=
BUG_ON("do");
Quoted 1 line
Quoted 1 line
+=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BD=EF=BF=BDreturn=
-EPERM;
Quoted 4 lines
Quoted 1 line
+#else
=20
Do you still need the #ifdef? Since there is no point executing this, would guess you can just as well keep only the other version, right?
I wanted to keep it there in the event someone tries to use a usb device that needs scatter-gather with CONFIG_PS3_DYNAMIC_DMA=3Dy. Currently, CONFIG_PS3_DYNAMIC_DMA=3Dy only supports alloc_coherent and map_single.
I plan to rework the entire CONFIG_PS3_DYNAMIC_DMA to use Ben's fixes for iommu support, but until then, I think it would be safer to keep this.
-Geoff
Quoted 3 lines · Geoff Levand
Add the missing pieces to support DMA scatter-gather on the PS3 system bus.
Signed-off-by Geoff Levand <[email protected]>
---
I'll help with the dynamic DMA stuff as soon as I find a minute free..
Ben.
Quoted 55 lines
---
USB mass storage works properly now.
arch/powerpc/platforms/ps3/system-bus.c | 23 +++++++++++++++++++++-- 1 files changed, 21 insertions(+), 2 deletions(-)arch/powerpc/platforms/ps3/system-bus.c +21
-2@@ -272,10 +272,29 @@ static void ps3_unmap_single(struct devistatic int ps3_map_sg (struct device *_dev,struct scatterlist *sg,int nents,enum dma_data_direction direction) { +struct ps3_system_bus_device *dev =to_ps3_system_bus_device (_dev); +int i; +#if defined(CONFIG_PS3_DYNAMIC_DMA )BUG_ON ("do" ); +return -EPERM ; +#else +for (i =0 ; i < nents; i++, sg++) { +int result =ps3_dma_map (dev->d_region, +page_to_phys (sg->page) + sg->offset, sg->length, + &sg->dma_address); + +if (result) { +pr_debug ("%s:%d: ps3_dma_map failed (%d)\n" , + __func__, __LINE__, result); +return -EINVAL ; + } + + sg->dma_length = sg->length; + } + +return nents;#endif -return 0 ; } static void ps3_unmap_sg(struct device *_dev, struct scatterlist *sg,@@ -288,7 +307,7 @@ static void ps3_unmap_sg(struct device *static int ps3_dma_supported (struct device *_dev,u64 mask) { -return 1 ; +return mask >=DMA_32BIT_MASK ; }static struct dma_mapping_ops ps3_dma_ops = {_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://ozlabs.org/mailman/listinfo/linuxppc-dev
Quoted 4 lines · Geoff Levand
Add the missing pieces to support DMA scatter-gather on the PS3 system bus.
Signed-off-by Geoff Levand <[email protected]>