drm/i915: Use msleep instead of mdelay during wait_vblank_off
authorChris Wilson <chris@chris-wilson.co.uk>
Sun, 12 Sep 2010 12:34:08 +0000 (13:34 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Sun, 12 Sep 2010 12:34:08 +0000 (13:34 +0100)
Avoid a potentially long busy-wait if we not in the process of
atomically switching to the kdb console.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h

index 1e88ebbc1a1e2fc81784220dc3183dfb8c482e07..594f8f2410abb0f93faf25180e757efbe1d673f3 100644 (file)
@@ -1034,16 +1034,17 @@ void intel_wait_for_vblank_off(struct drm_device *dev, int pipe)
        struct drm_i915_private *dev_priv = dev->dev_private;
        int pipedsl_reg = (pipe == 0 ? PIPEADSL : PIPEBDSL);
        unsigned long timeout = jiffies + msecs_to_jiffies(100);
-       u32 last_line;
+       u32 last_line, line;
 
        /* Wait for the display line to settle */
+       line = I915_READ(pipedsl_reg) & DSL_LINEMASK;
        do {
-               last_line = I915_READ(pipedsl_reg) & DSL_LINEMASK;
-               mdelay(5);
-       } while (((I915_READ(pipedsl_reg) & DSL_LINEMASK) != last_line) &&
-                time_after(timeout, jiffies));
+               last_line = line;
+               MSLEEP(5);
+               line = I915_READ(pipedsl_reg) & DSL_LINEMASK;
+       } while (line != last_line && time_after(timeout, jiffies));
 
-       if (time_after(jiffies, timeout))
+       if (line != last_line)
                DRM_DEBUG_KMS("vblank wait timed out\n");
 }
 
index 6c6b897539f891a2ea65f67f1e10b8ffd32af401..e5f2a61af9f68f3c521cd6303f7dfd31ae09d37d 100644 (file)
 #define wait_for(COND, MS) _wait_for(COND, MS, 1)
 #define wait_for_atomic(COND, MS) _wait_for(COND, MS, 0)
 
+#define MSLEEP(x) do { \
+       if (in_dbg_master()) \
+               mdelay(x); \
+       else \
+               msleep(x); \
+} while(0)
+
 #define KHz(x) (1000*x)
 #define MHz(x) KHz(1000*x)