Commit cc4d99b8 authored by Charlene Liu's avatar Charlene Liu Committed by Alex Deucher

drm/amd/display: HDMI YCbCr422 12bpc pixel format issue

Signed-off-by: default avatarCharlene Liu <charlene.liu@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Acked-by: default avatarHarry Wentland <Harry.Wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 8fde5884
...@@ -1267,6 +1267,7 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx) ...@@ -1267,6 +1267,7 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
{ {
struct core_stream *stream = pipe_ctx->stream; struct core_stream *stream = pipe_ctx->stream;
struct core_link *link = stream->sink->link; struct core_link *link = stream->sink->link;
enum dc_color_depth display_color_depth;
if (dc_is_hdmi_signal(pipe_ctx->stream->signal)) if (dc_is_hdmi_signal(pipe_ctx->stream->signal))
dal_ddc_service_write_scdc_data( dal_ddc_service_write_scdc_data(
...@@ -1277,10 +1278,14 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx) ...@@ -1277,10 +1278,14 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
memset(&stream->sink->link->public.cur_link_settings, 0, memset(&stream->sink->link->public.cur_link_settings, 0,
sizeof(struct dc_link_settings)); sizeof(struct dc_link_settings));
display_color_depth = stream->public.timing.display_color_depth;
if (stream->public.timing.pixel_encoding == PIXEL_ENCODING_YCBCR422)
display_color_depth = COLOR_DEPTH_888;
link->link_enc->funcs->enable_tmds_output( link->link_enc->funcs->enable_tmds_output(
link->link_enc, link->link_enc,
pipe_ctx->clock_source->id, pipe_ctx->clock_source->id,
stream->public.timing.display_color_depth, display_color_depth,
pipe_ctx->stream->signal == SIGNAL_TYPE_HDMI_TYPE_A, pipe_ctx->stream->signal == SIGNAL_TYPE_HDMI_TYPE_A,
pipe_ctx->stream->signal == SIGNAL_TYPE_DVI_DUAL_LINK, pipe_ctx->stream->signal == SIGNAL_TYPE_DVI_DUAL_LINK,
stream->phy_pix_clk); stream->phy_pix_clk);
......
...@@ -1045,25 +1045,25 @@ static int get_norm_pix_clk(const struct dc_crtc_timing *timing) ...@@ -1045,25 +1045,25 @@ static int get_norm_pix_clk(const struct dc_crtc_timing *timing)
if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
pix_clk /= 2; pix_clk /= 2;
if (timing->pixel_encoding != PIXEL_ENCODING_YCBCR422) {
switch (timing->display_color_depth) { switch (timing->display_color_depth) {
case COLOR_DEPTH_888: case COLOR_DEPTH_888:
normalized_pix_clk = pix_clk; normalized_pix_clk = pix_clk;
break; break;
case COLOR_DEPTH_101010: case COLOR_DEPTH_101010:
normalized_pix_clk = (pix_clk * 30) / 24; normalized_pix_clk = (pix_clk * 30) / 24;
break;
case COLOR_DEPTH_121212:
normalized_pix_clk = (pix_clk * 36) / 24;
break; break;
case COLOR_DEPTH_121212: case COLOR_DEPTH_161616:
normalized_pix_clk = (pix_clk * 36) / 24; normalized_pix_clk = (pix_clk * 48) / 24;
break; break;
case COLOR_DEPTH_161616: default:
normalized_pix_clk = (pix_clk * 48) / 24; ASSERT(0);
break;
default:
ASSERT(0);
break; break;
}
} }
return normalized_pix_clk; return normalized_pix_clk;
} }
......
...@@ -390,25 +390,24 @@ static bool pll_adjust_pix_clk( ...@@ -390,25 +390,24 @@ static bool pll_adjust_pix_clk(
struct bp_adjust_pixel_clock_parameters bp_adjust_pixel_clock_params = { struct bp_adjust_pixel_clock_parameters bp_adjust_pixel_clock_params = {
0 }; 0 };
enum bp_result bp_result; enum bp_result bp_result;
switch (pix_clk_params->signal_type) { switch (pix_clk_params->signal_type) {
case SIGNAL_TYPE_HDMI_TYPE_A: { case SIGNAL_TYPE_HDMI_TYPE_A: {
requested_clk_khz = pix_clk_params->requested_pix_clk; requested_clk_khz = pix_clk_params->requested_pix_clk;
if (pix_clk_params->pixel_encoding != PIXEL_ENCODING_YCBCR422) {
switch (pix_clk_params->color_depth) { switch (pix_clk_params->color_depth) {
case COLOR_DEPTH_101010: case COLOR_DEPTH_101010:
requested_clk_khz = (requested_clk_khz * 5) >> 2; requested_clk_khz = (requested_clk_khz * 5) >> 2;
break; /* x1.25*/ break; /* x1.25*/
case COLOR_DEPTH_121212: case COLOR_DEPTH_121212:
requested_clk_khz = (requested_clk_khz * 6) >> 2; requested_clk_khz = (requested_clk_khz * 6) >> 2;
break; /* x1.5*/ break; /* x1.5*/
case COLOR_DEPTH_161616: case COLOR_DEPTH_161616:
requested_clk_khz = requested_clk_khz * 2; requested_clk_khz = requested_clk_khz * 2;
break; /* x2.0*/ break; /* x2.0*/
default: default:
break; break;
}
} }
actual_pix_clk_khz = requested_clk_khz; actual_pix_clk_khz = requested_clk_khz;
} }
break; break;
......
...@@ -366,19 +366,37 @@ static void set_truncation( ...@@ -366,19 +366,37 @@ static void set_truncation(
FMT_TRUNCATE_EN, 0, FMT_TRUNCATE_EN, 0,
FMT_TRUNCATE_DEPTH, 0, FMT_TRUNCATE_DEPTH, 0,
FMT_TRUNCATE_MODE, 0); FMT_TRUNCATE_MODE, 0);
/* no 10bpc trunc on DCE11*/
if (params->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
/* 8bpc trunc on YCbCr422*/
if (params->flags.TRUNCATE_DEPTH == 1)
REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
FMT_TRUNCATE_EN, 1,
FMT_TRUNCATE_DEPTH, 1,
FMT_TRUNCATE_MODE, 0);
else if (params->flags.TRUNCATE_DEPTH == 2)
/* 10bpc trunc on YCbCr422*/
REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
FMT_TRUNCATE_EN, 1,
FMT_TRUNCATE_DEPTH, 2,
FMT_TRUNCATE_MODE, 0);
return;
}
/* on other format-to do */
if (params->flags.TRUNCATE_ENABLED == 0 || if (params->flags.TRUNCATE_ENABLED == 0 ||
params->flags.TRUNCATE_DEPTH == 2) params->flags.TRUNCATE_DEPTH == 2)
return; return;
/*Set truncation depth and Enable truncation*/ /*Set truncation depth and Enable truncation*/
REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL, REG_UPDATE_3(FMT_BIT_DEPTH_CONTROL,
FMT_TRUNCATE_EN, 1, FMT_TRUNCATE_EN, 1,
FMT_TRUNCATE_DEPTH, params->flags.TRUNCATE_MODE, FMT_TRUNCATE_DEPTH,
FMT_TRUNCATE_MODE, params->flags.TRUNCATE_DEPTH); params->flags.TRUNCATE_MODE,
FMT_TRUNCATE_MODE,
params->flags.TRUNCATE_DEPTH);
} }
/** /**
* set_spatial_dither * set_spatial_dither
* 1) set spatial dithering mode: pattern of seed * 1) set spatial dithering mode: pattern of seed
......
...@@ -367,14 +367,20 @@ static void dce110_stream_encoder_hdmi_set_stream_attribute( ...@@ -367,14 +367,20 @@ static void dce110_stream_encoder_hdmi_set_stream_attribute(
HDMI_DEEP_COLOR_ENABLE, 1); HDMI_DEEP_COLOR_ENABLE, 1);
break; break;
case COLOR_DEPTH_121212: case COLOR_DEPTH_121212:
REG_UPDATE_2(HDMI_CONTROL, if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
HDMI_DEEP_COLOR_DEPTH, 2, REG_UPDATE_2(HDMI_CONTROL,
HDMI_DEEP_COLOR_ENABLE, 1); HDMI_DEEP_COLOR_DEPTH, 2,
HDMI_DEEP_COLOR_ENABLE, 0);
} else {
REG_UPDATE_2(HDMI_CONTROL,
HDMI_DEEP_COLOR_DEPTH, 2,
HDMI_DEEP_COLOR_ENABLE, 1);
}
break; break;
case COLOR_DEPTH_161616: case COLOR_DEPTH_161616:
REG_UPDATE_2(HDMI_CONTROL, REG_UPDATE_2(HDMI_CONTROL,
HDMI_DEEP_COLOR_DEPTH, 3, HDMI_DEEP_COLOR_DEPTH, 3,
HDMI_DEEP_COLOR_ENABLE, 1); HDMI_DEEP_COLOR_ENABLE, 1);
break; break;
default: default:
break; break;
......
...@@ -814,6 +814,9 @@ void dce110_resource_build_bit_depth_reduction_params( ...@@ -814,6 +814,9 @@ void dce110_resource_build_bit_depth_reduction_params(
fmt_bit_depth->flags.HIGHPASS_RANDOM = 1; fmt_bit_depth->flags.HIGHPASS_RANDOM = 1;
fmt_bit_depth->flags.TRUNCATE_ENABLED = 1; fmt_bit_depth->flags.TRUNCATE_ENABLED = 1;
fmt_bit_depth->flags.TRUNCATE_DEPTH = 2; fmt_bit_depth->flags.TRUNCATE_DEPTH = 2;
fmt_bit_depth->pixel_encoding =
stream->public.timing.pixel_encoding;
} }
return; return;
......
...@@ -94,7 +94,7 @@ struct pixel_clk_params { ...@@ -94,7 +94,7 @@ struct pixel_clk_params {
enum dc_color_depth color_depth; enum dc_color_depth color_depth;
struct csdp_ref_clk_ds_params de_spread_params; struct csdp_ref_clk_ds_params de_spread_params;
/*> de-spread info, relevant only for on-the-fly tune-up pixel rate*/ /*> de-spread info, relevant only for on-the-fly tune-up pixel rate*/
enum dc_pixel_encoding pixel_encoding;
struct pixel_clk_flags flags; struct pixel_clk_flags flags;
}; };
......
...@@ -86,6 +86,7 @@ struct bit_depth_reduction_params { ...@@ -86,6 +86,7 @@ struct bit_depth_reduction_params {
uint32_t r_seed_value; uint32_t r_seed_value;
uint32_t b_seed_value; uint32_t b_seed_value;
uint32_t g_seed_value; uint32_t g_seed_value;
enum dc_pixel_encoding pixel_encoding;
}; };
enum wide_gamut_regamma_mode { enum wide_gamut_regamma_mode {
......
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