Merge tag 'drm-misc-next-fixes-2021-09-09' of git://anongit.freedesktop.org/drm/drm...
[linux-2.6-microblaze.git] / drivers / gpu / drm / msm / msm_gem.c
index 1411787..22308a1 100644 (file)
@@ -131,7 +131,6 @@ static struct page **get_pages(struct drm_gem_object *obj)
                if (msm_obj->flags & (MSM_BO_WC|MSM_BO_UNCACHED))
                        sync_for_device(msm_obj);
 
-               GEM_WARN_ON(msm_obj->active_count);
                update_inactive(msm_obj);
        }
 
@@ -218,31 +217,6 @@ static pgprot_t msm_gem_pgprot(struct msm_gem_object *msm_obj, pgprot_t prot)
        return prot;
 }
 
-int msm_gem_mmap_obj(struct drm_gem_object *obj,
-               struct vm_area_struct *vma)
-{
-       struct msm_gem_object *msm_obj = to_msm_bo(obj);
-
-       vma->vm_flags &= ~VM_PFNMAP;
-       vma->vm_flags |= VM_MIXEDMAP;
-       vma->vm_page_prot = msm_gem_pgprot(msm_obj, vm_get_page_prot(vma->vm_flags));
-
-       return 0;
-}
-
-int msm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
-{
-       int ret;
-
-       ret = drm_gem_mmap(filp, vma);
-       if (ret) {
-               DBG("mmap failed: %d", ret);
-               return ret;
-       }
-
-       return msm_gem_mmap_obj(vma->vm_private_data, vma);
-}
-
 static vm_fault_t msm_gem_fault(struct vm_fault *vmf)
 {
        struct vm_area_struct *vma = vmf->vma;
@@ -804,41 +778,6 @@ void msm_gem_vunmap(struct drm_gem_object *obj)
        msm_obj->vaddr = NULL;
 }
 
-/* must be called before _move_to_active().. */
-int msm_gem_sync_object(struct drm_gem_object *obj,
-               struct msm_fence_context *fctx, bool exclusive)
-{
-       struct dma_resv_list *fobj;
-       struct dma_fence *fence;
-       int i, ret;
-
-       fobj = dma_resv_shared_list(obj->resv);
-       if (!fobj || (fobj->shared_count == 0)) {
-               fence = dma_resv_excl_fence(obj->resv);
-               /* don't need to wait on our own fences, since ring is fifo */
-               if (fence && (fence->context != fctx->context)) {
-                       ret = dma_fence_wait(fence, true);
-                       if (ret)
-                               return ret;
-               }
-       }
-
-       if (!exclusive || !fobj)
-               return 0;
-
-       for (i = 0; i < fobj->shared_count; i++) {
-               fence = rcu_dereference_protected(fobj->shared[i],
-                                               dma_resv_held(obj->resv));
-               if (fence->context != fctx->context) {
-                       ret = dma_fence_wait(fence, true);
-                       if (ret)
-                               return ret;
-               }
-       }
-
-       return 0;
-}
-
 void msm_gem_active_get(struct drm_gem_object *obj, struct msm_gpu *gpu)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
@@ -848,14 +787,12 @@ void msm_gem_active_get(struct drm_gem_object *obj, struct msm_gpu *gpu)
        GEM_WARN_ON(!msm_gem_is_locked(obj));
        GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED);
        GEM_WARN_ON(msm_obj->dontneed);
-       GEM_WARN_ON(!msm_obj->sgt);
 
        if (msm_obj->active_count++ == 0) {
                mutex_lock(&priv->mm_lock);
                if (msm_obj->evictable)
                        mark_unevictable(msm_obj);
-               list_del(&msm_obj->mm_list);
-               list_add_tail(&msm_obj->mm_list, &gpu->active_list);
+               list_move_tail(&msm_obj->mm_list, &gpu->active_list);
                mutex_unlock(&priv->mm_lock);
        }
 }
@@ -1062,7 +999,7 @@ void msm_gem_describe_objects(struct list_head *list, struct seq_file *m)
 }
 #endif
 
-/* don't call directly!  Use drm_gem_object_put_locked() and friends */
+/* don't call directly!  Use drm_gem_object_put() */
 void msm_gem_free_object(struct drm_gem_object *obj)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
@@ -1114,6 +1051,17 @@ void msm_gem_free_object(struct drm_gem_object *obj)
        kfree(msm_obj);
 }
 
+static int msm_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
+{
+       struct msm_gem_object *msm_obj = to_msm_bo(obj);
+
+       vma->vm_flags &= ~VM_PFNMAP;
+       vma->vm_flags |= VM_MIXEDMAP | VM_DONTEXPAND;
+       vma->vm_page_prot = msm_gem_pgprot(msm_obj, vm_get_page_prot(vma->vm_flags));
+
+       return 0;
+}
+
 /* convenience method to construct a GEM buffer object, and userspace handle */
 int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
                uint32_t size, uint32_t flags, uint32_t *handle,
