Merge tag 'drm-intel-gt-next-2021-04-06' of git://anongit.freedesktop.org/drm/drm...
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / gem / i915_gem_dmabuf.c
index 04e9c04..ccede73 100644 (file)
@@ -25,7 +25,7 @@ static struct sg_table *i915_gem_map_dma_buf(struct dma_buf_attachment *attachme
        struct scatterlist *src, *dst;
        int ret, i;
 
-       ret = i915_gem_object_pin_pages(obj);
+       ret = i915_gem_object_pin_pages_unlocked(obj);
        if (ret)
                goto err;
 
@@ -82,7 +82,7 @@ static int i915_gem_dmabuf_vmap(struct dma_buf *dma_buf, struct dma_buf_map *map
        struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
        void *vaddr;
 
-       vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB);
+       vaddr = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WB);
        if (IS_ERR(vaddr))
                return PTR_ERR(vaddr);
 
@@ -123,42 +123,48 @@ static int i915_gem_begin_cpu_access(struct dma_buf *dma_buf, enum dma_data_dire
 {
        struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
        bool write = (direction == DMA_BIDIRECTIONAL || direction == DMA_TO_DEVICE);
+       struct i915_gem_ww_ctx ww;
        int err;
 
-       err = i915_gem_object_pin_pages(obj);
-       if (err)
-               return err;
-
-       err = i915_gem_object_lock_interruptible(obj, NULL);
-       if (err)
-               goto out;
-
-       err = i915_gem_object_set_to_cpu_domain(obj, write);
-       i915_gem_object_unlock(obj);
-
-out:
-       i915_gem_object_unpin_pages(obj);
+       i915_gem_ww_ctx_init(&ww, true);
+retry:
+       err = i915_gem_object_lock(obj, &ww);
+       if (!err)
+               err = i915_gem_object_pin_pages(obj);
+       if (!err) {
+               err = i915_gem_object_set_to_cpu_domain(obj, write);
+               i915_gem_object_unpin_pages(obj);
+       }
+       if (err == -EDEADLK) {
+               err = i915_gem_ww_ctx_backoff(&ww);
+               if (!err)
+                       goto retry;
+       }
+       i915_gem_ww_ctx_fini(&ww);
        return err;
 }
 
 static int i915_gem_end_cpu_access(struct dma_buf *dma_buf, enum dma_data_direction direction)
 {
        struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
+       struct i915_gem_ww_ctx ww;
        int err;
 
-       err = i915_gem_object_pin_pages(obj);
-       if (err)
-               return err;
-
-       err = i915_gem_object_lock_interruptible(obj, NULL);
-       if (err)
-               goto out;
-
-       err = i915_gem_object_set_to_gtt_domain(obj, false);
-       i915_gem_object_unlock(obj);
-
-out:
-       i915_gem_object_unpin_pages(obj);
+       i915_gem_ww_ctx_init(&ww, true);
+retry:
+       err = i915_gem_object_lock(obj, &ww);
+       if (!err)
+               err = i915_gem_object_pin_pages(obj);
+       if (!err) {
+               err = i915_gem_object_set_to_gtt_domain(obj, false);
+               i915_gem_object_unpin_pages(obj);
+       }
+       if (err == -EDEADLK) {
+               err = i915_gem_ww_ctx_backoff(&ww);
+               if (!err)
+                       goto retry;
+       }
+       i915_gem_ww_ctx_fini(&ww);
        return err;
 }
 
@@ -244,6 +250,9 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
                }
        }
 
+       if (i915_gem_object_size_2big(dma_buf->size))
+               return ERR_PTR(-E2BIG);
+
        /* need to attach */
        attach = dma_buf_attach(dma_buf, dev->dev);
        if (IS_ERR(attach))
@@ -258,7 +267,7 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev,
        }
 
        drm_gem_private_object_init(dev, &obj->base, dma_buf->size);
-       i915_gem_object_init(obj, &i915_gem_object_dmabuf_ops, &lock_class);
+       i915_gem_object_init(obj, &i915_gem_object_dmabuf_ops, &lock_class, 0);
        obj->base.import_attach = attach;
        obj->base.resv = dma_buf->resv;