mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 18:09:56 +00:00
drm/amd/display: Cache streams targeting link when performing LT automation
[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.liu@amd.com> Signed-off-by: Michael Strauss <michael.strauss@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
327aba7f55
commit
f5b69101f9
@@ -76,6 +76,9 @@ static void dp_retrain_link_dp_test(struct dc_link *link,
|
|||||||
uint8_t count;
|
uint8_t count;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
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) !=
|
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));
|
link->dc->link_srv->dp_get_encoding_format((const struct dc_link_settings *) &link->cur_link_settings));
|
||||||
|
|
||||||
@@ -138,12 +141,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);
|
pipes[i]->stream_res.tg->funcs->enable_crtc(pipes[i]->stream_res.tg);
|
||||||
|
|
||||||
// Set DPMS on with stream update
|
// Set DPMS on with stream update
|
||||||
for (i = 0; i < state->stream_count; i++)
|
// Cache all streams on current link since dc_update_planes_and_stream might kill current_state
|
||||||
if (state->streams[i] && state->streams[i]->link && state->streams[i]->link == link) {
|
for (i = 0; i < MAX_PIPES; i++) {
|
||||||
stream_update.stream = state->streams[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;
|
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)
|
static void dp_test_send_link_training(struct dc_link *link)
|
||||||
|
|||||||
Reference in New Issue
Block a user