lkml.org 
[lkml]   [2019]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH v2 09/15] media: vimc: cap: Allocate and verify mplanar buffers
Date
If the driver is in multiplanar mode, fill the vb2 structures
with the planes sizes and verify it the sizes allocated to the
planes are enough.

Signed-off-by: André Almeida <andrealmeid@collabora.com>
---
Change in v2:
- Use IS_MULTIPLANAR macro

drivers/media/platform/vimc/vimc-capture.c | 42 ++++++++++++++++++----
1 file changed, 36 insertions(+), 6 deletions(-)

diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c
index c344d04ed8ea..57bc2b64b093 100644
--- a/drivers/media/platform/vimc/vimc-capture.c
+++ b/drivers/media/platform/vimc/vimc-capture.c
@@ -505,12 +505,28 @@ static int vimc_cap_queue_setup(struct vb2_queue *vq, unsigned int *nbuffers,
struct device *alloc_devs[])
{
struct vimc_cap_device *vcap = vb2_get_drv_priv(vq);
+ const struct v4l2_plane_pix_format *plane_fmt =
+ vcap->format.fmt.pix_mp.plane_fmt;
+ unsigned int i;
+
+ if (IS_MULTIPLANAR(vcap)) {
+ for (i = 0; i < *nplanes; i++)
+ if (sizes[i] < plane_fmt[i].sizeimage)
+ return -EINVAL;
+ } else if (*nplanes && sizes[0] < vcap->format.fmt.pix.sizeimage)
+ return -EINVAL;

if (*nplanes)
- return sizes[0] < vcap->format.fmt.pix.sizeimage ? -EINVAL : 0;
- /* We don't support multiplanes for now */
- *nplanes = 1;
- sizes[0] = vcap->format.fmt.pix.sizeimage;
+ return 0;
+
+ if (IS_MULTIPLANAR(vcap)) {
+ *nplanes = vcap->format.fmt.pix_mp.num_planes;
+ for (i = 0; i < *nplanes; i++)
+ sizes[i] = plane_fmt[i].sizeimage;
+ } else {
+ *nplanes = 1;
+ sizes[0] = vcap->format.fmt.pix.sizeimage;
+ }

return 0;
}
@@ -518,9 +534,23 @@ static int vimc_cap_queue_setup(struct vb2_queue *vq, unsigned int *nbuffers,
static int vimc_cap_buffer_prepare(struct vb2_buffer *vb)
{
struct vimc_cap_device *vcap = vb2_get_drv_priv(vb->vb2_queue);
- unsigned long size = vcap->format.fmt.pix.sizeimage;
+ unsigned long size;
+ unsigned int i;

- if (vb2_plane_size(vb, 0) < size) {
+ if (IS_MULTIPLANAR(vcap)) {
+ for (i = 0; i < vb->num_planes; i++) {
+ size = vcap->format.fmt.pix_mp.plane_fmt[i].sizeimage;
+ if (vb2_plane_size(vb, i) < size) {
+ dev_err(vcap->dev,
+ "%s: buffer too small (%lu < %lu)\n",
+ vcap->vdev.name, vb2_plane_size(vb, i),
+ size);
+
+ return -EINVAL;
+ }
+ }
+ } else if (vb2_plane_size(vb, 0) < vcap->format.fmt.pix.sizeimage) {
+ size = vcap->format.fmt.pix.sizeimage;
dev_err(vcap->dev, "%s: buffer too small (%lu < %lu)\n",
vcap->vdev.name, vb2_plane_size(vb, 0), size);
return -EINVAL;
--
2.21.0
\
 
 \ /
  Last update: 2019-03-27 16:21    [W:1.167 / U:0.592 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site