[PATCH] drm: Make the bw/link rate calculations more forgiving

Ville Syrjälä ville.syrjala at linux.intel.com
Wed Jul 17 16:20:29 UTC 2019


On Wed, Jul 17, 2019 at 12:01:48PM -0400, Sean Paul wrote:
> From: Sean Paul <seanpaul at chromium.org>
> 
> Although the DisplayPort spec explicitly calls out the 1.62/2.7/5.4/8.1
> link rates, the value of LINK_BW_SET is calculated.  The DisplayPort
> spec says "Main-Link Bandwidth Setting = Value x 0.27Gbps/lane".
> 
> A bridge that we're looking to upstream uses 6.75Gbps rate (value 0x19)
> [1], and that precludes it from using these functions.

The DP spec has this note:
"A MyDP Source device, upon reading the MAX_LINK_RATE register of the
 downstream DPRX programmed to 19h (which can be the case only for a
 MyDP-to-Legacy or MyDP-to-DP lane count converter) can program the
 LINK_BW_SET register (DPCD Address 00100h) to 19h to enable 6.75Gbps/lane."

Which I guess is the thing you're seeing.

But I think the patch makes sense in any case. Otherwise anyone who
plugs in some new display to a machine with an old kernel will likely
get that WARN. Assuming the driver correctly limits the max link rate
based on the source device capabilities there's no harm in letting
the sink declare higher limits.

Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

> 
> This patch calculates the values according to spec instead of
> restricting these values to one of the DP_LINK_BW_* #defines.
> 
> No functional change for the well-defined values, but we lose the
> warning for ill-defined bw values.
> 
> Signed-off-by: Sean Paul <seanpaul at chromium.org>
> 
> [1] https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/1689251/2/drivers/gpu/drm/bridge/analogix/anx7625.c#636
> ---
>  drivers/gpu/drm/drm_dp_helper.c | 31 ++++---------------------------
>  1 file changed, 4 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
> index 0b994d083a89..ffc68d305afe 100644
> --- a/drivers/gpu/drm/drm_dp_helper.c
> +++ b/drivers/gpu/drm/drm_dp_helper.c
> @@ -152,38 +152,15 @@ EXPORT_SYMBOL(drm_dp_link_train_channel_eq_delay);
>  
>  u8 drm_dp_link_rate_to_bw_code(int link_rate)
>  {
> -	switch (link_rate) {
> -	default:
> -		WARN(1, "unknown DP link rate %d, using %x\n", link_rate,
> -		     DP_LINK_BW_1_62);
> -		/* fall through */
> -	case 162000:
> -		return DP_LINK_BW_1_62;
> -	case 270000:
> -		return DP_LINK_BW_2_7;
> -	case 540000:
> -		return DP_LINK_BW_5_4;
> -	case 810000:
> -		return DP_LINK_BW_8_1;
> -	}
> +	/* Spec says link_bw = link_rate / 0.27Gbps */
> +	return link_rate / 27000;
>  }
>  EXPORT_SYMBOL(drm_dp_link_rate_to_bw_code);
>  
>  int drm_dp_bw_code_to_link_rate(u8 link_bw)
>  {
> -	switch (link_bw) {
> -	default:
> -		WARN(1, "unknown DP link BW code %x, using 162000\n", link_bw);
> -		/* fall through */
> -	case DP_LINK_BW_1_62:
> -		return 162000;
> -	case DP_LINK_BW_2_7:
> -		return 270000;
> -	case DP_LINK_BW_5_4:
> -		return 540000;
> -	case DP_LINK_BW_8_1:
> -		return 810000;
> -	}
> +	/* Spec says link_rate = link_bw * 0.27Gbps */
> +	return link_bw * 27000;
>  }
>  EXPORT_SYMBOL(drm_dp_bw_code_to_link_rate);
>  
> -- 
> Sean Paul, Software Engineer, Google / Chromium OS
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Ville Syrjälä
Intel


More information about the dri-devel mailing list