diff options
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 16 |
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) | |||
| 4081 | struct intel_unpin_work { | 4081 | struct 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 | |
