[Intel-gfx] [PATCH 4/6] drm/i915: Introduce intel_panel_compute_config()

Ville Syrjälä ville.syrjala at linux.intel.com
Fri Sep 24 12:41:23 UTC 2021


On Thu, Sep 23, 2021 at 11:01:07PM +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Let's introduce a compute_config() helper for fixed mode panels.
> For now all it does is the fixed_mode->adjusted_mode copy.
> 
> Note that with sDVO we have to ask the external encoder chip
> to spit out our actual display timings for us, so we won't
> use intel_panel_compute_config() there.

Hmm. Actually I think it would be fine to use it as is since we
just overwrite adjusted_mode with the data from the encder, and 
we don't use adjusted_mode for anything else before that. So
overwriting it with the fixed_mode just prior to overwriting it
with the mode returned by the encoder should be OK.

That would avoid having to hand roll the refresh rate check for
sdvo in the followup patch.

> 
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/display/icl_dsi.c     |  7 ++++---
>  drivers/gpu/drm/i915/display/intel_dp.c    |  5 +++--
>  drivers/gpu/drm/i915/display/intel_dvo.c   | 10 ++++++++--
>  drivers/gpu/drm/i915/display/intel_lvds.c  |  5 +++--
>  drivers/gpu/drm/i915/display/intel_panel.c | 11 +++++++++--
>  drivers/gpu/drm/i915/display/intel_panel.h |  2 ++
>  drivers/gpu/drm/i915/display/vlv_dsi.c     |  4 +++-
>  7 files changed, 32 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
> index 060bc8fb0d30..a6edd5241b14 100644
> --- a/drivers/gpu/drm/i915/display/icl_dsi.c
> +++ b/drivers/gpu/drm/i915/display/icl_dsi.c
> @@ -1666,14 +1666,15 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder,
>  	struct intel_dsi *intel_dsi = container_of(encoder, struct intel_dsi,
>  						   base);
>  	struct intel_connector *intel_connector = intel_dsi->attached_connector;
> -	const struct drm_display_mode *fixed_mode =
> -		intel_connector->panel.fixed_mode;
>  	struct drm_display_mode *adjusted_mode =
>  		&pipe_config->hw.adjusted_mode;
>  	int ret;
>  
>  	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
> -	intel_panel_fixed_mode(fixed_mode, adjusted_mode);
> +
> +	ret = intel_panel_compute_config(intel_connector, adjusted_mode);
> +	if (ret)
> +		return ret;
>  
>  	ret = intel_panel_fitting(pipe_config, conn_state);
>  	if (ret)
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index 2b8b495fc2a9..b5cd188ca520 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -1757,8 +1757,9 @@ intel_dp_compute_config(struct intel_encoder *encoder,
>  		pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
>  
>  	if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
> -		intel_panel_fixed_mode(intel_connector->panel.fixed_mode,
> -				       adjusted_mode);
> +		ret = intel_panel_compute_config(intel_connector, adjusted_mode);
> +		if (ret)
> +			return ret;
>  
>  		ret = intel_panel_fitting(pipe_config, conn_state);
>  		if (ret)
> diff --git a/drivers/gpu/drm/i915/display/intel_dvo.c b/drivers/gpu/drm/i915/display/intel_dvo.c
> index f8fdc0386fd4..2eeb209afc64 100644
> --- a/drivers/gpu/drm/i915/display/intel_dvo.c
> +++ b/drivers/gpu/drm/i915/display/intel_dvo.c
> @@ -256,6 +256,7 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder,
>  				    struct drm_connector_state *conn_state)
>  {
>  	struct intel_dvo *intel_dvo = enc_to_dvo(encoder);
> +	struct intel_connector *connector = to_intel_connector(conn_state->connector);
>  	const struct drm_display_mode *fixed_mode =
>  		intel_dvo->attached_connector->panel.fixed_mode;
>  	struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
> @@ -266,8 +267,13 @@ static int intel_dvo_compute_config(struct intel_encoder *encoder,
>  	 * with the panel scaling set up to source from the H/VDisplay
>  	 * of the original mode.
>  	 */
> -	if (fixed_mode)
> -		intel_panel_fixed_mode(fixed_mode, adjusted_mode);
> +	if (fixed_mode) {
> +		int ret;
> +
> +		ret = intel_panel_compute_config(connector, adjusted_mode);
> +		if (ret)
> +			return ret;
> +	}
>  
>  	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
>  		return -EINVAL;
> diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c
> index 37e81bc71f7c..130e6ea61e11 100644
> --- a/drivers/gpu/drm/i915/display/intel_lvds.c
> +++ b/drivers/gpu/drm/i915/display/intel_lvds.c
> @@ -444,8 +444,9 @@ static int intel_lvds_compute_config(struct intel_encoder *intel_encoder,
>  	 * with the panel scaling set up to source from the H/VDisplay
>  	 * of the original mode.
>  	 */
> -	intel_panel_fixed_mode(intel_connector->panel.fixed_mode,
> -			       adjusted_mode);
> +	ret = intel_panel_compute_config(intel_connector, adjusted_mode);
> +	if (ret)
> +		return ret;
>  
>  	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
>  		return -EINVAL;
> diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c
> index b2ad0f065218..77c1ca387de0 100644
> --- a/drivers/gpu/drm/i915/display/intel_panel.c
> +++ b/drivers/gpu/drm/i915/display/intel_panel.c
> @@ -45,12 +45,19 @@ bool intel_panel_use_ssc(struct drm_i915_private *i915)
>  		&& !(i915->quirks & QUIRK_LVDS_SSC_DISABLE);
>  }
>  
> -void intel_panel_fixed_mode(const struct drm_display_mode *fixed_mode,
> -			    struct drm_display_mode *adjusted_mode)
> +int intel_panel_compute_config(struct intel_connector *connector,
> +			       struct drm_display_mode *adjusted_mode)
>  {
> +	const struct drm_display_mode *fixed_mode = connector->panel.fixed_mode;
> +
> +	if (!fixed_mode)
> +		return 0;
> +
>  	drm_mode_copy(adjusted_mode, fixed_mode);
>  
>  	drm_mode_set_crtcinfo(adjusted_mode, 0);
> +
> +	return 0;
>  }
>  
>  static bool is_downclock_mode(const struct drm_display_mode *downclock_mode,
> diff --git a/drivers/gpu/drm/i915/display/intel_panel.h b/drivers/gpu/drm/i915/display/intel_panel.h
> index 71bad6d546fa..d50b3f7e9e58 100644
> --- a/drivers/gpu/drm/i915/display/intel_panel.h
> +++ b/drivers/gpu/drm/i915/display/intel_panel.h
> @@ -31,6 +31,8 @@ intel_panel_mode_valid(struct intel_connector *connector,
>  		       const struct drm_display_mode *mode);
>  int intel_panel_fitting(struct intel_crtc_state *crtc_state,
>  			const struct drm_connector_state *conn_state);
> +int intel_panel_compute_config(struct intel_connector *connector,
> +			       struct drm_display_mode *adjusted_mode);
>  struct drm_display_mode *
>  intel_panel_edid_downclock_mode(struct intel_connector *connector,
>  				const struct drm_display_mode *fixed_mode);
> diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c
> index b0a2b6b96799..260e852245e9 100644
> --- a/drivers/gpu/drm/i915/display/vlv_dsi.c
> +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c
> @@ -279,7 +279,9 @@ static int intel_dsi_compute_config(struct intel_encoder *encoder,
>  	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
>  
>  	if (fixed_mode) {
> -		intel_panel_fixed_mode(fixed_mode, adjusted_mode);
> +		ret = intel_panel_compute_config(intel_connector, adjusted_mode);
> +		if (ret)
> +			return ret;
>  
>  		ret = intel_panel_fitting(pipe_config, conn_state);
>  		if (ret)
> -- 
> 2.32.0

-- 
Ville Syrjälä
Intel


More information about the Intel-gfx mailing list