Thread (29 messages) 29 messages, 7 authors, 2018-09-07

[PATCH v8 4/8] media: platform: Add Cedrus VPU decoder driver

From: Paul Kocialkowski <hidden>
Date: 2018-09-07 15:05:00
Also in: linux-devicetree, linux-media, lkml

Hi,

Le jeudi 06 septembre 2018 ? 09:22 +0200, Hans Verkuil a ?crit :
On 09/06/2018 09:01 AM, Hans Verkuil wrote:
quoted
On 09/05/2018 06:29 PM, Paul Kocialkowski wrote:
quoted
Hi and thanks for the review!

Le lundi 03 septembre 2018 ? 11:11 +0200, Hans Verkuil a ?crit :
quoted
On 08/28/2018 09:34 AM, Paul Kocialkowski wrote:
quoted
+static int cedrus_queue_setup(struct vb2_queue *vq, unsigned int *nbufs,
+			      unsigned int *nplanes, unsigned int sizes[],
+			      struct device *alloc_devs[])
+{
+	struct cedrus_ctx *ctx = vb2_get_drv_priv(vq);
+	struct cedrus_dev *dev = ctx->dev;
+	struct v4l2_pix_format_mplane *mplane_fmt;
+	struct cedrus_format *fmt;
+	unsigned int i;
+
+	switch (vq->type) {
+	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
+		mplane_fmt = &ctx->src_fmt;
+		fmt = cedrus_find_format(mplane_fmt->pixelformat,
+					 CEDRUS_DECODE_SRC,
+					 dev->capabilities);
+		break;
+
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
+		mplane_fmt = &ctx->dst_fmt;
+		fmt = cedrus_find_format(mplane_fmt->pixelformat,
+					 CEDRUS_DECODE_DST,
+					 dev->capabilities);
+		break;
+
+	default:
+		return -EINVAL;
+	}
+
+	if (!fmt)
+		return -EINVAL;
+
+	if (fmt->num_buffers == 1) {
+		sizes[0] = 0;
+
+		for (i = 0; i < fmt->num_planes; i++)
+			sizes[0] += mplane_fmt->plane_fmt[i].sizeimage;
+	} else if (fmt->num_buffers == fmt->num_planes) {
+		for (i = 0; i < fmt->num_planes; i++)
+			sizes[i] = mplane_fmt->plane_fmt[i].sizeimage;
+	} else {
+		return -EINVAL;
+	}
+
+	*nplanes = fmt->num_buffers;
This code does not take VIDIOC_CREATE_BUFFERS into account.

If it is called from that ioctl, then *nplanes is non-zero and you need
to check if *nplanes equals fmt->num_buffers and that sizes[n] is >=
the required size of the format. If so, then return 0, otherwise return
-EINVAL.
Thanks for spotting this, I'll fix it as you suggested in the next
revision.
quoted
Doesn't v4l2-compliance fail on that? Or is that test skipped because this
is a decoder for which streaming is not supported (yet)?
Apparently, v4l2-compliance doesn't fail since I'm getting:
test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
It is tested, but only with the -s option. I'll see if I can improve the
tests.
I've improved the tests. v4l2-compliance should now fail when run (without the
-s option) against this driver. Can you check that that is indeed the case?
I think this wasn't being tested with v8 of the driver as no default
format was provided (for the G_FMT test), which probably led to MMAP
not being picked up in valid_memorytype. Thus the subsequent
CREATE_BUFS test was reported as not failing, but it really didn't test
much of anything.

Cheers,

Paul

-- 
Developer of free digital technology and hardware support.

Website: https://www.paulk.fr/
Coding blog: https://code.paulk.fr/
Git repositories: https://git.paulk.fr/ https://git.code.paulk.fr/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20180907/d12c74cc/attachment.sig>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help