diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1302-drm-amd-display-Set-flip-pending-for-pipe-split.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1302-drm-amd-display-Set-flip-pending-for-pipe-split.patch | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1302-drm-amd-display-Set-flip-pending-for-pipe-split.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1302-drm-amd-display-Set-flip-pending-for-pipe-split.patch new file mode 100644 index 00000000..a2ecd675 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1302-drm-amd-display-Set-flip-pending-for-pipe-split.patch @@ -0,0 +1,64 @@ +From 3e0d91ec60f8086709327eafd5592c53000f886a Mon Sep 17 00:00:00 2001 +From: Wesley Chalmers <Wesley.Chalmers@amd.com> +Date: Wed, 6 Feb 2019 13:19:08 -0500 +Subject: [PATCH 1302/2940] drm/amd/display: Set flip pending for pipe split + +[WHY] +When doing split pipe, if one pipe is pending on flip, the entire +plane's status should be flip pending, otherwise corruption can occur +when OS writes to a surface prematurely. + +[HOW] +Clear the flip pending bit before checking pipes, then OR the flip +pending bits from all pipes together to create the flip pending status +of the entire plane. + +Signed-off-by: Wesley Chalmers <Wesley.Chalmers@amd.com> +Reviewed-by: Jun Lei <Jun.Lei@amd.com> +Acked-by: Eryk Brol <Eryk.Brol@amd.com> +Acked-by: Leo Li <sunpeng.li@amd.com> +--- + drivers/gpu/drm/amd/display/dc/core/dc_surface.c | 13 +++++++++++++ + .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 2 +- + 2 files changed, 14 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_surface.c b/drivers/gpu/drm/amd/display/dc/core/dc_surface.c +index ee6bd50f60b8..a5e86f9b148f 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_surface.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_surface.c +@@ -119,6 +119,19 @@ const struct dc_plane_status *dc_plane_get_status( + if (core_dc->current_state == NULL) + return NULL; + ++ /* Find the current plane state and set its pending bit to false */ ++ for (i = 0; i < core_dc->res_pool->pipe_count; i++) { ++ struct pipe_ctx *pipe_ctx = ++ &core_dc->current_state->res_ctx.pipe_ctx[i]; ++ ++ if (pipe_ctx->plane_state != plane_state) ++ continue; ++ ++ pipe_ctx->plane_state->status.is_flip_pending = false; ++ ++ break; ++ } ++ + for (i = 0; i < core_dc->res_pool->pipe_count; i++) { + struct pipe_ctx *pipe_ctx = + &core_dc->current_state->res_ctx.pipe_ctx[i]; +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 f8d0583d376b..3a857fa3f7aa 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 +@@ -2688,7 +2688,7 @@ static void dcn10_update_pending_status(struct pipe_ctx *pipe_ctx) + flip_pending = pipe_ctx->plane_res.hubp->funcs->hubp_is_flip_pending( + pipe_ctx->plane_res.hubp); + +- plane_state->status.is_flip_pending = flip_pending; ++ plane_state->status.is_flip_pending = plane_state->status.is_flip_pending || flip_pending; + + if (!flip_pending) + plane_state->status.current_address = plane_state->status.requested_address; +-- +2.17.1 + |