drm/amd/display: Reprogram FMT on pipe change
authorJulian Parkin <julian.parkin@amd.com>
Thu, 22 Aug 2019 20:32:05 +0000 (16:32 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 11 Oct 2019 00:25:00 +0000 (19:25 -0500)
[Why]
When planes are added or removed from a stream, the change
in pipe usage from dynamic MPC combine can cause a second
stream using ODM combine to pick a different pipe to combine with.

In this scenario, a different OPP is connected to the ODM without
programming its FMT.

[How]
Reprogram the FMT in dcn20_program_pipe whenever a pipe is
newly enabled, or when its opp changes.

Signed-off-by: Julian Parkin <julian.parkin@amd.com>
Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c

index 1b4aac1..4a00382 100644 (file)
@@ -1399,6 +1399,26 @@ static void dcn20_program_pipe(
         */
        if (pipe_ctx->update_flags.bits.enable || pipe_ctx->stream->update_flags.bits.out_tf)
                dc->hwss.set_output_transfer_func(pipe_ctx, pipe_ctx->stream);
+
+       /* If the pipe has been enabled or has a different opp, we
+        * should reprogram the fmt. This deals with cases where
+        * interation between mpc and odm combine on different streams
+        * causes a different pipe to be chosen to odm combine with.
+        */
+       if (pipe_ctx->update_flags.bits.enable
+           || pipe_ctx->update_flags.bits.opp_changed) {
+
+               pipe_ctx->stream_res.opp->funcs->opp_set_dyn_expansion(
+                       pipe_ctx->stream_res.opp,
+                       COLOR_SPACE_YCBCR601,
+                       pipe_ctx->stream->timing.display_color_depth,
+                       pipe_ctx->stream->signal);
+
+               pipe_ctx->stream_res.opp->funcs->opp_program_fmt(
+                       pipe_ctx->stream_res.opp,
+                       &pipe_ctx->stream->bit_depth_params,
+                       &pipe_ctx->stream->clamping);
+       }
 }
 
 static bool does_pipe_need_lock(struct pipe_ctx *pipe)