drm/amd/display: Only update link settings after successful MST link train
authorMichael Strauss <michael.strauss@amd.com>
Thu, 20 Oct 2022 19:57:36 +0000 (15:57 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 9 Nov 2022 22:41:41 +0000 (17:41 -0500)
[WHY]
Currently driver reduces verified link caps on DPIA devices if a link is
trained at a link rate below the max rate verified during link detection.
This blocks high bandwidth modes after setting a low bandwidth mode.

[HOW]
Only update link rate after a successful link train if link is MST.

Reviewed-by: Mustapha Ghaddar <Mustapha.Ghaddar@amd.com>
Acked-by: Alan Liu <HaoPing.Liu@amd.com>
Signed-off-by: Michael Strauss <michael.strauss@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
drivers/gpu/drm/amd/display/dc/core/dc_link.c
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
drivers/gpu/drm/amd/display/dc/dm_helpers.h

index f72c013d3a5b05b3a58e7ef8d8f3437a7a511e03..e47098fa5aac1b909308fc2b0a385cc9c2535a70 100644 (file)
@@ -971,3 +971,11 @@ void dm_helpers_enable_periodic_detection(struct dc_context *ctx, bool enable)
 {
        /* TODO: add periodic detection implementation */
 }
+
+void dm_helpers_dp_mst_update_branch_bandwidth(
+               struct dc_context *ctx,
+               struct dc_link *link)
+{
+       // TODO
+}
+
index 24ed057414e1e0c3442307b3a8e7dfa0bca9983e..5304e9daf90a3b01b966abbd52e43e9d5f9fda4b 100644 (file)
@@ -4663,6 +4663,10 @@ void dc_link_set_preferred_training_settings(struct dc *dc,
                link->preferred_link_setting.link_rate = LINK_RATE_UNKNOWN;
        }
 
+       if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT &&
+                       link->type == dc_connection_mst_branch)
+               dm_helpers_dp_mst_update_branch_bandwidth(dc->ctx, link);
+
        /* Retrain now, or wait until next stream update to apply */
        if (skip_immediate_retrain == false)
                dc_link_set_preferred_link_settings(dc, &link->preferred_link_setting, link);
index a3e1aeccd3f5a2dd5e5249a5b9102a0f0769fd74..b772d7f2301cf829bbfa44617f5a7951999d61d6 100644 (file)
@@ -2771,8 +2771,11 @@ bool perform_link_training_with_retries(
                                        /* Update verified link settings to current one
                                         * Because DPIA LT might fallback to lower link setting.
                                         */
-                                       link->verified_link_cap.link_rate = link->cur_link_settings.link_rate;
-                                       link->verified_link_cap.lane_count = link->cur_link_settings.lane_count;
+                                       if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
+                                               link->verified_link_cap.link_rate = link->cur_link_settings.link_rate;
+                                               link->verified_link_cap.lane_count = link->cur_link_settings.lane_count;
+                                               dm_helpers_dp_mst_update_branch_bandwidth(link->ctx, link);
+                                       }
                                }
                        } else {
                                status = dc_link_dp_perform_link_training(link,
index e3e5c39895a3ad20cbae84446e29cfbefeaf0e60..af1c50ed905abdfa3b26ca5a272bc889ca13f857 100644 (file)
@@ -116,6 +116,11 @@ bool dm_helpers_dp_mst_start_top_mgr(
 bool dm_helpers_dp_mst_stop_top_mgr(
                struct dc_context *ctx,
                struct dc_link *link);
+
+void dm_helpers_dp_mst_update_branch_bandwidth(
+               struct dc_context *ctx,
+               struct dc_link *link);
+
 /**
  * OS specific aux read callback.
  */