Merge drm/drm-next into drm-intel-next-queued
[linux-2.6-microblaze.git] / drivers / gpu / drm / drm_gem_shmem_helper.c
index d77c9f8..8233bda 100644 (file)
@@ -261,13 +261,16 @@ EXPORT_SYMBOL(drm_gem_shmem_unpin);
 static void *drm_gem_shmem_vmap_locked(struct drm_gem_shmem_object *shmem)
 {
        struct drm_gem_object *obj = &shmem->base;
-       int ret;
+       struct dma_buf_map map;
+       int ret = 0;
 
        if (shmem->vmap_use_count++ > 0)
                return shmem->vaddr;
 
        if (obj->import_attach) {
-               shmem->vaddr = dma_buf_vmap(obj->import_attach->dmabuf);
+               ret = dma_buf_vmap(obj->import_attach->dmabuf, &map);
+               if (!ret)
+                       shmem->vaddr = map.vaddr;
        } else {
                pgprot_t prot = PAGE_KERNEL;
 
@@ -279,11 +282,12 @@ static void *drm_gem_shmem_vmap_locked(struct drm_gem_shmem_object *shmem)
                        prot = pgprot_writecombine(prot);
                shmem->vaddr = vmap(shmem->pages, obj->size >> PAGE_SHIFT,
                                    VM_MAP, prot);
+               if (!shmem->vaddr)
+                       ret = -ENOMEM;
        }
 
-       if (!shmem->vaddr) {
-               DRM_DEBUG_KMS("Failed to vmap pages\n");
-               ret = -ENOMEM;
+       if (ret) {
+               DRM_DEBUG_KMS("Failed to vmap pages, error %d\n", ret);
                goto err_put_pages;
        }
 
@@ -333,6 +337,7 @@ EXPORT_SYMBOL(drm_gem_shmem_vmap);
 static void drm_gem_shmem_vunmap_locked(struct drm_gem_shmem_object *shmem)
 {
        struct drm_gem_object *obj = &shmem->base;
+       struct dma_buf_map map = DMA_BUF_MAP_INIT_VADDR(shmem->vaddr);
 
        if (WARN_ON_ONCE(!shmem->vmap_use_count))
                return;
@@ -341,7 +346,7 @@ static void drm_gem_shmem_vunmap_locked(struct drm_gem_shmem_object *shmem)
                return;
 
        if (obj->import_attach)
-               dma_buf_vunmap(obj->import_attach->dmabuf, shmem->vaddr);
+               dma_buf_vunmap(obj->import_attach->dmabuf, &map);
        else
                vunmap(shmem->vaddr);
 
@@ -593,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);