]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
[media] vivid: support for contiguous DMA buffers
authorVincent ABRIOU <vincent.abriou@st.com>
Mon, 12 Sep 2016 08:47:27 +0000 (05:47 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Fri, 3 Mar 2017 10:16:11 +0000 (07:16 -0300)
It allows to simulate the behavior of hardware with such limitations or
to connect vivid to real hardware with such limitations.

Add the "allocators" module parameter option to let vivid use the
dma-contig instead of vmalloc.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Vincent Abriou <vincent.abriou@st.com>
Reviewed-by: Javier Martinez Canillas <javier@osg.samsung.com>
Tested-by: Javier Martinez Canillas <javier@osg.samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Documentation/media/v4l-drivers/vivid.rst
drivers/media/platform/vivid/Kconfig
drivers/media/platform/vivid/vivid-core.c

index c8cf371e8bb91cd71d9d168265f6f54a6bfacffe..3e44b2217f2d33dbd1a57d3aa675a99fc4741e62 100644 (file)
@@ -263,6 +263,14 @@ all configurable using the following module options:
        removed. Unless overridden by ccs_cap_mode and/or ccs_out_mode the
        will default to enabling crop, compose and scaling.
 
+- allocators:
+
+       memory allocator selection, default is 0. It specifies the way buffers
+       will be allocated.
+
+               - 0: vmalloc
+               - 1: dma-contig
+
 Taken together, all these module options allow you to precisely customize
 the driver behavior and test your application with all sorts of permutations.
 It is also very suitable to emulate hardware that is not yet available, e.g.
index db0dd19d227acc313052c1620fe740eb4b02c6f5..94ab1364a792c88c896db3d754e6524c6742dfb0 100644 (file)
@@ -1,6 +1,7 @@
 config VIDEO_VIVID
        tristate "Virtual Video Test Driver"
        depends on VIDEO_DEV && VIDEO_V4L2 && !SPARC32 && !SPARC64 && FB
+       depends on HAS_DMA
        select FONT_SUPPORT
        select FONT_8x16
        select FB_CFB_FILLRECT
@@ -8,6 +9,7 @@ config VIDEO_VIVID
        select FB_CFB_IMAGEBLIT
        select MEDIA_CEC_EDID
        select VIDEOBUF2_VMALLOC
+       select VIDEOBUF2_DMA_CONTIG
        select VIDEO_V4L2_TPG
        default n
        ---help---
index 51e37812ec98c63c3855ab41507caf7f2f6295f9..ef344b9a48afb22fd7072295b43b8e027b82a3d7 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/videodev2.h>
 #include <linux/v4l2-dv-timings.h>
 #include <media/videobuf2-vmalloc.h>
+#include <media/videobuf2-dma-contig.h>
 #include <media/v4l2-dv-timings.h>
 #include <media/v4l2-ioctl.h>
 #include <media/v4l2-fh.h>
@@ -151,6 +152,12 @@ static bool no_error_inj;
 module_param(no_error_inj, bool, 0444);
 MODULE_PARM_DESC(no_error_inj, " if set disable the error injecting controls");
 
+static unsigned int allocators[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0 };
+module_param_array(allocators, uint, NULL, 0444);
+MODULE_PARM_DESC(allocators, " memory allocator selection, default is 0.\n"
+                            "\t\t    0 == vmalloc\n"
+                            "\t\t    1 == dma-contig");
+
 static struct vivid_dev *vivid_devs[VIVID_MAX_DEVS];
 
 const struct v4l2_rect vivid_min_rect = {
@@ -636,6 +643,10 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
 {
        static const struct v4l2_dv_timings def_dv_timings =
                                        V4L2_DV_BT_CEA_1280X720P60;
+       static const struct vb2_mem_ops * const vivid_mem_ops[2] = {
+               &vb2_vmalloc_memops,
+               &vb2_dma_contig_memops,
+       };
        unsigned in_type_counter[4] = { 0, 0, 0, 0 };
        unsigned out_type_counter[4] = { 0, 0, 0, 0 };
        int ccs_cap = ccs_cap_mode[inst];
@@ -646,6 +657,7 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
        struct video_device *vfd;
        struct vb2_queue *q;
        unsigned node_type = node_types[inst];
+       unsigned int allocator = allocators[inst];
        v4l2_std_id tvnorms_cap = 0, tvnorms_out = 0;
        int ret;
        int i;
@@ -1039,6 +1051,11 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
                goto unreg_dev;
        }
 
+       if (allocator == 1)
+               dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+       else if (allocator >= ARRAY_SIZE(vivid_mem_ops))
+               allocator = 0;
+
        /* start creating the vb2 queues */
        if (dev->has_vid_cap) {
                /* initialize vid_cap queue */
@@ -1049,10 +1066,11 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
                q->drv_priv = dev;
                q->buf_struct_size = sizeof(struct vivid_buffer);
                q->ops = &vivid_vid_cap_qops;
-               q->mem_ops = &vb2_vmalloc_memops;
+               q->mem_ops = vivid_mem_ops[allocator];
                q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
                q->min_buffers_needed = 2;
                q->lock = &dev->mutex;
+               q->dev = dev->v4l2_dev.dev;
 
                ret = vb2_queue_init(q);
                if (ret)
@@ -1068,10 +1086,11 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
                q->drv_priv = dev;
                q->buf_struct_size = sizeof(struct vivid_buffer);
                q->ops = &vivid_vid_out_qops;
-               q->mem_ops = &vb2_vmalloc_memops;
+               q->mem_ops = vivid_mem_ops[allocator];
                q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
                q->min_buffers_needed = 2;
                q->lock = &dev->mutex;
+               q->dev = dev->v4l2_dev.dev;
 
                ret = vb2_queue_init(q);
                if (ret)
@@ -1087,10 +1106,11 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
                q->drv_priv = dev;
                q->buf_struct_size = sizeof(struct vivid_buffer);
                q->ops = &vivid_vbi_cap_qops;
-               q->mem_ops = &vb2_vmalloc_memops;
+               q->mem_ops = vivid_mem_ops[allocator];
                q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
                q->min_buffers_needed = 2;
                q->lock = &dev->mutex;
+               q->dev = dev->v4l2_dev.dev;
 
                ret = vb2_queue_init(q);
                if (ret)
@@ -1106,10 +1126,11 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
                q->drv_priv = dev;
                q->buf_struct_size = sizeof(struct vivid_buffer);
                q->ops = &vivid_vbi_out_qops;
-               q->mem_ops = &vb2_vmalloc_memops;
+               q->mem_ops = vivid_mem_ops[allocator];
                q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
                q->min_buffers_needed = 2;
                q->lock = &dev->mutex;
+               q->dev = dev->v4l2_dev.dev;
 
                ret = vb2_queue_init(q);
                if (ret)
@@ -1124,10 +1145,11 @@ static int vivid_create_instance(struct platform_device *pdev, int inst)
                q->drv_priv = dev;
                q->buf_struct_size = sizeof(struct vivid_buffer);
                q->ops = &vivid_sdr_cap_qops;
-               q->mem_ops = &vb2_vmalloc_memops;
+               q->mem_ops = vivid_mem_ops[allocator];
                q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
                q->min_buffers_needed = 8;
                q->lock = &dev->mutex;
+               q->dev = dev->v4l2_dev.dev;
 
                ret = vb2_queue_init(q);
                if (ret)