drm/i915: Clear FlipDone semantics change for pageflipping on gen3
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 24 Apr 2012 21:59:45 +0000 (22:59 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 3 May 2012 09:18:16 +0000 (11:18 +0200)
On later gen3, you are able to select the meaning of the FlipPending
status bit in IIR and change it to FlipDone. This was sometimes done by
the BIOS leading to confusion on just how pageflipping worked on gen3.
Simplify the implementation by using the legacy meaning for all gen3
machines.

Note: this makes all gen3 machines equally broken...

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_irq.c

index 552f2504ff2375ad0e49641e736a3291bb81e61d..0095c8d12569bc6665c71aa8ddb7fc395bcf7766 100644 (file)
@@ -748,7 +748,6 @@ typedef struct drm_i915_private {
        struct drm_crtc *plane_to_crtc_mapping[3];
        struct drm_crtc *pipe_to_crtc_mapping[3];
        wait_queue_head_t pending_flip_queue;
-       bool gen3_flip_pending_is_done;
 
        struct intel_pch_pll pch_plls[I915_NUM_PLLS];
 
index 3b3943395a6ac933dc84a6b132be57349c52f919..7ea95b64891fb6f7f3dc367edb2b9ce2651f3437 100644 (file)
@@ -2510,26 +2510,18 @@ static irqreturn_t i915_irq_handler(DRM_IRQ_ARGS)
                if (iir & I915_BSD_USER_INTERRUPT)
                        notify_ring(dev, &dev_priv->ring[VCS]);
 
-               if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT) {
+               if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT)
                        intel_prepare_page_flip(dev, 0);
-                       if (dev_priv->gen3_flip_pending_is_done)
-                               intel_finish_page_flip_plane(dev, 0);
-               }
 
-               if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT) {
+               if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT)
                        intel_prepare_page_flip(dev, 1);
-                       if (dev_priv->gen3_flip_pending_is_done)
-                               intel_finish_page_flip_plane(dev, 1);
-               }
 
                for_each_pipe(pipe) {
                        if (pipe_stats[pipe] & vblank_status &&
                            drm_handle_vblank(dev, pipe)) {
                                vblank++;
-                               if (!dev_priv->gen3_flip_pending_is_done) {
-                                       i915_pageflip_stall_check(dev, pipe);
-                                       intel_finish_page_flip(dev, pipe);
-                               }
+                               i915_pageflip_stall_check(dev, pipe);
+                               intel_finish_page_flip(dev, pipe);
                        }
 
                        if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
@@ -2771,26 +2763,18 @@ static irqreturn_t i965_irq_handler(DRM_IRQ_ARGS)
                if (iir & I915_BSD_USER_INTERRUPT)
                        notify_ring(dev, &dev_priv->ring[VCS]);
 
-               if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT) {
+               if (iir & I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT)
                        intel_prepare_page_flip(dev, 0);
-                       if (dev_priv->gen3_flip_pending_is_done)
-                               intel_finish_page_flip_plane(dev, 0);
-               }
 
-               if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT) {
+               if (iir & I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT)
                        intel_prepare_page_flip(dev, 1);
-                       if (dev_priv->gen3_flip_pending_is_done)
-                               intel_finish_page_flip_plane(dev, 1);
-               }
 
                for_each_pipe(pipe) {
                        if (pipe_stats[pipe] & vblank_status &&
                            drm_handle_vblank(dev, pipe)) {
                                vblank++;
-                               if (!dev_priv->gen3_flip_pending_is_done) {
-                                       i915_pageflip_stall_check(dev, pipe);
-                                       intel_finish_page_flip(dev, pipe);
-                               }
+                               i915_pageflip_stall_check(dev, pipe);
+                               intel_finish_page_flip(dev, pipe);
                        }
 
                        if (pipe_stats[pipe] & PIPE_LEGACY_BLC_EVENT_STATUS)
@@ -2857,10 +2841,6 @@ void intel_irq_init(struct drm_device *dev)
        INIT_WORK(&dev_priv->error_work, i915_error_work_func);
        INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work);
 
-       /* IIR "flip pending" bit means done if this bit is set */
-       if (IS_GEN3(dev) && (I915_READ(ECOSKPD) & ECO_FLIP_DONE))
-               dev_priv->gen3_flip_pending_is_done = true;
-
        dev->driver->get_vblank_counter = i915_get_vblank_counter;
        dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
        if (IS_G4X(dev) || IS_GEN5(dev) || IS_GEN6(dev) || IS_IVYBRIDGE(dev) ||
@@ -2904,6 +2884,9 @@ void intel_irq_init(struct drm_device *dev)
                        dev->driver->irq_handler = i8xx_irq_handler;
                        dev->driver->irq_uninstall = i8xx_irq_uninstall;
                } else if (INTEL_INFO(dev)->gen == 3) {
+                       /* IIR "flip pending" means done if this bit is set */
+                       I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE));
+
                        dev->driver->irq_preinstall = i915_irq_preinstall;
                        dev->driver->irq_postinstall = i915_irq_postinstall;
                        dev->driver->irq_uninstall = i915_irq_uninstall;