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