Commit 90d26874 authored by Robin Singh's avatar Robin Singh Committed by Alex Deucher

drm/amd/display: Added pixel dynamic expansion control.

[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: default avatarRobin Singh <robin.singh@amd.com>
Reviewed-by: default avatarHarry Wentland <Harry.Wentland@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent f81b86a0
...@@ -122,11 +122,16 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc, ...@@ -122,11 +122,16 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,
} }
/* Configure dithering */ /* Configure dithering */
if (!dm_need_crc_dither(source)) if (!dm_need_crc_dither(source)) {
dc_stream_set_dither_option(stream_state, DITHER_OPTION_TRUN8); 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, dc_stream_set_dither_option(stream_state,
DITHER_OPTION_DEFAULT); DITHER_OPTION_DEFAULT);
dc_stream_set_dyn_expansion(stream_state->ctx->dc, stream_state,
DYN_EXPANSION_AUTO);
}
unlock: unlock:
mutex_unlock(&adev->dm.dc_lock); mutex_unlock(&adev->dm.dc_lock);
......
...@@ -411,6 +411,27 @@ bool dc_stream_get_crc(struct dc *dc, struct dc_stream_state *stream, ...@@ -411,6 +411,27 @@ bool dc_stream_get_crc(struct dc *dc, struct dc_stream_state *stream,
return false; 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, void dc_stream_set_dither_option(struct dc_stream_state *stream,
enum dc_dither_option option) enum dc_dither_option option)
{ {
......
...@@ -578,6 +578,11 @@ enum dc_quantization_range { ...@@ -578,6 +578,11 @@ enum dc_quantization_range {
QUANTIZATION_RANGE_LIMITED QUANTIZATION_RANGE_LIMITED
}; };
enum dc_dynamic_expansion {
DYN_EXPANSION_AUTO,
DYN_EXPANSION_DISABLE
};
/* XFM */ /* XFM */
/* used in struct dc_plane_state */ /* used in struct dc_plane_state */
......
...@@ -451,6 +451,9 @@ void dc_stream_set_static_screen_events(struct dc *dc, ...@@ -451,6 +451,9 @@ void dc_stream_set_static_screen_events(struct dc *dc,
int num_streams, int num_streams,
const struct dc_static_screen_events *events); 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, void dc_stream_set_dither_option(struct dc_stream_state *stream,
enum dc_dither_option option); enum dc_dither_option option);
......
...@@ -240,6 +240,9 @@ void opp1_set_dyn_expansion( ...@@ -240,6 +240,9 @@ void opp1_set_dyn_expansion(
FMT_DYNAMIC_EXP_EN, 0, FMT_DYNAMIC_EXP_EN, 0,
FMT_DYNAMIC_EXP_MODE, 0); FMT_DYNAMIC_EXP_MODE, 0);
if (opp->dyn_expansion == DYN_EXPANSION_DISABLE)
return;
/*00 - 10-bit -> 12-bit dynamic expansion*/ /*00 - 10-bit -> 12-bit dynamic expansion*/
/*01 - 8-bit -> 12-bit dynamic expansion*/ /*01 - 8-bit -> 12-bit dynamic expansion*/
if (signal == SIGNAL_TYPE_HDMI_TYPE_A || if (signal == SIGNAL_TYPE_HDMI_TYPE_A ||
......
...@@ -208,6 +208,7 @@ struct output_pixel_processor { ...@@ -208,6 +208,7 @@ struct output_pixel_processor {
struct mpc_tree mpc_tree_params; struct mpc_tree mpc_tree_params;
bool mpcc_disconnect_pending[MAX_PIPES]; bool mpcc_disconnect_pending[MAX_PIPES];
const struct opp_funcs *funcs; const struct opp_funcs *funcs;
uint32_t dyn_expansion;
}; };
enum fmt_stereo_action { enum fmt_stereo_action {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment