drm/amd/display: Added pixel dynamic expansion control.
authorRobin Singh <robin.singh@amd.com>
Thu, 22 Aug 2019 18:42:49 +0000 (14:42 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 11 Oct 2019 00:24:26 +0000 (19:24 -0500)
[Why]
To compare the crc of the framebuffer data at input of
display pipeline with the crc of the otg, we need to
disable pixel formatter's dynamic expansion feature during
crc capture and keep it enable in the normal operation.

[HOW]
Expose a new interface in DM and dc for pixel formatter
(fmt dynamic bitdepth expansion control). Interface control
the FMT_DYNAMIC_EXP_EN  bit, during crc capture keep
it disabled.

Signed-off-by: Robin Singh <robin.singh@amd.com>
Reviewed-by: Harry Wentland <Harry.Wentland@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/dc_hw_types.h
drivers/gpu/drm/amd/display/dc/dc_stream.h
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_opp.c
drivers/gpu/drm/amd/display/dc/inc/hw/opp.h

index a549c7c717ddc10233ffc4974c5ed0dfacbc8861..eaad9099bc0b4bfe91fa56f82d675acd993cdb95 100644 (file)
@@ -122,11 +122,16 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,
        }
 
        /* Configure dithering */
-       if (!dm_need_crc_dither(source))
+       if (!dm_need_crc_dither(source)) {
                dc_stream_set_dither_option(stream_state, DITHER_OPTION_TRUN8);
-       else
+               dc_stream_set_dyn_expansion(stream_state->ctx->dc, stream_state,
+                                           DYN_EXPANSION_DISABLE);
+       } else {
                dc_stream_set_dither_option(stream_state,
                                            DITHER_OPTION_DEFAULT);
+               dc_stream_set_dyn_expansion(stream_state->ctx->dc, stream_state,
+                                           DYN_EXPANSION_AUTO);
+       }
 
 unlock:
        mutex_unlock(&adev->dm.dc_lock);
index f24f82b68694eed223277a53005439c22cde510b..a56a989ee60721efd80aa05aa88e46d899449400 100644 (file)
@@ -411,6 +411,27 @@ bool dc_stream_get_crc(struct dc *dc, struct dc_stream_state *stream,
        return false;
 }
 
+void dc_stream_set_dyn_expansion(struct dc *dc, struct dc_stream_state *stream,
+               enum dc_dynamic_expansion option)
+{
+       /* OPP FMT dyn expansion updates*/
+       int i = 0;
+       struct pipe_ctx *pipe_ctx;
+
+       for (i = 0; i < MAX_PIPES; i++) {
+               if (dc->current_state->res_ctx.pipe_ctx[i].stream
+                               == stream) {
+                       pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i];
+                       pipe_ctx->stream_res.opp->dyn_expansion = option;
+                       pipe_ctx->stream_res.opp->funcs->opp_set_dyn_expansion(
+                                       pipe_ctx->stream_res.opp,
+                                       COLOR_SPACE_YCBCR601,
+                                       stream->timing.display_color_depth,
+                                       stream->signal);
+               }
+       }
+}
+
 void dc_stream_set_dither_option(struct dc_stream_state *stream,
                enum dc_dither_option option)
 {
index 2869b26d966a3a7a283c7dd365f70c035f560edf..e0856bb8511f6d9d7abfd4aecf7c87d18bd00e7a 100644 (file)
@@ -578,6 +578,11 @@ enum dc_quantization_range {
        QUANTIZATION_RANGE_LIMITED
 };
 
+enum dc_dynamic_expansion {
+       DYN_EXPANSION_AUTO,
+       DYN_EXPANSION_DISABLE
+};
+
 /* XFM */
 
 /* used in  struct dc_plane_state */
index 3c061d4f214fee776315e8ef17e494516850f9b2..fdb6adc37857a1654fbe5e33a95d5bb027a38aa8 100644 (file)
@@ -451,6 +451,9 @@ void dc_stream_set_static_screen_events(struct dc *dc,
                                        int num_streams,
                                        const struct dc_static_screen_events *events);
 
+void dc_stream_set_dyn_expansion(struct dc *dc, struct dc_stream_state *stream,
+               enum dc_dynamic_expansion option);
+
 void dc_stream_set_dither_option(struct dc_stream_state *stream,
                                 enum dc_dither_option option);
 
index 02c8a3e0b533dd9256e84343bbadb411292e2a5b..0a9ad692f541af3c821abdb5cb9c92d74c518832 100644 (file)
@@ -240,6 +240,9 @@ void opp1_set_dyn_expansion(
                        FMT_DYNAMIC_EXP_EN, 0,
                        FMT_DYNAMIC_EXP_MODE, 0);
 
+       if (opp->dyn_expansion == DYN_EXPANSION_DISABLE)
+               return;
+
        /*00 - 10-bit -> 12-bit dynamic expansion*/
        /*01 - 8-bit  -> 12-bit dynamic expansion*/
        if (signal == SIGNAL_TYPE_HDMI_TYPE_A ||
index 957e9047381aa84a2210fa9300fd6ad897fffaa1..18def2b6fafe02ca79f2adb42f93636805012c7a 100644 (file)
@@ -208,6 +208,7 @@ struct output_pixel_processor {
        struct mpc_tree mpc_tree_params;
        bool mpcc_disconnect_pending[MAX_PIPES];
        const struct opp_funcs *funcs;
+       uint32_t dyn_expansion;
 };
 
 enum fmt_stereo_action {