Backmerge tag 'v5.18-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds...
[linux-2.6-microblaze.git] / drivers / gpu / drm / vmwgfx / vmwgfx_bo.c
index 31aecc4..eb94433 100644 (file)
@@ -46,6 +46,21 @@ vmw_buffer_object(struct ttm_buffer_object *bo)
        return container_of(bo, struct vmw_buffer_object, base);
 }
 
+/**
+ * bo_is_vmw - check if the buffer object is a &vmw_buffer_object
+ * @bo: ttm buffer object to be checked
+ *
+ * Uses destroy function associated with the object to determine if this is
+ * a &vmw_buffer_object.
+ *
+ * Returns:
+ * true if the object is of &vmw_buffer_object type, false if not.
+ */
+static bool bo_is_vmw(struct ttm_buffer_object *bo)
+{
+       return bo->destroy == &vmw_bo_bo_free ||
+              bo->destroy == &vmw_gem_destroy;
+}
 
 /**
  * vmw_bo_pin_in_placement - Validate a buffer to placement.
@@ -528,8 +543,8 @@ static int vmw_user_bo_synccpu_grab(struct vmw_buffer_object *vmw_bo,
        if (flags & drm_vmw_synccpu_allow_cs) {
                long lret;
 
-               lret = dma_resv_wait_timeout(bo->base.resv, true, true,
-                                            nonblock ? 0 :
+               lret = dma_resv_wait_timeout(bo->base.resv, DMA_RESV_USAGE_READ,
+                                            true, nonblock ? 0 :
                                             MAX_SCHEDULE_TIMEOUT);
                if (!lret)
                        return -EBUSY;
@@ -615,8 +630,9 @@ int vmw_user_bo_synccpu_ioctl(struct drm_device *dev, void *data,
 
                ret = vmw_user_bo_synccpu_grab(vbo, arg->flags);
                vmw_bo_unreference(&vbo);
-               if (unlikely(ret != 0 && ret != -ERESTARTSYS &&
-                            ret != -EBUSY)) {
+               if (unlikely(ret != 0)) {
+                       if (ret == -ERESTARTSYS || ret == -EBUSY)
+                               return -EBUSY;
                        DRM_ERROR("Failed synccpu grab on handle 0x%08x.\n",
                                  (unsigned int) arg->handle);
                        return ret;
@@ -747,16 +763,23 @@ void vmw_bo_fence_single(struct ttm_buffer_object *bo,
                         struct vmw_fence_obj *fence)
 {
        struct ttm_device *bdev = bo->bdev;
-
        struct vmw_private *dev_priv =
                container_of(bdev, struct vmw_private, bdev);
+       int ret;
 
-       if (fence == NULL) {
+       if (fence == NULL)
                vmw_execbuf_fence_commands(NULL, dev_priv, &fence, NULL);
-               dma_resv_add_excl_fence(bo->base.resv, &fence->base);
-               dma_fence_put(&fence->base);
-       } else
-               dma_resv_add_excl_fence(bo->base.resv, &fence->base);
+       else
+               dma_fence_get(&fence->base);
+
+       ret = dma_resv_reserve_fences(bo->base.resv, 1);
+       if (!ret)
+               dma_resv_add_fence(bo->base.resv, &fence->base,
+                                  DMA_RESV_USAGE_KERNEL);
+       else
+               /* Last resort fallback when we are OOM */
+               dma_fence_wait(&fence->base, false);
+       dma_fence_put(&fence->base);
 }
 
 
@@ -798,7 +821,7 @@ int vmw_dumb_create(struct drm_file *file_priv,
 void vmw_bo_swap_notify(struct ttm_buffer_object *bo)
 {
        /* Is @bo embedded in a struct vmw_buffer_object? */
-       if (vmw_bo_is_vmw_bo(bo))
+       if (!bo_is_vmw(bo))
                return;
 
        /* Kill any cached kernel maps before swapout */
@@ -822,7 +845,7 @@ void vmw_bo_move_notify(struct ttm_buffer_object *bo,
        struct vmw_buffer_object *vbo;
 
        /* Make sure @bo is embedded in a struct vmw_buffer_object? */
-       if (vmw_bo_is_vmw_bo(bo))
+       if (!bo_is_vmw(bo))
                return;
 
        vbo = container_of(bo, struct vmw_buffer_object, base);
@@ -843,22 +866,3 @@ void vmw_bo_move_notify(struct ttm_buffer_object *bo,
        if (mem->mem_type != VMW_PL_MOB && bo->resource->mem_type == VMW_PL_MOB)
                vmw_resource_unbind_list(vbo);
 }
-
-/**
- * vmw_bo_is_vmw_bo - check if the buffer object is a &vmw_buffer_object
- * @bo: buffer object to be checked
- *
- * Uses destroy function associated with the object to determine if this is
- * a &vmw_buffer_object.
- *
- * Returns:
- * true if the object is of &vmw_buffer_object type, false if not.
- */
-bool vmw_bo_is_vmw_bo(struct ttm_buffer_object *bo)
-{
-       if (bo->destroy == &vmw_bo_bo_free ||
-           bo->destroy == &vmw_gem_destroy)
-               return true;
-
-       return false;
-}