[Intel-gfx] [PATCH 2/2] drm/i915: Cleanup crt disable sequence on hsw+
Daniel Vetter
daniel at ffwll.ch
Tue Aug 23 14:35:23 UTC 2016
On Tue, Aug 23, 2016 at 04:18:08PM +0200, Maarten Lankhorst wrote:
> Instead of iterating overthe connectors manually, run the last part of
> DDI disabling inside the crt post disable function.
>
> This was meant to be addressed before submitting the other commit,
> but I missed the review comments.
>
> Fixes: fd6bbda9c7a4 ("drm/i915: Pass crtc_state and connector_state to encoder functions")
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
Yup, I think that's much more tidy.
Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
> drivers/gpu/drm/i915/intel_crt.c | 15 ++++++++
> drivers/gpu/drm/i915/intel_ddi.c | 67 ++++++++++++++++++------------------
> drivers/gpu/drm/i915/intel_display.c | 25 ++------------
> drivers/gpu/drm/i915/intel_drv.h | 8 +++--
> 4 files changed, 57 insertions(+), 58 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
> index 1daf2d9c937e..dfbcf16b41df 100644
> --- a/drivers/gpu/drm/i915/intel_crt.c
> +++ b/drivers/gpu/drm/i915/intel_crt.c
> @@ -215,6 +215,20 @@ static void pch_post_disable_crt(struct intel_encoder *encoder,
> intel_disable_crt(encoder, old_crtc_state, old_conn_state);
> }
>
> +static void hsw_post_disable_crt(struct intel_encoder *encoder,
> + struct intel_crtc_state *old_crtc_state,
> + struct drm_connector_state *old_conn_state)
> +{
> + struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> +
> + pch_post_disable_crt(encoder, old_crtc_state, old_conn_state);
> +
> + lpt_disable_pch_transcoder(dev_priv);
> + lpt_disable_iclkip(dev_priv);
> +
> + intel_ddi_fdi_post_disable(encoder, old_crtc_state, old_conn_state);
> +}
> +
> static void intel_enable_crt(struct intel_encoder *encoder,
> struct intel_crtc_state *pipe_config,
> struct drm_connector_state *conn_state)
> @@ -905,6 +919,7 @@ void intel_crt_init(struct drm_device *dev)
> if (HAS_DDI(dev)) {
> crt->base.get_config = hsw_crt_get_config;
> crt->base.get_hw_state = intel_ddi_get_hw_state;
> + crt->base.post_disable = hsw_post_disable_crt;
> } else {
> crt->base.get_config = intel_crt_get_config;
> crt->base.get_hw_state = intel_crt_get_hw_state;
> diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
> index 309ba7bc19ad..bbd81c6bdd69 100644
> --- a/drivers/gpu/drm/i915/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/intel_ddi.c
> @@ -1714,6 +1714,40 @@ static void intel_ddi_post_disable(struct intel_encoder *intel_encoder,
> }
> }
>
> +void intel_ddi_fdi_post_disable(struct intel_encoder *intel_encoder,
> + struct intel_crtc_state *old_crtc_state,
> + struct drm_connector_state *old_conn_state)
> +{
> + struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
> + uint32_t val;
> +
> + /*
> + * Bspec lists this as both step 13 (before DDI_BUF_CTL disable)
> + * and step 18 (after clearing PORT_CLK_SEL). Based on a BUN,
> + * step 13 is the correct place for it. Step 18 is where it was
> + * originally before the BUN.
> + */
> + val = I915_READ(FDI_RX_CTL(PIPE_A));
> + val &= ~FDI_RX_ENABLE;
> + I915_WRITE(FDI_RX_CTL(PIPE_A), val);
> +
> + intel_ddi_post_disable(intel_encoder, old_crtc_state, old_conn_state);
> +
> + val = I915_READ(FDI_RX_MISC(PIPE_A));
> + val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
> + val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
> + I915_WRITE(FDI_RX_MISC(PIPE_A), val);
> +
> + val = I915_READ(FDI_RX_CTL(PIPE_A));
> + val &= ~FDI_PCDCLK;
> + I915_WRITE(FDI_RX_CTL(PIPE_A), val);
> +
> + val = I915_READ(FDI_RX_CTL(PIPE_A));
> + val &= ~FDI_RX_PLL_ENABLE;
> + I915_WRITE(FDI_RX_CTL(PIPE_A), val);
> +}
> +
> +
> static void intel_enable_ddi(struct intel_encoder *intel_encoder,
> struct intel_crtc_state *pipe_config,
> struct drm_connector_state *conn_state)
> @@ -2153,39 +2187,6 @@ void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
> udelay(600);
> }
>
> -void intel_ddi_fdi_disable(struct intel_encoder *intel_encoder,
> - struct intel_crtc_state *old_crtc_state,
> - struct drm_connector_state *old_conn_state)
> -{
> - struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
> - uint32_t val;
> -
> - /*
> - * Bspec lists this as both step 13 (before DDI_BUF_CTL disable)
> - * and step 18 (after clearing PORT_CLK_SEL). Based on a BUN,
> - * step 13 is the correct place for it. Step 18 is where it was
> - * originally before the BUN.
> - */
> - val = I915_READ(FDI_RX_CTL(PIPE_A));
> - val &= ~FDI_RX_ENABLE;
> - I915_WRITE(FDI_RX_CTL(PIPE_A), val);
> -
> - intel_ddi_post_disable(intel_encoder, old_crtc_state, old_conn_state);
> -
> - val = I915_READ(FDI_RX_MISC(PIPE_A));
> - val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
> - val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
> - I915_WRITE(FDI_RX_MISC(PIPE_A), val);
> -
> - val = I915_READ(FDI_RX_CTL(PIPE_A));
> - val &= ~FDI_PCDCLK;
> - I915_WRITE(FDI_RX_CTL(PIPE_A), val);
> -
> - val = I915_READ(FDI_RX_CTL(PIPE_A));
> - val &= ~FDI_RX_PLL_ENABLE;
> - I915_WRITE(FDI_RX_CTL(PIPE_A), val);
> -}
> -
> void intel_ddi_get_config(struct intel_encoder *encoder,
> struct intel_crtc_state *pipe_config)
> {
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 2ae080f947e8..8bd9cdb00869 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -1907,7 +1907,7 @@ static void ironlake_disable_pch_transcoder(struct drm_i915_private *dev_priv,
> }
> }
>
> -static void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv)
> +void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv)
> {
> u32 val;
>
> @@ -4292,7 +4292,7 @@ static int intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc)
> return 0;
> }
>
> -static void lpt_disable_iclkip(struct drm_i915_private *dev_priv)
> +void lpt_disable_iclkip(struct drm_i915_private *dev_priv)
> {
> u32 temp;
>
> @@ -5606,28 +5606,9 @@ static void haswell_crtc_disable(struct intel_crtc_state *old_crtc_state,
>
> intel_encoders_post_disable(crtc, old_crtc_state, old_state);
>
> - if (intel_crtc->config->has_pch_encoder) {
> - struct drm_connector_state *old_conn_state;
> - struct drm_connector *conn;
> - int i;
> -
> - lpt_disable_pch_transcoder(dev_priv);
> - lpt_disable_iclkip(dev_priv);
> -
> - for_each_connector_in_state(old_state, conn, old_conn_state, i)
> - if (old_conn_state->crtc == crtc) {
> - struct intel_encoder *encoder =
> - to_intel_encoder(old_conn_state->best_encoder);
> -
> - intel_ddi_fdi_disable(encoder,
> - old_crtc_state,
> - old_conn_state);
> - break;
> - }
> -
> + if (old_crtc_state->has_pch_encoder)
> intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
> true);
> - }
> }
>
> static void i9xx_pfit_enable(struct intel_crtc *crtc)
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 690fa463a6bc..f241a47b6e3a 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1137,6 +1137,9 @@ void intel_crt_reset(struct drm_encoder *encoder);
> /* intel_ddi.c */
> void intel_ddi_clk_select(struct intel_encoder *encoder,
> const struct intel_crtc_state *pipe_config);
> +void intel_ddi_fdi_post_disable(struct intel_encoder *intel_encoder,
> + struct intel_crtc_state *old_crtc_state,
> + struct drm_connector_state *old_conn_state);
> void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder);
> void hsw_fdi_link_train(struct drm_crtc *crtc);
> void intel_ddi_init(struct drm_device *dev, enum port port);
> @@ -1152,9 +1155,6 @@ bool intel_ddi_pll_select(struct intel_crtc *crtc,
> void intel_ddi_set_pipe_settings(struct drm_crtc *crtc);
> void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp);
> bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
> -void intel_ddi_fdi_disable(struct intel_encoder *,
> - struct intel_crtc_state *,
> - struct drm_connector_state *);
> void intel_ddi_get_config(struct intel_encoder *encoder,
> struct intel_crtc_state *pipe_config);
> struct intel_encoder *
> @@ -1185,6 +1185,8 @@ void skl_set_preferred_cdclk_vco(struct drm_i915_private *dev_priv, int vco);
> void intel_update_rawclk(struct drm_i915_private *dev_priv);
> int vlv_get_cck_clock(struct drm_i915_private *dev_priv,
> const char *name, u32 reg, int ref_freq);
> +void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv);
> +void lpt_disable_iclkip(struct drm_i915_private *dev_priv);
> extern const struct drm_plane_funcs intel_plane_funcs;
> void intel_init_display_hooks(struct drm_i915_private *dev_priv);
> unsigned int intel_fb_xy_to_linear(int x, int y,
> --
> 2.7.4
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the Intel-gfx
mailing list