drm/amd/display: Screen corruption on dual displays (DP+USB-C)
authorQingqing Zhuo <qingqing.zhuo@amd.com>
Thu, 30 Jul 2020 19:35:41 +0000 (15:35 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 17 Aug 2020 18:08:21 +0000 (14:08 -0400)
[why]
Current pipe merge and split logic only supports cases where new
dc_state is allocated and relies on dc->current_state to gather
information from previous dc_state.

Calls to validate_bandwidth on UPDATE_TYPE_MED would cause an issue
because there is no new dc_state allocated, and data in
dc->current_state would be overwritten during pipe merge.

[how]
Only allow validate_bandwidth when new dc_state space is created.

Signed-off-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c

index a2084f2..dc463d9 100644 (file)
@@ -2636,7 +2636,7 @@ void dc_commit_updates_for_stream(struct dc *dc,
 
        copy_stream_update_to_stream(dc, context, stream, stream_update);
 
-       if (update_type > UPDATE_TYPE_FAST) {
+       if (update_type >= UPDATE_TYPE_FULL) {
                if (!dc->res_pool->funcs->validate_bandwidth(dc, context, false)) {
                        DC_ERROR("Mode validation failed for stream update!\n");
                        dc_release_state(context);
index c31d1f3..1b98744 100644 (file)
@@ -3209,6 +3209,9 @@ static noinline bool dcn20_validate_bandwidth_fp(struct dc *dc,
        context->bw_ctx.dml.soc.allow_dram_clock_one_display_vactive =
                dc->debug.enable_dram_clock_change_one_display_vactive;
 
+       /*Unsafe due to current pipe merge and split logic*/
+       ASSERT(context != dc->current_state);
+
        if (fast_validate) {
                return dcn20_validate_bandwidth_internal(dc, context, true);
        }
index a828696..78743ae 100644 (file)
@@ -1184,6 +1184,9 @@ bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context,
 
        BW_VAL_TRACE_COUNT();
 
+       /*Unsafe due to current pipe merge and split logic*/
+       ASSERT(context != dc->current_state);
+
        out = dcn20_fast_validate_bw(dc, context, pipes, &pipe_cnt, pipe_split_from, &vlevel);
 
        if (pipe_cnt == 0)