All of lore.kernel.org
 help / color / mirror / Atom feed
From: Drew Davenport <ddavenport@chromium.org>
To: Imre Deak <imre.deak@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH] drm/i915/dp: Fix connector DSC HW state readout
Date: Mon, 5 Feb 2024 10:17:43 -0700	[thread overview]
Message-ID: <ZcEYN2BdILwotCIZ@chromium.org> (raw)
In-Reply-To: <20240205132631.1588577-1-imre.deak@intel.com>

On Mon, Feb 05, 2024 at 03:26:31PM +0200, Imre Deak wrote:
> The DSC HW state of DP connectors is read out during driver loading and
> system resume in intel_modeset_update_connector_atomic_state(). This
> function is called for all connectors though and so the state of DSI
> connectors will also get updated incorrectly, triggering a WARN there
> wrt. the DSC decompression AUX device.
> 
> Fix the above by moving the DSC state readout to a new DP connector
> specific sync_state() hook. This is anyway the logical place to update
> the connector object's state vs. the connector's atomic state.
> 
> Fixes: b2608c6b3212 ("drm/i915/dp_mst: Enable MST DSC decompression for all streams")
> Reported-by: Drew Davenport <ddavenport@chromium.org>
> Closes: https://lore.kernel.org/all/Zb0q8IDVXS0HxJyj@chromium.org
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display_types.h |  7 +++++++
>  drivers/gpu/drm/i915/display/intel_dp.c            | 13 +++++++++++++
>  drivers/gpu/drm/i915/display/intel_dp.h            |  2 ++
>  drivers/gpu/drm/i915/display/intel_dp_mst.c        |  1 +
>  drivers/gpu/drm/i915/display/intel_modeset_setup.c | 13 ++++++-------
>  5 files changed, 29 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index ae2e8cff9d691..6e1ddd05bd504 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -609,6 +609,13 @@ struct intel_connector {
>  	 * and active (i.e. dpms ON state). */
>  	bool (*get_hw_state)(struct intel_connector *);
>  
> +	/*
> +	 * Optional hook called during init/resume to sync any state
> +	 * stored in the connector (eg. DSC state) wrt. the HW state.
> +	 */
> +	void (*sync_state)(struct intel_connector *connector,
> +			   const struct intel_crtc_state *crtc_state);
> +
>  	/* Panel info for eDP and LVDS */
>  	struct intel_panel panel;
>  
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index ab415f41924d7..f8b1aab7745fd 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -5868,6 +5868,19 @@ intel_dp_connector_unregister(struct drm_connector *connector)
>  	intel_connector_unregister(connector);
>  }
>  
> +void intel_dp_connector_sync_state(struct intel_connector *connector,
> +				   const struct intel_crtc_state *crtc_state)
> +{
> +	struct drm_i915_private *i915 = to_i915(connector->base.dev);
> +
> +	if (crtc_state && crtc_state->dsc.compression_enable) {
> +		drm_WARN_ON(&i915->drm, !connector->dp.dsc_decompression_aux);
> +		connector->dp.dsc_decompression_enabled = true;
> +	} else {
> +		connector->dp.dsc_decompression_enabled = false;
> +	}
> +}
> +
>  void intel_dp_encoder_flush_work(struct drm_encoder *encoder)
>  {
>  	struct intel_digital_port *dig_port = enc_to_dig_port(to_intel_encoder(encoder));
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h
> index 530cc97bc42f4..f911dfab5fba9 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp.h
> @@ -45,6 +45,8 @@ bool intel_dp_limited_color_range(const struct intel_crtc_state *crtc_state,
>  int intel_dp_min_bpp(enum intel_output_format output_format);
>  bool intel_dp_init_connector(struct intel_digital_port *dig_port,
>  			     struct intel_connector *intel_connector);
> +void intel_dp_connector_sync_state(struct intel_connector *connector,
> +				   const struct intel_crtc_state *crtc_state);
>  void intel_dp_set_link_params(struct intel_dp *intel_dp,
>  			      int link_rate, int lane_count);
>  int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 5fa25a5a36b55..130c6aab86b22 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -1538,6 +1538,7 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
>  		return NULL;
>  
>  	intel_connector->get_hw_state = intel_dp_mst_get_hw_state;
> +	intel_connector->sync_state = intel_dp_connector_sync_state;
>  	intel_connector->mst_port = intel_dp;
>  	intel_connector->port = port;
>  	drm_dp_mst_get_port_malloc(port);
> diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> index 94eece7f63be3..caeca3a8442c5 100644
> --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> @@ -318,12 +318,6 @@ static void intel_modeset_update_connector_atomic_state(struct drm_i915_private
>  			const struct intel_crtc_state *crtc_state =
>  				to_intel_crtc_state(crtc->base.state);
>  
> -			if (crtc_state->dsc.compression_enable) {
> -				drm_WARN_ON(&i915->drm, !connector->dp.dsc_decompression_aux);
> -				connector->dp.dsc_decompression_enabled = true;
> -			} else {
> -				connector->dp.dsc_decompression_enabled = false;
> -			}
>  			conn_state->max_bpc = (crtc_state->pipe_bpp ?: 24) / 3;
>  		}
>  	}
> @@ -775,8 +769,9 @@ static void intel_modeset_readout_hw_state(struct drm_i915_private *i915)
>  
>  	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
>  	for_each_intel_connector_iter(connector, &conn_iter) {
> +		struct intel_crtc_state *crtc_state = NULL;
> +
>  		if (connector->get_hw_state(connector)) {
> -			struct intel_crtc_state *crtc_state;
>  			struct intel_crtc *crtc;
>  
>  			connector->base.dpms = DRM_MODE_DPMS_ON;
> @@ -802,6 +797,10 @@ static void intel_modeset_readout_hw_state(struct drm_i915_private *i915)
>  			connector->base.dpms = DRM_MODE_DPMS_OFF;
>  			connector->base.encoder = NULL;
>  		}
> +
> +		if (connector->sync_state)
> +			connector->sync_state(connector, crtc_state);
> +
>  		drm_dbg_kms(&i915->drm,
>  			    "[CONNECTOR:%d:%s] hw state readout: %s\n",
>  			    connector->base.base.id, connector->base.name,
> -- 
> 2.39.2
> 

Thanks. I verified this on the JSL device that I reproed the warning on.

Tested-by: Drew Davenport <ddavenport@chromium.org>

  parent reply	other threads:[~2024-02-05 17:17 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-05 13:26 [PATCH] drm/i915/dp: Fix connector DSC HW state readout Imre Deak
2024-02-05 14:41 ` ✓ Fi.CI.BAT: success for " Patchwork
2024-02-05 17:17 ` Drew Davenport [this message]
2024-02-05 17:58 ` ✗ Fi.CI.IGT: failure " Patchwork
2024-02-13  4:50 ` [PATCH] " Nautiyal, Ankit K
2024-02-29 17:33 ` ✓ Fi.CI.BAT: success for drm/i915/dp: Fix connector DSC HW state readout (rev2) Patchwork
2024-03-01 20:00 ` ✗ Fi.CI.IGT: failure " Patchwork
2024-03-05 19:51   ` Imre Deak

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=ZcEYN2BdILwotCIZ@chromium.org \
    --to=ddavenport@chromium.org \
    --cc=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    /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.