[2/3] drm/dp/mst: Handle arbitrary DP_LINK_BW values
diff mbox series

Message ID 20190925141442.23236-2-ville.syrjala@linux.intel.com
State New
Headers show
Series
  • [1/3] drm/dp/mst: Reduce nested ifs
Related show

Commit Message

Ville Syrjälä Sept. 25, 2019, 2:14 p.m. UTC
From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Make drm_dp_get_vc_payload() tolerate arbitrary DP_LINK_BW_*
values, just like drm_dp_bw_code_to_link_rate() does since commit
57a1b0893782 ("drm: Make the bw/link rate calculations more forgiving").

Cc: Lyude Paul <lyude@redhat.com>
Cc: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/drm_dp_mst_topology.c | 29 ++++++---------------------
 1 file changed, 6 insertions(+), 23 deletions(-)

Comments

Lyude Paul Sept. 26, 2019, 12:03 a.m. UTC | #1
Reviewed-by: Lyude Paul <lyude@redhat.com>

On Wed, 2019-09-25 at 17:14 +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Make drm_dp_get_vc_payload() tolerate arbitrary DP_LINK_BW_*
> values, just like drm_dp_bw_code_to_link_rate() does since commit
> 57a1b0893782 ("drm: Make the bw/link rate calculations more forgiving").
> 
> Cc: Lyude Paul <lyude@redhat.com>
> Cc: Sean Paul <seanpaul@chromium.org>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/drm_dp_mst_topology.c | 29 ++++++---------------------
>  1 file changed, 6 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c
> b/drivers/gpu/drm/drm_dp_mst_topology.c
> index e25597eb3ca1..d4644a3c1324 100644
> --- a/drivers/gpu/drm/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
> @@ -2974,30 +2974,13 @@ static int drm_dp_send_up_ack_reply(struct
> drm_dp_mst_topology_mgr *mgr,
>  	return 0;
>  }
>  
> -static bool drm_dp_get_vc_payload_bw(int dp_link_bw,
> -				     int dp_link_count,
> -				     int *out)
> +static int drm_dp_get_vc_payload_bw(u8 dp_link_bw, u8  dp_link_count)
>  {
> -	switch (dp_link_bw) {
> -	default:
> +	if (dp_link_bw == 0 || dp_link_count == 0)
>  		DRM_DEBUG_KMS("invalid link bandwidth in DPCD: %x (link count:
> %d)\n",
>  			      dp_link_bw, dp_link_count);
> -		return false;
>  
> -	case DP_LINK_BW_1_62:
> -		*out = 3 * dp_link_count;
> -		break;
> -	case DP_LINK_BW_2_7:
> -		*out = 5 * dp_link_count;
> -		break;
> -	case DP_LINK_BW_5_4:
> -		*out = 10 * dp_link_count;
> -		break;
> -	case DP_LINK_BW_8_1:
> -		*out = 15 * dp_link_count;
> -		break;
> -	}
> -	return true;
> +	return dp_link_bw * dp_link_count / 2;
>  }
>  
>  /**
> @@ -3029,9 +3012,9 @@ int drm_dp_mst_topology_mgr_set_mst(struct
> drm_dp_mst_topology_mgr *mgr, bool ms
>  			goto out_unlock;
>  		}
>  
> -		if (!drm_dp_get_vc_payload_bw(mgr->dpcd[1],
> -					      mgr->dpcd[2] &
> DP_MAX_LANE_COUNT_MASK,
> -					      &mgr->pbn_div)) {
> +		mgr->pbn_div = drm_dp_get_vc_payload_bw(mgr->dpcd[1],
> +							mgr->dpcd[2] &
> DP_MAX_LANE_COUNT_MASK);
> +		if (mgr->pbn_div == 0) {
>  			ret = -EINVAL;
>  			goto out_unlock;
>  		}

Patch
diff mbox series

diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
index e25597eb3ca1..d4644a3c1324 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -2974,30 +2974,13 @@  static int drm_dp_send_up_ack_reply(struct drm_dp_mst_topology_mgr *mgr,
 	return 0;
 }
 
-static bool drm_dp_get_vc_payload_bw(int dp_link_bw,
-				     int dp_link_count,
-				     int *out)
+static int drm_dp_get_vc_payload_bw(u8 dp_link_bw, u8  dp_link_count)
 {
-	switch (dp_link_bw) {
-	default:
+	if (dp_link_bw == 0 || dp_link_count == 0)
 		DRM_DEBUG_KMS("invalid link bandwidth in DPCD: %x (link count: %d)\n",
 			      dp_link_bw, dp_link_count);
-		return false;
 
-	case DP_LINK_BW_1_62:
-		*out = 3 * dp_link_count;
-		break;
-	case DP_LINK_BW_2_7:
-		*out = 5 * dp_link_count;
-		break;
-	case DP_LINK_BW_5_4:
-		*out = 10 * dp_link_count;
-		break;
-	case DP_LINK_BW_8_1:
-		*out = 15 * dp_link_count;
-		break;
-	}
-	return true;
+	return dp_link_bw * dp_link_count / 2;
 }
 
 /**
@@ -3029,9 +3012,9 @@  int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms
 			goto out_unlock;
 		}
 
-		if (!drm_dp_get_vc_payload_bw(mgr->dpcd[1],
-					      mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK,
-					      &mgr->pbn_div)) {
+		mgr->pbn_div = drm_dp_get_vc_payload_bw(mgr->dpcd[1],
+							mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK);
+		if (mgr->pbn_div == 0) {
 			ret = -EINVAL;
 			goto out_unlock;
 		}