diff options
author | Mika Kuoppala <mika.kuoppala@intel.com> | 2016-03-18 17:27:19 +0200 |
---|---|---|
committer | Mika Kuoppala <mika.kuoppala@intel.com> | 2016-04-01 13:57:59 +0300 |
commit | dd8a22b51782f89e2d02ba8e2e77ff53a5dacf63 (patch) | |
tree | cfae80c89c02a8c96bc84e1f3b1dfb822227bc21 | |
parent | 326668404524650d492908a5728938e38fe142cd (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.h | 25 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_uncore.c | 9 |
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); +} |