From: Sung Lee <[email protected]>

[WHY]
Triplebuffer should be programmed on all pipes.
Some code assumed it only needed to be called on top
pipe, but as the HWSS function does not account
for that, it must be called on every pipe.

[HOW]
Remove condition to not program triplebuffer
on non-top/next pipe. Call the function
unconditionally on all pipes.

Reviewed-by: Dillon Varone <[email protected]>
Reviewed-by: Aric Cyr <[email protected]>
Signed-off-by: Sung Lee <[email protected]>
Signed-off-by: Ray Wu <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c      | 25 ++++++++++++++-----
 .../amd/display/dc/hwss/dcn20/dcn20_hwseq.c   |  2 +-
 .../amd/display/dc/hwss/dcn401/dcn401_hwseq.c |  2 +-
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 6ec22c0d5b97..6867837f01d7 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -4249,12 +4249,6 @@ static void commit_planes_for_stream(struct dc *dc,
                        if (update_type == UPDATE_TYPE_FAST)
                                continue;
 
-                       ASSERT(!pipe_ctx->plane_state->triplebuffer_flips);
-                       if (dc->hwss.program_triplebuffer != NULL && 
dc->debug.enable_tri_buf) {
-                               /*turn off triple buffer for full update*/
-                               dc->hwss.program_triplebuffer(
-                                       dc, pipe_ctx, 
pipe_ctx->plane_state->triplebuffer_flips);
-                       }
                        stream_status =
                                stream_get_status(context, pipe_ctx->stream);
 
@@ -4263,6 +4257,25 @@ static void commit_planes_for_stream(struct dc *dc,
                                        dc, pipe_ctx->stream, 
stream_status->plane_count, context);
                }
        }
+
+       for (j = 0; j < dc->res_pool->pipe_count; j++) {
+               struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j];
+
+               if (!pipe_ctx->plane_state)
+                       continue;
+
+               /* Full fe update*/
+               if (update_type == UPDATE_TYPE_FAST)
+                       continue;
+
+               ASSERT(!pipe_ctx->plane_state->triplebuffer_flips);
+               if (dc->hwss.program_triplebuffer != NULL && 
dc->debug.enable_tri_buf) {
+                       /*turn off triple buffer for full update*/
+                       dc->hwss.program_triplebuffer(
+                               dc, pipe_ctx, 
pipe_ctx->plane_state->triplebuffer_flips);
+               }
+       }
+
        if (dc->hwss.program_front_end_for_ctx && update_type != 
UPDATE_TYPE_FAST) {
                dc->hwss.program_front_end_for_ctx(dc, context);
 
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c
index 5e78b553adbd..858288c3b1ac 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c
@@ -2053,7 +2053,7 @@ void dcn20_program_front_end_for_ctx(
                for (i = 0; i < dc->res_pool->pipe_count; i++) {
                        pipe = &context->res_ctx.pipe_ctx[i];
 
-                       if (!pipe->top_pipe && !pipe->prev_odm_pipe && 
pipe->plane_state) {
+                       if (pipe->plane_state) {
                                ASSERT(!pipe->plane_state->triplebuffer_flips);
                                /*turn off triple buffer for full update*/
                                dc->hwss.program_triplebuffer(
diff --git a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
index ae7194da5987..e61ed07fdc62 100644
--- a/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
@@ -2361,7 +2361,7 @@ void dcn401_program_front_end_for_ctx(
                for (i = 0; i < dc->res_pool->pipe_count; i++) {
                        pipe = &context->res_ctx.pipe_ctx[i];
 
-                       if (!pipe->top_pipe && !pipe->prev_odm_pipe && 
pipe->plane_state) {
+                       if (pipe->plane_state) {
                                if (pipe->plane_state->triplebuffer_flips)
                                        BREAK_TO_DEBUGGER();
 
-- 
2.43.0

Reply via email to