[alsa-devel] [PATCH 03/11] drm/i915: Stop pretending to mask/unmask LPE audio interrupts

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Wed Apr 26 02:27:32 CEST 2017


On 4/25/17 3:27 PM, ville.syrjala at linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> vlv_display_irq_postinstall() enables the LPE audio interrupts
> regardless of whether the LPE audio irq chip has masked/unmasked
> them. Also the irqchip masking/unmasking doesn't consider the state
> of the display power well or the device, and hence just leads to
> dmesg spew when it tries to access the hardware while it's powered
> down.
>
> If the current way works, then we don't need to do anything in the
> mask/unmask hooks. If it doesn't work, well, then we'd need to properly
> track whether the irqchip has masked/unmasked the interrupts when
> we enable display interrupts. And the mask/unmask hooks would need
> to check whether display interrupts are even enabled before frobbing
> with he registers.
>
> So let's just assume the current way works and neuter the mask/unmask
> hooks. Also clean up vlv_display_irq_postinstall() a bit and stop
> it from trying to unmask/enable the LPE C interrupt on VLV since it
> doesn't exist.

No objections, I assumed that we did want to update VLV_IMR and VLV_IIR 
in the mask/unmask, that was the initial recommendation IIRC

There was also a comment where we removed all tests in 
vlv_display_irq_postinstall:

 >> +		if (IS_LPE_AUDIO_ENABLED(dev_priv))
 >> +			if (IS_LPE_AUDIO_IRQ_VALID(dev_priv))
 >
 >I think both of these checks can be removed. We won't unmask the
 >interrupts unless lpe is enabled, so the IIR bits will never be set in
 >that case.




>
> Cc: Takashi Iwai <tiwai at suse.de>
> Cc: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/i915_irq.c        | 15 ++++++--------
>  drivers/gpu/drm/i915/intel_lpe_audio.c | 36 ----------------------------------
>  2 files changed, 6 insertions(+), 45 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index fd97fe00cd0d..190f6aa5d15e 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -2953,7 +2953,6 @@ static void vlv_display_irq_postinstall(struct drm_i915_private *dev_priv)
>  	u32 pipestat_mask;
>  	u32 enable_mask;
>  	enum pipe pipe;
> -	u32 val;
>
>  	pipestat_mask = PLANE_FLIP_DONE_INT_STATUS_VLV |
>  			PIPE_CRC_DONE_INTERRUPT_STATUS;
> @@ -2964,18 +2963,16 @@ static void vlv_display_irq_postinstall(struct drm_i915_private *dev_priv)
>
>  	enable_mask = I915_DISPLAY_PORT_INTERRUPT |
>  		I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
> -		I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;
> +		I915_DISPLAY_PIPE_B_EVENT_INTERRUPT |
> +		I915_LPE_PIPE_A_INTERRUPT |
> +		I915_LPE_PIPE_B_INTERRUPT;
> +
>  	if (IS_CHERRYVIEW(dev_priv))
> -		enable_mask |= I915_DISPLAY_PIPE_C_EVENT_INTERRUPT;
> +		enable_mask |= I915_DISPLAY_PIPE_C_EVENT_INTERRUPT |
> +			I915_LPE_PIPE_C_INTERRUPT;
>
>  	WARN_ON(dev_priv->irq_mask != ~0);
>
> -	val = (I915_LPE_PIPE_A_INTERRUPT |
> -		I915_LPE_PIPE_B_INTERRUPT |
> -		I915_LPE_PIPE_C_INTERRUPT);
> -
> -	enable_mask |= val;
> -
>  	dev_priv->irq_mask = ~enable_mask;
>
>  	GEN5_IRQ_INIT(VLV_, dev_priv->irq_mask, enable_mask);
> diff --git a/drivers/gpu/drm/i915/intel_lpe_audio.c b/drivers/gpu/drm/i915/intel_lpe_audio.c
> index 668f00480d97..292fedf30b00 100644
> --- a/drivers/gpu/drm/i915/intel_lpe_audio.c
> +++ b/drivers/gpu/drm/i915/intel_lpe_audio.c
> @@ -149,44 +149,10 @@ static void lpe_audio_platdev_destroy(struct drm_i915_private *dev_priv)
>
>  static void lpe_audio_irq_unmask(struct irq_data *d)
>  {
> -	struct drm_i915_private *dev_priv = d->chip_data;
> -	unsigned long irqflags;
> -	u32 val = (I915_LPE_PIPE_A_INTERRUPT |
> -		I915_LPE_PIPE_B_INTERRUPT);
> -
> -	if (IS_CHERRYVIEW(dev_priv))
> -		val |= I915_LPE_PIPE_C_INTERRUPT;
> -
> -	spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
> -
> -	dev_priv->irq_mask &= ~val;
> -	I915_WRITE(VLV_IIR, val);
> -	I915_WRITE(VLV_IIR, val);
> -	I915_WRITE(VLV_IMR, dev_priv->irq_mask);
> -	POSTING_READ(VLV_IMR);
> -
> -	spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
>  }
>
>  static void lpe_audio_irq_mask(struct irq_data *d)
>  {
> -	struct drm_i915_private *dev_priv = d->chip_data;
> -	unsigned long irqflags;
> -	u32 val = (I915_LPE_PIPE_A_INTERRUPT |
> -		I915_LPE_PIPE_B_INTERRUPT);
> -
> -	if (IS_CHERRYVIEW(dev_priv))
> -		val |= I915_LPE_PIPE_C_INTERRUPT;
> -
> -	spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
> -
> -	dev_priv->irq_mask |= val;
> -	I915_WRITE(VLV_IMR, dev_priv->irq_mask);
> -	I915_WRITE(VLV_IIR, val);
> -	I915_WRITE(VLV_IIR, val);
> -	POSTING_READ(VLV_IIR);
> -
> -	spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags);
>  }
>
>  static struct irq_chip lpe_audio_irqchip = {
> @@ -330,8 +296,6 @@ void intel_lpe_audio_teardown(struct drm_i915_private *dev_priv)
>
>  	desc = irq_to_desc(dev_priv->lpe_audio.irq);
>
> -	lpe_audio_irq_mask(&desc->irq_data);
> -
>  	lpe_audio_platdev_destroy(dev_priv);
>
>  	irq_free_desc(dev_priv->lpe_audio.irq);
>



More information about the Alsa-devel mailing list