aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0605-drm-amd-display-Introduce-refcount-for-dc_validate_c.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0605-drm-amd-display-Introduce-refcount-for-dc_validate_c.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0605-drm-amd-display-Introduce-refcount-for-dc_validate_c.patch231
1 files changed, 231 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0605-drm-amd-display-Introduce-refcount-for-dc_validate_c.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0605-drm-amd-display-Introduce-refcount-for-dc_validate_c.patch
new file mode 100644
index 00000000..448c18cc
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0605-drm-amd-display-Introduce-refcount-for-dc_validate_c.patch
@@ -0,0 +1,231 @@
+From b648a6859a1b314a76bd4c7993e8faaf64e4b36b Mon Sep 17 00:00:00 2001
+From: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
+Date: Tue, 11 Jul 2017 14:41:51 -0400
+Subject: [PATCH 0605/4131] drm/amd/display: Introduce refcount for
+ dc_validate_context
+
+Linux requires to be able to release allocated context
+in case it was never commited.
+
+Signed-off-by: Andrey Grodzovsky <Andrey.Grodzovsky@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 | 64 ++++++++++++++++++-------
+ drivers/gpu/drm/amd/display/dc/dc.h | 4 ++
+ drivers/gpu/drm/amd/display/dc/inc/core_types.h | 2 +
+ 3 files changed, 54 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
+index 4f93029..e81c9d5 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
+@@ -423,7 +423,7 @@ static void allocate_dc_stream_funcs(struct core_dc *core_dc)
+
+ static void destruct(struct core_dc *dc)
+ {
+- dc_resource_validate_ctx_destruct(dc->current_context);
++ dc_release_validate_context(dc->current_context);
+
+ destroy_links(dc);
+
+@@ -467,6 +467,8 @@ static bool construct(struct core_dc *dc,
+ goto val_ctx_fail;
+ }
+
++ dc->current_context->ref_count++;
++
+ dc_ctx->cgs_device = init_params->cgs_device;
+ dc_ctx->driver_context = init_params->driver;
+ dc_ctx->dc = &dc->public;
+@@ -683,6 +685,8 @@ struct validate_context *dc_get_validate_context(
+ if (context == NULL)
+ goto context_alloc_fail;
+
++ ++context->ref_count;
++
+ if (!is_validation_required(core_dc, set, set_count)) {
+ dc_resource_validate_ctx_copy_construct(core_dc->current_context, context);
+ return context;
+@@ -698,8 +702,7 @@ struct validate_context *dc_get_validate_context(
+ __func__,
+ result);
+
+- dc_resource_validate_ctx_destruct(context);
+- dm_free(context);
++ dc_release_validate_context(context);
+ context = NULL;
+ }
+
+@@ -720,6 +723,8 @@ bool dc_validate_resources(
+ if (context == NULL)
+ goto context_alloc_fail;
+
++ ++context->ref_count;
++
+ result = core_dc->res_pool->funcs->validate_with_context(
+ core_dc, set, set_count, context, NULL);
+
+@@ -731,8 +736,7 @@ bool dc_validate_resources(
+ result);
+ }
+
+- dc_resource_validate_ctx_destruct(context);
+- dm_free(context);
++ dc_release_validate_context(context);
+ context = NULL;
+
+ return result == DC_OK;
+@@ -750,11 +754,12 @@ bool dc_validate_guaranteed(
+ if (context == NULL)
+ goto context_alloc_fail;
+
++ ++context->ref_count;
++
+ result = core_dc->res_pool->funcs->validate_guaranteed(
+ core_dc, stream, context);
+
+- dc_resource_validate_ctx_destruct(context);
+- dm_free(context);
++ dc_release_validate_context(context);
+
+ context_alloc_fail:
+ if (result != DC_OK) {
+@@ -972,8 +977,10 @@ static bool dc_commit_context_no_check(struct dc *dc, struct validate_context *c
+
+ dc_enable_stereo(dc, context, dc_streams, context->stream_count);
+
+- dc_resource_validate_ctx_destruct(core_dc->current_context);
+- dm_free(core_dc->current_context);
++ dc_release_validate_context(core_dc->current_context);
++
++ dc_retain_validate_context(context);
++
+ core_dc->current_context = context;
+
+ return (result == DC_OK);
+@@ -1045,6 +1052,8 @@ bool dc_commit_streams(
+ if (context == NULL)
+ goto context_alloc_fail;
+
++ ++context->ref_count;
++
+ result = core_dc->res_pool->funcs->validate_with_context(
+ core_dc, set, stream_count, context, core_dc->current_context);
+ if (result != DC_OK){
+@@ -1053,7 +1062,6 @@ bool dc_commit_streams(
+ __func__,
+ result);
+ BREAK_TO_DEBUGGER();
+- dc_resource_validate_ctx_destruct(context);
+ goto fail;
+ }
+
+@@ -1062,7 +1070,7 @@ bool dc_commit_streams(
+ return (result == DC_OK);
+
+ fail:
+- dm_free(context);
++ dc_release_validate_context(context);
+
+ context_alloc_fail:
+ return (result == DC_OK);
+@@ -1155,6 +1163,23 @@ bool dc_commit_surfaces_to_stream(
+ return true;
+ }
+
++void dc_retain_validate_context(struct validate_context *context)
++{
++ ASSERT(context->ref_count > 0);
++ ++context->ref_count;
++}
++
++void dc_release_validate_context(struct validate_context *context)
++{
++ ASSERT(context->ref_count > 0);
++ --context->ref_count;
++
++ if (context->ref_count == 0) {
++ dc_resource_validate_ctx_destruct(context);
++ dm_free(context);
++ }
++}
++
+ static bool is_surface_in_context(
+ const struct validate_context *context,
+ const struct dc_surface *surface)
+@@ -1341,6 +1366,7 @@ void dc_update_surfaces_and_stream(struct dc *dc,
+ enum surface_update_type update_type;
+ const struct dc_stream_status *stream_status;
+ struct core_stream *stream = DC_STREAM_TO_CORE(dc_stream);
++ struct dc_context *dc_ctx = core_dc->ctx;
+
+ stream_status = dc_stream_get_status(dc_stream);
+ ASSERT(stream_status);
+@@ -1403,6 +1429,11 @@ void dc_update_surfaces_and_stream(struct dc *dc,
+
+ /* initialize scratch memory for building context */
+ context = dm_alloc(sizeof(*context));
++ if (context == NULL)
++ goto context_alloc_fail;
++
++ ++context->ref_count;
++
+ dc_resource_validate_ctx_copy_construct(
+ core_dc->current_context, context);
+
+@@ -1624,16 +1655,17 @@ void dc_update_surfaces_and_stream(struct dc *dc,
+ }
+
+ if (core_dc->current_context != context) {
+- dc_resource_validate_ctx_destruct(core_dc->current_context);
+- dm_free(core_dc->current_context);
+-
++ dc_release_validate_context(core_dc->current_context);
++ dc_retain_validate_context(context);
+ core_dc->current_context = context;
+ }
+ return;
+
+ fail:
+- dc_resource_validate_ctx_destruct(context);
+- dm_free(context);
++ dc_release_validate_context(context);
++
++context_alloc_fail:
++ DC_ERROR("Failed to allocate new validate context!\n");
+ }
+
+ uint8_t dc_get_current_stream_count(const struct dc *dc)
+diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
+index 1fad03c..cd89814 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc.h
++++ b/drivers/gpu/drm/amd/display/dc/dc.h
+@@ -643,6 +643,10 @@ enum surface_update_type dc_check_update_surfaces_for_stream(
+ struct dc_stream_update *stream_update,
+ const struct dc_stream_status *stream_status);
+
++
++void dc_retain_validate_context(struct validate_context *context);
++void dc_release_validate_context(struct validate_context *context);
++
+ /*******************************************************************************
+ * Link Interfaces
+ ******************************************************************************/
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h
+index 3e9a0cc..d216522 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h
+@@ -361,6 +361,8 @@ struct validate_context {
+ #ifdef CONFIG_DRM_AMD_DC_DCN1_0
+ struct dcn_bw_internal_vars dcn_bw_vars;
+ #endif
++
++ int ref_count;
+ };
+
+ #endif /* _CORE_TYPES_H_ */
+--
+2.7.4
+