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 a549c7c..eaad909 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 f24f82b..a56a989 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 2869b26..e0856bb 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 3c061d4..fdb6adc 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 02c8a3e..0a9ad69 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 957e904..18def2b 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 {