Skip to content

Commit ee0a227

Browse files
ickledanvet
authored andcommitted
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 <[email protected]> Cc: Michał Winiarski <[email protected]> Cc: [email protected] Signed-off-by: Daniel Vetter <[email protected]>
1 parent cbfe8fa commit ee0a227

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3303,15 +3303,14 @@ int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
33033303
#define I915_READ64(reg) dev_priv->uncore.funcs.mmio_readq(dev_priv, (reg), true)
33043304

33053305
#define I915_READ64_2x32(lower_reg, upper_reg) ({ \
3306-
u32 upper = I915_READ(upper_reg); \
3307-
u32 lower = I915_READ(lower_reg); \
3308-
u32 tmp = I915_READ(upper_reg); \
3309-
if (upper != tmp) { \
3310-
upper = tmp; \
3311-
lower = I915_READ(lower_reg); \
3312-
WARN_ON(I915_READ(upper_reg) != upper); \
3313-
} \
3314-
(u64)upper << 32 | lower; })
3306+
u32 upper, lower, tmp; \
3307+
tmp = I915_READ(upper_reg); \
3308+
do { \
3309+
upper = tmp; \
3310+
lower = I915_READ(lower_reg); \
3311+
tmp = I915_READ(upper_reg); \
3312+
} while (upper != tmp); \
3313+
(u64)upper << 32 | lower; })
33153314

33163315
#define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg)
33173316
#define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg)

0 commit comments

Comments
 (0)