diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1197-drm-amd-display-Apply-all-surface-updates-onto-surfa.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1197-drm-amd-display-Apply-all-surface-updates-onto-surfa.patch | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1197-drm-amd-display-Apply-all-surface-updates-onto-surfa.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1197-drm-amd-display-Apply-all-surface-updates-onto-surfa.patch new file mode 100644 index 00000000..660f394a --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1197-drm-amd-display-Apply-all-surface-updates-onto-surfa.patch @@ -0,0 +1,170 @@ +From 7815e2aa0abe1fb99582e08cb3dfe9b4119c65fc Mon Sep 17 00:00:00 2001 +From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> +Date: Wed, 9 Jan 2019 09:14:54 -0500 +Subject: [PATCH 1197/2940] drm/amd/display: Apply all surface updates onto + surfaces + +[Why] +Most surface updates weren't propagated onto the surface during +dc_commit_updates_for_stream. This makes it more difficult for DC to +determine the actual surface update type required. + +[How] +Use copy_surface_update_to_plane to propagate the changes. The FreeSync +surface timing information update for BTR has been moved out of +amdgpu_dm.c into this function as well. + +Change-Id: I031d3032a56e768560b28d1a76750afd57c0769b +Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> +Reviewed-by: Sun peng Li <Sunpeng.Li@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +--- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 9 -- + drivers/gpu/drm/amd/display/dc/core/dc.c | 104 ++++++++++++++++-- + 2 files changed, 96 insertions(+), 17 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index e5b542e462c4..59c9ccad2743 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -4891,15 +4891,6 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, + surface, + flip->flip_addrs[flip_count].flip_timestamp_in_us); + +- /* Update surface timing information. */ +- surface->time.time_elapsed_in_us[surface->time.index] = +- flip->flip_addrs[flip_count].flip_timestamp_in_us - +- surface->time.prev_update_time_in_us; +- surface->time.prev_update_time_in_us = flip->flip_addrs[flip_count].flip_timestamp_in_us; +- surface->time.index++; +- if (surface->time.index >= DC_PLANE_UPDATE_TIMES_MAX) +- surface->time.index = 0; +- + DRM_DEBUG_DRIVER("%s Flipping to hi: 0x%x, low: 0x%x\n", + __func__, + flip->flip_addrs[flip_count].address.grph.addr.high_part, +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 783f944aee94..7ba22006da91 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -1440,6 +1440,101 @@ static struct dc_stream_status *stream_get_status( + + static const enum surface_update_type update_surface_trace_level = UPDATE_TYPE_FULL; + ++static void copy_surface_update_to_plane( ++ struct dc_plane_state *surface, ++ struct dc_surface_update *srf_update) ++{ ++ if (srf_update->flip_addr) { ++ surface->address = srf_update->flip_addr->address; ++ surface->flip_immediate = ++ srf_update->flip_addr->flip_immediate; ++ surface->time.time_elapsed_in_us[surface->time.index] = ++ srf_update->flip_addr->flip_timestamp_in_us - ++ surface->time.prev_update_time_in_us; ++ surface->time.prev_update_time_in_us = ++ srf_update->flip_addr->flip_timestamp_in_us; ++ surface->time.index++; ++ if (surface->time.index >= DC_PLANE_UPDATE_TIMES_MAX) ++ surface->time.index = 0; ++ } ++ ++ if (srf_update->scaling_info) { ++ surface->scaling_quality = ++ srf_update->scaling_info->scaling_quality; ++ surface->dst_rect = ++ srf_update->scaling_info->dst_rect; ++ surface->src_rect = ++ srf_update->scaling_info->src_rect; ++ surface->clip_rect = ++ srf_update->scaling_info->clip_rect; ++ } ++ ++ if (srf_update->plane_info) { ++ surface->color_space = ++ srf_update->plane_info->color_space; ++ surface->format = ++ srf_update->plane_info->format; ++ surface->plane_size = ++ srf_update->plane_info->plane_size; ++ surface->rotation = ++ srf_update->plane_info->rotation; ++ surface->horizontal_mirror = ++ srf_update->plane_info->horizontal_mirror; ++ surface->stereo_format = ++ srf_update->plane_info->stereo_format; ++ surface->tiling_info = ++ srf_update->plane_info->tiling_info; ++ surface->visible = ++ srf_update->plane_info->visible; ++ surface->per_pixel_alpha = ++ srf_update->plane_info->per_pixel_alpha; ++ surface->global_alpha = ++ srf_update->plane_info->global_alpha; ++ surface->global_alpha_value = ++ srf_update->plane_info->global_alpha_value; ++ surface->dcc = ++ srf_update->plane_info->dcc; ++ surface->sdr_white_level = ++ srf_update->plane_info->sdr_white_level; ++ } ++ ++ if (srf_update->gamma && ++ (surface->gamma_correction != ++ srf_update->gamma)) { ++ memcpy(&surface->gamma_correction->entries, ++ &srf_update->gamma->entries, ++ sizeof(struct dc_gamma_entries)); ++ surface->gamma_correction->is_identity = ++ srf_update->gamma->is_identity; ++ surface->gamma_correction->num_entries = ++ srf_update->gamma->num_entries; ++ surface->gamma_correction->type = ++ srf_update->gamma->type; ++ } ++ ++ if (srf_update->in_transfer_func && ++ (surface->in_transfer_func != ++ srf_update->in_transfer_func)) { ++ surface->in_transfer_func->sdr_ref_white_level = ++ srf_update->in_transfer_func->sdr_ref_white_level; ++ surface->in_transfer_func->tf = ++ srf_update->in_transfer_func->tf; ++ surface->in_transfer_func->type = ++ srf_update->in_transfer_func->type; ++ memcpy(&surface->in_transfer_func->tf_pts, ++ &srf_update->in_transfer_func->tf_pts, ++ sizeof(struct dc_transfer_func_distributed_points)); ++ } ++ ++ if (srf_update->input_csc_color_matrix) ++ surface->input_csc_color_matrix = ++ *srf_update->input_csc_color_matrix; ++ ++ if (srf_update->coeff_reduction_factor) ++ surface->coeff_reduction_factor = ++ *srf_update->coeff_reduction_factor; ++} ++ + static void commit_planes_do_stream_update(struct dc *dc, + struct dc_stream_state *stream, + struct dc_stream_update *stream_update, +@@ -1645,14 +1740,7 @@ void dc_commit_updates_for_stream(struct dc *dc, + for (i = 0; i < surface_count; i++) { + struct dc_plane_state *surface = srf_updates[i].surface; + +- /* TODO: On flip we don't build the state, so it still has the +- * old address. Which is why we are updating the address here +- */ +- if (srf_updates[i].flip_addr) { +- surface->address = srf_updates[i].flip_addr->address; +- surface->flip_immediate = srf_updates[i].flip_addr->flip_immediate; +- +- } ++ copy_surface_update_to_plane(surface, &srf_updates[i]); + + if (update_type >= UPDATE_TYPE_MED) { + for (j = 0; j < dc->res_pool->pipe_count; j++) { +-- +2.17.1 + |