Merge tag 'drm-misc-next-2020-10-27' of git://anongit.freedesktop.org/drm/drm-misc...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / drm_gem_shmem_helper.c
index 3c2e8cde69a8685e6705dd54a5bca7d7cef04739..8233bda4692f71dab0a5fc85f3e3cce68ec427d6 100644 (file)
@@ -126,8 +126,8 @@ void drm_gem_shmem_free_object(struct drm_gem_object *obj)
                drm_prime_gem_destroy(obj, shmem->sgt);
        } else {
                if (shmem->sgt) {
-                       dma_unmap_sg(obj->dev->dev, shmem->sgt->sgl,
-                                    shmem->sgt->nents, DMA_BIDIRECTIONAL);
+                       dma_unmap_sgtable(obj->dev->dev, shmem->sgt,
+                                         DMA_BIDIRECTIONAL, 0);
                        sg_free_table(shmem->sgt);
                        kfree(shmem->sgt);
                }
@@ -429,8 +429,7 @@ void drm_gem_shmem_purge_locked(struct drm_gem_object *obj)
 
        WARN_ON(!drm_gem_shmem_is_purgeable(shmem));
 
-       dma_unmap_sg(obj->dev->dev, shmem->sgt->sgl,
-                    shmem->sgt->nents, DMA_BIDIRECTIONAL);
+       dma_unmap_sgtable(obj->dev->dev, shmem->sgt, DMA_BIDIRECTIONAL, 0);
        sg_free_table(shmem->sgt);
        kfree(shmem->sgt);
        shmem->sgt = NULL;
@@ -599,8 +598,13 @@ int drm_gem_shmem_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
        /* Remove the fake offset */
        vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node);
 
-       if (obj->import_attach)
+       if (obj->import_attach) {
+               /* Drop the reference drm_gem_mmap_obj() acquired.*/
+               drm_gem_object_put(obj);
+               vma->vm_private_data = NULL;
+
                return dma_buf_mmap(obj->dma_buf, vma, 0);
+       }
 
        shmem = to_drm_gem_shmem_obj(obj);
 
@@ -702,12 +706,17 @@ struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_object *obj)
                goto err_put_pages;
        }
        /* Map the pages for use by the h/w. */
-       dma_map_sg(obj->dev->dev, sgt->sgl, sgt->nents, DMA_BIDIRECTIONAL);
+       ret = dma_map_sgtable(obj->dev->dev, sgt, DMA_BIDIRECTIONAL, 0);
+       if (ret)
+               goto err_free_sgt;
 
        shmem->sgt = sgt;
 
        return sgt;
 
+err_free_sgt:
+       sg_free_table(sgt);
+       kfree(sgt);
 err_put_pages:
        drm_gem_shmem_put_pages(shmem);
        return ERR_PTR(ret);