diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0961-drm-amd-display-fix-YCbCr420-blank-color.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/0961-drm-amd-display-fix-YCbCr420-blank-color.patch | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0961-drm-amd-display-fix-YCbCr420-blank-color.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0961-drm-amd-display-fix-YCbCr420-blank-color.patch new file mode 100644 index 00000000..a1dae293 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0961-drm-amd-display-fix-YCbCr420-blank-color.patch @@ -0,0 +1,75 @@ +From 48a2ce5114a0bae4492b44d5ec54d33a9d7a848a Mon Sep 17 00:00:00 2001 +From: Eric Yang <Eric.Yang2@amd.com> +Date: Thu, 22 Nov 2018 02:07:06 -0500 +Subject: [PATCH 0961/2940] drm/amd/display: fix YCbCr420 blank color + +[Why] +YCbCr420 packing format uses two chanels for luma, and 1 +channel for both chroma component. Our previous implementation +did not account for this and results in every other pixel having +very high luma value, showing greyish color instead of black. + +YCbCr444 = <Y1, Cb1, Cr1>; <Y2, Cb2, Cr2> ..... +YCbCr420 = <Y1, Y2, Cb1>; <Y3, Y4, Cr1> ..... + +[How] +Program the second channel with the black color value for luma +as well. + +Signed-off-by: Eric Yang <Eric.Yang2@amd.com> +Reviewed-by: Hugo Hu <Hugo.Hu@amd.com> +Acked-by: Leo Li <sunpeng.li@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + .../drm/amd/display/dc/dce110/dce110_hw_sequencer.c | 11 ++++++++++- + .../gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 9 +++++++++ + 2 files changed, 19 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +index 82bdc9ecfc98..0247b5be3b93 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +@@ -1267,10 +1267,19 @@ static void program_scaler(const struct dc *dc, + pipe_ctx->plane_res.scl_data.lb_params.depth, + &pipe_ctx->stream->bit_depth_params); + +- if (pipe_ctx->stream_res.tg->funcs->set_overscan_blank_color) ++ if (pipe_ctx->stream_res.tg->funcs->set_overscan_blank_color) { ++ /* ++ * The way 420 is packed, 2 channels carry Y component, 1 channel ++ * alternate between Cb and Cr, so both channels need the pixel ++ * value for Y ++ */ ++ if (pipe_ctx->stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420) ++ color.color_r_cr = color.color_g_y; ++ + pipe_ctx->stream_res.tg->funcs->set_overscan_blank_color( + pipe_ctx->stream_res.tg, + &color); ++ } + + pipe_ctx->plane_res.xfm->funcs->transform_set_scaler(pipe_ctx->plane_res.xfm, + &pipe_ctx->plane_res.scl_data); +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +index f507c7835847..5c2a17dcd08b 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +@@ -2158,6 +2158,15 @@ static void dcn10_blank_pixel_data( + color_space = stream->output_color_space; + color_space_to_black_color(dc, color_space, &black_color); + ++ /* ++ * The way 420 is packed, 2 channels carry Y component, 1 channel ++ * alternate between Cb and Cr, so both channels need the pixel ++ * value for Y ++ */ ++ if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420) ++ black_color.color_r_cr = black_color.color_g_y; ++ ++ + if (stream_res->tg->funcs->set_blank_color) + stream_res->tg->funcs->set_blank_color( + stream_res->tg, +-- +2.17.1 + |