On Mon, Apr 10, 2017 at 04:02:07PM +0100, Chris Wilson wrote: > We acquire the forcewake and use I915_READ_FW instead for the atomic > wait within intel_uncore_wait_for_register. However, this still leaves > us vulnerable to concurrent mmio access to the register, which can cause > system hangs on gen7. The protection is to acquire uncore.lock around > each register, so lets add it back. > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Michal Wajdeczko <michal.wajdeczko@xxxxxxxxx> > Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/intel_uncore.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c > index 53c8457869f6..d2ba3011c2f0 100644 > --- a/drivers/gpu/drm/i915/intel_uncore.c > +++ b/drivers/gpu/drm/i915/intel_uncore.c > @@ -1661,14 +1661,18 @@ int intel_wait_for_register(struct drm_i915_private *dev_priv, > u32 value, > unsigned int timeout_ms) > { > - > unsigned fw = > intel_uncore_forcewake_for_reg(dev_priv, reg, FW_REG_READ); > int ret; > > - intel_uncore_forcewake_get(dev_priv, fw); > + spin_lock_irq(&dev_priv->uncore.lock); > + intel_uncore_forcewake_get__locked(dev_priv, fw); > + > ret = wait_for_us((I915_READ_FW(reg) & mask) == value, 2); To further decrease driver size we may try to call here our helper function: ret = __intel_wait_for_register_fw(dev_priv, reg, mask, value, 2, 0, NULL); -Michal > - intel_uncore_forcewake_put(dev_priv, fw); > + > + intel_uncore_forcewake_put__locked(dev_priv, fw); > + spin_unlock_irq(&dev_priv->uncore.lock); > + > if (ret) > ret = wait_for((I915_READ_NOTRACE(reg) & mask) == value, > timeout_ms); > -- > 2.11.0 > _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx