If device has no DMA max_seg_size set, we assume that there is no limit
and it is safe to force it to use DMA_BIT_MASK(32) as max_seg_size to
let DMA-mapping API always create contiguous mappings in DMA address
space. This is essential for all devices, which use dma-contig
videobuf2 memory allocator.

Signed-off-by: Marek Szyprowski <m.szyprow...@samsung.com>
---
Changelog:
v2:
- set max segment size only if a new dma params structure has been
  allocated, as suggested by Laurent Pinchart
---
 drivers/media/v4l2-core/videobuf2-dma-contig.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/drivers/media/v4l2-core/videobuf2-dma-contig.c 
b/drivers/media/v4l2-core/videobuf2-dma-contig.c
index 94c1e64..455e925 100644
--- a/drivers/media/v4l2-core/videobuf2-dma-contig.c
+++ b/drivers/media/v4l2-core/videobuf2-dma-contig.c
@@ -862,6 +862,21 @@ EXPORT_SYMBOL_GPL(vb2_dma_contig_memops);
 void *vb2_dma_contig_init_ctx(struct device *dev)
 {
        struct vb2_dc_conf *conf;
+       int err;
+
+       /*
+        * if device has no max_seg_size set, we assume that there is no limit
+        * and force it to DMA_BIT_MASK(32) to always use contiguous mappings
+        * in DMA address space
+        */
+       if (!dev->dma_parms) {
+               dev->dma_parms = kzalloc(sizeof(*dev->dma_parms), GFP_KERNEL);
+               if (!dev->dma_parms)
+                       return ERR_PTR(-ENOMEM);
+               err = dma_set_max_seg_size(dev, DMA_BIT_MASK(32));
+               if (err)
+                       return ERR_PTR(err);
+       }
 
        conf = kzalloc(sizeof *conf, GFP_KERNEL);
        if (!conf)
-- 
1.9.2

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to