drm/amd/display: Add dp_skip_rbr flag for NUTMEG
authorTimur Kristóf <timur.kristof@gmail.com>
Fri, 29 May 2026 09:09:09 +0000 (11:09 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 15 Jul 2026 13:15:37 +0000 (09:15 -0400)
No functional changes. Just clean up a conceptual mismatch.

Based on feedback on the NUTMEG code in DC, the
preferred_link_setting is meant to force the DP link to a
specific setting, meaning both the link rate and lane count
should be locked to an exact value. What NUTMEG needs is
a lower bound on the link rate, which is not the same concept.

Implement this as a HW workaround flag instead.

Suggested-by: Wenjing Liu <wenjing.liu@amd.com>
Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dc/link/link_detection.c
drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c

index c78fdfc..a10ee71 100644 (file)
@@ -1936,6 +1936,8 @@ struct dc_scratch_space {
                bool dp_skip_DID2;
                bool dp_skip_reset_segment;
                bool dp_skip_fs_144hz;
+               /* Some DP bridges don't work with RBR and must use HBR. */
+               bool dp_skip_rbr;
                bool dp_mot_reset_segment;
                /* Some USB4 docks do not handle turning off MST DSC once it has been enabled. */
                bool dpia_mst_dsc_always_on;
index 2abe9d3..4f18b66 100644 (file)
@@ -646,7 +646,7 @@ static bool detect_dp(struct dc_link *link,
                link->dpcd_caps.sink_count.bits.SINK_COUNT = 1;
                /* NUTMEG requires that we use HBR, doesn't work with RBR. */
                if (link->dpcd_caps.branch_dev_id == DP_BRANCH_DEVICE_ID_00001A)
-                       link->preferred_link_setting.link_rate = LINK_RATE_HIGH;
+                       link->wa_flags.dp_skip_rbr = true;
        }
 
        return true;
index 5d3b526..24e3bbe 100644 (file)
@@ -756,9 +756,9 @@ static bool decide_dp_link_settings(struct dc_link *link, struct dc_link_setting
        if (req_bw > dp_link_bandwidth_kbps(link, &link->verified_link_cap))
                return false;
 
-       if (link->preferred_link_setting.link_rate != LINK_RATE_UNKNOWN) {
-               initial_link_setting.link_rate = link->preferred_link_setting.link_rate;
-               current_link_setting.link_rate = link->preferred_link_setting.link_rate;
+       if (link->wa_flags.dp_skip_rbr) {
+               initial_link_setting.link_rate = LINK_RATE_HIGH;
+               current_link_setting.link_rate = LINK_RATE_HIGH;
        }
 
        /* search for the minimum link setting that: