diff options
| author | Chris Wilson <chris@chris-wilson.co.uk> | 2015-07-15 04:50:42 -0400 |
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-07-29 04:22:18 -0400 |
| commit | ee0a227b7ac6e75f28e10269f81c7ec6eb600952 (patch) | |
| tree | ebc6781b38245103564217e51a1453249306b233 | |
| parent | cbfe8fa6cd672011c755c3cd85c9ffd4e2d10a6f (diff) | |
drm/i915: Replace WARN inside I915_READ64_2x32 with retry loop
Since we may conceivably encounter situations where the upper part of the
64bit register changes between reads, for example when a timestamp
counter overflows, change the WARN into a retry loop.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: MichaĆ Winiarski <michal.winiarski@intel.com>
Cc: stable@vger.kernel.org
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 5f27290201e0..fd1de451c8c6 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -3303,15 +3303,14 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val); | |||
| 3303 | #define I915_READ64(reg) dev_priv->uncore.funcs.mmio_readq(dev_priv, (reg), true) | 3303 | #define I915_READ64(reg) dev_priv->uncore.funcs.mmio_readq(dev_priv, (reg), true) |
| 3304 | 3304 | ||
| 3305 | #define I915_READ64_2x32(lower_reg, upper_reg) ({ \ | 3305 | #define I915_READ64_2x32(lower_reg, upper_reg) ({ \ |
| 3306 | u32 upper = I915_READ(upper_reg); \ | 3306 | u32 upper, lower, tmp; \ |
| 3307 | u32 lower = I915_READ(lower_reg); \ | 3307 | tmp = I915_READ(upper_reg); \ |
| 3308 | u32 tmp = I915_READ(upper_reg); \ | 3308 | do { \ |
| 3309 | if (upper != tmp) { \ | 3309 | upper = tmp; \ |
| 3310 | upper = tmp; \ | 3310 | lower = I915_READ(lower_reg); \ |
| 3311 | lower = I915_READ(lower_reg); \ | 3311 | tmp = I915_READ(upper_reg); \ |
| 3312 | WARN_ON(I915_READ(upper_reg) != upper); \ | 3312 | } while (upper != tmp); \ |
| 3313 | } \ | 3313 | (u64)upper << 32 | lower; }) |
| 3314 | (u64)upper << 32 | lower; }) | ||
| 3315 | 3314 | ||
| 3316 | #define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) | 3315 | #define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) |
| 3317 | #define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg) | 3316 | #define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg) |
