All of lore.kernel.org
 help / color / mirror / Atom feed
From: Imre Deak <imre.deak@intel.com>
To: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org, stable@vger.kernel.org
Subject: Re: [PATCH v2 2/3] drm/i915: Disable LTTPR support when the DPCD rev < 1.4
Date: Thu, 18 Mar 2021 20:05:23 +0200	[thread overview]
Message-ID: <20210318180523.GF4128033@ideak-desk.fi.intel.com> (raw)
In-Reply-To: <YFOUgp1QvipUwSGR@intel.com>

On Thu, Mar 18, 2021 at 07:57:22PM +0200, Ville Syrjälä wrote:
> On Wed, Mar 17, 2021 at 09:01:49PM +0200, Imre Deak wrote:
> > By the specification the 0xF0000-0xF02FF range is only valid when the
> > DPCD revision is 1.4 or higher. Disable LTTPR support if this isn't so.
> > 
> > Trying to detect LTTPRs returned corrupted values for the above DPCD
> > range at least on a Skylake host with an LG 43UD79-B monitor with a DPCD
> > revision 1.2 connected.
> > 
> > v2: Add the actual version check.
> > 
> > Fixes: 7b2a4ab8b0ef ("drm/i915: Switch to LTTPR transparent mode link training")
> > Cc: <stable@vger.kernel.org> # v5.11
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_dp.c       |  4 +-
> >  .../drm/i915/display/intel_dp_link_training.c | 48 ++++++++++++++-----
> >  .../drm/i915/display/intel_dp_link_training.h |  2 +-
> >  3 files changed, 39 insertions(+), 15 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> > index b6b5776f5a66..873684da0cd4 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -3711,9 +3711,7 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
> >  {
> >  	int ret;
> >  
> > -	intel_dp_lttpr_init(intel_dp);
> > -
> > -	if (drm_dp_read_dpcd_caps(&intel_dp->aux, intel_dp->dpcd))
> > +	if (intel_dp_init_lttpr_and_dprx_caps(intel_dp) < 0)
> >  		return false;
> >  
> >  	/*
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > index c0e25c75c105..5a821d644e9c 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > @@ -35,6 +35,11 @@ intel_dp_dump_link_status(struct drm_device *drm,
> >  		    link_status[3], link_status[4], link_status[5]);
> >  }
> >  
> > +static void intel_dp_reset_lttpr_common_caps(struct intel_dp *intel_dp)
> > +{
> > +	memset(&intel_dp->lttpr_common_caps, 0, sizeof(intel_dp->lttpr_common_caps));
> > +}
> > +
> >  static void intel_dp_reset_lttpr_count(struct intel_dp *intel_dp)
> >  {
> >  	intel_dp->lttpr_common_caps[DP_PHY_REPEATER_CNT -
> > @@ -96,8 +101,7 @@ static bool intel_dp_read_lttpr_common_caps(struct intel_dp *intel_dp)
> >  
> >  	if (drm_dp_read_lttpr_common_caps(&intel_dp->aux,
> >  					  intel_dp->lttpr_common_caps) < 0) {
> > -		memset(intel_dp->lttpr_common_caps, 0,
> > -		       sizeof(intel_dp->lttpr_common_caps));
> > +		intel_dp_reset_lttpr_common_caps(intel_dp);
> >  		return false;
> >  	}
> >  
> > @@ -119,30 +123,49 @@ intel_dp_set_lttpr_transparent_mode(struct intel_dp *intel_dp, bool enable)
> >  }
> >  
> >  /**
> > - * intel_dp_lttpr_init - detect LTTPRs and init the LTTPR link training mode
> > + * intel_dp_init_lttpr_and_dprx_caps - detect LTTPR and DPRX caps, init the LTTPR link training mode
> >   * @intel_dp: Intel DP struct
> >   *
> > - * Read the LTTPR common capabilities, switch to non-transparent link training
> > - * mode if any is detected and read the PHY capabilities for all detected
> > - * LTTPRs. In case of an LTTPR detection error or if the number of
> > + * Read the LTTPR common and DPRX capabilities and switch to non-transparent
> > + * link training mode if any is detected and read the PHY capabilities for all
> > + * detected LTTPRs. In case of an LTTPR detection error or if the number of
> >   * LTTPRs is more than is supported (8), fall back to the no-LTTPR,
> >   * transparent mode link training mode.
> >   *
> >   * Returns:
> > - *   >0  if LTTPRs were detected and the non-transparent LT mode was set
> > + *   >0  if LTTPRs were detected and the non-transparent LT mode was set. The
> > + *       DPRX capabilities are read out.
> >   *    0  if no LTTPRs or more than 8 LTTPRs were detected or in case of a
> > - *       detection failure and the transparent LT mode was set
> > + *       detection failure and the transparent LT mode was set. The DPRX
> > + *       capabilities are read out.
> > + *   <0  Reading out the DPRX capabilities failed.
> >   */
> > -int intel_dp_lttpr_init(struct intel_dp *intel_dp)
> > +int intel_dp_init_lttpr_and_dprx_caps(struct intel_dp *intel_dp)
> >  {
> >  	int lttpr_count;
> >  	bool ret;
> >  	int i;
> >  
> >  	ret = intel_dp_read_lttpr_common_caps(intel_dp);
> > +
> > +	/* The DPTX shall read the DRPX caps after LTTPR detection. */
> > +	if (drm_dp_read_dpcd_caps(&intel_dp->aux, intel_dp->dpcd)) {
> > +		intel_dp_reset_lttpr_common_caps(intel_dp);
> > +		return -EIO;
> > +	}
> > +
> >  	if (!ret)
> >  		return 0;
> >  
> > +	/*
> > +	 * The 0xF0000-0xF02FF range is only valid if the DPCD revision is
> > +	 * at least 1.4.
> > +	 */
> > +	if (intel_dp->dpcd[DP_DPCD_REV] < 0x14) {
> > +		intel_dp_reset_lttpr_common_caps(intel_dp);
> > +		return 0;
> > +	}
> 
> Slight chicken vs. egg I guess. Seems ok

Yes, reading 0xF0000-0xF0007 has a side effect and I suppose the LTTPRs
could change something in the returned DPRX caps, depending on whether
the read happened or not.

> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> > +
> >  	lttpr_count = drm_dp_lttpr_count(intel_dp->lttpr_common_caps);
> >  	/*
> >  	 * Prevent setting LTTPR transparent mode explicitly if no LTTPRs are
> > @@ -182,7 +205,7 @@ int intel_dp_lttpr_init(struct intel_dp *intel_dp)
> >  
> >  	return lttpr_count;
> >  }
> > -EXPORT_SYMBOL(intel_dp_lttpr_init);
> > +EXPORT_SYMBOL(intel_dp_init_lttpr_and_dprx_caps);
> >  
> >  static u8 dp_voltage_max(u8 preemph)
> >  {
> > @@ -817,7 +840,10 @@ void intel_dp_start_link_train(struct intel_dp *intel_dp,
> >  	 * TODO: Reiniting LTTPRs here won't be needed once proper connector
> >  	 * HW state readout is added.
> >  	 */
> > -	int lttpr_count = intel_dp_lttpr_init(intel_dp);
> > +	int lttpr_count = intel_dp_init_lttpr_and_dprx_caps(intel_dp);
> > +
> > +	if (lttpr_count < 0)
> > +		return;
> >  
> >  	if (!intel_dp_link_train_all_phys(intel_dp, crtc_state, lttpr_count))
> >  		intel_dp_schedule_fallback_link_training(intel_dp, crtc_state);
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.h b/drivers/gpu/drm/i915/display/intel_dp_link_training.h
> > index 6a1f76bd8c75..9cb7c28027f0 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.h
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.h
> > @@ -11,7 +11,7 @@
> >  struct intel_crtc_state;
> >  struct intel_dp;
> >  
> > -int intel_dp_lttpr_init(struct intel_dp *intel_dp);
> > +int intel_dp_init_lttpr_and_dprx_caps(struct intel_dp *intel_dp);
> >  
> >  void intel_dp_get_adjust_train(struct intel_dp *intel_dp,
> >  			       const struct intel_crtc_state *crtc_state,
> > -- 
> > 2.25.1
> 
> -- 
> Ville Syrjälä
> Intel

WARNING: multiple messages have this Message-ID (diff)
From: Imre Deak <imre.deak@intel.com>
To: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org, stable@vger.kernel.org
Subject: Re: [Intel-gfx] [PATCH v2 2/3] drm/i915: Disable LTTPR support when the DPCD rev < 1.4
Date: Thu, 18 Mar 2021 20:05:23 +0200	[thread overview]
Message-ID: <20210318180523.GF4128033@ideak-desk.fi.intel.com> (raw)
In-Reply-To: <YFOUgp1QvipUwSGR@intel.com>

On Thu, Mar 18, 2021 at 07:57:22PM +0200, Ville Syrjälä wrote:
> On Wed, Mar 17, 2021 at 09:01:49PM +0200, Imre Deak wrote:
> > By the specification the 0xF0000-0xF02FF range is only valid when the
> > DPCD revision is 1.4 or higher. Disable LTTPR support if this isn't so.
> > 
> > Trying to detect LTTPRs returned corrupted values for the above DPCD
> > range at least on a Skylake host with an LG 43UD79-B monitor with a DPCD
> > revision 1.2 connected.
> > 
> > v2: Add the actual version check.
> > 
> > Fixes: 7b2a4ab8b0ef ("drm/i915: Switch to LTTPR transparent mode link training")
> > Cc: <stable@vger.kernel.org> # v5.11
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > ---
> >  drivers/gpu/drm/i915/display/intel_dp.c       |  4 +-
> >  .../drm/i915/display/intel_dp_link_training.c | 48 ++++++++++++++-----
> >  .../drm/i915/display/intel_dp_link_training.h |  2 +-
> >  3 files changed, 39 insertions(+), 15 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> > index b6b5776f5a66..873684da0cd4 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> > @@ -3711,9 +3711,7 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
> >  {
> >  	int ret;
> >  
> > -	intel_dp_lttpr_init(intel_dp);
> > -
> > -	if (drm_dp_read_dpcd_caps(&intel_dp->aux, intel_dp->dpcd))
> > +	if (intel_dp_init_lttpr_and_dprx_caps(intel_dp) < 0)
> >  		return false;
> >  
> >  	/*
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > index c0e25c75c105..5a821d644e9c 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > @@ -35,6 +35,11 @@ intel_dp_dump_link_status(struct drm_device *drm,
> >  		    link_status[3], link_status[4], link_status[5]);
> >  }
> >  
> > +static void intel_dp_reset_lttpr_common_caps(struct intel_dp *intel_dp)
> > +{
> > +	memset(&intel_dp->lttpr_common_caps, 0, sizeof(intel_dp->lttpr_common_caps));
> > +}
> > +
> >  static void intel_dp_reset_lttpr_count(struct intel_dp *intel_dp)
> >  {
> >  	intel_dp->lttpr_common_caps[DP_PHY_REPEATER_CNT -
> > @@ -96,8 +101,7 @@ static bool intel_dp_read_lttpr_common_caps(struct intel_dp *intel_dp)
> >  
> >  	if (drm_dp_read_lttpr_common_caps(&intel_dp->aux,
> >  					  intel_dp->lttpr_common_caps) < 0) {
> > -		memset(intel_dp->lttpr_common_caps, 0,
> > -		       sizeof(intel_dp->lttpr_common_caps));
> > +		intel_dp_reset_lttpr_common_caps(intel_dp);
> >  		return false;
> >  	}
> >  
> > @@ -119,30 +123,49 @@ intel_dp_set_lttpr_transparent_mode(struct intel_dp *intel_dp, bool enable)
> >  }
> >  
> >  /**
> > - * intel_dp_lttpr_init - detect LTTPRs and init the LTTPR link training mode
> > + * intel_dp_init_lttpr_and_dprx_caps - detect LTTPR and DPRX caps, init the LTTPR link training mode
> >   * @intel_dp: Intel DP struct
> >   *
> > - * Read the LTTPR common capabilities, switch to non-transparent link training
> > - * mode if any is detected and read the PHY capabilities for all detected
> > - * LTTPRs. In case of an LTTPR detection error or if the number of
> > + * Read the LTTPR common and DPRX capabilities and switch to non-transparent
> > + * link training mode if any is detected and read the PHY capabilities for all
> > + * detected LTTPRs. In case of an LTTPR detection error or if the number of
> >   * LTTPRs is more than is supported (8), fall back to the no-LTTPR,
> >   * transparent mode link training mode.
> >   *
> >   * Returns:
> > - *   >0  if LTTPRs were detected and the non-transparent LT mode was set
> > + *   >0  if LTTPRs were detected and the non-transparent LT mode was set. The
> > + *       DPRX capabilities are read out.
> >   *    0  if no LTTPRs or more than 8 LTTPRs were detected or in case of a
> > - *       detection failure and the transparent LT mode was set
> > + *       detection failure and the transparent LT mode was set. The DPRX
> > + *       capabilities are read out.
> > + *   <0  Reading out the DPRX capabilities failed.
> >   */
> > -int intel_dp_lttpr_init(struct intel_dp *intel_dp)
> > +int intel_dp_init_lttpr_and_dprx_caps(struct intel_dp *intel_dp)
> >  {
> >  	int lttpr_count;
> >  	bool ret;
> >  	int i;
> >  
> >  	ret = intel_dp_read_lttpr_common_caps(intel_dp);
> > +
> > +	/* The DPTX shall read the DRPX caps after LTTPR detection. */
> > +	if (drm_dp_read_dpcd_caps(&intel_dp->aux, intel_dp->dpcd)) {
> > +		intel_dp_reset_lttpr_common_caps(intel_dp);
> > +		return -EIO;
> > +	}
> > +
> >  	if (!ret)
> >  		return 0;
> >  
> > +	/*
> > +	 * The 0xF0000-0xF02FF range is only valid if the DPCD revision is
> > +	 * at least 1.4.
> > +	 */
> > +	if (intel_dp->dpcd[DP_DPCD_REV] < 0x14) {
> > +		intel_dp_reset_lttpr_common_caps(intel_dp);
> > +		return 0;
> > +	}
> 
> Slight chicken vs. egg I guess. Seems ok

Yes, reading 0xF0000-0xF0007 has a side effect and I suppose the LTTPRs
could change something in the returned DPRX caps, depending on whether
the read happened or not.

> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> > +
> >  	lttpr_count = drm_dp_lttpr_count(intel_dp->lttpr_common_caps);
> >  	/*
> >  	 * Prevent setting LTTPR transparent mode explicitly if no LTTPRs are
> > @@ -182,7 +205,7 @@ int intel_dp_lttpr_init(struct intel_dp *intel_dp)
> >  
> >  	return lttpr_count;
> >  }
> > -EXPORT_SYMBOL(intel_dp_lttpr_init);
> > +EXPORT_SYMBOL(intel_dp_init_lttpr_and_dprx_caps);
> >  
> >  static u8 dp_voltage_max(u8 preemph)
> >  {
> > @@ -817,7 +840,10 @@ void intel_dp_start_link_train(struct intel_dp *intel_dp,
> >  	 * TODO: Reiniting LTTPRs here won't be needed once proper connector
> >  	 * HW state readout is added.
> >  	 */
> > -	int lttpr_count = intel_dp_lttpr_init(intel_dp);
> > +	int lttpr_count = intel_dp_init_lttpr_and_dprx_caps(intel_dp);
> > +
> > +	if (lttpr_count < 0)
> > +		return;
> >  
> >  	if (!intel_dp_link_train_all_phys(intel_dp, crtc_state, lttpr_count))
> >  		intel_dp_schedule_fallback_link_training(intel_dp, crtc_state);
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.h b/drivers/gpu/drm/i915/display/intel_dp_link_training.h
> > index 6a1f76bd8c75..9cb7c28027f0 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.h
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.h
> > @@ -11,7 +11,7 @@
> >  struct intel_crtc_state;
> >  struct intel_dp;
> >  
> > -int intel_dp_lttpr_init(struct intel_dp *intel_dp);
> > +int intel_dp_init_lttpr_and_dprx_caps(struct intel_dp *intel_dp);
> >  
> >  void intel_dp_get_adjust_train(struct intel_dp *intel_dp,
> >  			       const struct intel_crtc_state *crtc_state,
> > -- 
> > 2.25.1
> 
> -- 
> Ville Syrjälä
> Intel
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2021-03-18 18:06 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-17 18:48 [PATCH v2 0/3] drm/i915: Fix DP LTTPR link training mode initialization Imre Deak
2021-03-17 18:48 ` [Intel-gfx] " Imre Deak
2021-03-17 18:48 ` [PATCH v2 1/3] drm/i915/ilk-glk: Fix link training on links with LTTPRs Imre Deak
2021-03-17 18:48   ` [Intel-gfx] " Imre Deak
2021-03-18 17:33   ` Ville Syrjälä
2021-03-18 17:33     ` [Intel-gfx] " Ville Syrjälä
2021-03-18 17:49     ` Imre Deak
2021-03-18 17:49       ` [Intel-gfx] " Imre Deak
2021-03-18 18:06       ` Imre Deak
2021-03-18 18:06         ` [Intel-gfx] " Imre Deak
2021-03-18 22:04         ` Almahallawy, Khaled
2021-03-18 22:04           ` [Intel-gfx] " Almahallawy, Khaled
2021-03-18 23:17           ` Imre Deak
2021-03-18 23:17             ` [Intel-gfx] " Imre Deak
2021-03-19 17:25             ` Lyude Paul
2021-03-19 17:25               ` [Intel-gfx] " Lyude Paul
2021-03-19 17:29               ` Imre Deak
2021-03-19 17:29                 ` [Intel-gfx] " Imre Deak
2021-03-19 20:44                 ` Lyude Paul
2021-03-19 20:44                   ` [Intel-gfx] " Lyude Paul
2021-03-19 21:07                   ` Imre Deak
2021-03-19 21:07                     ` [Intel-gfx] " Imre Deak
2021-03-20  7:15                     ` Imre Deak
2021-03-20  7:15                       ` [Intel-gfx] " Imre Deak
2021-03-20  7:40                       ` Almahallawy, Khaled
2021-03-20  7:40                         ` [Intel-gfx] " Almahallawy, Khaled
2021-03-20  7:45                         ` Imre Deak
2021-03-20  7:45                           ` [Intel-gfx] " Imre Deak
2021-03-17 18:49 ` [PATCH v2 2/3] drm/i915: Disable LTTPR support when the DPCD rev < 1.4 Imre Deak
2021-03-17 18:49   ` [Intel-gfx] " Imre Deak
2021-03-17 19:01   ` Imre Deak
2021-03-17 19:01     ` [Intel-gfx] " Imre Deak
2021-03-18 17:57     ` Ville Syrjälä
2021-03-18 17:57       ` [Intel-gfx] " Ville Syrjälä
2021-03-18 18:05       ` Imre Deak [this message]
2021-03-18 18:05         ` Imre Deak
2021-03-17 18:49 ` [PATCH v2 3/3] drm/i915: Disable LTTPR support when the LTTPR " Imre Deak
2021-03-17 18:49   ` [Intel-gfx] " Imre Deak
2021-03-18 18:00   ` Ville Syrjälä
2021-03-18 18:00     ` [Intel-gfx] " Ville Syrjälä
2021-03-18 18:09     ` Imre Deak
2021-03-18 18:09       ` [Intel-gfx] " Imre Deak
2021-03-17 20:26 ` [Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915: Fix DP LTTPR link training mode initialization (rev2) Patchwork
2021-03-17 21:01 ` [Intel-gfx] drm/i915: Fix DP LTTPR link training mode initialization Zephaniah E. Loss-Cutler-Hull
2021-03-17 22:34 ` [Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915: Fix DP LTTPR link training mode initialization (rev2) Patchwork
2021-03-19 11:16   ` Imre Deak
2021-03-19 11:16     ` [Intel-gfx] " Imre Deak
2021-03-22  8:34 ` [Intel-gfx] drm/i915: Fix DP LTTPR link training mode initialization Zephaniah E. Loss-Cutler-Hull

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=20210318180523.GF4128033@ideak-desk.fi.intel.com \
    --to=imre.deak@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=stable@vger.kernel.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.