lkml.org 
[lkml]   [2020]   [Oct]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.9 105/111] drm/amd/display: Screen corruption on dual displays (DP+USB-C)
    Date
    From: Qingqing Zhuo <qingqing.zhuo@amd.com>

    [ Upstream commit ce271b40a91f781af3dee985c39e841ac5148766 ]

    [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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/amd/display/dc/core/dc.c | 2 +-
    drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 3 +++
    drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c | 3 +++
    3 files changed, 7 insertions(+), 1 deletion(-)

    diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
    index 92eb1ca1634fc..22cbfda6ab338 100644
    --- a/drivers/gpu/drm/amd/display/dc/core/dc.c
    +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
    @@ -2621,7 +2621,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);
    diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
    index f31f48dd0da29..aaf9a99f9f045 100644
    --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
    +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
    @@ -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);
    }
    diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
    index 88d41a385add8..a4f37d83d5cc9 100644
    --- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
    +++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
    @@ -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)
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-10-18 21:20    [W:2.243 / U:0.280 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site