Merge tag 'drm-misc-next-2020-10-27' of git://anongit.freedesktop.org/drm/drm-misc...
[platform/kernel/linux-starfive.git] / drivers / media / common / videobuf2 / videobuf2-dma-sg.c
index 7481311..030e482 100644 (file)
@@ -295,14 +295,18 @@ static void vb2_dma_sg_put_userptr(void *buf_priv)
 static void *vb2_dma_sg_vaddr(void *buf_priv)
 {
        struct vb2_dma_sg_buf *buf = buf_priv;
+       struct dma_buf_map map;
+       int ret;
 
        BUG_ON(!buf);
 
        if (!buf->vaddr) {
-               if (buf->db_attach)
-                       buf->vaddr = dma_buf_vmap(buf->db_attach->dmabuf);
-               else
+               if (buf->db_attach) {
+                       ret = dma_buf_vmap(buf->db_attach->dmabuf, &map);
+                       buf->vaddr = ret ? NULL : map.vaddr;
+               } else {
                        buf->vaddr = vm_map_ram(buf->pages, buf->num_pages, -1);
+               }
        }
 
        /* add offset in case userptr is not page-aligned */
@@ -480,11 +484,13 @@ vb2_dma_sg_dmabuf_ops_end_cpu_access(struct dma_buf *dbuf,
        return 0;
 }
 
-static void *vb2_dma_sg_dmabuf_ops_vmap(struct dma_buf *dbuf)
+static int vb2_dma_sg_dmabuf_ops_vmap(struct dma_buf *dbuf, struct dma_buf_map *map)
 {
        struct vb2_dma_sg_buf *buf = dbuf->priv;
 
-       return vb2_dma_sg_vaddr(buf);
+       dma_buf_map_set_vaddr(map, buf->vaddr);
+
+       return 0;
 }
 
 static int vb2_dma_sg_dmabuf_ops_mmap(struct dma_buf *dbuf,
@@ -565,6 +571,7 @@ static void vb2_dma_sg_unmap_dmabuf(void *mem_priv)
 {
        struct vb2_dma_sg_buf *buf = mem_priv;
        struct sg_table *sgt = buf->dma_sgt;
+       struct dma_buf_map map = DMA_BUF_MAP_INIT_VADDR(buf->vaddr);
 
        if (WARN_ON(!buf->db_attach)) {
                pr_err("trying to unpin a not attached buffer\n");
@@ -577,7 +584,7 @@ static void vb2_dma_sg_unmap_dmabuf(void *mem_priv)
        }
 
        if (buf->vaddr) {
-               dma_buf_vunmap(buf->db_attach->dmabuf, buf->vaddr);
+               dma_buf_vunmap(buf->db_attach->dmabuf, &map);
                buf->vaddr = NULL;
        }
        dma_buf_unmap_attachment(buf->db_attach, sgt, buf->dma_dir);