[Intel-gfx] [PATCH] drm/i915: Disable mmio debugging during user access
Mika Kuoppala
mika.kuoppala at linux.intel.com
Thu Sep 7 13:22:21 UTC 2017
Chris Wilson <chris at chris-wilson.co.uk> 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 at chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> ---
> 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 at intel.com>
>
> 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
More information about the Intel-gfx
mailing list