aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1302-drm-amd-display-Set-flip-pending-for-pipe-split.patch
diff options
context:
space:
mode:
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.patch64
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
+