[Intel-gfx] [PATCH 08/14] drm/i915: Make valleyview_display_irqs_(un)install() work for chv
Paulo Zanoni
przanoni at gmail.com
Thu Oct 30 21:12:51 CET 2014
2014-10-30 15:42 GMT-02:00 <ville.syrjala at linux.intel.com>:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Genralize valleyview_display_irqs_install() and
> valleyview_display_irqs_uninstall() enough so that they work on chv.
> The only difference to vlv here being the third pipe that chv brings.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/i915_irq.c | 27 +++++++++++++++++----------
> 1 file changed, 17 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 67c046b..50431f6 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -3335,24 +3335,27 @@ static void valleyview_display_irqs_install(struct drm_i915_private *dev_priv)
> {
> u32 pipestat_mask;
> u32 iir_mask;
> + enum pipe pipe;
>
> pipestat_mask = PIPESTAT_INT_STATUS_MASK |
> PIPE_FIFO_UNDERRUN_STATUS;
>
> - I915_WRITE(PIPESTAT(PIPE_A), pipestat_mask);
> - I915_WRITE(PIPESTAT(PIPE_B), pipestat_mask);
> + for_each_pipe(dev_priv, pipe)
> + I915_WRITE(PIPESTAT(pipe), pipestat_mask);
> POSTING_READ(PIPESTAT(PIPE_A));
>
> pipestat_mask = PLANE_FLIP_DONE_INT_STATUS_VLV |
> PIPE_CRC_DONE_INTERRUPT_STATUS;
>
> - i915_enable_pipestat(dev_priv, PIPE_A, pipestat_mask |
> - PIPE_GMBUS_INTERRUPT_STATUS);
> - i915_enable_pipestat(dev_priv, PIPE_B, pipestat_mask);
> + i915_enable_pipestat(dev_priv, PIPE_A, PIPE_GMBUS_INTERRUPT_STATUS);
> + for_each_pipe(dev_priv, pipe)
> + i915_enable_pipestat(dev_priv, pipe, pipestat_mask);
While trying to check for the correctness of the lines above, I
noticed that in __i915_enable_pipestat(), if the enable mask is
already what we want, we won't clear/update the status bits. Is that
correct? Why? Anyway, any problems in that function should be fixed by
a separate patch.
Reviewed-by: Paulo Zanoni <paulo.r.zanoni at intel.com>
>
> iir_mask = I915_DISPLAY_PORT_INTERRUPT |
> I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
> I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;
> + if (IS_CHERRYVIEW(dev_priv))
> + iir_mask |= I915_DISPLAY_PIPE_C_EVENT_INTERRUPT;
> dev_priv->irq_mask &= ~iir_mask;
>
> I915_WRITE(VLV_IIR, iir_mask);
> @@ -3366,10 +3369,13 @@ static void valleyview_display_irqs_uninstall(struct drm_i915_private *dev_priv)
> {
> u32 pipestat_mask;
> u32 iir_mask;
> + enum pipe pipe;
>
> iir_mask = I915_DISPLAY_PORT_INTERRUPT |
> I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
> I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;
> + if (IS_CHERRYVIEW(dev_priv))
> + iir_mask |= I915_DISPLAY_PIPE_C_EVENT_INTERRUPT;
>
> dev_priv->irq_mask |= iir_mask;
> I915_WRITE(VLV_IMR, dev_priv->irq_mask);
> @@ -3381,14 +3387,15 @@ static void valleyview_display_irqs_uninstall(struct drm_i915_private *dev_priv)
> pipestat_mask = PLANE_FLIP_DONE_INT_STATUS_VLV |
> PIPE_CRC_DONE_INTERRUPT_STATUS;
>
> - i915_disable_pipestat(dev_priv, PIPE_A, pipestat_mask |
> - PIPE_GMBUS_INTERRUPT_STATUS);
> - i915_disable_pipestat(dev_priv, PIPE_B, pipestat_mask);
> + i915_disable_pipestat(dev_priv, PIPE_A, PIPE_GMBUS_INTERRUPT_STATUS);
> + for_each_pipe(dev_priv, pipe)
> + i915_disable_pipestat(dev_priv, pipe, pipestat_mask);
>
> pipestat_mask = PIPESTAT_INT_STATUS_MASK |
> PIPE_FIFO_UNDERRUN_STATUS;
> - I915_WRITE(PIPESTAT(PIPE_A), pipestat_mask);
> - I915_WRITE(PIPESTAT(PIPE_B), pipestat_mask);
> +
> + for_each_pipe(dev_priv, pipe)
> + I915_WRITE(PIPESTAT(pipe), pipestat_mask);
> POSTING_READ(PIPESTAT(PIPE_A));
> }
>
> --
> 2.0.4
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Paulo Zanoni
More information about the Intel-gfx
mailing list