[Intel-gfx] [PATCH v3 1/4] drm/i915: Enable edp psr error interrupts on hsw
Souza, Jose
jose.souza at intel.com
Thu Apr 5 21:44:00 UTC 2018
On Thu, 2018-04-05 at 14:42 -0700, Dhinakaran Pandiyan wrote:
>
>
> On Thu, 2018-04-05 at 20:40 +0000, Souza, Jose wrote:
> > On Tue, 2018-04-03 at 14:24 -0700, Dhinakaran Pandiyan wrote:
> > > From: Daniel Vetter <daniel.vetter at ffwll.ch>
> > >
> > > The definitions for the error register should be valid on bdw/skl
> > > too,
> > > but there we haven't even enabled DE_MISC handling yet.
> > >
> > > Somewhat confusing the the moved register offset on bdw is only
> > > for
> > > the _CTL/_AUX register, and that _IIR/IMR stayed where they have
> > > been
> > > on bdw.
> > >
> > > v2: Fixes from Ville.
> > >
> > > v3: From DK
> > > * Rebased on drm-tip
> > > * Removed BDW IIR bit definition, looks like an unintentional
> > > change
> > > that
> > > should be in the following patch.
> > >
> > > v4: From DK
> > > * Don't mask REG_WRITE.
> > >
> > > Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
> > > Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
> > > Cc: Daniel Vetter <daniel.vetter at intel.com>
> >
> > With bspec id and comment about why are you masking interruptions
> > in
> > hsw_edp_psr_irq_handler() feel free to add:
> >
> > Reviewed-by: Jose Roberto de Souza <jose.souza at intel.com>
> >
> > > Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
> > > Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan at intel.com
> > > >
> > > ---
> > > drivers/gpu/drm/i915/i915_irq.c | 34
> > > ++++++++++++++++++++++++++++++++++
> > > drivers/gpu/drm/i915/i915_reg.h | 8 ++++++++
> > > 2 files changed, 42 insertions(+)
> > >
> > > diff --git a/drivers/gpu/drm/i915/i915_irq.c
> > > b/drivers/gpu/drm/i915/i915_irq.c
> > > index 27aee25429b7..c2d3f30778ee 100644
> > > --- a/drivers/gpu/drm/i915/i915_irq.c
> > > +++ b/drivers/gpu/drm/i915/i915_irq.c
> > > @@ -2391,6 +2391,26 @@ static void ilk_display_irq_handler(struct
> > > drm_i915_private *dev_priv,
> > > ironlake_rps_change_irq_handler(dev_priv);
> > > }
> > >
> > > +static void hsw_edp_psr_irq_handler(struct drm_i915_private
> > > *dev_priv)
> > > +{
> > > + u32 edp_psr_iir = I915_READ(EDP_PSR_IIR);
> > > +
> > > + if (edp_psr_iir & EDP_PSR_ERROR)
> > > + DRM_DEBUG_KMS("PSR error\n");
> > > +
> > > + if (edp_psr_iir & EDP_PSR_PRE_ENTRY) {
> > > + DRM_DEBUG_KMS("PSR prepare entry in 2
> > > vblanks\n");
> > > + I915_WRITE(EDP_PSR_IMR, EDP_PSR_PRE_ENTRY);
> >
> > Just to know... you need to mask this one otherwise it will keep
> > triggering EDP_PSR_PRE_ENTRY interruptions? Would be nice to have a
> > comment explaning why you are masking it.
> >
>
> The final implementation in patch 3/4 doesn't do that. Adding a
> comment
> here and removing will be pointless IMO.
Okay
>
> > > + }
> > > +
> > > + if (edp_psr_iir & EDP_PSR_POST_EXIT) {
> > > + DRM_DEBUG_KMS("PSR exit completed\n");
> > > + I915_WRITE(EDP_PSR_IMR, 0);
> > > + }
> > > +
> > > + I915_WRITE(EDP_PSR_IIR, edp_psr_iir);
> > > +}
> > > +
> > > static void ivb_display_irq_handler(struct drm_i915_private
> > > *dev_priv,
> > > u32 de_iir)
> > > {
> > > @@ -2403,6 +2423,9 @@ static void ivb_display_irq_handler(struct
> > > drm_i915_private *dev_priv,
> > > if (de_iir & DE_ERR_INT_IVB)
> > > ivb_err_int_handler(dev_priv);
> > >
> > > + if (de_iir & DE_EDP_PSR_INT_HSW)
> > > + hsw_edp_psr_irq_handler(dev_priv);
> > > +
> > > if (de_iir & DE_AUX_CHANNEL_A_IVB)
> > > dp_aux_irq_handler(dev_priv);
> > >
> > > @@ -3260,6 +3283,11 @@ static void ironlake_irq_reset(struct
> > > drm_device *dev)
> > > if (IS_GEN7(dev_priv))
> > > I915_WRITE(GEN7_ERR_INT, 0xffffffff);
> > >
> > > + if (IS_HASWELL(dev_priv)) {
> > > + I915_WRITE(EDP_PSR_IMR, 0xffffffff);
> > > + I915_WRITE(EDP_PSR_IIR, 0xffffffff);
> >
> > No need to do a POSTING_READ(EDP_PSR_IMR);? Like is done in:
> > GEN3_IRQ_RESET()
> >
>
> We should be fine without that. From what I was told a while ago,
> some
> of these POSTING_READS are cargo culted.
Ack
>
> > > + }
> > > +
> > > gen5_gt_irq_reset(dev_priv);
> > >
> > > ibx_irq_reset(dev_priv);
> > > @@ -3671,6 +3699,12 @@ static int ironlake_irq_postinstall(struct
> > > drm_device *dev)
> > > DE_DP_A_HOTPLUG);
> > > }
> > >
> > > + if (IS_HASWELL(dev_priv)) {
> > > + gen3_assert_iir_is_zero(dev_priv, EDP_PSR_IIR);
> > > + I915_WRITE(EDP_PSR_IMR, 0);
> > > + display_mask |= DE_EDP_PSR_INT_HSW;
> > > + }
> > > +
> > > dev_priv->irq_mask = ~display_mask;
> > >
> > > ibx_irq_pre_postinstall(dev);
> > > diff --git a/drivers/gpu/drm/i915/i915_reg.h
> > > b/drivers/gpu/drm/i915/i915_reg.h
> > > index 176dca6554f4..f5783d6db614 100644
> > > --- a/drivers/gpu/drm/i915/i915_reg.h
> > > +++ b/drivers/gpu/drm/i915/i915_reg.h
> > > @@ -4011,6 +4011,13 @@ enum {
> > > #define EDP_PSR_TP1_TIME_0us (3<<4)
> > > #define EDP_PSR_IDLE_FRAME_SHIFT 0
> > >
> > > +/* Bspec claims those aren't shifted but stay at 0x64800 */
> > > +#define EDP_PSR_IMR _MMIO(0x64834
> > > )
> > > +#define EDP_PSR_IIR _MMIO(0x64838
> > > )
> > > +#define EDP_PSR_ERROR (1<<2)
> > > +#define EDP_PSR_POST_EXIT (1<<1)
> > > +#define EDP_PSR_PRE_ENTRY (1<<0)
> >
> > Could you add the bspec id of where did you got this?
> > The hsw spec that I'm reading don't have the bits, skl have but
> > don't
> > have the bits of the other transcoders.
> >
>
> I understand it is not easy to find, but are we going to add bspec
> references for all new register definitions? :) From what I have
> seen, a
> bspec reference is typically added only for workarounds. I'll update
> this patch though since I've waited too long to get this patch in.
> Would
> adding the bspec reference in the commit message suffice?
Yeah in the commit message please.
>
>
> > > +
> > > #define EDP_PSR_AUX_CTL _MMIO(dev
> > > _pri
> > > v->psr_mmio_base + 0x10)
> > > #define EDP_PSR_AUX_CTL_TIME_OUT_MASK (3 << 26)
> > > #define EDP_PSR_AUX_CTL_MESSAGE_SIZE_MASK (0x1f << 20)
> > > @@ -6820,6 +6827,7 @@ enum {
> > > #define DE_PCH_EVENT_IVB (1<<28)
> > > #define DE_DP_A_HOTPLUG_IVB (1<<27)
> > > #define DE_AUX_CHANNEL_A_IVB (1<<26)
> > > +#define DE_EDP_PSR_INT_HSW (1<<19)
> > > #define DE_SPRITEC_FLIP_DONE_IVB (1<<14)
> > > #define DE_PLANEC_FLIP_DONE_IVB (1<<13)
> > > #define DE_PIPEC_VBLANK_IVB (1<<10)
>
>
More information about the Intel-gfx
mailing list