drm/amd/display: Handle link loss interrupt better
authorAric Cyr <aric.cyr@amd.com>
Tue, 12 May 2020 16:53:52 +0000 (12:53 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 28 May 2020 18:00:50 +0000 (14:00 -0400)
[Why]
Link loss currently only retrains and re-enables the stream.  This can
cause issues for some sinks.

[How]
When link loss occurs, the link and stream(s) should be completely
disabled and then reenabled.

Signed-off-by: Aric Cyr <aric.cyr@amd.com>
Reviewed-by: Wenjing Liu <Wenjing.Liu@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c

index 4b3a3e8b64011769da0dd50aec5191e038b07049..fe4fd664f40ca22425d7e006e9947f5af113170c 100644 (file)
@@ -2849,7 +2849,6 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd
        enum dc_status result;
        bool status = false;
        struct pipe_ctx *pipe_ctx;
-       struct dc_link_settings previous_link_settings;
        int i;
 
        if (out_link_loss)
@@ -2925,12 +2924,6 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd
                                        sizeof(hpd_irq_dpcd_data),
                                        "Status: ");
 
-               for (i = 0; i < MAX_PIPES; i++) {
-                       pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i];
-                       if (pipe_ctx && pipe_ctx->stream && pipe_ctx->stream->link == link)
-                               link->dc->hwss.blank_stream(pipe_ctx);
-               }
-
                for (i = 0; i < MAX_PIPES; i++) {
                        pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i];
                        if (pipe_ctx && pipe_ctx->stream && pipe_ctx->stream->link == link)
@@ -2940,20 +2933,19 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd
                if (pipe_ctx == NULL || pipe_ctx->stream == NULL)
                        return false;
 
-               previous_link_settings = link->cur_link_settings;
 
-               perform_link_training_with_retries(&previous_link_settings,
-                       true, LINK_TRAINING_ATTEMPTS,
-                       pipe_ctx,
-                       pipe_ctx->stream->signal);
-
-               if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
-                       dc_link_reallocate_mst_payload(link);
+               for (i = 0; i < MAX_PIPES; i++) {
+                       pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i];
+                       if (pipe_ctx && pipe_ctx->stream && !pipe_ctx->stream->dpms_off &&
+                                       pipe_ctx->stream->link == link)
+                               core_link_disable_stream(pipe_ctx);
+               }
 
                for (i = 0; i < MAX_PIPES; i++) {
                        pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i];
-                       if (pipe_ctx && pipe_ctx->stream && pipe_ctx->stream->link == link)
-                               link->dc->hwss.unblank_stream(pipe_ctx, &previous_link_settings);
+                       if (pipe_ctx && pipe_ctx->stream && !pipe_ctx->stream->dpms_off &&
+                                       pipe_ctx->stream->link == link)
+                               core_link_enable_stream(link->dc->current_state, pipe_ctx);
                }
 
                status = false;