aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_display.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index a4d382c8bf58..dc6ffe82d2cd 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4081,7 +4081,8 @@ static void intel_crtc_destroy(struct drm_crtc *crtc)
4081struct intel_unpin_work { 4081struct intel_unpin_work {
4082 struct work_struct work; 4082 struct work_struct work;
4083 struct drm_device *dev; 4083 struct drm_device *dev;
4084 struct drm_gem_object *obj; 4084 struct drm_gem_object *old_fb_obj;
4085 struct drm_gem_object *pending_flip_obj;
4085 struct drm_pending_vblank_event *event; 4086 struct drm_pending_vblank_event *event;
4086 int pending; 4087 int pending;
4087}; 4088};
@@ -4092,8 +4093,8 @@ static void intel_unpin_work_fn(struct work_struct *__work)
4092 container_of(__work, struct intel_unpin_work, work); 4093 container_of(__work, struct intel_unpin_work, work);
4093 4094
4094 mutex_lock(&work->dev->struct_mutex); 4095 mutex_lock(&work->dev->struct_mutex);
4095 i915_gem_object_unpin(work->obj); 4096 i915_gem_object_unpin(work->old_fb_obj);
4096 drm_gem_object_unreference(work->obj); 4097 drm_gem_object_unreference(work->old_fb_obj);
4097 mutex_unlock(&work->dev->struct_mutex); 4098 mutex_unlock(&work->dev->struct_mutex);
4098 kfree(work); 4099 kfree(work);
4099} 4100}
@@ -4117,7 +4118,7 @@ void intel_finish_page_flip(struct drm_device *dev, int pipe)
4117 work = intel_crtc->unpin_work; 4118 work = intel_crtc->unpin_work;
4118 if (work == NULL || !work->pending) { 4119 if (work == NULL || !work->pending) {
4119 if (work && !work->pending) { 4120 if (work && !work->pending) {
4120 obj_priv = work->obj->driver_private; 4121 obj_priv = work->pending_flip_obj->driver_private;
4121 DRM_DEBUG_DRIVER("flip finish: %p (%d) not pending?\n", 4122 DRM_DEBUG_DRIVER("flip finish: %p (%d) not pending?\n",
4122 obj_priv, 4123 obj_priv,
4123 atomic_read(&obj_priv->pending_flip)); 4124 atomic_read(&obj_priv->pending_flip));
@@ -4142,7 +4143,7 @@ void intel_finish_page_flip(struct drm_device *dev, int pipe)
4142 4143
4143 spin_unlock_irqrestore(&dev->event_lock, flags); 4144 spin_unlock_irqrestore(&dev->event_lock, flags);
4144 4145
4145 obj_priv = work->obj->driver_private; 4146 obj_priv = work->pending_flip_obj->driver_private;
4146 4147
4147 /* Initial scanout buffer will have a 0 pending flip count */ 4148 /* Initial scanout buffer will have a 0 pending flip count */
4148 if ((atomic_read(&obj_priv->pending_flip) == 0) || 4149 if ((atomic_read(&obj_priv->pending_flip) == 0) ||
@@ -4191,7 +4192,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
4191 work->event = event; 4192 work->event = event;
4192 work->dev = crtc->dev; 4193 work->dev = crtc->dev;
4193 intel_fb = to_intel_framebuffer(crtc->fb); 4194 intel_fb = to_intel_framebuffer(crtc->fb);
4194 work->obj = intel_fb->obj; 4195 work->old_fb_obj = intel_fb->obj;
4195 INIT_WORK(&work->work, intel_unpin_work_fn); 4196 INIT_WORK(&work->work, intel_unpin_work_fn);
4196 4197
4197 /* We borrow the event spin lock for protecting unpin_work */ 4198 /* We borrow the event spin lock for protecting unpin_work */
@@ -4220,13 +4221,14 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
4220 } 4221 }
4221 4222
4222 /* Reference the old fb object for the scheduled work. */ 4223 /* Reference the old fb object for the scheduled work. */
4223 drm_gem_object_reference(work->obj); 4224 drm_gem_object_reference(work->old_fb_obj);
4224 4225
4225 crtc->fb = fb; 4226 crtc->fb = fb;
4226 i915_gem_object_flush_write_domain(obj); 4227 i915_gem_object_flush_write_domain(obj);
4227 drm_vblank_get(dev, intel_crtc->pipe); 4228 drm_vblank_get(dev, intel_crtc->pipe);
4228 obj_priv = obj->driver_private; 4229 obj_priv = obj->driver_private;
4229 atomic_inc(&obj_priv->pending_flip); 4230 atomic_inc(&obj_priv->pending_flip);
4231 work->pending_flip_obj = obj;
4230 4232
4231 BEGIN_LP_RING(4); 4233 BEGIN_LP_RING(4);
4232 OUT_RING(MI_DISPLAY_FLIP | 4234 OUT_RING(MI_DISPLAY_FLIP |