* 1 Pad sink
        * 1 Pad source
+
+Module options
+--------------
+
+Vimc has a module parameter to configure the driver.
+
+* ``allocator=<unsigned int>``
+
+       memory allocator selection, default is 0. It specifies the way buffers
+       will be allocated.
+
+               - 0: vmalloc
+               - 1: dma-contig
 
        select MEDIA_CONTROLLER
        select VIDEO_V4L2_SUBDEV_API
        select VIDEOBUF2_VMALLOC
+       select VIDEOBUF2_DMA_CONTIG
        select VIDEO_V4L2_TPG
        help
          Skeleton driver for Virtual Media Controller
 
 
 #include <media/v4l2-ioctl.h>
 #include <media/videobuf2-core.h>
+#include <media/videobuf2-dma-contig.h>
 #include <media/videobuf2-vmalloc.h>
 
 #include "vimc-common.h"
        /* Initialize the vb2 queue */
        q = &vcap->queue;
        q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-       q->io_modes = VB2_MMAP | VB2_DMABUF | VB2_USERPTR;
+       q->io_modes = VB2_MMAP | VB2_DMABUF;
+       if (vimc_allocator == VIMC_ALLOCATOR_VMALLOC)
+               q->io_modes |= VB2_USERPTR;
        q->drv_priv = vcap;
        q->buf_struct_size = sizeof(struct vimc_cap_buffer);
        q->ops = &vimc_cap_qops;
-       q->mem_ops = &vb2_vmalloc_memops;
+       q->mem_ops = vimc_allocator == VIMC_ALLOCATOR_DMA_CONTIG
+                  ? &vb2_dma_contig_memops : &vb2_vmalloc_memops;
        q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
        q->min_buffers_needed = 2;
        q->lock = &vcap->lock;
+       q->dev = v4l2_dev->dev;
 
        ret = vb2_queue_init(q);
        if (ret) {
 
 
 #define VIMC_PIX_FMT_MAX_CODES 8
 
+extern unsigned int vimc_allocator;
+
+enum vimc_allocator_type {
+       VIMC_ALLOCATOR_VMALLOC = 0,
+       VIMC_ALLOCATOR_DMA_CONTIG = 1,
+};
+
 /**
  * vimc_colorimetry_clamp - Adjust colorimetry parameters
  *
 
  * Copyright (C) 2015-2017 Helen Koike <helen.fornazier@gmail.com>
  */
 
+#include <linux/dma-mapping.h>
 #include <linux/font.h>
 #include <linux/init.h>
 #include <linux/module.h>
 
 #include "vimc-common.h"
 
+unsigned int vimc_allocator;
+module_param_named(allocator, vimc_allocator, uint, 0444);
+MODULE_PARM_DESC(allocator, " memory allocator selection, default is 0.\n"
+                            "\t\t    0 == vmalloc\n"
+                            "\t\t    1 == dma-contig");
+
 #define VIMC_MDEV_MODEL_NAME "VIMC MDEV"
 
 #define VIMC_ENT_LINK(src, srcpad, sink, sinkpad, link_flags) {        \
 
        tpg_set_font(font->data);
 
+       if (vimc_allocator == VIMC_ALLOCATOR_DMA_CONTIG)
+               dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+
        vimc = kzalloc(sizeof(*vimc), GFP_KERNEL);
        if (!vimc)
                return -ENOMEM;