From: Michael Strauss <michael.stra...@amd.com>

[WHY]
Last LT automation update can cause crash by referencing current_state and
calling into dc_update_planes_and_stream which may clobber current_state.

[HOW]
Cache relevant stream pointers and iterate through them instead of relying
on the current_state.

Reviewed-by: Wenjing Liu <wenjing....@amd.com>
Signed-off-by: Michael Strauss <michael.stra...@amd.com>
Signed-off-by: Ivan Lipski <ivan.lip...@amd.com>
---
 .../display/dc/link/accessories/link_dp_cts.c   | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_cts.c 
b/drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_cts.c
index 2956c2b3ad1a..9e33bf937a69 100644
--- a/drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_cts.c
+++ b/drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_cts.c
@@ -76,6 +76,8 @@ static void dp_retrain_link_dp_test(struct dc_link *link,
        uint8_t count;
        int i;
        struct audio_output audio_output[MAX_PIPES];
+       struct dc_stream_state *streams_on_link[MAX_PIPES];
+       int num_streams_on_link = 0;
 
        needs_divider_update = 
(link->dc->link_srv->dp_get_encoding_format(link_setting) !=
        link->dc->link_srv->dp_get_encoding_format((const struct 
dc_link_settings *) &link->cur_link_settings));
@@ -138,12 +140,19 @@ static void dp_retrain_link_dp_test(struct dc_link *link,
                
pipes[i]->stream_res.tg->funcs->enable_crtc(pipes[i]->stream_res.tg);
 
        // Set DPMS on with stream update
-       for (i = 0; i < state->stream_count; i++)
-               if (state->streams[i] && state->streams[i]->link && 
state->streams[i]->link == link) {
-                       stream_update.stream = state->streams[i];
+       // Cache all streams on current link since dc_update_planes_and_stream 
might kill current_state
+       for (i = 0; i < MAX_PIPES; i++) {
+               if (state->streams[i] && state->streams[i]->link && 
state->streams[i]->link == link)
+                       streams_on_link[num_streams_on_link++] = 
state->streams[i];
+       }
+
+       for (i = 0; i < num_streams_on_link; i++) {
+               if (streams_on_link[i] && streams_on_link[i]->link && 
streams_on_link[i]->link == link) {
+                       stream_update.stream = streams_on_link[i];
                        stream_update.dpms_off = &dpms_off;
-                       dc_update_planes_and_stream(state->clk_mgr->ctx->dc, 
NULL, 0, state->streams[i], &stream_update);
+                       dc_update_planes_and_stream(state->clk_mgr->ctx->dc, 
NULL, 0, streams_on_link[i], &stream_update);
                }
+       }
 }
 
 static void dp_test_send_link_training(struct dc_link *link)
-- 
2.43.0

Reply via email to