diff --git a/drivers/gpu/drm/i915/display/intel_dsb.c b/drivers/gpu/drm/i915/display/intel_dsb.c index 50c4d98c0020f..5bf67bdc8182a 100644 --- a/drivers/gpu/drm/i915/display/intel_dsb.c +++ b/drivers/gpu/drm/i915/display/intel_dsb.c @@ -102,6 +102,7 @@ intel_dsb_get(struct intel_crtc *crtc) struct intel_dsb *dsb = &crtc->dsb; struct drm_i915_gem_object *obj; struct i915_vma *vma; + u32 *buf; intel_wakeref_t wakeref; if (!HAS_DSB(i915)) @@ -110,7 +111,6 @@ intel_dsb_get(struct intel_crtc *crtc) if (dsb->refcount++ != 0) return dsb; - dsb->id = DSB1; wakeref = intel_runtime_pm_get(&i915->runtime_pm); obj = i915_gem_object_create_internal(i915, DSB_BUF_SIZE); @@ -123,22 +123,29 @@ intel_dsb_get(struct intel_crtc *crtc) if (IS_ERR(vma)) { DRM_ERROR("Vma creation failed\n"); i915_gem_object_put(obj); - dsb->refcount--; goto err; } - dsb->cmd_buf = i915_gem_object_pin_map(vma->obj, I915_MAP_WC); - if (IS_ERR(dsb->cmd_buf)) { + buf = i915_gem_object_pin_map(vma->obj, I915_MAP_WC); + if (IS_ERR(buf)) { DRM_ERROR("Command buffer creation failed\n"); - i915_vma_unpin_and_release(&vma, 0); - dsb->cmd_buf = NULL; - dsb->refcount--; goto err; } + + dsb->id = DSB1; dsb->vma = vma; + dsb->cmd_buf = buf; err: + /* + * Set cmd_buf to NULL so the writes pass-through, but leave the + * dangling refcount to be removed later by the corresponding + * intel_dsb_put(): the important error message will already be + * logged above. + */ + dsb->cmd_buf = NULL; intel_runtime_pm_put(&i915->runtime_pm, wakeref); + return dsb; }