]> rtime.felk.cvut.cz Git - hercules2020/nv-tegra/linux-4.4.git/commitdiff
drivers: vivid: DMABUF cache maintenance
authorBhanu Murthy V <bmurthyv@nvidia.com>
Wed, 21 Jun 2017 21:27:22 +0000 (14:27 -0700)
committermobile promotions <svcmobile_promotions@nvidia.com>
Wed, 28 Jun 2017 07:04:56 +0000 (00:04 -0700)
vivid driver copies data in cpu to DMABUF buffers.
Use cache maintenance apis to begin and end CPU
access.
Fix number of planes reported in G_FMT.

Bug 1877448

Change-Id: I61c9f3234e8afc2d990b23d887bd9f5da6e59e3d
Signed-off-by: Bhanu Murthy V <bmurthyv@nvidia.com>
Reviewed-on: http://git-master/r/1506678
(cherry picked from commit cac7c9e965c196a4a0226fd0e6c369d80703535f)
Reviewed-on: https://git-master/r/1508200
GVS: Gerrit_Virtual_Submit
Reviewed-by: Jihoon Bang <jbang@nvidia.com>
drivers/media/platform/vivid/vivid-vid-cap.c

index 1ebe570ff7cbe67286fb45eb9d919232e7516ddb..85b9aacbc7365addba5cc3b97a001da31e8b5104 100644 (file)
@@ -183,9 +183,11 @@ static int vid_cap_queue_setup(struct vb2_queue *vq, const void *parg,
 static int vid_cap_buf_prepare(struct vb2_buffer *vb)
 {
        struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
+       struct vb2_queue *q = vb->vb2_queue;
        unsigned long size;
        unsigned buffers = tpg_g_buffers(&dev->tpg);
        unsigned p;
+       int err = 0;
 
        dprintk(dev, 1, "%s\n", __func__);
 
@@ -213,6 +215,20 @@ static int vid_cap_buf_prepare(struct vb2_buffer *vb)
 
                vb2_set_plane_payload(vb, p, size);
                vb->planes[p].data_offset = dev->fmt_cap->data_offset[p];
+
+               if (q->memory == V4L2_MEMORY_DMABUF) {
+                       struct dma_buf *dbuf = dma_buf_get(vb->planes[p].m.fd);
+                       enum dma_data_direction dma_dir =
+                               q->is_output ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
+
+                       err = dma_buf_begin_cpu_access(dbuf, 0,
+                                       vb->planes[p].length, dma_dir);
+                       if (err) {
+                               dprintk(dev, 1, "%s dma buf cpu access for plane %d failed\n",
+                                       __func__, p);
+                               return err;
+                       }
+               }
        }
 
        return 0;
@@ -225,6 +241,20 @@ static void vid_cap_buf_finish(struct vb2_buffer *vb)
        struct v4l2_timecode *tc = &vbuf->timecode;
        unsigned fps = 25;
        unsigned seq = vbuf->sequence;
+       unsigned p;
+
+       for (p = 0; p < tpg_g_buffers(&dev->tpg); p++) {
+               struct vb2_queue *q = vb->vb2_queue;
+
+               if (q->memory == V4L2_MEMORY_DMABUF) {
+                       struct dma_buf *dbuf = dma_buf_get(vb->planes[p].m.fd);
+                       enum dma_data_direction dma_dir =
+                               q->is_output ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
+
+                       dma_buf_end_cpu_access(dbuf, 0,
+                               vb->planes[p].length, dma_dir);
+               }
+       }
 
        if (!vivid_is_sdtv_cap(dev))
                return;
@@ -577,7 +607,7 @@ int vivid_g_fmt_vid_cap(struct file *file, void *priv,
        mp->xfer_func    = vivid_xfer_func_cap(dev);
        mp->ycbcr_enc    = vivid_ycbcr_enc_cap(dev);
        mp->quantization = vivid_quantization_cap(dev);
-       mp->num_planes = dev->fmt_cap->buffers;
+       mp->num_planes = tpg_g_planes(&dev->tpg);
        mp->metadata_height = dev->embedded_data_height;
        for (p = 0; p < mp->num_planes; p++) {
                mp->plane_fmt[p].bytesperline =