diff options
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index f6e274c5db62..57c1309733f6 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -2806,13 +2806,34 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc) | |||
2806 | udelay(100); | 2806 | udelay(100); |
2807 | } | 2807 | } |
2808 | 2808 | ||
2809 | static bool intel_crtc_has_pending_flip(struct drm_crtc *crtc) | ||
2810 | { | ||
2811 | struct drm_device *dev = crtc->dev; | ||
2812 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2813 | unsigned long flags; | ||
2814 | bool pending; | ||
2815 | |||
2816 | if (atomic_read(&dev_priv->mm.wedged)) | ||
2817 | return false; | ||
2818 | |||
2819 | spin_lock_irqsave(&dev->event_lock, flags); | ||
2820 | pending = to_intel_crtc(crtc)->unpin_work != NULL; | ||
2821 | spin_unlock_irqrestore(&dev->event_lock, flags); | ||
2822 | |||
2823 | return pending; | ||
2824 | } | ||
2825 | |||
2809 | static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc) | 2826 | static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc) |
2810 | { | 2827 | { |
2811 | struct drm_device *dev = crtc->dev; | 2828 | struct drm_device *dev = crtc->dev; |
2829 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2812 | 2830 | ||
2813 | if (crtc->fb == NULL) | 2831 | if (crtc->fb == NULL) |
2814 | return; | 2832 | return; |
2815 | 2833 | ||
2834 | wait_event(dev_priv->pending_flip_queue, | ||
2835 | !intel_crtc_has_pending_flip(crtc)); | ||
2836 | |||
2816 | mutex_lock(&dev->struct_mutex); | 2837 | mutex_lock(&dev->struct_mutex); |
2817 | intel_finish_fb(crtc->fb); | 2838 | intel_finish_fb(crtc->fb); |
2818 | mutex_unlock(&dev->struct_mutex); | 2839 | mutex_unlock(&dev->struct_mutex); |
@@ -6217,9 +6238,8 @@ static void do_intel_finish_page_flip(struct drm_device *dev, | |||
6217 | 6238 | ||
6218 | atomic_clear_mask(1 << intel_crtc->plane, | 6239 | atomic_clear_mask(1 << intel_crtc->plane, |
6219 | &obj->pending_flip.counter); | 6240 | &obj->pending_flip.counter); |
6220 | if (atomic_read(&obj->pending_flip) == 0) | ||
6221 | wake_up(&dev_priv->pending_flip_queue); | ||
6222 | 6241 | ||
6242 | wake_up(&dev_priv->pending_flip_queue); | ||
6223 | schedule_work(&work->work); | 6243 | schedule_work(&work->work); |
6224 | 6244 | ||
6225 | trace_i915_flip_complete(intel_crtc->plane, work->pending_flip_obj); | 6245 | trace_i915_flip_complete(intel_crtc->plane, work->pending_flip_obj); |