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: 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>
This commit is contained in:
parent
f81b86a043
commit
90d268741f
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 ||
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user