drm/i915: add timeout to FBC disable waits

Previous thread: drm/i915: Rename dev_priv->ring to dev_priv->render_ring. by Linux Kernel Mailing List on Tuesday, June 1, 2010 - 2:59 pm. (1 message)

Next thread: i915: fix lock imbalance on error path... by Linux Kernel Mailing List on Tuesday, June 1, 2010 - 2:59 pm. (1 message)
From: Linux Kernel Mailing List
Date: Tuesday, June 1, 2010 - 2:59 pm

Gitweb:     http://git.kernel.org/linus/9517a92f48b08bb02cfb616825850b82b28461cc
Commit:     9517a92f48b08bb02cfb616825850b82b28461cc
Parent:     d1b851fc0d105caa6b6e3e7c92d2987dfb52cbe0
Author:     Jesse Barnes <jbarnes@virtuousgeek.org>
AuthorDate: Fri May 21 09:40:45 2010 -0700
Committer:  Eric Anholt <eric@anholt.net>
CommitDate: Wed May 26 13:48:43 2010 -0700

    drm/i915: add timeout to FBC disable waits
    
    FBC disable on 965 can take long enough to trigger latency checks in the
    kernel so be sure to timeout after a reasonable period.
    
    Fixes https://bugzilla.kernel.org/show_bug.cgi?id=15015.
    
    Tested-by: James Ettle <theholyettlz@googlemail.com>
    Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
    Signed-off-by: Eric Anholt <eric@anholt.net>
---
 drivers/gpu/drm/i915/intel_display.c |   13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index b867f3c..36afe94 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1029,19 +1029,28 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
 void i8xx_disable_fbc(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
+	unsigned long timeout = jiffies + msecs_to_jiffies(1);
 	u32 fbc_ctl;
 
 	if (!I915_HAS_FBC(dev))
 		return;
 
+	if (!(I915_READ(FBC_CONTROL) & FBC_CTL_EN))
+		return;	/* Already off, just return */
+
 	/* Disable compression */
 	fbc_ctl = I915_READ(FBC_CONTROL);
 	fbc_ctl &= ~FBC_CTL_EN;
 	I915_WRITE(FBC_CONTROL, fbc_ctl);
 
 	/* Wait for compressing bit to clear */
-	while (I915_READ(FBC_STATUS) & FBC_STAT_COMPRESSING)
-		; /* nothing */
+	while (I915_READ(FBC_STATUS) & FBC_STAT_COMPRESSING) {
+		if (time_after(jiffies, timeout)) {
+			DRM_DEBUG_DRIVER("FBC idle timed out\n");
+			break;
+		}
+		; /* do nothing */
+	}
 
 	intel_wait_for_vblank(dev);
 
--

Previous thread: drm/i915: Rename dev_priv->ring to dev_priv->render_ring. by Linux Kernel Mailing List on Tuesday, June 1, 2010 - 2:59 pm. (1 message)

Next thread: i915: fix lock imbalance on error path... by Linux Kernel Mailing List on Tuesday, June 1, 2010 - 2:59 pm. (1 message)