return hibmc_dp_link_reduce_rate(dp);
 }
 
+static void hibmc_dp_update_caps(struct hibmc_dp_dev *dp)
+{
+       dp->link.cap.link_rate = dp->dpcd[DP_MAX_LINK_RATE];
+       if (dp->link.cap.link_rate > DP_LINK_BW_8_1 || !dp->link.cap.link_rate)
+               dp->link.cap.link_rate = DP_LINK_BW_8_1;
+
+       dp->link.cap.lanes = dp->dpcd[DP_MAX_LANE_COUNT] & DP_MAX_LANE_COUNT_MASK;
+       if (dp->link.cap.lanes > HIBMC_DP_LANE_NUM_MAX)
+               dp->link.cap.lanes = HIBMC_DP_LANE_NUM_MAX;
+}
+
 int hibmc_dp_link_training(struct hibmc_dp_dev *dp)
 {
        struct hibmc_dp_link *link = &dp->link;
        if (ret)
                drm_err(dp->dev, "dp aux read dpcd failed, ret: %d\n", ret);
 
-       dp->link.cap.link_rate = dp->dpcd[DP_MAX_LINK_RATE];
-       dp->link.cap.lanes = 0x2;
+       hibmc_dp_update_caps(dp);
 
        ret = hibmc_dp_get_serdes_rate_cfg(dp);
        if (ret < 0)