All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hans Verkuil <hansverk@cisco.com>
To: Philipp Zabel <p.zabel@pengutronix.de>,
	Hans Verkuil <hans.verkuil@cisco.com>
Cc: Mauro Carvalho Chehab <m.chehab@samsung.com>,
	linux-media@vger.kernel.org, kernel@pengutronix.de
Subject: Re: [PATCH 4/5] [media] vivid: add support for contiguous DMA buffers
Date: Wed, 22 Oct 2014 12:14:54 +0200	[thread overview]
Message-ID: <5447839E.4090309@cisco.com> (raw)
In-Reply-To: <1413972221-13669-5-git-send-email-p.zabel@pengutronix.de>

On 10/22/2014 12:03 PM, Philipp Zabel wrote:
> To simulate the behaviour of real hardware with such limitations or to
> connect vivid to real hardware with such limitations, add an option to
> let vivid use the dma-contig allocator instead of vmalloc.
>
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> ---
>   drivers/media/platform/vivid/Kconfig         |  1 +
>   drivers/media/platform/vivid/vivid-core.c    | 30 +++++++++++++++++++++++-----
>   drivers/media/platform/vivid/vivid-core.h    |  1 +
>   drivers/media/platform/vivid/vivid-vid-cap.c |  4 +++-
>   drivers/media/platform/vivid/vivid-vid-out.c |  5 ++++-
>   5 files changed, 34 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/media/platform/vivid/Kconfig b/drivers/media/platform/vivid/Kconfig
> index 3bfda25..f48c998 100644
> --- a/drivers/media/platform/vivid/Kconfig
> +++ b/drivers/media/platform/vivid/Kconfig
> @@ -4,6 +4,7 @@ config VIDEO_VIVID
>   	select FONT_SUPPORT
>   	select FONT_8x16
>   	select VIDEOBUF2_VMALLOC
> +	select VIDEOBUF2_DMA_CONTIG
>   	select FB_CFB_FILLRECT
>   	select FB_CFB_COPYAREA
>   	select FB_CFB_IMAGEBLIT
> diff --git a/drivers/media/platform/vivid/vivid-core.c b/drivers/media/platform/vivid/vivid-core.c
> index c79d60d..4c4fc3d 100644
> --- a/drivers/media/platform/vivid/vivid-core.c
> +++ b/drivers/media/platform/vivid/vivid-core.c
> @@ -29,6 +29,7 @@
>   #include <linux/platform_device.h>
>   #include <linux/videodev2.h>
>   #include <linux/v4l2-dv-timings.h>
> +#include <media/videobuf2-dma-contig.h>
>   #include <media/videobuf2-vmalloc.h>
>   #include <media/v4l2-dv-timings.h>
>   #include <media/v4l2-ioctl.h>
> @@ -107,6 +108,11 @@ MODULE_PARM_DESC(multiplanar, " 0 (default) is alternating single and multiplana
>   			      "\t\t    1 is single planar devices,\n"
>   			      "\t\t    2 is multiplanar devices");
>
> +static unsigned allocators[VIVID_MAX_DEVS];
> +module_param_array(allocators, uint, NULL, 0444);
> +MODULE_PARM_DESC(allocators, " memory allocator selection, default is 0.\n"
> +			     "\t\t    0=vmalloc, 1=dma-contig");
> +
>   /* Default: video + vbi-cap (raw and sliced) + radio rx + radio tx + sdr + vbi-out + vid-out */
>   static unsigned node_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0x1d3d };
>   module_param_array(node_types, uint, NULL, 0444);
> @@ -640,6 +646,10 @@ static int __init vivid_create_instance(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];
> @@ -650,6 +660,7 @@ static int __init vivid_create_instance(int inst)
>   	struct video_device *vfd;
>   	struct vb2_queue *q;
>   	unsigned node_type = node_types[inst];
> +	unsigned allocator = allocators[inst];
>   	v4l2_std_id tvnorms_cap = 0, tvnorms_out = 0;
>   	int ret;
>   	int i;
> @@ -1001,6 +1012,15 @@ static int __init vivid_create_instance(int inst)
>   	dev->fb_cap.fmt.bytesperline = dev->src_rect.width * tpg_g_twopixelsize(&dev->tpg, 0) / 2;
>   	dev->fb_cap.fmt.sizeimage = dev->src_rect.height * dev->fb_cap.fmt.bytesperline;
>
> +	/* initialize allocator context */
> +	if (allocator == 1) {
> +		dev->alloc_ctx = vb2_dma_contig_init_ctx(dev->v4l2_dev.dev);
> +		if (IS_ERR(dev->alloc_ctx))
> +			goto unreg_dev;
> +	} else if (allocator >= ARRAY_SIZE(vivid_mem_ops)) {
> +		allocator = 0;
> +	}
> +
>   	/* initialize locks */
>   	spin_lock_init(&dev->slock);
>   	mutex_init(&dev->mutex);
> @@ -1022,7 +1042,7 @@ static int __init vivid_create_instance(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;
>
> @@ -1040,7 +1060,7 @@ static int __init vivid_create_instance(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;
>
> @@ -1058,7 +1078,7 @@ static int __init vivid_create_instance(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;
>
> @@ -1076,7 +1096,7 @@ static int __init vivid_create_instance(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;
>
> @@ -1093,7 +1113,7 @@ static int __init vivid_create_instance(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;
>
> diff --git a/drivers/media/platform/vivid/vivid-core.h b/drivers/media/platform/vivid/vivid-core.h
> index 811c286..4fefb0d 100644
> --- a/drivers/media/platform/vivid/vivid-core.h
> +++ b/drivers/media/platform/vivid/vivid-core.h
> @@ -142,6 +142,7 @@ struct vivid_dev {
>   	struct v4l2_ctrl_handler	ctrl_hdl_radio_tx;
>   	struct video_device		sdr_cap_dev;
>   	struct v4l2_ctrl_handler	ctrl_hdl_sdr_cap;
> +	struct vb2_alloc_ctx		*alloc_ctx;
>   	spinlock_t			slock;
>   	struct mutex			mutex;
>
> diff --git a/drivers/media/platform/vivid/vivid-vid-cap.c b/drivers/media/platform/vivid/vivid-vid-cap.c
> index 331c544..04b5fbf 100644
> --- a/drivers/media/platform/vivid/vivid-vid-cap.c
> +++ b/drivers/media/platform/vivid/vivid-vid-cap.c
> @@ -151,8 +151,10 @@ static int vid_cap_queue_setup(struct vb2_queue *vq, const struct v4l2_format *f
>
>   	/*
>   	 * videobuf2-vmalloc allocator is context-less so no need to set
> -	 * alloc_ctxs array.
> +	 * alloc_ctxs array. videobuf2-dma-contig needs a context, though.
>   	 */
> +	for (p = 0; p < planes; p++)
> +		alloc_ctxs[p] = dev->alloc_ctx;
>
>   	if (planes == 2)
>   		dprintk(dev, 1, "%s, count=%d, sizes=%u, %u\n", __func__,
> diff --git a/drivers/media/platform/vivid/vivid-vid-out.c b/drivers/media/platform/vivid/vivid-vid-out.c
> index 69c2dbd..6b8dfd6 100644
> --- a/drivers/media/platform/vivid/vivid-vid-out.c
> +++ b/drivers/media/platform/vivid/vivid-vid-out.c
> @@ -39,6 +39,7 @@ static int vid_out_queue_setup(struct vb2_queue *vq, const struct v4l2_format *f
>   	unsigned planes = dev->fmt_out->planes;
>   	unsigned h = dev->fmt_out_rect.height;
>   	unsigned size = dev->bytesperline_out[0] * h;
> +	unsigned p;
>
>   	if (dev->field_out == V4L2_FIELD_ALTERNATE) {
>   		/*
> @@ -98,8 +99,10 @@ static int vid_out_queue_setup(struct vb2_queue *vq, const struct v4l2_format *f
>
>   	/*
>   	 * videobuf2-vmalloc allocator is context-less so no need to set
> -	 * alloc_ctxs array.
> +	 * alloc_ctxs array. videobuf2-dma-contig needs a context, though.
>   	 */
> +	for (p = 0; p < planes; p++)
> +		alloc_ctxs[p] = dev->alloc_ctx;
>
>   	if (planes == 2)
>   		dprintk(dev, 1, "%s, count=%d, sizes=%u, %u\n", __func__,
>

This is not sufficient. alloc_ctxs should be filled in for all device types in the
queue_setup op, so also for vbi cap/out and sdr cap. Without that these devices
would fail.

Regards,

	Hans

  reply	other threads:[~2014-10-22 10:14 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-22 10:03 [PATCH 0/5] Contiguous DMA buffer support for the Virtual Video Test Driver Philipp Zabel
2014-10-22 10:03 ` [PATCH 1/5] [media] vivid: select CONFIG_FB_CFB_FILLRECT/COPYAREA/IMAGEBLIT Philipp Zabel
2014-10-22 10:07   ` Hans Verkuil
2014-10-22 10:03 ` [PATCH 2/5] [media] vivid: remove unused videobuf2-vmalloc headers Philipp Zabel
2014-10-22 10:08   ` Hans Verkuil
2014-10-22 10:03 ` [PATCH 3/5] [media] vivid: convert to platform device Philipp Zabel
2014-10-22 10:10   ` Hans Verkuil
2014-10-22 10:03 ` [PATCH 4/5] [media] vivid: add support for contiguous DMA buffers Philipp Zabel
2014-10-22 10:14   ` Hans Verkuil [this message]
2014-10-22 11:50     ` Philipp Zabel
2014-11-03 13:38   ` Hans Verkuil
2014-11-04 11:51     ` Philipp Zabel
2014-10-22 10:03 ` [PATCH 5/5] [media] vivid: enable VIDIOC_EXPBUF Philipp Zabel
2014-10-22 10:15   ` Hans Verkuil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5447839E.4090309@cisco.com \
    --to=hansverk@cisco.com \
    --cc=hans.verkuil@cisco.com \
    --cc=kernel@pengutronix.de \
    --cc=linux-media@vger.kernel.org \
    --cc=m.chehab@samsung.com \
    --cc=p.zabel@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.