[Intel-gfx] [PATCH] drm/i915/edp: don't write to DP_LINK_BW_SET when using rate select

Manna, Animesh animesh.manna at intel.com
Mon Dec 4 13:59:53 UTC 2023



> -----Original Message-----
> From: Nikula, Jani <jani.nikula at intel.com>
> Sent: Monday, December 4, 2023 3:28 PM
> To: Ville Syrjälä <ville.syrjala at linux.intel.com>
> Cc: intel-gfx at lists.freedesktop.org; Manna, Animesh
> <animesh.manna at intel.com>
> Subject: Re: [Intel-gfx] [PATCH] drm/i915/edp: don't write to
> DP_LINK_BW_SET when using rate select
> 
> On Fri, 01 Dec 2023, Ville Syrjälä <ville.syrjala at linux.intel.com> wrote:
> > On Fri, Dec 01, 2023 at 03:41:41PM +0200, Jani Nikula wrote:
> >> The eDP 1.5 spec adds a clarification for eDP 1.4x:
> >>
> >> > For eDP v1.4x, if the Source device chooses the Main-Link rate by
> >> > way of DPCD 00100h, the Sink device shall ignore DPCD 00115h[2:0].
> >>
> >> We write 0 to DP_LINK_BW_SET (DPCD 100h) even when using
> >> DP_LINK_RATE_SET (DPCD 114h). Stop doing that, as it can cause the
> >> panel to ignore the rate set method.
> >
> > What a terrible way to specify this :( This means the device must hav
> > some internal state to keep track of whethe BW_SET was ever written.
> 
> Indeed.
> 
> Additionally, eDP 1.5 specifies LINK_CONFIGURATION_STATUS (DPCD
> 0020Ch) which exposes the internal state as link rate set status, and whether
> that status is valid or not.
> 
> Overall the spec looks like that's just for status, but the register is annotated
> Write/Read so who knows.
> 
> >
> >>
> >> Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/9081
> >> Tested-by: Animesh Manna <animesh.manna at intel.com>
> >> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
> >> ---
> >>  .../drm/i915/display/intel_dp_link_training.c | 23
> >> +++++++++++--------
> >>  1 file changed, 13 insertions(+), 10 deletions(-)
> >>
> >> 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 dbc1b66c8ee4..6336a39030a4 100644
> >> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> >> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> >> @@ -650,19 +650,22 @@ intel_dp_update_link_bw_set(struct intel_dp
> *intel_dp,
> >>  			    const struct intel_crtc_state *crtc_state,
> >>  			    u8 link_bw, u8 rate_select)
> >>  {
> >> -	u8 link_config[2];
> >> +	u8 lane_count = crtc_state->lane_count;
> >>
> >> -	/* Write the link configuration data */
> >> -	link_config[0] = link_bw;
> >> -	link_config[1] = crtc_state->lane_count;
> >>  	if (crtc_state->enhanced_framing)
> >> -		link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
> >> -	drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET, link_config,
> 2);
> >> +		lane_count |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
> >> +
> >> +	if (link_bw) {
> >> +		/* eDP 1.3 and earlier link bw set method. */
> >> +		u8 link_config[] = { link_bw, lane_count };
> >>
> >> -	/* eDP 1.4 rate select method. */
> >> -	if (!link_bw)
> >> -		drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_RATE_SET,
> >> -				  &rate_select, 1);
> >> +		drm_dp_dpcd_write(&intel_dp->aux, DP_LINK_BW_SET,
> link_config,
> >> +				  ARRAY_SIZE(link_config));
> >> +	} else {
> >> +		/* eDP 1.4 rate select method. */
> >> +		drm_dp_dpcd_writeb(&intel_dp->aux,
> DP_LANE_COUNT_SET, lane_count);
> >> +		drm_dp_dpcd_writeb(&intel_dp->aux, DP_LINK_RATE_SET,
> rate_select);
> >
> > Doesn't look there's anything in the spec that specifies when the
> > device is supposed to reset its internal state to stop ignoring
> DP_LINK_RATE_SET.
> > Do we know when this panel does it? When VDD is removed?
> 
> No idea. Animesh?

Hi Jani/Ville,

Tried below experiment and sharing my observation below:
Forcefully changed the value of dpcd 0x100 (LINK_BW_SET) to random value (0x99) in edp_init_connector and later while VDD is on during modeset sequence I can see it is not holding its value rather got reset to default value. This will confirm when VDD is removed panel reset its internal state.

Regards,
Animesh
> 
> I think it's just crazy writing 0 to explicitly disable DP_LINK_BW_SET renders
> DP_LINK_RATE_SET unusable. Pretty sure we've seen panels where this
> works as you'd expect.
> 
> And the above depends on pre-os using the same logic as us for choosing
> DP_LINK_RATE_SET. GOP seems to do that. But if it or some other pre-os
> used DP_LINK_BW_SET, we'd fail. With some other panels, writing the 0
> might recover from that.
> 
> No r-b, so do you have any better ideas?
> 
> 
> BR,
> Jani.
> 
> 
> >
> >> +	}
> >>  }
> >>
> >>  /*
> >> --
> >> 2.39.2
> 
> --
> Jani Nikula, Intel


More information about the Intel-gfx mailing list