diff options
Diffstat (limited to 'meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0157-drm-amd-display-HDR-Enablement-For-Applications.patch')
-rw-r--r-- | meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0157-drm-amd-display-HDR-Enablement-For-Applications.patch | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0157-drm-amd-display-HDR-Enablement-For-Applications.patch b/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0157-drm-amd-display-HDR-Enablement-For-Applications.patch new file mode 100644 index 00000000..2de24823 --- /dev/null +++ b/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0157-drm-amd-display-HDR-Enablement-For-Applications.patch @@ -0,0 +1,219 @@ +From c981b4eb6e1265a338bb9edf5e1caa9e1d557cbb Mon Sep 17 00:00:00 2001 +From: Amy Zhang <Amy.Zhang@amd.com> +Date: Fri, 13 Jan 2017 16:49:26 -0500 +Subject: [PATCH 0157/4131] drm/amd/display: HDR Enablement For Applications + +- Made sure dest color space is updated in stream and info frame +- Optimized segment distribution algorithm for regamma mapping + +Signed-off-by: Amy Zhang <Amy.Zhang@amd.com> +Acked-by: Harry Wentland <Harry.Wentland@amd.com> +Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 14 ++++ + drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 6 +- + .../amd/display/dc/dce110/dce110_hw_sequencer.c | 94 ++++++++++++++++++---- + drivers/gpu/drm/amd/display/dc/inc/hw/transform.h | 11 +++ + 4 files changed, 107 insertions(+), 18 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +index fe79a28..8b41c77 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +@@ -1310,6 +1310,20 @@ static void set_avi_info_frame( + info_frame.avi_info_packet.info_packet_hdmi.bits.C0_C1 = + COLORIMETRY_NO_DATA; + ++ if (color_space == COLOR_SPACE_2020_RGB_FULLRANGE || ++ color_space == COLOR_SPACE_2020_RGB_LIMITEDRANGE || ++ color_space == COLOR_SPACE_2020_YCBCR) { ++ info_frame.avi_info_packet.info_packet_hdmi.bits.EC0_EC2 = ++ COLORIMETRYEX_BT2020RGBYCBCR; ++ info_frame.avi_info_packet.info_packet_hdmi.bits.C0_C1 = ++ COLORIMETRY_EXTENDED; ++ } else if (color_space == COLOR_SPACE_ADOBERGB) { ++ info_frame.avi_info_packet.info_packet_hdmi.bits.EC0_EC2 = ++ COLORIMETRYEX_ADOBERGB; ++ info_frame.avi_info_packet.info_packet_hdmi.bits.C0_C1 = ++ COLORIMETRY_EXTENDED; ++ } ++ + /* TODO: un-hardcode aspect ratio */ + aspect = stream->public.timing.aspect_ratio; + +diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h +index 00958bd..a17e7bc 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h ++++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h +@@ -444,7 +444,11 @@ enum dc_color_space { + COLOR_SPACE_YCBCR601, + COLOR_SPACE_YCBCR709, + COLOR_SPACE_YCBCR601_LIMITED, +- COLOR_SPACE_YCBCR709_LIMITED ++ COLOR_SPACE_YCBCR709_LIMITED, ++ COLOR_SPACE_2020_RGB_FULLRANGE, ++ COLOR_SPACE_2020_RGB_LIMITEDRANGE, ++ COLOR_SPACE_2020_YCBCR, ++ COLOR_SPACE_ADOBERGB, + }; + + enum dc_quantization_range { +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 ee393a1..e9fd83e 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 +@@ -594,39 +594,88 @@ static bool dce110_translate_regamma_to_hw_format(const struct dc_transfer_func + struct fixed31_32 y3_max; + + int32_t segment_start, segment_end; +- uint32_t hw_points, start_index; +- uint32_t i, j; ++ uint32_t i, j, k, seg_distr[16], increment, start_index; ++ uint32_t hw_points = 0; + + memset(regamma_params, 0, sizeof(struct pwl_params)); + + if (output_tf->tf == TRANSFER_FUNCTION_PQ) { +- /* 16 segments x 16 points ++ /* 16 segments + * segments are from 2^-11 to 2^5 + */ + segment_start = -11; + segment_end = 5; + ++ seg_distr[0] = 2; ++ seg_distr[1] = 2; ++ seg_distr[2] = 2; ++ seg_distr[3] = 2; ++ seg_distr[4] = 2; ++ seg_distr[5] = 2; ++ seg_distr[6] = 3; ++ seg_distr[7] = 4; ++ seg_distr[8] = 4; ++ seg_distr[9] = 4; ++ seg_distr[10] = 4; ++ seg_distr[11] = 5; ++ seg_distr[12] = 5; ++ seg_distr[13] = 5; ++ seg_distr[14] = 5; ++ seg_distr[15] = 5; ++ + } else { +- /* 10 segments x 16 points ++ /* 10 segments + * segment is from 2^-10 to 2^0 + */ + segment_start = -10; + segment_end = 0; ++ ++ seg_distr[0] = 3; ++ seg_distr[1] = 4; ++ seg_distr[2] = 4; ++ seg_distr[3] = 4; ++ seg_distr[4] = 4; ++ seg_distr[5] = 4; ++ seg_distr[6] = 4; ++ seg_distr[7] = 4; ++ seg_distr[8] = 5; ++ seg_distr[9] = 5; ++ seg_distr[10] = -1; ++ seg_distr[11] = -1; ++ seg_distr[12] = -1; ++ seg_distr[13] = -1; ++ seg_distr[14] = -1; ++ seg_distr[15] = -1; ++ } ++ ++ for (k = 0; k < 16; k++) { ++ if (seg_distr[k] != -1) ++ hw_points += (1 << seg_distr[k]); + } + +- hw_points = (segment_end - segment_start) * 16; + j = 0; +- /* (segment + 25) * 32, every 2nd point */ +- start_index = (segment_start + 25) * 32; +- for (i = start_index; i <= 1025; i += 2) { +- if (j > hw_points) +- break; +- rgb_resulted[j].red = output_tf->tf_pts.red[i]; +- rgb_resulted[j].green = output_tf->tf_pts.green[i]; +- rgb_resulted[j].blue = output_tf->tf_pts.blue[i]; +- j++; ++ for (k = 0; k < (segment_end - segment_start); k++) { ++ increment = 32 / (1 << seg_distr[k]); ++ start_index = (segment_start + k + 25) * 32; ++ for (i = start_index; i < start_index + 32; i += increment) { ++ if (j == hw_points - 1) ++ break; ++ rgb_resulted[j].red = output_tf->tf_pts.red[i]; ++ rgb_resulted[j].green = output_tf->tf_pts.green[i]; ++ rgb_resulted[j].blue = output_tf->tf_pts.blue[i]; ++ j++; ++ } + } + ++ /* last point */ ++ start_index = (segment_end + 25) * 32; ++ rgb_resulted[hw_points - 1].red = ++ output_tf->tf_pts.red[start_index]; ++ rgb_resulted[hw_points - 1].green = ++ output_tf->tf_pts.green[start_index]; ++ rgb_resulted[hw_points - 1].blue = ++ output_tf->tf_pts.blue[start_index]; ++ + arr_points[0].x = dal_fixed31_32_pow(dal_fixed31_32_from_int(2), + dal_fixed31_32_from_int(segment_start)); + arr_points[1].x = dal_fixed31_32_pow(dal_fixed31_32_from_int(2), +@@ -677,11 +726,22 @@ static bool dce110_translate_regamma_to_hw_format(const struct dc_transfer_func + + regamma_params->hw_points_num = hw_points; + +- for (i = 0; i < segment_end - segment_start; i++) { +- regamma_params->arr_curve_points[i].offset = i * 16; +- regamma_params->arr_curve_points[i].segments_num = 4; ++ i = 1; ++ for (k = 0; k < 16 && i < 16; k++) { ++ if (seg_distr[k] != -1) { ++ regamma_params->arr_curve_points[k].segments_num = ++ seg_distr[k]; ++ regamma_params->arr_curve_points[i].offset = ++ regamma_params->arr_curve_points[k]. ++ offset + (1 << seg_distr[k]); ++ } ++ i++; + } + ++ if (seg_distr[k] != -1) ++ regamma_params->arr_curve_points[k].segments_num = ++ seg_distr[k]; ++ + struct pwl_result_data *rgb = rgb_resulted; + struct pwl_result_data *rgb_plus_1 = rgb_resulted + 1; + +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/transform.h b/drivers/gpu/drm/amd/display/dc/inc/hw/transform.h +index ef743b7..a510d3f 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw/transform.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/transform.h +@@ -47,6 +47,17 @@ enum colorimetry { + COLORIMETRY_EXTENDED = 3 + }; + ++enum colorimetry_ext { ++ COLORIMETRYEX_XVYCC601 = 0, ++ COLORIMETRYEX_XVYCC709 = 1, ++ COLORIMETRYEX_SYCC601 = 2, ++ COLORIMETRYEX_ADOBEYCC601 = 3, ++ COLORIMETRYEX_ADOBERGB = 4, ++ COLORIMETRYEX_BT2020YCC = 5, ++ COLORIMETRYEX_BT2020RGBYCBCR = 6, ++ COLORIMETRYEX_RESERVED = 7 ++}; ++ + enum active_format_info { + ACTIVE_FORMAT_NO_DATA = 0, + ACTIVE_FORMAT_VALID = 1 +-- +2.7.4 + |