[Intel-gfx] [PATCH 02/16] drm/i915: Clear pipestat consistently
Imre Deak
imre.deak at intel.com
Thu Sep 14 13:51:43 UTC 2017
On Fri, Aug 18, 2017 at 09:36:51PM +0300, ville.syrjala at linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> We have a lot of different ways of clearing the PIPESTAT registers.
> Let's unify it all into one function. There's no magic in PIPESTAT
> that would require any of the double clearing and whatnot that
> some of the code tries to do. All we can really do is clear the status
> bits and disable the enable bits. There is no way to mask anything
> so as soon as another event happens the status bit will become set
> again, and trying to clear them twice or something can't protect
> against that.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
Reviewed-by: Imre Deak <imre.deak at intel.com>
> ---
> drivers/gpu/drm/i915/i915_irq.c | 67 ++++++++++++++++++-----------------------
> 1 file changed, 30 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 4bfa7fbbd72e..9e0ee014a055 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -1709,6 +1709,19 @@ static void gen9_guc_irq_handler(struct drm_i915_private *dev_priv, u32 gt_iir)
> }
> }
>
> +static void i9xx_pipestat_irq_reset(struct drm_i915_private *dev_priv)
> +{
> + enum pipe pipe;
> +
> + for_each_pipe(dev_priv, pipe) {
> + I915_WRITE(PIPESTAT(pipe),
> + PIPESTAT_INT_STATUS_MASK |
> + PIPE_FIFO_UNDERRUN_STATUS);
> +
> + dev_priv->pipestat_irq_mask[pipe] = 0;
> + }
> +}
> +
> static void valleyview_pipestat_irq_ack(struct drm_i915_private *dev_priv,
> u32 iir, u32 pipe_stats[I915_MAX_PIPES])
> {
> @@ -2898,8 +2911,6 @@ static void gen5_gt_irq_reset(struct drm_i915_private *dev_priv)
>
> static void vlv_display_irq_reset(struct drm_i915_private *dev_priv)
> {
> - enum pipe pipe;
> -
> if (IS_CHERRYVIEW(dev_priv))
> I915_WRITE(DPINVGTT, DPINVGTT_STATUS_MASK_CHV);
> else
> @@ -2908,12 +2919,7 @@ static void vlv_display_irq_reset(struct drm_i915_private *dev_priv)
> i915_hotplug_interrupt_update_locked(dev_priv, 0xffffffff, 0);
> I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
>
> - for_each_pipe(dev_priv, pipe) {
> - I915_WRITE(PIPESTAT(pipe),
> - PIPE_FIFO_UNDERRUN_STATUS |
> - PIPESTAT_INT_STATUS_MASK);
> - dev_priv->pipestat_irq_mask[pipe] = 0;
> - }
> + i9xx_pipestat_irq_reset(dev_priv);
>
> GEN5_IRQ_RESET(VLV_);
> dev_priv->irq_mask = ~0;
> @@ -3564,10 +3570,9 @@ static void ironlake_irq_uninstall(struct drm_device *dev)
> static void i8xx_irq_preinstall(struct drm_device * dev)
> {
> struct drm_i915_private *dev_priv = to_i915(dev);
> - int pipe;
>
> - for_each_pipe(dev_priv, pipe)
> - I915_WRITE(PIPESTAT(pipe), 0);
> + i9xx_pipestat_irq_reset(dev_priv);
> +
> I915_WRITE16(IMR, 0xffff);
> I915_WRITE16(IER, 0x0);
> POSTING_READ16(IER);
> @@ -3679,13 +3684,9 @@ static irqreturn_t i8xx_irq_handler(int irq, void *arg)
> static void i8xx_irq_uninstall(struct drm_device * dev)
> {
> struct drm_i915_private *dev_priv = to_i915(dev);
> - int pipe;
>
> - for_each_pipe(dev_priv, pipe) {
> - /* Clear enable bits; then clear status bits */
> - I915_WRITE(PIPESTAT(pipe), 0);
> - I915_WRITE(PIPESTAT(pipe), I915_READ(PIPESTAT(pipe)));
> - }
> + i9xx_pipestat_irq_reset(dev_priv);
> +
> I915_WRITE16(IMR, 0xffff);
> I915_WRITE16(IER, 0x0);
> I915_WRITE16(IIR, I915_READ16(IIR));
> @@ -3694,16 +3695,16 @@ static void i8xx_irq_uninstall(struct drm_device * dev)
> static void i915_irq_preinstall(struct drm_device * dev)
> {
> struct drm_i915_private *dev_priv = to_i915(dev);
> - int pipe;
>
> if (I915_HAS_HOTPLUG(dev_priv)) {
> i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0);
> I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
> }
>
> + i9xx_pipestat_irq_reset(dev_priv);
> +
> I915_WRITE16(HWSTAM, 0xeffe);
> - for_each_pipe(dev_priv, pipe)
> - I915_WRITE(PIPESTAT(pipe), 0);
> +
> I915_WRITE(IMR, 0xffffffff);
> I915_WRITE(IER, 0x0);
> POSTING_READ(IER);
> @@ -3859,36 +3860,32 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
> static void i915_irq_uninstall(struct drm_device * dev)
> {
> struct drm_i915_private *dev_priv = to_i915(dev);
> - int pipe;
>
> if (I915_HAS_HOTPLUG(dev_priv)) {
> i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0);
> I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
> }
>
> + i9xx_pipestat_irq_reset(dev_priv);
> +
> I915_WRITE16(HWSTAM, 0xffff);
> - for_each_pipe(dev_priv, pipe) {
> - /* Clear enable bits; then clear status bits */
> - I915_WRITE(PIPESTAT(pipe), 0);
> - I915_WRITE(PIPESTAT(pipe), I915_READ(PIPESTAT(pipe)));
> - }
> +
> I915_WRITE(IMR, 0xffffffff);
> I915_WRITE(IER, 0x0);
> -
> I915_WRITE(IIR, I915_READ(IIR));
> }
>
> static void i965_irq_preinstall(struct drm_device * dev)
> {
> struct drm_i915_private *dev_priv = to_i915(dev);
> - int pipe;
>
> i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0);
> I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
>
> + i9xx_pipestat_irq_reset(dev_priv);
> +
> I915_WRITE(HWSTAM, 0xeffe);
> - for_each_pipe(dev_priv, pipe)
> - I915_WRITE(PIPESTAT(pipe), 0);
> +
> I915_WRITE(IMR, 0xffffffff);
> I915_WRITE(IER, 0x0);
> POSTING_READ(IER);
> @@ -4082,7 +4079,6 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
> static void i965_irq_uninstall(struct drm_device * dev)
> {
> struct drm_i915_private *dev_priv = to_i915(dev);
> - int pipe;
>
> if (!dev_priv)
> return;
> @@ -4090,15 +4086,12 @@ static void i965_irq_uninstall(struct drm_device * dev)
> i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0);
> I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
>
> + i9xx_pipestat_irq_reset(dev_priv);
> +
> I915_WRITE(HWSTAM, 0xffffffff);
> - for_each_pipe(dev_priv, pipe)
> - I915_WRITE(PIPESTAT(pipe), 0);
> +
> I915_WRITE(IMR, 0xffffffff);
> I915_WRITE(IER, 0x0);
> -
> - for_each_pipe(dev_priv, pipe)
> - I915_WRITE(PIPESTAT(pipe),
> - I915_READ(PIPESTAT(pipe)) & 0x8000ffff);
> I915_WRITE(IIR, I915_READ(IIR));
> }
>
> --
> 2.13.0
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
More information about the Intel-gfx
mailing list