drm/amd/display: Workaround to increase phantom pipe vactive in pipesplit
authorGeorge Shen <george.shen@amd.com>
Tue, 1 Nov 2022 04:16:56 +0000 (00:16 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 15 Nov 2022 18:35:14 +0000 (13:35 -0500)
[Why]
Certain high resolution displays exhibit DCC line corruption with SubVP
enabled. This is likely due to insufficient DCC meta data buffered
immediately after the mclk switch.

[How]
Add workaround to increase phantom pipe vactive height by
meta_row_height number of lines, thus increasing the amount of meta data
buffered immediately after mclk switch finishes.

Reviewed-by: Alvin Lee <Alvin.Lee2@amd.com>
Acked-by: Tom Chung <chiahsuan.chung@amd.com>
Signed-off-by: George Shen <george.shen@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c

index dadaac2..0b1e721 100644 (file)
@@ -531,9 +531,11 @@ void dcn32_set_phantom_stream_timing(struct dc *dc,
        unsigned int i, pipe_idx;
        struct pipe_ctx *pipe;
        uint32_t phantom_vactive, phantom_bp, pstate_width_fw_delay_lines;
+       unsigned int num_dpp;
        unsigned int vlevel = context->bw_ctx.dml.vba.VoltageLevel;
        unsigned int dcfclk = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb];
        unsigned int socclk = context->bw_ctx.dml.vba.SOCCLKPerState[vlevel];
+       struct vba_vars_st *vba = &context->bw_ctx.dml.vba;
 
        dc_assert_fp_enabled();
 
@@ -569,6 +571,11 @@ void dcn32_set_phantom_stream_timing(struct dc *dc,
        phantom_vactive = get_subviewport_lines_needed_in_mall(&context->bw_ctx.dml, pipes, pipe_cnt, pipe_idx) +
                                pstate_width_fw_delay_lines + dc->caps.subvp_swath_height_margin_lines;
 
+       // W/A for DCC corruption with certain high resolution timings.
+       // Determing if pipesplit is used. If so, add meta_row_height to the phantom vactive.
+       num_dpp = vba->NoOfDPP[vba->VoltageLevel][vba->maxMpcComb][vba->pipe_plane[pipe_idx]];
+       phantom_vactive += num_dpp > 1 ? vba->meta_row_height[vba->pipe_plane[pipe_idx]] : 0;
+
        // For backporch of phantom pipe, use vstartup of the main pipe
        phantom_bp = get_vstartup(&context->bw_ctx.dml, pipes, pipe_cnt, pipe_idx);