mirror of https://gitee.com/openkylin/linux.git
drm/amd/display: HDMI YCbCr422 12bpc pixel format issue
Signed-off-by: Charlene Liu <charlene.liu@amd.com> Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> Acked-by: Harry Wentland <Harry.Wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
8fde5884f4
commit
cc4d99b8a8
|
@ -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)
|
||||||
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)
|
||||||
|
|
||||||
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;
|
||||||
|
case COLOR_DEPTH_101010:
|
||||||
|
normalized_pix_clk = (pix_clk * 30) / 24;
|
||||||
|
break;
|
||||||
|
case COLOR_DEPTH_121212:
|
||||||
|
normalized_pix_clk = (pix_clk * 36) / 24;
|
||||||
break;
|
break;
|
||||||
case COLOR_DEPTH_101010:
|
case COLOR_DEPTH_161616:
|
||||||
normalized_pix_clk = (pix_clk * 30) / 24;
|
normalized_pix_clk = (pix_clk * 48) / 24;
|
||||||
break;
|
break;
|
||||||
case COLOR_DEPTH_121212:
|
default:
|
||||||
normalized_pix_clk = (pix_clk * 36) / 24;
|
ASSERT(0);
|
||||||
break;
|
|
||||||
case COLOR_DEPTH_161616:
|
|
||||||
normalized_pix_clk = (pix_clk * 48) / 24;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ASSERT(0);
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return normalized_pix_clk;
|
return normalized_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(
|
||||||
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->flags.TRUNCATE_ENABLED == 0 ||
|
|
||||||
params->flags.TRUNCATE_DEPTH == 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
|
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 ||
|
||||||
|
params->flags.TRUNCATE_DEPTH == 2)
|
||||||
|
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(
|
||||||
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(
|
||||||
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 {
|
||||||
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 {
|
||||||
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 {
|
||||||
|
|
Loading…
Reference in New Issue