summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMika Kuoppala <mika.kuoppala@intel.com>2016-03-18 17:27:19 +0200
committerMika Kuoppala <mika.kuoppala@intel.com>2016-04-01 13:57:59 +0300
commitdd8a22b51782f89e2d02ba8e2e77ff53a5dacf63 (patch)
treecfae80c89c02a8c96bc84e1f3b1dfb822227bc21
parent326668404524650d492908a5728938e38fe142cd (diff)
drm/i915: Introduce wait_until_reg
The most common usage pattern for wait_for() macro is to wait for some register value. Instead of bloating all callsites, encapsulate this complex wait_for macro into a helper function. v2: s/for/until, macro readability (Chris) Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h25
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c9
2 files changed, 34 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 1885eee11135..7cd185000d69 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2866,6 +2866,31 @@ static inline bool intel_vgpu_active(struct drm_device *dev)
return to_i915(dev)->vgpu.active;
}
+int intel_wait_until_register(struct drm_i915_private *dev_priv,
+ i915_reg_t reg,
+ u32 mask,
+ u32 value,
+ unsigned long timeout_ms);
+
+#define wait_until_reg(reg, mask, value, timeout_ms) ({ \
+ if (__builtin_constant_p(timeout_ms)) \
+ BUILD_BUG_ON((timeout_ms) > 60000); \
+ intel_wait_until_register(dev_priv, \
+ (reg), (mask), (value), (timeout_ms)); \
+ })
+
+#define wait_until_reg_set(reg, v, timeout_ms) ({ \
+ if (__builtin_constant_p(v)) \
+ BUILD_BUG_ON_NOT_POWER_OF_2((u32)(v)); \
+ wait_until_reg(reg, v, v, timeout_ms); \
+ })
+
+#define wait_until_reg_clr(reg, v, timeout_ms) ({ \
+ if (__builtin_constant_p((u32)(v))) \
+ BUILD_BUG_ON_NOT_POWER_OF_2((u32)(v)); \
+ wait_until_reg(reg, v, 0, timeout_ms); \
+ })
+
void
i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe,
u32 status_mask);
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 349c266007bd..94b08107b84f 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -1705,3 +1705,12 @@ intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv)
return false;
}
+
+int intel_wait_until_register(struct drm_i915_private *dev_priv,
+ i915_reg_t reg,
+ u32 mask,
+ u32 value,
+ unsigned long timeout_ms)
+{
+ return wait_for((I915_READ(reg) & mask) == value, timeout_ms);
+}