]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/dp/mst: Handle arbitrary DP_LINK_BW values
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 25 Sep 2019 14:14:41 +0000 (17:14 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 30 Sep 2019 17:56:11 +0000 (20:56 +0300)
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>
Link: https://patchwork.freedesktop.org/patch/msgid/20190925141442.23236-2-ville.syrjala@linux.intel.com
Reviewed-by: Lyude Paul <lyude@redhat.com>
drivers/gpu/drm/drm_dp_mst_topology.c

index dd06a50d4938e024c7f88551108bb9ed1f87263c..f90f18532367efac08fa4f8454d543784fc20ffd 100644 (file)
@@ -2977,30 +2977,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;
 }
 
 /**
@@ -3032,9 +3015,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;
                }