xref: /linux/drivers/gpu/drm/amd/display/dc/dml2_0/dml21/dml21_wrapper.c (revision 92c4c9fdc838d3b41a996bb700ea64b9e78fc7ea)
1 // SPDX-License-Identifier: MIT
2 //
3 // Copyright 2024 Advanced Micro Devices, Inc.
4 
5 #include "dml2_internal_types.h"
6 #include "dml_top.h"
7 #include "dml2_core_dcn4_calcs.h"
8 #include "dml2_internal_shared_types.h"
9 #include "dml21_utils.h"
10 #include "dml21_translation_helper.h"
11 #include "dml2_dc_resource_mgmt.h"
12 #include "dml2_wrapper.h"
13 #include "dml2_wrapper_fpu.h"
14 #include "dml21_wrapper.h"
15 #include "dml21_wrapper_fpu.h"
16 #include "dc_fpu.h"
17 
18 #if !defined(DC_RUN_WITH_PREEMPTION_ENABLED)
19 #define DC_RUN_WITH_PREEMPTION_ENABLED(code) code
20 #endif // !DC_RUN_WITH_PREEMPTION_ENABLED
21 
22 #define INVALID -1
23 
dml21_allocate_memory(struct dml2_context ** dml_ctx)24 static bool dml21_allocate_memory(struct dml2_context **dml_ctx)
25 {
26 	DC_RUN_WITH_PREEMPTION_ENABLED(*dml_ctx = vzalloc(sizeof(struct dml2_context)));
27 	if (!(*dml_ctx))
28 		return false;
29 
30 	DC_RUN_WITH_PREEMPTION_ENABLED((*dml_ctx)->v21.dml_init.dml2_instance = vzalloc(sizeof(struct dml2_instance)));
31 	if (!((*dml_ctx)->v21.dml_init.dml2_instance))
32 		return false;
33 
34 	(*dml_ctx)->v21.mode_support.dml2_instance = (*dml_ctx)->v21.dml_init.dml2_instance;
35 	(*dml_ctx)->v21.mode_programming.dml2_instance = (*dml_ctx)->v21.dml_init.dml2_instance;
36 
37 	(*dml_ctx)->v21.mode_support.display_config = &(*dml_ctx)->v21.display_config;
38 	(*dml_ctx)->v21.mode_programming.display_config = (*dml_ctx)->v21.mode_support.display_config;
39 
40 	DC_RUN_WITH_PREEMPTION_ENABLED((*dml_ctx)->v21.mode_programming.programming = vzalloc(sizeof(struct dml2_display_cfg_programming)));
41 
42 	if (!((*dml_ctx)->v21.mode_programming.programming))
43 		return false;
44 
45 	return true;
46 }
47 
dml21_create(const struct dc * in_dc,struct dml2_context ** dml_ctx,const struct dml2_configuration_options * config)48 bool dml21_create(const struct dc *in_dc, struct dml2_context **dml_ctx, const struct dml2_configuration_options *config)
49 {
50 	/* Allocate memory for initializing DML21 instance */
51 	if (!dml21_allocate_memory(dml_ctx))
52 		return false;
53 
54 	dml21_init(in_dc, *dml_ctx, config);
55 
56 	return true;
57 }
58 
dml21_destroy(struct dml2_context * dml2)59 void dml21_destroy(struct dml2_context *dml2)
60 {
61 	DC_RUN_WITH_PREEMPTION_ENABLED(vfree(dml2->v21.dml_init.dml2_instance));
62 	DC_RUN_WITH_PREEMPTION_ENABLED(vfree(dml2->v21.mode_programming.programming));
63 }
64 
dml21_copy(struct dml2_context * dst_dml_ctx,struct dml2_context * src_dml_ctx)65 void dml21_copy(struct dml2_context *dst_dml_ctx,
66 	struct dml2_context *src_dml_ctx)
67 {
68 	/* Preserve references to internals */
69 	struct dml2_instance *dst_dml2_instance = dst_dml_ctx->v21.dml_init.dml2_instance;
70 	struct dml2_display_cfg_programming *dst_dml2_programming = dst_dml_ctx->v21.mode_programming.programming;
71 
72 	/* Copy context */
73 	memcpy(dst_dml_ctx, src_dml_ctx, sizeof(struct dml2_context));
74 
75 	/* Copy Internals */
76 	memcpy(dst_dml2_instance, src_dml_ctx->v21.dml_init.dml2_instance, sizeof(struct dml2_instance));
77 	memcpy(dst_dml2_programming, src_dml_ctx->v21.mode_programming.programming, sizeof(struct dml2_display_cfg_programming));
78 
79 	/* Restore references to internals */
80 	dst_dml_ctx->v21.dml_init.dml2_instance = dst_dml2_instance;
81 
82 	dst_dml_ctx->v21.mode_support.dml2_instance = dst_dml2_instance;
83 	dst_dml_ctx->v21.mode_programming.dml2_instance = dst_dml2_instance;
84 
85 	dst_dml_ctx->v21.mode_support.display_config = &dst_dml_ctx->v21.display_config;
86 	dst_dml_ctx->v21.mode_programming.display_config = dst_dml_ctx->v21.mode_support.display_config;
87 
88 	dst_dml_ctx->v21.mode_programming.programming = dst_dml2_programming;
89 
90 	/* need to initialize copied instance for internal references to be correct */
91 	dml2_initialize_instance(&dst_dml_ctx->v21.dml_init);
92 }
93 
dml21_create_copy(struct dml2_context ** dst_dml_ctx,struct dml2_context * src_dml_ctx)94 bool dml21_create_copy(struct dml2_context **dst_dml_ctx,
95 	struct dml2_context *src_dml_ctx)
96 {
97 	/* Allocate memory for initializing DML21 instance */
98 	if (!dml21_allocate_memory(dst_dml_ctx))
99 		return false;
100 
101 	dml21_copy(*dst_dml_ctx, src_dml_ctx);
102 
103 	return true;
104 }
105 
106