Chris Wilson <ch...@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 <ch...@chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuopp...@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.kuopp...@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
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to