All of lore.kernel.org
 help / color / mirror / Atom feed
From: Imre Deak <imre.deak@intel.com>
To: ville.syrjala@linux.intel.com, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 2/6] drm/i915: Move the encoder vs. FDI dotclock check out from encoder .get_config()
Date: Thu, 18 Feb 2016 20:18:59 +0200	[thread overview]
Message-ID: <1455819539.7638.31.camel@intel.com> (raw)
In-Reply-To: <1455738073-14502-3-git-send-email-ville.syrjala@linux.intel.com>

On ke, 2016-02-17 at 21:41 +0200, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Currently we check if the encoder's idea of dotclock agrees with what
> we calculated based on the FDI parameters. We do this in the encoder
> .get_config() hooks, which isn't so nice in case the BIOS (or some
> other
> outside party) made a mess of the state and we're just trying to take
> over.
> 
> So as a prep step to being able sanitize such a bogus state, move the
> the sanity check to just after we've read out the entire state. If
> we then need to sanitize a bad state, it should be easier to move the
> sanity check to occur after sanitation instead of before it.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Separating the get-config and check steps makes things more logical in
any case. Looks ok to me:
Reviewed-by: Imre Deak <imre.deak@intel.com>

> ---
>  drivers/gpu/drm/i915/intel_crt.c     | 10 +------
>  drivers/gpu/drm/i915/intel_display.c | 57 ++++++++++++++++++++----
> ------------
>  drivers/gpu/drm/i915/intel_dp.c      | 11 ++-----
>  drivers/gpu/drm/i915/intel_drv.h     |  3 --
>  drivers/gpu/drm/i915/intel_hdmi.c    |  3 --
>  drivers/gpu/drm/i915/intel_lvds.c    |  8 +----
>  drivers/gpu/drm/i915/intel_sdvo.c    |  4 +--
>  7 files changed, 38 insertions(+), 58 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_crt.c
> b/drivers/gpu/drm/i915/intel_crt.c
> index e686a91a416e..f4c88d93a164 100644
> --- a/drivers/gpu/drm/i915/intel_crt.c
> +++ b/drivers/gpu/drm/i915/intel_crt.c
> @@ -120,17 +120,9 @@ static unsigned int intel_crt_get_flags(struct
> intel_encoder *encoder)
>  static void intel_crt_get_config(struct intel_encoder *encoder,
>  				 struct intel_crtc_state
> *pipe_config)
>  {
> -	struct drm_device *dev = encoder->base.dev;
> -	int dotclock;
> -
>  	pipe_config->base.adjusted_mode.flags |=
> intel_crt_get_flags(encoder);
>  
> -	dotclock = pipe_config->port_clock;
> -
> -	if (HAS_PCH_SPLIT(dev))
> -		ironlake_check_encoder_dotclock(pipe_config,
> dotclock);
> -
> -	pipe_config->base.adjusted_mode.crtc_clock = dotclock;
> +	pipe_config->base.adjusted_mode.crtc_clock = pipe_config-
> >port_clock;
>  }
>  
>  static void hsw_crt_get_config(struct intel_encoder *encoder,
> diff --git a/drivers/gpu/drm/i915/intel_display.c
> b/drivers/gpu/drm/i915/intel_display.c
> index f0f88061a9e5..99001e117517 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -224,12 +224,11 @@ static void intel_update_czclk(struct
> drm_i915_private *dev_priv)
>  }
>  
>  static inline u32 /* units of 100MHz */
> -intel_fdi_link_freq(struct drm_device *dev)
> +intel_fdi_link_freq(struct drm_i915_private *dev_priv)
>  {
> -	if (IS_GEN5(dev)) {
> -		struct drm_i915_private *dev_priv = dev-
> >dev_private;
> +	if (IS_GEN5(dev_priv))
>  		return (I915_READ(FDI_PLL_BIOS_0) &
> FDI_PLL_FB_CLOCK_MASK) + 2;
> -	} else
> +	else
>  		return 27;
>  }
>  
> @@ -6589,7 +6588,7 @@ retry:
>  	 * Hence the bw of each lane in terms of the mode signal
>  	 * is:
>  	 */
> -	link_bw = intel_fdi_link_freq(dev) * MHz(100)/KHz(1)/10;
> +	link_bw = intel_fdi_link_freq(to_i915(dev)) *
> MHz(100)/KHz(1)/10;
>  
>  	fdi_dotclock = adjusted_mode->crtc_clock;
>  
> @@ -6601,8 +6600,7 @@ retry:
>  	intel_link_compute_m_n(pipe_config->pipe_bpp, lane,
> fdi_dotclock,
>  			       link_bw, &pipe_config->fdi_m_n);
>  
> -	ret = ironlake_check_fdi_lanes(intel_crtc->base.dev,
> -				       intel_crtc->pipe,
> pipe_config);
> +	ret = ironlake_check_fdi_lanes(dev, intel_crtc->pipe,
> pipe_config);
>  	if (ret == -EINVAL && pipe_config->pipe_bpp > 6*3) {
>  		pipe_config->pipe_bpp -= 2*3;
>  		DRM_DEBUG_KMS("fdi link bw constraint, reducing pipe
> bpp to %i\n",
> @@ -10765,19 +10763,18 @@ int intel_dotclock_calculate(int link_freq,
>  static void ironlake_pch_clock_get(struct intel_crtc *crtc,
>  				   struct intel_crtc_state
> *pipe_config)
>  {
> -	struct drm_device *dev = crtc->base.dev;
> +	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
>  
>  	/* read out port_clock from the DPLL */
>  	i9xx_crtc_clock_get(crtc, pipe_config);
>  
>  	/*
> -	 * This value does not include pixel_multiplier.
> -	 * We will check that port_clock and
> adjusted_mode.crtc_clock
> -	 * agree once we know their relationship in the encoder's
> -	 * get_config() function.
> +	 * In case there is an active pipe without active ports,
> +	 * we may need some idea for the dotclock anyway.
> +	 * Calculate one based on the FDI configuration.
>  	 */
>  	pipe_config->base.adjusted_mode.crtc_clock =
> -		intel_dotclock_calculate(intel_fdi_link_freq(dev) *
> 10000,
> +		intel_dotclock_calculate(intel_fdi_link_freq(dev_pri
> v) * 10000,
>  					 &pipe_config->fdi_m_n);
>  }
>  
> @@ -12788,6 +12785,24 @@ intel_pipe_config_compare(struct drm_device
> *dev,
>  	return ret;
>  }
>  
> +static void intel_pipe_config_sanity_check(struct drm_i915_private
> *dev_priv,
> +					   const struct
> intel_crtc_state *pipe_config)
> +{
> +	if (pipe_config->has_pch_encoder) {
> +		int fdi_dotclock =
> intel_dotclock_calculate(intel_fdi_link_freq(dev_priv) * 10000,
> +							    &pipe_co
> nfig->fdi_m_n);
> +		int dotclock = pipe_config-
> >base.adjusted_mode.crtc_clock;
> +
> +		/*
> +		 * FDI already provided one idea for the dotclock.
> +		 * Yell if the encoder disagrees.
> +		 */
> +		WARN(!intel_fuzzy_clock_check(fdi_dotclock,
> dotclock),
> +		     "FDI dotclock and encoder dotclock mismatch,
> fdi: %i, encoder: %i\n",
> +		     fdi_dotclock, dotclock);
> +	}
> +}
> +
>  static void check_wm_state(struct drm_device *dev)
>  {
>  	struct drm_i915_private *dev_priv = dev->dev_private;
> @@ -12961,6 +12976,8 @@ check_crtc_state(struct drm_device *dev,
> struct drm_atomic_state *old_state)
>  		if (!crtc->state->active)
>  			continue;
>  
> +		intel_pipe_config_sanity_check(dev_priv,
> pipe_config);
> +
>  		sw_config = to_intel_crtc_state(crtc->state);
>  		if (!intel_pipe_config_compare(dev, sw_config,
>  					       pipe_config, false))
> {
> @@ -13033,18 +13050,6 @@ intel_modeset_check_state(struct drm_device
> *dev,
>  	check_shared_dpll_state(dev);
>  }
>  
> -void ironlake_check_encoder_dotclock(const struct intel_crtc_state
> *pipe_config,
> -				     int dotclock)
> -{
> -	/*
> -	 * FDI already provided one idea for the dotclock.
> -	 * Yell if the encoder disagrees.
> -	 */
> -	WARN(!intel_fuzzy_clock_check(pipe_config-
> >base.adjusted_mode.crtc_clock, dotclock),
> -	     "FDI dotclock and encoder dotclock mismatch, fdi: %i,
> encoder: %i\n",
> -	     pipe_config->base.adjusted_mode.crtc_clock, dotclock);
> -}
> -
>  static void update_scanline_offset(struct intel_crtc *crtc)
>  {
>  	struct drm_device *dev = crtc->base.dev;
> @@ -15847,6 +15852,8 @@ static void
> intel_modeset_readout_hw_state(struct drm_device *dev)
>  			drm_calc_timestamping_constants(&crtc->base, 
> &crtc->base.hwmode);
>  			update_scanline_offset(crtc);
>  		}
> +
> +		intel_pipe_config_sanity_check(dev_priv, crtc-
> >config);
>  	}
>  }
>  
> diff --git a/drivers/gpu/drm/i915/intel_dp.c
> b/drivers/gpu/drm/i915/intel_dp.c
> index cbc06596659a..f272b3541e00 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -2409,7 +2409,6 @@ static void intel_dp_get_config(struct
> intel_encoder *encoder,
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	enum port port = dp_to_dig_port(intel_dp)->port;
>  	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
> -	int dotclock;
>  
>  	tmp = I915_READ(intel_dp->output_reg);
>  
> @@ -2459,13 +2458,9 @@ static void intel_dp_get_config(struct
> intel_encoder *encoder,
>  			pipe_config->port_clock = 270000;
>  	}
>  
> -	dotclock = intel_dotclock_calculate(pipe_config->port_clock,
> -					    &pipe_config->dp_m_n);
> -
> -	if (HAS_PCH_SPLIT(dev_priv->dev) && port != PORT_A)
> -		ironlake_check_encoder_dotclock(pipe_config,
> dotclock);
> -
> -	pipe_config->base.adjusted_mode.crtc_clock = dotclock;
> +	pipe_config->base.adjusted_mode.crtc_clock =
> +		intel_dotclock_calculate(pipe_config->port_clock,
> +					 &pipe_config->dp_m_n);
>  
>  	if (is_edp(intel_dp) && dev_priv->vbt.edp_bpp &&
>  	    pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
> diff --git a/drivers/gpu/drm/i915/intel_drv.h
> b/drivers/gpu/drm/i915/intel_drv.h
> index f95f8b22939f..c25a8880b4e8 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1197,9 +1197,6 @@ void intel_dp_get_m_n(struct intel_crtc *crtc,
>  		      struct intel_crtc_state *pipe_config);
>  void intel_dp_set_m_n(struct intel_crtc *crtc, enum link_m_n_set
> m_n);
>  int intel_dotclock_calculate(int link_freq, const struct
> intel_link_m_n *m_n);
> -void
> -ironlake_check_encoder_dotclock(const struct intel_crtc_state
> *pipe_config,
> -				int dotclock);
>  bool bxt_find_best_dpll(struct intel_crtc_state *crtc_state, int
> target_clock,
>  			intel_clock_t *best_clock);
>  int chv_calc_dpll_params(int refclk, intel_clock_t *pll_clock);
> diff --git a/drivers/gpu/drm/i915/intel_hdmi.c
> b/drivers/gpu/drm/i915/intel_hdmi.c
> index 80b44c054087..d8060e6251f8 100644
> --- a/drivers/gpu/drm/i915/intel_hdmi.c
> +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> @@ -952,9 +952,6 @@ static void intel_hdmi_get_config(struct
> intel_encoder *encoder,
>  	if (pipe_config->pixel_multiplier)
>  		dotclock /= pipe_config->pixel_multiplier;
>  
> -	if (HAS_PCH_SPLIT(dev_priv->dev))
> -		ironlake_check_encoder_dotclock(pipe_config,
> dotclock);
> -
>  	pipe_config->base.adjusted_mode.crtc_clock = dotclock;
>  }
>  
> diff --git a/drivers/gpu/drm/i915/intel_lvds.c
> b/drivers/gpu/drm/i915/intel_lvds.c
> index 30a8403a8f4f..b35342f7b969 100644
> --- a/drivers/gpu/drm/i915/intel_lvds.c
> +++ b/drivers/gpu/drm/i915/intel_lvds.c
> @@ -109,7 +109,6 @@ static void intel_lvds_get_config(struct
> intel_encoder *encoder,
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	struct intel_lvds_encoder *lvds_encoder =
> to_lvds_encoder(&encoder->base);
>  	u32 tmp, flags = 0;
> -	int dotclock;
>  
>  	tmp = I915_READ(lvds_encoder->reg);
>  	if (tmp & LVDS_HSYNC_POLARITY)
> @@ -130,12 +129,7 @@ static void intel_lvds_get_config(struct
> intel_encoder *encoder,
>  		pipe_config->gmch_pfit.control |= tmp &
> PANEL_8TO6_DITHER_ENABLE;
>  	}
>  
> -	dotclock = pipe_config->port_clock;
> -
> -	if (HAS_PCH_SPLIT(dev_priv->dev))
> -		ironlake_check_encoder_dotclock(pipe_config,
> dotclock);
> -
> -	pipe_config->base.adjusted_mode.crtc_clock = dotclock;
> +	pipe_config->base.adjusted_mode.crtc_clock = pipe_config-
> >port_clock;
>  }
>  
>  static void intel_pre_enable_lvds(struct intel_encoder *encoder)
> diff --git a/drivers/gpu/drm/i915/intel_sdvo.c
> b/drivers/gpu/drm/i915/intel_sdvo.c
> index 4ecc076c4041..fae64bc93c1b 100644
> --- a/drivers/gpu/drm/i915/intel_sdvo.c
> +++ b/drivers/gpu/drm/i915/intel_sdvo.c
> @@ -1398,12 +1398,10 @@ static void intel_sdvo_get_config(struct
> intel_encoder *encoder,
>  	}
>  
>  	dotclock = pipe_config->port_clock;
> +
>  	if (pipe_config->pixel_multiplier)
>  		dotclock /= pipe_config->pixel_multiplier;
>  
> -	if (HAS_PCH_SPLIT(dev))
> -		ironlake_check_encoder_dotclock(pipe_config,
> dotclock);
> -
>  	pipe_config->base.adjusted_mode.crtc_clock = dotclock;
>  
>  	/* Cross check the port pixel multiplier with the sdvo
> encoder state. */
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2016-02-18 18:19 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-17 19:41 [PATCH 0/6] drm/i915: Some FDI related dotclock stuff ville.syrjala
2016-02-17 19:41 ` [PATCH 1/6] drm/i915: Dump ddi_pll_sel in hex instead of decimal on HSW/BDW ville.syrjala
2016-02-18 13:19   ` Imre Deak
2016-02-17 19:41 ` [PATCH 2/6] drm/i915: Move the encoder vs. FDI dotclock check out from encoder .get_config() ville.syrjala
2016-02-18 18:18   ` Imre Deak [this message]
2016-02-17 19:41 ` [PATCH 3/6] drm/i915: Remove the SPLL==270Mhz assumption from intel_fdi_link_freq() ville.syrjala
2016-02-18 18:28   ` Imre Deak
2016-02-17 19:41 ` [PATCH 4/6] drm/i915: Make the LPT iclkip 20MHz case more generic ville.syrjala
2016-02-19 13:54   ` Zanoni, Paulo R
2016-02-19 14:04   ` Imre Deak
2016-02-17 19:41 ` [PATCH 5/6] drm/i915: Read out VGA dotclock properly on LPT ville.syrjala
2016-02-19 14:17   ` Imre Deak
2016-02-17 19:41 ` [PATCH 6/6] drm/i915: Try to fix CRT port clock limits ville.syrjala
2016-02-19 14:58   ` Imre Deak
2016-02-19 13:45 ` ✗ Fi.CI.BAT: failure for drm/i915: Some FDI related dotclock stuff Patchwork
2016-02-25 18:15   ` Ville Syrjälä
2016-03-01 11:13 ` [PATCH 0/6] " Ville Syrjälä

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=1455819539.7638.31.camel@intel.com \
    --to=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=ville.syrjala@linux.intel.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.