On 01/09/2017 04:10 PM, Hans Verkuil wrote: > On 09/12/2016 10:47 AM, Vincent Abriou wrote: >> 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@xxxxxxxxxxxxxx> >> Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx> >> Signed-off-by: Vincent Abriou <vincent.abriou@xxxxxx> >> >> Cc: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> >> Cc: Hans Verkuil <hans.verkuil@xxxxxxxxx> >> --- >> Documentation/media/v4l-drivers/vivid.rst | 8 ++++++++ >> drivers/media/platform/vivid/Kconfig | 2 ++ >> drivers/media/platform/vivid/vivid-core.c | 32 ++++++++++++++++++++++++++----- >> 3 files changed, 37 insertions(+), 5 deletions(-) >> >> diff --git a/Documentation/media/v4l-drivers/vivid.rst b/Documentation/media/v4l-drivers/vivid.rst >> index c8cf371..3e44b22 100644 >> --- a/Documentation/media/v4l-drivers/vivid.rst >> +++ b/Documentation/media/v4l-drivers/vivid.rst >> @@ -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 > > Could you add support for dma-sg as well? I think that would be fairly trivial (unless > I missed something). > > Once that's added (or it's clear dma-sg won't work for some reason), then I'll merge this. > > Regards, > > Hans > Hi Hans, What is the difference between a vmalloc allocation exported in DMABUF that will populate the sg and dma-sg allocation? BR Vincent >> + >> 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. >> diff --git a/drivers/media/platform/vivid/Kconfig b/drivers/media/platform/vivid/Kconfig >> index 8e6918c..2e238a1 100644 >> --- a/drivers/media/platform/vivid/Kconfig >> +++ b/drivers/media/platform/vivid/Kconfig >> @@ -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--- >> diff --git a/drivers/media/platform/vivid/vivid-core.c b/drivers/media/platform/vivid/vivid-core.c >> index 741460a..02e1909 100644 >> --- a/drivers/media/platform/vivid/vivid-core.c >> +++ b/drivers/media/platform/vivid/vivid-core.c >> @@ -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; >> @@ -1036,6 +1048,11 @@ static int vivid_create_instance(struct platform_device *pdev, int inst) >> if (!dev->cec_workqueue) >> 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 */ >> @@ -1046,10 +1063,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) >> @@ -1065,10 +1083,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) >> @@ -1084,10 +1103,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) >> @@ -1103,10 +1123,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) >> @@ -1121,10 +1142,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) >> >-- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html