]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/display: lttpr cap should be nrd cap in bw_alloc mode
authorPeichen Huang <PeiChen.Huang@amd.com>
Thu, 11 Sep 2025 05:41:16 +0000 (13:41 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 13 Oct 2025 18:14:32 +0000 (14:14 -0400)
[WHY]
When bw allocation mode enabled, dpia may reports lttpr cap with
reduced common cap. It would cause driver not start pre-training with
max available bandwidth.

[How]
When bw allocation mode enabled, use NRD cap as lttpr cap.

Reviewed-by: Cruise Hung <cruise.hung@amd.com>
Reviewed-by: Wenjing Liu <wenjing.liu@amd.com>
Signed-off-by: Peichen Huang <PeiChen.Huang@amd.com>
Signed-off-by: Roman Li <roman.li@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c

index b12c11bd6a1498777959896c1dc8e5ea8e2453c7..c33a8c17c38a1af99727370f4a7fdf59ff7514c0 100644 (file)
@@ -424,6 +424,21 @@ static enum dc_link_rate get_link_rate_from_max_link_bw(
        return link_rate;
 }
 
+static enum dc_lane_count get_lttpr_max_lane_count(struct dc_link *link)
+{
+       enum dc_lane_count lttpr_max_lane_count = LANE_COUNT_UNKNOWN;
+
+       if (link->dpcd_caps.lttpr_caps.max_lane_count <= LANE_COUNT_DP_MAX)
+               lttpr_max_lane_count = link->dpcd_caps.lttpr_caps.max_lane_count;
+
+       /* if bw_allocation is enabled and nrd_max_lane_count is set, use it */
+       if (link->dpia_bw_alloc_config.bw_alloc_enabled &&
+                       link->dpia_bw_alloc_config.nrd_max_lane_count > 0)
+               lttpr_max_lane_count = link->dpia_bw_alloc_config.nrd_max_lane_count;
+
+       return lttpr_max_lane_count;
+}
+
 static enum dc_link_rate get_lttpr_max_link_rate(struct dc_link *link)
 {
 
@@ -438,6 +453,11 @@ static enum dc_link_rate get_lttpr_max_link_rate(struct dc_link *link)
                break;
        }
 
+       /* if bw_allocation is enabled and nrd_max_link_rate is set, use it */
+       if (link->dpia_bw_alloc_config.bw_alloc_enabled &&
+                       link->dpia_bw_alloc_config.nrd_max_link_rate > 0)
+               lttpr_max_link_rate = link->dpia_bw_alloc_config.nrd_max_link_rate;
+
        if (link->dpcd_caps.lttpr_caps.supported_128b_132b_rates.bits.UHBR20)
                lttpr_max_link_rate = LINK_RATE_UHBR20;
        else if (link->dpcd_caps.lttpr_caps.supported_128b_132b_rates.bits.UHBR13_5)
@@ -2241,6 +2261,7 @@ const struct dc_link_settings *dp_get_verified_link_cap(
 struct dc_link_settings dp_get_max_link_cap(struct dc_link *link)
 {
        struct dc_link_settings max_link_cap = {0};
+       enum dc_lane_count lttpr_max_lane_count;
        enum dc_link_rate lttpr_max_link_rate;
        enum dc_link_rate cable_max_link_rate;
        struct resource_context *res_ctx = &link->dc->current_state->res_ctx;
@@ -2305,8 +2326,11 @@ struct dc_link_settings dp_get_max_link_cap(struct dc_link *link)
 
                /* Some LTTPR devices do not report valid DPCD revisions, if so, do not take it's link cap into consideration. */
                if (link->dpcd_caps.lttpr_caps.revision.raw >= DPCD_REV_14) {
-                       if (link->dpcd_caps.lttpr_caps.max_lane_count < max_link_cap.lane_count)
-                               max_link_cap.lane_count = link->dpcd_caps.lttpr_caps.max_lane_count;
+                       lttpr_max_lane_count = get_lttpr_max_lane_count(link);
+
+                       if (lttpr_max_lane_count < max_link_cap.lane_count)
+                               max_link_cap.lane_count = lttpr_max_lane_count;
+
                        lttpr_max_link_rate = get_lttpr_max_link_rate(link);
 
                        if (lttpr_max_link_rate < max_link_cap.link_rate)
@@ -2412,6 +2436,11 @@ bool dp_verify_link_cap_with_retries(
 
        dp_trace_detect_lt_init(link);
 
+       DC_LOG_HW_LINK_TRAINING("%s: Link[%d]  LinkRate=0x%x LaneCount=%d",
+               __func__, link->link_index,
+               known_limit_link_setting->link_rate,
+               known_limit_link_setting->lane_count);
+
        if (link->link_enc && link->link_enc->features.flags.bits.DP_IS_USB_C &&
                        link->dc->debug.usbc_combo_phy_reset_wa)
                apply_usbc_combo_phy_reset_wa(link, known_limit_link_setting);
@@ -2448,6 +2477,11 @@ bool dp_verify_link_cap_with_retries(
        dp_trace_lt_fail_count_update(link, fail_count, true);
        dp_trace_set_lt_end_timestamp(link, true);
 
+       DC_LOG_HW_LINK_TRAINING("%s: Link[%d]  Exit. is_success=%d  fail_count=%d",
+               __func__, link->link_index,
+               success,
+               fail_count);
+
        return success;
 }