aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/0441-drm-amd-display-revert-dc_get_validate_context-re-en.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/0441-drm-amd-display-revert-dc_get_validate_context-re-en.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/0441-drm-amd-display-revert-dc_get_validate_context-re-en.patch121
1 files changed, 121 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/0441-drm-amd-display-revert-dc_get_validate_context-re-en.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/0441-drm-amd-display-revert-dc_get_validate_context-re-en.patch
new file mode 100644
index 00000000..e115a4b5
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/0441-drm-amd-display-revert-dc_get_validate_context-re-en.patch
@@ -0,0 +1,121 @@
+From c0c5be3a73b8bf6e70bf1694c934628bd88cc22f Mon Sep 17 00:00:00 2001
+From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Date: Wed, 17 May 2017 16:56:56 -0400
+Subject: [PATCH 0441/4131] drm/amd/display: revert dc_get_validate_context
+ re-entrancy fix
+
+Apply dc_get_validate_context re-entrancy fix to dc_validate_resources instead
+
+Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Reviewed-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@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 | 71 ++++++++++++++++++++++++++++----
+ 1 file changed, 62 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
+index 0aafcc0..773f0ef 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
+@@ -653,6 +653,40 @@ void dc_destroy(struct dc **dc)
+ *dc = NULL;
+ }
+
++static bool is_validation_required(
++ const struct core_dc *dc,
++ const struct dc_validation_set set[],
++ int set_count)
++{
++ const struct validate_context *context = dc->current_context;
++ int i, j;
++
++ if (context->stream_count != set_count)
++ return true;
++
++ for (i = 0; i < set_count; i++) {
++
++ if (set[i].surface_count != context->stream_status[i].surface_count)
++ return true;
++ if (!is_stream_unchanged(DC_STREAM_TO_CORE(set[i].stream), context->streams[i]))
++ return true;
++
++ for (j = 0; j < set[i].surface_count; j++) {
++ struct dc_surface temp_surf = { 0 };
++
++ temp_surf = *context->stream_status[i].surfaces[j];
++ temp_surf.clip_rect = set[i].surfaces[j]->clip_rect;
++ temp_surf.dst_rect.x = set[i].surfaces[j]->dst_rect.x;
++ temp_surf.dst_rect.y = set[i].surfaces[j]->dst_rect.y;
++
++ if (memcmp(&temp_surf, set[i].surfaces[j], sizeof(temp_surf)) != 0)
++ return true;
++ }
++ }
++
++ return false;
++}
++
+ struct validate_context *dc_get_validate_context(
+ const struct dc *dc,
+ const struct dc_validation_set set[],
+@@ -663,11 +697,16 @@ struct validate_context *dc_get_validate_context(
+ struct validate_context *context;
+
+ context = dm_alloc(sizeof(struct validate_context));
+- if(context == NULL)
++ if (context == NULL)
+ goto context_alloc_fail;
+
++ if (!is_validation_required(core_dc, set, set_count)) {
++ dc_resource_validate_ctx_copy_construct(core_dc->current_context, context);
++ return context;
++ }
++
+ result = core_dc->res_pool->funcs->validate_with_context(
+- core_dc, set, set_count, context, NULL);
++ core_dc, set, set_count, context, core_dc->current_context);
+
+ context_alloc_fail:
+ if (result != DC_OK) {
+@@ -690,16 +729,30 @@ bool dc_validate_resources(
+ const struct dc_validation_set set[],
+ uint8_t set_count)
+ {
+- struct validate_context *ctx;
++ struct core_dc *core_dc = DC_TO_CORE(dc);
++ enum dc_status result = DC_ERROR_UNEXPECTED;
++ struct validate_context *context;
+
+- ctx = dc_get_validate_context(dc, set, set_count);
+- if (ctx) {
+- dc_resource_validate_ctx_destruct(ctx);
+- dm_free(ctx);
+- return true;
++ context = dm_alloc(sizeof(struct validate_context));
++ if (context == NULL)
++ goto context_alloc_fail;
++
++ result = core_dc->res_pool->funcs->validate_with_context(
++ core_dc, set, set_count, context, NULL);
++
++context_alloc_fail:
++ if (result != DC_OK) {
++ dm_logger_write(core_dc->ctx->logger, LOG_WARNING,
++ "%s:resource validation failed, dc_status:%d\n",
++ __func__,
++ result);
+ }
+
+- return false;
++ dc_resource_validate_ctx_destruct(context);
++ dm_free(context);
++ context = NULL;
++
++ return result == DC_OK;
+ }
+
+ bool dc_validate_guaranteed(
+--
+2.7.4
+