@@ -1151,6 +1099,7 @@ static const struct drm_gem_object_funcs msm_gem_object_funcs = {
        .get_sg_table = msm_gem_prime_get_sg_table,
        .vmap = msm_gem_prime_vmap,
        .vunmap = msm_gem_prime_vunmap,
+       .mmap = msm_gem_object_mmap,
        .vm_ops = &vm_ops,
 };
 
@@ -1169,7 +1118,7 @@ static int msm_gem_new_impl(struct drm_device *dev,
        case MSM_BO_CACHED_COHERENT:
                if (priv->has_cached_coherent)
                        break;
-               /* fallthrough */
+               fallthrough;
        default:
                DRM_DEV_ERROR(dev->dev, "invalid cache flag: %x\n",
                                (flags & MSM_BO_CACHE_MASK));
@@ -1183,7 +1132,6 @@ static int msm_gem_new_impl(struct drm_device *dev,
        msm_obj->flags = flags;
        msm_obj->madv = MSM_MADV_WILLNEED;
 
-       INIT_LIST_HEAD(&msm_obj->submit_entry);
        INIT_LIST_HEAD(&msm_obj->vmas);
 
        *obj = &msm_obj->base;
@@ -1192,8 +1140,7 @@ static int msm_gem_new_impl(struct drm_device *dev,
        return 0;
 }
 
-static struct drm_gem_object *_msm_gem_new(struct drm_device *dev,
-               uint32_t size, uint32_t flags, bool struct_mutex_locked)
+struct drm_gem_object *msm_gem_new(struct drm_device *dev, uint32_t size, uint32_t flags)
 {
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_gem_object *msm_obj;
@@ -1280,26 +1227,10 @@ static struct drm_gem_object *_msm_gem_new(struct drm_device *dev,
        return obj;
 
 fail:
-       if (struct_mutex_locked) {
-               drm_gem_object_put_locked(obj);
-       } else {
-               drm_gem_object_put(obj);
-       }
+       drm_gem_object_put(obj);
        return ERR_PTR(ret);
 }
 
-struct drm_gem_object *msm_gem_new_locked(struct drm_device *dev,
-               uint32_t size, uint32_t flags)
-{
-       return _msm_gem_new(dev, size, flags, true);
-}
-
-struct drm_gem_object *msm_gem_new(struct drm_device *dev,
-               uint32_t size, uint32_t flags)
-{
-       return _msm_gem_new(dev, size, flags, false);
-}
-
 struct drm_gem_object *msm_gem_import(struct drm_device *dev,
                struct dma_buf *dmabuf, struct sg_table *sgt)
 {
@@ -1358,12 +1289,12 @@ fail:
        return ERR_PTR(ret);
 }
 
-static void *_msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
+void *msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
                uint32_t flags, struct msm_gem_address_space *aspace,
-               struct drm_gem_object **bo, uint64_t *iova, bool locked)
+               struct drm_gem_object **bo, uint64_t *iova)
 {
        void *vaddr;
-       struct drm_gem_object *obj = _msm_gem_new(dev, size, flags, locked);
+       struct drm_gem_object *obj = msm_gem_new(dev, size, flags);
        int ret;
 
        if (IS_ERR(obj))
@@ -1387,42 +1318,21 @@ static void *_msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
 
        return vaddr;
 err:
-       if (locked)
-               drm_gem_object_put_locked(obj);
-       else
-               drm_gem_object_put(obj);
+       drm_gem_object_put(obj);
 
        return ERR_PTR(ret);
 
 }
 
-void *msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
-               uint32_t flags, struct msm_gem_address_space *aspace,
-               struct drm_gem_object **bo, uint64_t *iova)
-{
-       return _msm_gem_kernel_new(dev, size, flags, aspace, bo, iova, false);
-}
-
-void *msm_gem_kernel_new_locked(struct drm_device *dev, uint32_t size,
-               uint32_t flags, struct msm_gem_address_space *aspace,
-               struct drm_gem_object **bo, uint64_t *iova)
-{
-       return _msm_gem_kernel_new(dev, size, flags, aspace, bo, iova, true);
-}
-
 void msm_gem_kernel_put(struct drm_gem_object *bo,
-               struct msm_gem_address_space *aspace, bool locked)
+               struct msm_gem_address_space *aspace)
 {
        if (IS_ERR_OR_NULL(bo))
                return;
 
        msm_gem_put_vaddr(bo);
        msm_gem_unpin_iova(bo, aspace);
-
-       if (locked)
-               drm_gem_object_put_locked(bo);
-       else
-               drm_gem_object_put(bo);
+       drm_gem_object_put(bo);
 }
 
 void msm_gem_object_set_name(struct drm_gem_object *bo, const char *fmt, ...)