diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2660-drm-amd-display-Move-hdr_metadata-from-plane-to-stre.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2660-drm-amd-display-Move-hdr_metadata-from-plane-to-stre.patch | 419 |
1 files changed, 419 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2660-drm-amd-display-Move-hdr_metadata-from-plane-to-stre.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2660-drm-amd-display-Move-hdr_metadata-from-plane-to-stre.patch new file mode 100644 index 00000000..519c51ef --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2660-drm-amd-display-Move-hdr_metadata-from-plane-to-stre.patch @@ -0,0 +1,419 @@ +From d7221724e1ab8515f2a8162927b4c165d77e8a8b Mon Sep 17 00:00:00 2001 +From: Anthony Koo <Anthony.Koo@amd.com> +Date: Mon, 23 Oct 2017 17:02:02 -0400 +Subject: [PATCH 2660/4131] drm/amd/display: Move hdr_metadata from plane to + stream + +Need to move HDR Metadata from Surface to Stream since there is only one +infoframe possible per stream. + +Also cleaning up some duplicate definitions. + +Signed-off-by: Anthony Koo <anthony.koo@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> +--- + drivers/gpu/drm/amd/display/dc/core/dc.c | 19 +++++++--- + drivers/gpu/drm/amd/display/dc/core/dc_debug.c | 4 +++ + drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 41 +++++++++------------- + drivers/gpu/drm/amd/display/dc/dc.h | 35 +++++------------- + drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 9 +++++ + .../drm/amd/display/dc/dce/dce_stream_encoder.c | 11 +++++- + .../amd/display/dc/dce110/dce110_hw_sequencer.c | 3 +- + .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 3 +- + 8 files changed, 65 insertions(+), 60 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index f91d0da..a8a3ca4 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -960,6 +960,7 @@ bool dc_commit_planes_to_stream( + flip_addr[i].address = plane_states[i]->address; + flip_addr[i].flip_immediate = plane_states[i]->flip_immediate; + plane_info[i].color_space = plane_states[i]->color_space; ++ plane_info[i].input_tf = plane_states[i]->input_tf; + plane_info[i].format = plane_states[i]->format; + plane_info[i].plane_size = plane_states[i]->plane_size; + plane_info[i].rotation = plane_states[i]->rotation; +@@ -1085,12 +1086,12 @@ static enum surface_update_type get_plane_info_update_type( + + /* Full update parameters */ + temp_plane_info.color_space = u->surface->color_space; ++ temp_plane_info.input_tf = u->surface->input_tf; + temp_plane_info.dcc = u->surface->dcc; + temp_plane_info.horizontal_mirror = u->surface->horizontal_mirror; + temp_plane_info.plane_size = u->surface->plane_size; + temp_plane_info.rotation = u->surface->rotation; + temp_plane_info.stereo_format = u->surface->stereo_format; +- temp_plane_info.input_csc_enabled = u->surface->input_csc_color_matrix.enable_adjustment; + + if (surface_index == 0) + temp_plane_info.visible = u->plane_info->visible; +@@ -1171,7 +1172,6 @@ static enum surface_update_type det_surface_update( + overall_type = type; + + if (u->in_transfer_func || +- u->hdr_static_metadata || + u->input_csc_color_matrix) { + if (overall_type < UPDATE_TYPE_MED) + overall_type = UPDATE_TYPE_MED; +@@ -1303,14 +1303,25 @@ static void commit_planes_for_stream(struct dc *dc, + pipe_ctx->top_pipe->plane_state == pipe_ctx->plane_state)) + dc->hwss.set_input_transfer_func( + pipe_ctx, pipe_ctx->plane_state); ++ } ++ } ++ ++ if (update_type > UPDATE_TYPE_FAST) { ++ for (j = 0; j < dc->res_pool->pipe_count; j++) { ++ struct pipe_ctx *pipe_ctx = ++ &context->res_ctx.pipe_ctx[j]; ++ ++ if (!pipe_ctx->stream) ++ continue; + + if (stream_update != NULL && +- stream_update->out_transfer_func != NULL) { ++ stream_update->out_transfer_func != NULL) { + dc->hwss.set_output_transfer_func( + pipe_ctx, pipe_ctx->stream); + } + +- if (srf_updates[i].hdr_static_metadata) { ++ if (stream_update != NULL && ++ stream_update->hdr_static_metadata) { + resource_build_info_frame(pipe_ctx); + dc->hwss.update_info_frame(pipe_ctx); + } +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_debug.c b/drivers/gpu/drm/amd/display/dc/core/dc_debug.c +index 6acee54..2e50938 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_debug.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_debug.c +@@ -137,6 +137,7 @@ void pre_surface_trace( + "plane_state->tiling_info.gfx8.pipe_config = %d;\n" + "plane_state->tiling_info.gfx8.array_mode = %d;\n" + "plane_state->color_space = %d;\n" ++ "plane_state->input_tf = %d;\n" + "plane_state->dcc.enable = %d;\n" + "plane_state->format = %d;\n" + "plane_state->rotation = %d;\n" +@@ -144,6 +145,7 @@ void pre_surface_trace( + plane_state->tiling_info.gfx8.pipe_config, + plane_state->tiling_info.gfx8.array_mode, + plane_state->color_space, ++ plane_state->input_tf, + plane_state->dcc.enable, + plane_state->format, + plane_state->rotation, +@@ -184,6 +186,7 @@ void update_surface_trace( + if (update->plane_info) { + SURFACE_TRACE( + "plane_info->color_space = %d;\n" ++ "plane_info->input_tf = %d;\n" + "plane_info->format = %d;\n" + "plane_info->plane_size.grph.surface_pitch = %d;\n" + "plane_info->plane_size.grph.surface_size.height = %d;\n" +@@ -192,6 +195,7 @@ void update_surface_trace( + "plane_info->plane_size.grph.surface_size.y = %d;\n" + "plane_info->rotation = %d;\n", + update->plane_info->color_space, ++ update->plane_info->input_tf, + update->plane_info->format, + update->plane_info->plane_size.grph.surface_pitch, + update->plane_info->plane_size.grph.surface_size.height, +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 ced339a..c20aa1c 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +@@ -2311,20 +2311,13 @@ static void set_spd_info_packet( + + static void set_hdr_static_info_packet( + struct encoder_info_packet *info_packet, +- struct dc_plane_state *plane_state, + struct dc_stream_state *stream) + { + uint16_t i = 0; + enum signal_type signal = stream->signal; +- struct dc_hdr_static_metadata hdr_metadata; + uint32_t data; + +- if (!plane_state) +- return; +- +- hdr_metadata = plane_state->hdr_static_ctx; +- +- if (!hdr_metadata.hdr_supported) ++ if (!stream->hdr_static_metadata.hdr_supported) + return; + + if (dc_is_hdmi_signal(signal)) { +@@ -2344,55 +2337,55 @@ static void set_hdr_static_info_packet( + i = 2; + } + +- data = hdr_metadata.is_hdr; ++ data = stream->hdr_static_metadata.is_hdr; + info_packet->sb[i++] = data ? 0x02 : 0x00; + info_packet->sb[i++] = 0x00; + +- data = hdr_metadata.chromaticity_green_x / 2; ++ data = stream->hdr_static_metadata.chromaticity_green_x / 2; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +- data = hdr_metadata.chromaticity_green_y / 2; ++ data = stream->hdr_static_metadata.chromaticity_green_y / 2; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +- data = hdr_metadata.chromaticity_blue_x / 2; ++ data = stream->hdr_static_metadata.chromaticity_blue_x / 2; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +- data = hdr_metadata.chromaticity_blue_y / 2; ++ data = stream->hdr_static_metadata.chromaticity_blue_y / 2; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +- data = hdr_metadata.chromaticity_red_x / 2; ++ data = stream->hdr_static_metadata.chromaticity_red_x / 2; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +- data = hdr_metadata.chromaticity_red_y / 2; ++ data = stream->hdr_static_metadata.chromaticity_red_y / 2; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +- data = hdr_metadata.chromaticity_white_point_x / 2; ++ data = stream->hdr_static_metadata.chromaticity_white_point_x / 2; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +- data = hdr_metadata.chromaticity_white_point_y / 2; ++ data = stream->hdr_static_metadata.chromaticity_white_point_y / 2; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +- data = hdr_metadata.max_luminance; ++ data = stream->hdr_static_metadata.max_luminance; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +- data = hdr_metadata.min_luminance; ++ data = stream->hdr_static_metadata.min_luminance; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +- data = hdr_metadata.maximum_content_light_level; ++ data = stream->hdr_static_metadata.maximum_content_light_level; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +- data = hdr_metadata.maximum_frame_average_light_level; ++ data = stream->hdr_static_metadata.maximum_frame_average_light_level; + info_packet->sb[i++] = data & 0xFF; + info_packet->sb[i++] = (data & 0xFF00) >> 8; + +@@ -2543,16 +2536,14 @@ void resource_build_info_frame(struct pipe_ctx *pipe_ctx) + + set_spd_info_packet(&info->spd, pipe_ctx->stream); + +- set_hdr_static_info_packet(&info->hdrsmd, +- pipe_ctx->plane_state, pipe_ctx->stream); ++ set_hdr_static_info_packet(&info->hdrsmd, pipe_ctx->stream); + + } else if (dc_is_dp_signal(signal)) { + set_vsc_info_packet(&info->vsc, pipe_ctx->stream); + + set_spd_info_packet(&info->spd, pipe_ctx->stream); + +- set_hdr_static_info_packet(&info->hdrsmd, +- pipe_ctx->plane_state, pipe_ctx->stream); ++ set_hdr_static_info_packet(&info->hdrsmd, pipe_ctx->stream); + } + + patch_gamut_packet_checksum(&info->gamut); +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index 19187fe..43b648f 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -334,24 +334,6 @@ enum color_transfer_func { + transfer_func_gamma_26 + }; + +-enum color_color_space { +- color_space_unsupported, +- color_space_srgb, +- color_space_bt601, +- color_space_bt709, +- color_space_xv_ycc_bt601, +- color_space_xv_ycc_bt709, +- color_space_xr_rgb, +- color_space_bt2020, +- color_space_adobe, +- color_space_dci_p3, +- color_space_sc_rgb_ms_ref, +- color_space_display_native, +- color_space_app_ctrl, +- color_space_dolby_vision, +- color_space_custom_coordinates +-}; +- + struct dc_hdr_static_metadata { + /* display chromaticities and white point in units of 0.00001 */ + unsigned int chromaticity_green_x; +@@ -427,7 +409,6 @@ struct dc_plane_state { + union dc_tiling_info tiling_info; + + struct dc_plane_dcc_param dcc; +- struct dc_hdr_static_metadata hdr_static_ctx; + + struct dc_gamma *gamma_correction; + struct dc_transfer_func *in_transfer_func; +@@ -435,13 +416,12 @@ struct dc_plane_state { + struct csc_transform input_csc_color_matrix; + struct fixed31_32 coeff_reduction_factor; + +- // sourceContentAttribute cache +- bool is_source_input_valid; +- struct dc_hdr_static_metadata source_input_mastering_info; +- enum color_color_space source_input_color_space; +- enum color_transfer_func source_input_tf; ++ // TODO: No longer used, remove ++ struct dc_hdr_static_metadata hdr_static_ctx; + + enum dc_color_space color_space; ++ enum color_transfer_func input_tf; ++ + enum surface_pixel_format format; + enum dc_rotation_angle rotation; + enum plane_stereo_format stereo_format; +@@ -467,7 +447,8 @@ struct dc_plane_info { + enum surface_pixel_format format; + enum dc_rotation_angle rotation; + enum plane_stereo_format stereo_format; +- enum dc_color_space color_space; /*todo: wrong place, fits in scaling info*/ ++ enum dc_color_space color_space; ++ enum color_transfer_func input_tf; + bool horizontal_mirror; + bool visible; + bool per_pixel_alpha; +@@ -488,13 +469,13 @@ struct dc_surface_update { + struct dc_flip_addrs *flip_addr; + struct dc_plane_info *plane_info; + struct dc_scaling_info *scaling_info; ++ + /* following updates require alloc/sleep/spin that is not isr safe, + * null means no updates + */ + /* gamma TO BE REMOVED */ + struct dc_gamma *gamma; + struct dc_transfer_func *in_transfer_func; +- struct dc_hdr_static_metadata *hdr_static_metadata; + + struct csc_transform *input_csc_color_matrix; + struct fixed31_32 *coeff_reduction_factor; +@@ -603,6 +584,7 @@ struct dc_stream_state { + + struct freesync_context freesync_ctx; + ++ struct dc_hdr_static_metadata hdr_static_metadata; + struct dc_transfer_func *out_transfer_func; + struct colorspace_transform gamut_remap_matrix; + struct csc_transform csc_color_matrix; +@@ -643,6 +625,7 @@ struct dc_stream_update { + struct rect src; + struct rect dst; + struct dc_transfer_func *out_transfer_func; ++ struct dc_hdr_static_metadata *hdr_static_metadata; + }; + + bool dc_is_stream_unchanged( +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 1a9f57f..ea58d10 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h ++++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h +@@ -492,15 +492,24 @@ struct dc_cursor_attributes { + enum dc_color_space { + COLOR_SPACE_UNKNOWN, + COLOR_SPACE_SRGB, ++ COLOR_SPACE_XR_RGB, + COLOR_SPACE_SRGB_LIMITED, ++ COLOR_SPACE_MSREF_SCRGB, + COLOR_SPACE_YCBCR601, + COLOR_SPACE_YCBCR709, ++ COLOR_SPACE_XV_YCC_709, ++ COLOR_SPACE_XV_YCC_601, + COLOR_SPACE_YCBCR601_LIMITED, + COLOR_SPACE_YCBCR709_LIMITED, + COLOR_SPACE_2020_RGB_FULLRANGE, + COLOR_SPACE_2020_RGB_LIMITEDRANGE, + COLOR_SPACE_2020_YCBCR, + COLOR_SPACE_ADOBERGB, ++ COLOR_SPACE_DCIP3, ++ COLOR_SPACE_DISPLAYNATIVE, ++ COLOR_SPACE_DOLBYVISION, ++ COLOR_SPACE_APPCTRL, ++ COLOR_SPACE_CUSTOMPOINTS, + }; + + enum dc_dither_option { +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c +index 4fd49a1..cabb31c 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c +@@ -434,10 +434,19 @@ static void dce110_stream_encoder_dp_set_stream_attribute( + case COLOR_SPACE_2020_RGB_FULLRANGE: + case COLOR_SPACE_2020_RGB_LIMITEDRANGE: + case COLOR_SPACE_2020_YCBCR: ++ case COLOR_SPACE_XR_RGB: ++ case COLOR_SPACE_MSREF_SCRGB: + case COLOR_SPACE_ADOBERGB: +- case COLOR_SPACE_UNKNOWN: ++ case COLOR_SPACE_DCIP3: ++ case COLOR_SPACE_XV_YCC_709: ++ case COLOR_SPACE_XV_YCC_601: + case COLOR_SPACE_YCBCR601_LIMITED: + case COLOR_SPACE_YCBCR709_LIMITED: ++ case COLOR_SPACE_DISPLAYNATIVE: ++ case COLOR_SPACE_DOLBYVISION: ++ case COLOR_SPACE_APPCTRL: ++ case COLOR_SPACE_CUSTOMPOINTS: ++ case COLOR_SPACE_UNKNOWN: + /* do nothing */ + break; + } +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 4c072662..1f47f1b 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 +@@ -2272,8 +2272,7 @@ static void set_plane_config( + dce_enable_fe_clock(dc->hwseq, pipe_ctx->pipe_idx, true); + + set_default_colors(pipe_ctx); +- if (pipe_ctx->stream->csc_color_matrix.enable_adjustment +- == true) { ++ if (pipe_ctx->stream->csc_color_matrix.enable_adjustment == true) { + tbl_entry.color_space = + pipe_ctx->stream->output_color_space; + +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 d51861d..d575921 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 +@@ -1556,8 +1556,7 @@ static void program_csc_matrix(struct pipe_ctx *pipe_ctx, + int i; + struct out_csc_color_matrix tbl_entry; + +- if (pipe_ctx->stream->csc_color_matrix.enable_adjustment +- == true) { ++ if (pipe_ctx->stream->csc_color_matrix.enable_adjustment == true) { + enum dc_color_space color_space = + pipe_ctx->stream->output_color_space; + +-- +2.7.4 + |