drm/amd/display: Set compbuf size to min at prep prevent overbook crb
authorDuncan Ma <duncanma@amd.com>
Tue, 8 Feb 2022 20:05:09 +0000 (15:05 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 23 Feb 2022 19:21:43 +0000 (14:21 -0500)
[Why]
Detbuffer size is dynamically set for dcn31x. At certain moment,
compbuf+(def size * num pipes) > config return buffer size causing
flickering. This is easily reproducible when MPO is
enabled with two displays.

[How]
At prepare BW, use the min comp buffer size. When it is to
optimize BW, set compbuf size back to maximum possible size.

Reviewed-by: Charlene Liu <Charlene.Liu@amd.com>
Acked-by: Solomon Chiu <solomon.chiu@amd.com>
Signed-off-by: Duncan Ma <duncanma@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/dcn20/dcn20_hwseq.c
drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h

index 20a9cbb7c0a8177ff1fb75b442c055a308dac6b9..1ef880fed77669108a291513910b67a3668f52fb 100644 (file)
@@ -1818,6 +1818,7 @@ void dcn20_prepare_bandwidth(
                struct dc_state *context)
 {
        struct hubbub *hubbub = dc->res_pool->hubbub;
+       unsigned int compbuf_size_kb = 0;
 
        dc->clk_mgr->funcs->update_clocks(
                        dc->clk_mgr,
@@ -1829,9 +1830,16 @@ void dcn20_prepare_bandwidth(
                                        &context->bw_ctx.bw.dcn.watermarks,
                                        dc->res_pool->ref_clocks.dchub_ref_clock_inKhz / 1000,
                                        false);
+
        /* decrease compbuf size */
-       if (hubbub->funcs->program_compbuf_size)
-               hubbub->funcs->program_compbuf_size(hubbub, context->bw_ctx.bw.dcn.compbuf_size_kb, false);
+       if (hubbub->funcs->program_compbuf_size) {
+               if (context->bw_ctx.dml.ip.min_comp_buffer_size_kbytes)
+                       compbuf_size_kb = context->bw_ctx.dml.ip.min_comp_buffer_size_kbytes;
+               else
+                       compbuf_size_kb = context->bw_ctx.bw.dcn.compbuf_size_kb;
+
+               hubbub->funcs->program_compbuf_size(hubbub, compbuf_size_kb, false);
+       }
 }
 
 void dcn20_optimize_bandwidth(
index 8f9f1d607f7cb9aa43a57ae9660f257cba05ff7c..59f0a61c33cf9018deb5d792bd76a5d6619420e4 100644 (file)
@@ -141,6 +141,7 @@ struct _vcs_dpi_ip_params_st {
        unsigned int odm_capable;
        unsigned int rob_buffer_size_kbytes;
        unsigned int det_buffer_size_kbytes;
+       unsigned int min_comp_buffer_size_kbytes;
        unsigned int dpte_buffer_size_in_pte_reqs_luma;
        unsigned int dpte_buffer_size_in_pte_reqs_chroma;
        unsigned int pde_proc_buffer_size_64k_reqs;