| // SPDX-License-Identifier: MIT | |
| /* | |
| * Copyright 2025 Advanced Micro Devices, Inc. | |
| * | |
| * Authors: AMD | |
| */ | |
| #include "dml2_internal_types.h" | |
| #include "dml2_wrapper.h" | |
| #include "dml2_wrapper_fpu.h" | |
| #include "dml21_wrapper/dml21_wrapper.h" | |
| #include "dml21_wrapper/dml21_wrapper_fpu.h" | |
| #include "dc_fpu.h" | |
| #if !defined(DC_RUN_WITH_PREEMPTION_ENABLED) | |
| #define DC_RUN_WITH_PREEMPTION_ENABLED(code) code | |
| #endif // !DC_RUN_WITH_PREEMPTION_ENABLED | |
| struct dml2_context *dml2_allocate_memory(void) | |
| { | |
| struct dml2_context *dml2; | |
| DC_RUN_WITH_PREEMPTION_ENABLED(dml2 = vzalloc(sizeof(struct dml2_context))); | |
| return dml2; | |
| } | |
| bool dml2_validate(const struct dc *in_dc, struct dc_state *context, struct dml2_context *dml2, | |
| enum dc_validate_mode validate_mode) | |
| { | |
| bool out = false; | |
| if (!dml2) | |
| return false; | |
| dml2_apply_debug_options(in_dc, dml2); | |
| /* DML2.1 validation path */ | |
| if (dml2->architecture == dml2_architecture_21) { | |
| out = dml21_validate(in_dc, context, dml2, validate_mode); | |
| return out; | |
| } | |
| /* Use dml_validate_only for DC_VALIDATE_MODE_ONLY and DC_VALIDATE_MODE_AND_STATE_INDEX path */ | |
| if (validate_mode != DC_VALIDATE_MODE_AND_PROGRAMMING) | |
| out = dml2_validate_only(context, validate_mode); | |
| else | |
| out = dml2_validate_and_build_resource(in_dc, context, validate_mode); | |
| return out; | |
| } | |
| static void dml2_init(const struct dc *in_dc, const struct dml2_configuration_options *config, struct dml2_context **dml2) | |
| { | |
| if ((in_dc->debug.using_dml21) && (in_dc->ctx->dce_version >= DCN_VERSION_4_01)) { | |
| dml21_reinit(in_dc, *dml2, config); | |
| return; | |
| } | |
| // Store config options | |
| (*dml2)->config = *config; | |
| switch (in_dc->ctx->dce_version) { | |
| case DCN_VERSION_3_5: | |
| (*dml2)->v20.dml_core_ctx.project = dml_project_dcn35; | |
| break; | |
| case DCN_VERSION_3_51: | |
| (*dml2)->v20.dml_core_ctx.project = dml_project_dcn351; | |
| break; | |
| case DCN_VERSION_3_6: | |
| (*dml2)->v20.dml_core_ctx.project = dml_project_dcn36; | |
| break; | |
| case DCN_VERSION_3_2: | |
| (*dml2)->v20.dml_core_ctx.project = dml_project_dcn32; | |
| break; | |
| case DCN_VERSION_3_21: | |
| (*dml2)->v20.dml_core_ctx.project = dml_project_dcn321; | |
| break; | |
| case DCN_VERSION_4_01: | |
| (*dml2)->v20.dml_core_ctx.project = dml_project_dcn401; | |
| break; | |
| default: | |
| (*dml2)->v20.dml_core_ctx.project = dml_project_default; | |
| break; | |
| } | |
| initialize_dml2_ip_params(*dml2, in_dc, &(*dml2)->v20.dml_core_ctx.ip); | |
| initialize_dml2_soc_bbox(*dml2, in_dc, &(*dml2)->v20.dml_core_ctx.soc); | |
| initialize_dml2_soc_states(*dml2, in_dc, &(*dml2)->v20.dml_core_ctx.soc, &(*dml2)->v20.dml_core_ctx.states); | |
| } | |
| bool dml2_create(const struct dc *in_dc, const struct dml2_configuration_options *config, struct dml2_context **dml2) | |
| { | |
| // TODO : Temporarily add DCN_VERSION_3_2 for N-1 validation. Remove DCN_VERSION_3_2 after N-1 validation phase is complete. | |
| if ((in_dc->debug.using_dml21) && (in_dc->ctx->dce_version >= DCN_VERSION_4_01)) { | |
| return dml21_create(in_dc, dml2, config); | |
| } | |
| // Allocate Mode Lib Ctx | |
| *dml2 = dml2_allocate_memory(); | |
| if (!(*dml2)) | |
| return false; | |
| dml2_init(in_dc, config, dml2); | |
| return true; | |
| } | |
| void dml2_destroy(struct dml2_context *dml2) | |
| { | |
| if (!dml2) | |
| return; | |
| if (dml2->architecture == dml2_architecture_21) | |
| dml21_destroy(dml2); | |
| DC_RUN_WITH_PREEMPTION_ENABLED(vfree(dml2)); | |
| } | |
| void dml2_reinit(const struct dc *in_dc, | |
| const struct dml2_configuration_options *config, | |
| struct dml2_context **dml2) | |
| { | |
| if ((in_dc->debug.using_dml21) && (in_dc->ctx->dce_version >= DCN_VERSION_4_01)) { | |
| dml21_reinit(in_dc, *dml2, config); | |
| return; | |
| } | |
| dml2_init(in_dc, config, dml2); | |
| } |