1f6661e6dSSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause
2f6661e6dSSrikanth Yalavarthi * Copyright (c) 2022 Marvell.
3f6661e6dSSrikanth Yalavarthi */
4f6661e6dSSrikanth Yalavarthi
5f6661e6dSSrikanth Yalavarthi #include <errno.h>
6f6661e6dSSrikanth Yalavarthi
7f6661e6dSSrikanth Yalavarthi #include <rte_common.h>
8f6661e6dSSrikanth Yalavarthi #include <rte_malloc.h>
9f6661e6dSSrikanth Yalavarthi #include <rte_mldev.h>
10f6661e6dSSrikanth Yalavarthi
11f6661e6dSSrikanth Yalavarthi #include "ml_common.h"
12f6661e6dSSrikanth Yalavarthi #include "test_model_common.h"
13f6661e6dSSrikanth Yalavarthi
14f6661e6dSSrikanth Yalavarthi int
ml_model_load(struct ml_test * test,struct ml_options * opt,struct ml_model * model,uint16_t fid)15f6661e6dSSrikanth Yalavarthi ml_model_load(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid)
16f6661e6dSSrikanth Yalavarthi {
17f6661e6dSSrikanth Yalavarthi struct rte_ml_model_params model_params;
18f6661e6dSSrikanth Yalavarthi int ret;
19f6661e6dSSrikanth Yalavarthi
20*fccf444cSSrikanth Yalavarthi RTE_SET_USED(test);
21*fccf444cSSrikanth Yalavarthi
22f6661e6dSSrikanth Yalavarthi if (model->state == MODEL_LOADED)
23f6661e6dSSrikanth Yalavarthi return 0;
24f6661e6dSSrikanth Yalavarthi
25f6661e6dSSrikanth Yalavarthi if (model->state != MODEL_INITIAL)
26f6661e6dSSrikanth Yalavarthi return -EINVAL;
27f6661e6dSSrikanth Yalavarthi
28f6661e6dSSrikanth Yalavarthi /* read model binary */
29*fccf444cSSrikanth Yalavarthi ret = ml_read_file(opt->filelist[fid].model, &model_params.size,
30*fccf444cSSrikanth Yalavarthi (char **)&model_params.addr);
31*fccf444cSSrikanth Yalavarthi if (ret != 0)
32*fccf444cSSrikanth Yalavarthi return ret;
33f6661e6dSSrikanth Yalavarthi
34f6661e6dSSrikanth Yalavarthi /* load model to device */
35f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_load(opt->dev_id, &model_params, &model->id);
36f6661e6dSSrikanth Yalavarthi if (ret != 0) {
37f6661e6dSSrikanth Yalavarthi ml_err("Failed to load model : %s\n", opt->filelist[fid].model);
38f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR;
39*fccf444cSSrikanth Yalavarthi free(model_params.addr);
40f6661e6dSSrikanth Yalavarthi return ret;
41f6661e6dSSrikanth Yalavarthi }
42f6661e6dSSrikanth Yalavarthi
43*fccf444cSSrikanth Yalavarthi /* release buffer */
44*fccf444cSSrikanth Yalavarthi free(model_params.addr);
45f6661e6dSSrikanth Yalavarthi
46f6661e6dSSrikanth Yalavarthi /* get model info */
47f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_info_get(opt->dev_id, model->id, &model->info);
48f6661e6dSSrikanth Yalavarthi if (ret != 0) {
49f6661e6dSSrikanth Yalavarthi ml_err("Failed to get model info : %s\n", opt->filelist[fid].model);
50f6661e6dSSrikanth Yalavarthi return ret;
51f6661e6dSSrikanth Yalavarthi }
52f6661e6dSSrikanth Yalavarthi
53f6661e6dSSrikanth Yalavarthi model->state = MODEL_LOADED;
54f6661e6dSSrikanth Yalavarthi
55f6661e6dSSrikanth Yalavarthi return 0;
56f6661e6dSSrikanth Yalavarthi }
57f6661e6dSSrikanth Yalavarthi
58f6661e6dSSrikanth Yalavarthi int
ml_model_unload(struct ml_test * test,struct ml_options * opt,struct ml_model * model,uint16_t fid)59f6661e6dSSrikanth Yalavarthi ml_model_unload(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid)
60f6661e6dSSrikanth Yalavarthi {
61f6661e6dSSrikanth Yalavarthi struct test_common *t = ml_test_priv(test);
62f6661e6dSSrikanth Yalavarthi int ret;
63f6661e6dSSrikanth Yalavarthi
64f6661e6dSSrikanth Yalavarthi RTE_SET_USED(t);
65f6661e6dSSrikanth Yalavarthi
66f6661e6dSSrikanth Yalavarthi if (model->state == MODEL_INITIAL)
67f6661e6dSSrikanth Yalavarthi return 0;
68f6661e6dSSrikanth Yalavarthi
69f6661e6dSSrikanth Yalavarthi if (model->state != MODEL_LOADED)
70f6661e6dSSrikanth Yalavarthi return -EINVAL;
71f6661e6dSSrikanth Yalavarthi
72f6661e6dSSrikanth Yalavarthi /* unload model */
73f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_unload(opt->dev_id, model->id);
74f6661e6dSSrikanth Yalavarthi if (ret != 0) {
75f6661e6dSSrikanth Yalavarthi ml_err("Failed to unload model: %s\n", opt->filelist[fid].model);
76f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR;
77f6661e6dSSrikanth Yalavarthi return ret;
78f6661e6dSSrikanth Yalavarthi }
79f6661e6dSSrikanth Yalavarthi
80f6661e6dSSrikanth Yalavarthi model->state = MODEL_INITIAL;
81f6661e6dSSrikanth Yalavarthi
82f6661e6dSSrikanth Yalavarthi return 0;
83f6661e6dSSrikanth Yalavarthi }
84f6661e6dSSrikanth Yalavarthi
85f6661e6dSSrikanth Yalavarthi int
ml_model_start(struct ml_test * test,struct ml_options * opt,struct ml_model * model,uint16_t fid)86f6661e6dSSrikanth Yalavarthi ml_model_start(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid)
87f6661e6dSSrikanth Yalavarthi {
88f6661e6dSSrikanth Yalavarthi struct test_common *t = ml_test_priv(test);
89f6661e6dSSrikanth Yalavarthi int ret;
90f6661e6dSSrikanth Yalavarthi
91f6661e6dSSrikanth Yalavarthi RTE_SET_USED(t);
92f6661e6dSSrikanth Yalavarthi
93f6661e6dSSrikanth Yalavarthi if (model->state == MODEL_STARTED)
94f6661e6dSSrikanth Yalavarthi return 0;
95f6661e6dSSrikanth Yalavarthi
96f6661e6dSSrikanth Yalavarthi if (model->state != MODEL_LOADED)
97f6661e6dSSrikanth Yalavarthi return -EINVAL;
98f6661e6dSSrikanth Yalavarthi
99f6661e6dSSrikanth Yalavarthi /* start model */
100f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_start(opt->dev_id, model->id);
101f6661e6dSSrikanth Yalavarthi if (ret != 0) {
102f6661e6dSSrikanth Yalavarthi ml_err("Failed to start model : %s\n", opt->filelist[fid].model);
103f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR;
104f6661e6dSSrikanth Yalavarthi return ret;
105f6661e6dSSrikanth Yalavarthi }
106f6661e6dSSrikanth Yalavarthi
107f6661e6dSSrikanth Yalavarthi model->state = MODEL_STARTED;
108f6661e6dSSrikanth Yalavarthi
109f6661e6dSSrikanth Yalavarthi return 0;
110f6661e6dSSrikanth Yalavarthi }
111f6661e6dSSrikanth Yalavarthi
112f6661e6dSSrikanth Yalavarthi int
ml_model_stop(struct ml_test * test,struct ml_options * opt,struct ml_model * model,uint16_t fid)113f6661e6dSSrikanth Yalavarthi ml_model_stop(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid)
114f6661e6dSSrikanth Yalavarthi {
115f6661e6dSSrikanth Yalavarthi struct test_common *t = ml_test_priv(test);
116f6661e6dSSrikanth Yalavarthi int ret;
117f6661e6dSSrikanth Yalavarthi
118f6661e6dSSrikanth Yalavarthi RTE_SET_USED(t);
119f6661e6dSSrikanth Yalavarthi
120f6661e6dSSrikanth Yalavarthi if (model->state == MODEL_LOADED)
121f6661e6dSSrikanth Yalavarthi return 0;
122f6661e6dSSrikanth Yalavarthi
123f6661e6dSSrikanth Yalavarthi if (model->state != MODEL_STARTED)
124f6661e6dSSrikanth Yalavarthi return -EINVAL;
125f6661e6dSSrikanth Yalavarthi
126f6661e6dSSrikanth Yalavarthi /* stop model */
127f6661e6dSSrikanth Yalavarthi ret = rte_ml_model_stop(opt->dev_id, model->id);
128f6661e6dSSrikanth Yalavarthi if (ret != 0) {
129f6661e6dSSrikanth Yalavarthi ml_err("Failed to stop model: %s\n", opt->filelist[fid].model);
130f6661e6dSSrikanth Yalavarthi model->state = MODEL_ERROR;
131f6661e6dSSrikanth Yalavarthi return ret;
132f6661e6dSSrikanth Yalavarthi }
133f6661e6dSSrikanth Yalavarthi
134f6661e6dSSrikanth Yalavarthi model->state = MODEL_LOADED;
135f6661e6dSSrikanth Yalavarthi
136f6661e6dSSrikanth Yalavarthi return 0;
137f6661e6dSSrikanth Yalavarthi }
138