All of lore.kernel.org
 help / color / mirror / Atom feed
From: Imre Deak <imre.deak@intel.com>
To: Paulo Zanoni <przanoni@gmail.com>
Cc: Intel Graphics Development <intel-gfx@lists.freedesktop.org>
Subject: Re: [PATCH 1/2] drm/i915: mask RPS IRQs properly when disabling RPS
Date: Mon, 01 Dec 2014 18:42:08 +0200	[thread overview]
Message-ID: <1417452128.11576.4.camel@intelbox> (raw)
In-Reply-To: <CA+gsUGSPiao_eNxjuFm5gjn1GyN1Mkary3ahLdNJV_zBLsf5_g@mail.gmail.com>

On Mon, 2014-12-01 at 14:29 -0200, Paulo Zanoni wrote:
> 2014-11-20 19:01 GMT-02:00 Imre Deak <imre.deak@intel.com>:
> > Atm, igt/gem_reset_stats can trigger the recently added WARN on
> > left-over PM_IIR bits in gen6_enable_rps_interrupts(). There are two
> > reasons for this:
> > 1. we call intel_enable_gt_powersave() without a preceeding
> >    intel_disable_gt_powersave()
> > 2. gen6_disable_rps_interrupts() doesn't mask interrupts in PM_IMR
> 
> We don't do this, but we mask stuff through GEN6_PMINTRMSK. Shouldn't
> this be enough to prevent IIR from changing?

Note also, that during a subsequent RPS enabling, interrupts will be
unmasked in GEN6_PMINTRMSK, before calling gen6_enable_rps_interrupts().
So not masking the interrupts in PM_IMR here would lead to triggering
RPS interrupts before we explicitly enable them.

> 
> Chris?
> 
> >
> > 1. means RPS interrupts will remain enabled and can be serviced during
> > the HW initialization after a GPU reset. 2. means even if we called
> > gen6_disable_rps_interrupts() any new RPS interrupt during RPS
> > initialization would still propagate to PM_IIR too early (though
> > wouldn't be serviced).
> >
> > This patch solves the 2. issue by also masking interrupts in PM_IMR, the
> > following patch fixes 1. getting rid of the WARN. This also makes
> > intel_enable_gt_powersave() and intel_disable_gt_powersave() more
> > symmetric.
> >
> > Since gen6_disable_rps_interrupts() is called during driver loading with
> > i915 interrupts disabled add a new version of gen6_disable_pm_irq() that
> > doesn't WARN for this.
> >
> > Also while at it, get the irq_lock around the whole PM_IMR/IER/IIR
> > programming sequence and make sure that any queued PM_IIR bit is also
> > cleared.
> >
> > The WARN was caught by PRTS after I sent my previous RPS sanitizing
> > patchset and I could easily reproduce it on HSW. To actually fix it we
> > also need the next patch.
> >
> > Reported-by: He, Shuang <shuang.he@intel.com>
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > ---
> >  drivers/gpu/drm/i915/i915_irq.c | 27 ++++++++++++++++++++-------
> >  1 file changed, 20 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> > index 8d169e1..598e9689 100644
> > --- a/drivers/gpu/drm/i915/i915_irq.c
> > +++ b/drivers/gpu/drm/i915/i915_irq.c
> > @@ -231,9 +231,6 @@ static void snb_update_pm_irq(struct drm_i915_private *dev_priv,
> >
> >         assert_spin_locked(&dev_priv->irq_lock);
> >
> > -       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
> > -               return;
> > -
> >         new_val = dev_priv->pm_irq_mask;
> >         new_val &= ~interrupt_mask;
> >         new_val |= (~enabled_irq_mask & interrupt_mask);
> > @@ -247,14 +244,26 @@ static void snb_update_pm_irq(struct drm_i915_private *dev_priv,
> >
> >  void gen6_enable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
> >  {
> > +       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
> > +               return;
> > +
> >         snb_update_pm_irq(dev_priv, mask, mask);
> >  }
> >
> > -void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
> > +static void __gen6_disable_pm_irq(struct drm_i915_private *dev_priv,
> > +                                 uint32_t mask)
> >  {
> >         snb_update_pm_irq(dev_priv, mask, 0);
> >  }
> >
> > +void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, uint32_t mask)
> > +{
> > +       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
> > +               return;
> > +
> > +       __gen6_disable_pm_irq(dev_priv, mask);
> > +}
> > +
> >  void gen6_reset_rps_interrupts(struct drm_device *dev)
> >  {
> >         struct drm_i915_private *dev_priv = dev->dev_private;
> > @@ -289,16 +298,20 @@ void gen6_disable_rps_interrupts(struct drm_device *dev)
> >
> >         cancel_work_sync(&dev_priv->rps.work);
> >
> > +       spin_lock_irq(&dev_priv->irq_lock);
> > +
> >         I915_WRITE(GEN6_PMINTRMSK, INTEL_INFO(dev_priv)->gen >= 8 ?
> >                    ~GEN8_PMINTR_REDIRECT_TO_NON_DISP : ~0);
> > +
> > +       __gen6_disable_pm_irq(dev_priv, dev_priv->pm_rps_events);
> >         I915_WRITE(gen6_pm_ier(dev_priv), I915_READ(gen6_pm_ier(dev_priv)) &
> >                                 ~dev_priv->pm_rps_events);
> > +       I915_WRITE(gen6_pm_iir(dev_priv), dev_priv->pm_rps_events);
> > +       I915_WRITE(gen6_pm_iir(dev_priv), dev_priv->pm_rps_events);
> >
> > -       spin_lock_irq(&dev_priv->irq_lock);
> >         dev_priv->rps.pm_iir = 0;
> > +
> >         spin_unlock_irq(&dev_priv->irq_lock);
> > -
> > -       I915_WRITE(gen6_pm_iir(dev_priv), dev_priv->pm_rps_events);
> >  }
> >
> >  /**
> > --
> > 1.8.4
> >
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 
> 
> 


_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

      parent reply	other threads:[~2014-12-01 16:42 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-20 21:01 [PATCH 1/2] drm/i915: mask RPS IRQs properly when disabling RPS Imre Deak
2014-11-20 21:01 ` [PATCH 2/2] drm/i915: sanitize RPS resetting during GPU reset Imre Deak
2014-11-22 23:17   ` [PATCH 2/2] drm/i915: sanitize RPS resetting during GPU shuang.he
2014-11-27 11:08   ` [PATCH 2/2] drm/i915: sanitize RPS resetting during GPU reset Imre Deak
2014-11-27 19:07     ` Daniel Vetter
2014-11-27 19:26       ` Imre Deak
2014-12-01 17:35   ` Paulo Zanoni
2014-12-01 16:29 ` [PATCH 1/2] drm/i915: mask RPS IRQs properly when disabling RPS Paulo Zanoni
2014-12-01 16:34   ` Chris Wilson
2014-12-01 16:47     ` Paulo Zanoni
2014-12-01 17:13       ` Imre Deak
2014-12-01 17:26       ` Daniel Vetter
2014-12-01 16:42   ` Imre Deak [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1417452128.11576.4.camel@intelbox \
    --to=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=przanoni@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.