aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/0485-drm-amd-display-fix-surface-attachment-handling-of-p.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/0485-drm-amd-display-fix-surface-attachment-handling-of-p.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/0485-drm-amd-display-fix-surface-attachment-handling-of-p.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/0485-drm-amd-display-fix-surface-attachment-handling-of-p.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/0485-drm-amd-display-fix-surface-attachment-handling-of-p.patch
new file mode 100644
index 00000000..26191737
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/0485-drm-amd-display-fix-surface-attachment-handling-of-p.patch
@@ -0,0 +1,93 @@
+From 6af12ea52bf5b91796b7d2a9f464dc213c9eef3a Mon Sep 17 00:00:00 2001
+From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Date: Mon, 29 May 2017 18:26:28 -0400
+Subject: [PATCH 0485/4131] drm/amd/display: fix surface attachment handling of
+ pipe split
+
+Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@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_resource.c | 35 +++++++----------------
+ 1 file changed, 10 insertions(+), 25 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 feb0f5d..c97d0d1 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+@@ -894,24 +894,6 @@ enum dc_status resource_build_scaling_params_for_context(
+ return DC_OK;
+ }
+
+-static void detach_surfaces_for_stream(
+- struct validate_context *context,
+- const struct resource_pool *pool,
+- const struct dc_stream *dc_stream)
+-{
+- int i;
+- struct core_stream *stream = DC_STREAM_TO_CORE(dc_stream);
+-
+- for (i = 0; i < pool->pipe_count; i++) {
+- struct pipe_ctx *cur_pipe = &context->res_ctx.pipe_ctx[i];
+- if (cur_pipe->stream == stream) {
+- cur_pipe->surface = NULL;
+- cur_pipe->top_pipe = NULL;
+- cur_pipe->bottom_pipe = NULL;
+- }
+- }
+-}
+-
+ struct pipe_ctx *find_idle_secondary_pipe(
+ struct resource_context *res_ctx,
+ const struct resource_pool *pool)
+@@ -1004,9 +986,11 @@ static void release_free_pipes_for_stream(
+ struct core_stream *stream = DC_STREAM_TO_CORE(dc_stream);
+
+ for (i = MAX_PIPES - 1; i >= 0; i--) {
++ /* never release the topmost pipe*/
+ if (res_ctx->pipe_ctx[i].stream == stream &&
++ res_ctx->pipe_ctx[i].top_pipe &&
+ !res_ctx->pipe_ctx[i].surface) {
+- res_ctx->pipe_ctx[i].stream = NULL;
++ memset(&res_ctx->pipe_ctx[i], 0, sizeof(struct pipe_ctx));
+ }
+ }
+ }
+@@ -1021,6 +1005,7 @@ bool resource_attach_surfaces_to_context(
+ int i;
+ struct pipe_ctx *tail_pipe;
+ struct dc_stream_status *stream_status = NULL;
++ struct core_stream *stream = DC_STREAM_TO_CORE(dc_stream);
+
+
+ if (surface_count > MAX_SURFACE_NUM) {
+@@ -1043,7 +1028,12 @@ bool resource_attach_surfaces_to_context(
+ for (i = 0; i < surface_count; i++)
+ dc_surface_retain(surfaces[i]);
+
+- detach_surfaces_for_stream(context, pool, dc_stream);
++ /* detach surfaces from pipes */
++ for (i = 0; i < pool->pipe_count; i++)
++ if (context->res_ctx.pipe_ctx[i].stream == stream) {
++ context->res_ctx.pipe_ctx[i].surface = NULL;
++ context->res_ctx.pipe_ctx[i].bottom_pipe = NULL;
++ }
+
+ /* release existing surfaces*/
+ for (i = 0; i < stream_status->surface_count; i++)
+@@ -1052,11 +1042,6 @@ bool resource_attach_surfaces_to_context(
+ for (i = surface_count; i < stream_status->surface_count; i++)
+ stream_status->surfaces[i] = NULL;
+
+- stream_status->surface_count = 0;
+-
+- if (surface_count == 0)
+- return true;
+-
+ tail_pipe = NULL;
+ for (i = 0; i < surface_count; i++) {
+ struct core_surface *surface = DC_SURFACE_TO_CORE(surfaces[i]);
+--
+2.7.4
+