Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> writes: > If the user bypasses i915 and accesses mmio directly, that easily > confuses our automatic mmio debugging (any error we then detect is > likely to be as a result of the user). Since we expect userspace to open > debugfs/i915_forcewake_user if i915.ko is loaded and they want mmio > access, that makes the opportune time to disable our debugging for > duration of the bypass. > > References: https://bugs.freedesktop.org/show_bug.cgi?id=102543 > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_debugfs.c | 32 ++++++++++++++++++++++++++++++-- > drivers/gpu/drm/i915/intel_uncore.h | 7 +++++++ > 2 files changed, 37 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c > index 48572b157222..d63b3c5c2f83 100644 > --- a/drivers/gpu/drm/i915/i915_debugfs.c > +++ b/drivers/gpu/drm/i915/i915_debugfs.c > @@ -4679,7 +4679,21 @@ static int i915_forcewake_open(struct inode *inode, struct file *file) > return 0; > > intel_runtime_pm_get(dev_priv); > - intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); > + > + spin_lock_irq(&dev_priv->uncore.lock); > + if (!dev_priv->uncore.user_forcewake.count++) { > + intel_uncore_forcewake_get__locked(dev_priv, FORCEWAKE_ALL); > + > + /* Save and disable mmio debugging for the user bypass */ > + dev_priv->uncore.user_forcewake.saved_mmio_check = > + dev_priv->uncore.unclaimed_mmio_check; > + dev_priv->uncore.user_forcewake.saved_mmio_debug = > + i915.mmio_debug; > + > + dev_priv->uncore.unclaimed_mmio_check = 0; > + i915.mmio_debug = 0; > + } > + spin_unlock_irq(&dev_priv->uncore.lock); Just pondering if this should be in intel_uncore.c as a user_mmio_bypass_on/off(). But not insisting. Reviewed-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxx> > > return 0; > } > @@ -4691,7 +4705,21 @@ static int i915_forcewake_release(struct inode *inode, struct file *file) > if (INTEL_GEN(dev_priv) < 6) > return 0; > > - intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); > + spin_lock_irq(&dev_priv->uncore.lock); > + if (!--dev_priv->uncore.user_forcewake.count) { > + if (intel_uncore_unclaimed_mmio(dev_priv)) > + dev_info(dev_priv->drm.dev, > + "Unclaimed mmio occurred during user acess\n"); > + > + dev_priv->uncore.unclaimed_mmio_check = > + dev_priv->uncore.user_forcewake.saved_mmio_check; > + i915.mmio_debug = > + dev_priv->uncore.user_forcewake.saved_mmio_debug; > + > + intel_uncore_forcewake_put__locked(dev_priv, FORCEWAKE_ALL); > + } > + spin_unlock_irq(&dev_priv->uncore.lock); > + > intel_runtime_pm_put(dev_priv); > > return 0; > diff --git a/drivers/gpu/drm/i915/intel_uncore.h b/drivers/gpu/drm/i915/intel_uncore.h > index 5f90278da461..1acf24c6e9ce 100644 > --- a/drivers/gpu/drm/i915/intel_uncore.h > +++ b/drivers/gpu/drm/i915/intel_uncore.h > @@ -102,6 +102,13 @@ struct intel_uncore { > i915_reg_t reg_ack; > } fw_domain[FW_DOMAIN_ID_COUNT]; > > + struct { > + unsigned int count; > + > + int saved_mmio_check; > + int saved_mmio_debug; > + } user_forcewake; > + > int unclaimed_mmio_check; > }; > > -- > 2.14.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx