| From 7864e648a7a481c8b7d7ea276e89531065043855 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 1 Dec 2023 06:25:18 -0700 |
| Subject: drm/amd/display: Add dml2 copy functions |
| |
| From: Dillon Varone <dillon.varone@amd.com> |
| |
| [ Upstream commit abd26a3252cbd1a3ae4e46d37596d176fe50b41a ] |
| |
| Add function to handle deep copying dml2 context. |
| |
| Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> |
| Reviewed-by: Chaitanya Dhere <chaitanya.dhere@amd.com> |
| Acked-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com> |
| Signed-off-by: Dillon Varone <dillon.varone@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Stable-dep-of: 4f5b8d78ca43 ("drm/amd/display: Init DPPCLK from SMU on dcn32") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/amd/display/dc/core/dc.c | 15 +++------- |
| .../drm/amd/display/dc/dml2/dml2_wrapper.c | 29 ++++++++++++++++++- |
| .../drm/amd/display/dc/dml2/dml2_wrapper.h | 4 +++ |
| 3 files changed, 36 insertions(+), 12 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c |
| index 537f71c19b806..dab26d7e4d52a 100644 |
| --- a/drivers/gpu/drm/amd/display/dc/core/dc.c |
| +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c |
| @@ -2258,23 +2258,16 @@ struct dc_state *dc_copy_state(struct dc_state *src_ctx) |
| { |
| int i, j; |
| struct dc_state *new_ctx = kvmalloc(sizeof(struct dc_state), GFP_KERNEL); |
| -#ifdef CONFIG_DRM_AMD_DC_FP |
| - struct dml2_context *dml2 = NULL; |
| -#endif |
| |
| if (!new_ctx) |
| return NULL; |
| memcpy(new_ctx, src_ctx, sizeof(struct dc_state)); |
| |
| #ifdef CONFIG_DRM_AMD_DC_FP |
| - if (new_ctx->bw_ctx.dml2) { |
| - dml2 = kzalloc(sizeof(struct dml2_context), GFP_KERNEL); |
| - if (!dml2) |
| - return NULL; |
| - |
| - memcpy(dml2, src_ctx->bw_ctx.dml2, sizeof(struct dml2_context)); |
| - new_ctx->bw_ctx.dml2 = dml2; |
| - } |
| + if (new_ctx->bw_ctx.dml2 && !dml2_create_copy(&new_ctx->bw_ctx.dml2, src_ctx->bw_ctx.dml2)) { |
| + dc_release_state(new_ctx); |
| + return NULL; |
| + } |
| #endif |
| |
| for (i = 0; i < MAX_PIPES; i++) { |
| diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c b/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c |
| index c62b61ac45d27..8f34df00055c3 100644 |
| --- a/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c |
| +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c |
| @@ -696,10 +696,15 @@ bool dml2_validate(const struct dc *in_dc, struct dc_state *context, bool fast_v |
| return out; |
| } |
| |
| +static inline struct dml2_context *dml2_allocate_memory(void) |
| +{ |
| + return (struct dml2_context *) kzalloc(sizeof(struct dml2_context), GFP_KERNEL); |
| +} |
| + |
| bool dml2_create(const struct dc *in_dc, const struct dml2_configuration_options *config, struct dml2_context **dml2) |
| { |
| // Allocate Mode Lib Ctx |
| - *dml2 = (struct dml2_context *) kzalloc(sizeof(struct dml2_context), GFP_KERNEL); |
| + *dml2 = dml2_allocate_memory(); |
| |
| if (!(*dml2)) |
| return false; |
| @@ -750,3 +755,25 @@ void dml2_extract_dram_and_fclk_change_support(struct dml2_context *dml2, |
| *fclk_change_support = (unsigned int) dml2->v20.dml_core_ctx.ms.support.FCLKChangeSupport[0]; |
| *dram_clk_change_support = (unsigned int) dml2->v20.dml_core_ctx.ms.support.DRAMClockChangeSupport[0]; |
| } |
| + |
| +void dml2_copy(struct dml2_context *dst_dml2, |
| + struct dml2_context *src_dml2) |
| +{ |
| + /* copy Mode Lib Ctx */ |
| + memcpy(dst_dml2, src_dml2, sizeof(struct dml2_context)); |
| +} |
| + |
| +bool dml2_create_copy(struct dml2_context **dst_dml2, |
| + struct dml2_context *src_dml2) |
| +{ |
| + /* Allocate Mode Lib Ctx */ |
| + *dst_dml2 = dml2_allocate_memory(); |
| + |
| + if (!(*dst_dml2)) |
| + return false; |
| + |
| + /* copy Mode Lib Ctx */ |
| + dml2_copy(*dst_dml2, src_dml2); |
| + |
| + return true; |
| +} |
| diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h b/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h |
| index fe15baa4bf094..0de6886969c69 100644 |
| --- a/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h |
| +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.h |
| @@ -191,6 +191,10 @@ bool dml2_create(const struct dc *in_dc, |
| struct dml2_context **dml2); |
| |
| void dml2_destroy(struct dml2_context *dml2); |
| +void dml2_copy(struct dml2_context *dst_dml2, |
| + struct dml2_context *src_dml2); |
| +bool dml2_create_copy(struct dml2_context **dst_dml2, |
| + struct dml2_context *src_dml2); |
| |
| /* |
| * dml2_validate - Determines if a display configuration is supported or not. |
| -- |
| 2.43.0 |
| |