drm/amd/display: intermittent underflow observed when PIP is toggled in Full screen
authorTashfique Abdullah <tabdullah@amd.com>
Wed, 4 Nov 2020 23:51:53 +0000 (18:51 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 24 Nov 2020 17:07:37 +0000 (12:07 -0500)
[Why]
The MPCC may change and request data when the pipes are switching from 2
to 1 or 1 to 2. During the switch there is a possibility of underflow
and flicker/missing data.

[How]
During VBlank the MPCC won't request data. The trick is to delay and
wait on VBlank, ONLY when pipes are either turning on or off, right
before MPCC is reset for the pipes.

Signed-off-by: Tashfique Abdullah <tabdullah@amd.com>
Reviewed-by: Aric Cyr <Aric.Cyr@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/dcn20/dcn20_hwseq.c

index b9c20e30d99dd6c63de63c2b9cead51d5eb0366a..abcb06044e6e59726baa7dc6e0de32cd7374f10f 100644 (file)
@@ -1695,6 +1695,15 @@ void dcn20_program_front_end_for_ctx(
                                && context->res_ctx.pipe_ctx[i].stream)
                        hws->funcs.blank_pixel_data(dc, &context->res_ctx.pipe_ctx[i], true);
 
+       /* wait for outstanding pending changes before adding or removing planes */
+       for (i = 0; i < dc->res_pool->pipe_count; i++) {
+               if (context->res_ctx.pipe_ctx[i].update_flags.bits.disable ||
+                               context->res_ctx.pipe_ctx[i].update_flags.bits.enable) {
+                       dc->hwss.wait_for_pending_cleared(dc, context);
+                       break;
+               }
+       }
+
        /* Disconnect mpcc */
        for (i = 0; i < dc->res_pool->pipe_count; i++)
                if (context->res_ctx.pipe_ctx[i].update_flags.bits.disable