Merge tag 'drm-intel-next-2021-04-01' of git://anongit.freedesktop.org/drm/drm-intel...
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / display / intel_overlay.c
index 9211f6c..e477b61 100644 (file)
@@ -755,6 +755,32 @@ static u32 overlay_cmd_reg(struct drm_intel_overlay_put_image *params)
        return cmd;
 }
 
+static struct i915_vma *intel_overlay_pin_fb(struct drm_i915_gem_object *new_bo)
+{
+       struct i915_gem_ww_ctx ww;
+       struct i915_vma *vma;
+       int ret;
+
+       i915_gem_ww_ctx_init(&ww, true);
+retry:
+       ret = i915_gem_object_lock(new_bo, &ww);
+       if (!ret) {
+               vma = i915_gem_object_pin_to_display_plane(new_bo, &ww, 0,
+                                                          NULL, PIN_MAPPABLE);
+               ret = PTR_ERR_OR_ZERO(vma);
+       }
+       if (ret == -EDEADLK) {
+               ret = i915_gem_ww_ctx_backoff(&ww);
+               if (!ret)
+                       goto retry;
+       }
+       i915_gem_ww_ctx_fini(&ww);
+       if (ret)
+               return ERR_PTR(ret);
+
+       return vma;
+}
+
 static int intel_overlay_do_put_image(struct intel_overlay *overlay,
                                      struct drm_i915_gem_object *new_bo,
                                      struct drm_intel_overlay_put_image *params)
@@ -776,12 +802,10 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay,
 
        atomic_inc(&dev_priv->gpu_error.pending_fb_pin);
 
-       vma = i915_gem_object_pin_to_display_plane(new_bo,
-                                                  0, NULL, PIN_MAPPABLE);
-       if (IS_ERR(vma)) {
-               ret = PTR_ERR(vma);
+       vma = intel_overlay_pin_fb(new_bo);
+       if (IS_ERR(vma))
                goto out_pin_section;
-       }
+
        i915_gem_object_flush_frontbuffer(new_bo, ORIGIN_DIRTYFB);
 
        if (!overlay->active) {