提交 8a76708e 编写于 作者: A Andrey Grodzovsky 提交者: Alex Deucher

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: NAndrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Reviewed-by: NDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: NHarry Wentland <Harry.Wentland@amd.com>
Signed-off-by: NAlex Deucher <alexander.deucher@amd.com>
上级 2ebad8eb
master alk-4.19.24 alk-4.19.30 alk-4.19.34 alk-4.19.36 alk-4.19.43 alk-4.19.48 alk-4.19.57 ck-4.19.67 ck-4.19.81 ck-4.19.91 github/fork/deepanshu1422/fix-typo-in-comment github/fork/haosdent/fix-typo linux-next v4.19.91 v4.19.90 v4.19.89 v4.19.88 v4.19.87 v4.19.86 v4.19.85 v4.19.84 v4.19.83 v4.19.82 v4.19.81 v4.19.80 v4.19.79 v4.19.78 v4.19.77 v4.19.76 v4.19.75 v4.19.74 v4.19.73 v4.19.72 v4.19.71 v4.19.70 v4.19.69 v4.19.68 v4.19.67 v4.19.66 v4.19.65 v4.19.64 v4.19.63 v4.19.62 v4.19.61 v4.19.60 v4.19.59 v4.19.58 v4.19.57 v4.19.56 v4.19.55 v4.19.54 v4.19.53 v4.19.52 v4.19.51 v4.19.50 v4.19.49 v4.19.48 v4.19.47 v4.19.46 v4.19.45 v4.19.44 v4.19.43 v4.19.42 v4.19.41 v4.19.40 v4.19.39 v4.19.38 v4.19.37 v4.19.36 v4.19.35 v4.19.34 v4.19.33 v4.19.32 v4.19.31 v4.19.30 v4.19.29 v4.19.28 v4.19.27 v4.19.26 v4.19.25 v4.19.24 v4.19.23 v4.19.22 v4.19.21 v4.19.20 v4.19.19 v4.19.18 v4.19.17 v4.19.16 v4.19.15 v4.19.14 v4.19.13 v4.19.12 v4.19.11 v4.19.10 v4.19.9 v4.19.8 v4.19.7 v4.19.6 v4.19.5 v4.19.4 v4.19.3 v4.19.2 v4.19.1 v4.19 v4.19-rc8 v4.19-rc7 v4.19-rc6 v4.19-rc5 v4.19-rc4 v4.19-rc3 v4.19-rc2 v4.19-rc1 ck-release-21 ck-release-20 ck-release-19.2 ck-release-19.1 ck-release-19 ck-release-18 ck-release-17.2 ck-release-17.1 ck-release-17 ck-release-16 ck-release-15.1 ck-release-15 ck-release-14 ck-release-13.2 ck-release-13 ck-release-12 ck-release-11 ck-release-10 ck-release-9 ck-release-7 alk-release-15 alk-release-14 alk-release-13.2 alk-release-13 alk-release-12 alk-release-11 alk-release-10 alk-release-9 alk-release-7
无相关合并请求
......@@ -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)
......
......@@ -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
******************************************************************************/
......
......@@ -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_ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
反馈
建议
客服 返回
顶部