media: vivid: add module option to set request support mode
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Thu, 29 Jul 2021 13:36:26 +0000 (15:36 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 30 Sep 2021 08:07:38 +0000 (10:07 +0200)
Currently vivid supports the Request API, but it also sets
min_buffers_needed in the vb2 queue. But the combination of
support_requests and min_buffers_needed is not allowed due to
the fact that vb2_core_qbuf() isn't supposed to fail when called
from the request framework. And if min_buffers_needed > 0, then
is can call start_streaming() which definitely can fail.

With the new module option you can control if requests are not
allowed (min_buffers_needed is 2 in that case), optionally allowed
or are required. In the latter two cases min_buffers_needed is set
to 0.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/test-drivers/vivid/vivid-core.c

index d2bd265..87f27c7 100644 (file)
@@ -177,6 +177,15 @@ MODULE_PARM_DESC(cache_hints, " user-space cache hints, default is 0.\n"
                             "\t\t    0 == forbid\n"
                             "\t\t    1 == allow");
 
+static unsigned int supports_requests[VIVID_MAX_DEVS] = {
+       [0 ... (VIVID_MAX_DEVS - 1)] = 1
+};
+module_param_array(supports_requests, uint, NULL, 0444);
+MODULE_PARM_DESC(supports_requests, " support for requests, default is 1.\n"
+                            "\t\t    0 == no support\n"
+                            "\t\t    1 == supports requests\n"
+                            "\t\t    2 == requires requests");
+
 static struct vivid_dev *vivid_devs[VIVID_MAX_DEVS];
 
 const struct v4l2_rect vivid_min_rect = {
@@ -883,10 +892,11 @@ static int vivid_create_queue(struct vivid_dev *dev,
        q->mem_ops = allocators[dev->inst] == 1 ? &vb2_dma_contig_memops :
                                                  &vb2_vmalloc_memops;
        q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
-       q->min_buffers_needed = min_buffers_needed;
+       q->min_buffers_needed = supports_requests[dev->inst] ? 0 : min_buffers_needed;
        q->lock = &dev->mutex;
        q->dev = dev->v4l2_dev.dev;
-       q->supports_requests = true;
+       q->supports_requests = supports_requests[dev->inst];
+       q->requires_requests = supports_requests[dev->inst] >= 2;
        q->allow_cache_hints = (cache_hints[dev->inst] == 1);
 
        return vb2_queue_init(q);