1bb38d854SSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause
2bb38d854SSrikanth Yalavarthi * Copyright (c) 2022 Marvell.
3bb38d854SSrikanth Yalavarthi */
4bb38d854SSrikanth Yalavarthi
5bb38d854SSrikanth Yalavarthi #include <errno.h>
6bb38d854SSrikanth Yalavarthi
7bb38d854SSrikanth Yalavarthi #include <rte_common.h>
8bb38d854SSrikanth Yalavarthi #include <rte_malloc.h>
9bb38d854SSrikanth Yalavarthi #include <rte_mldev.h>
10bb38d854SSrikanth Yalavarthi
11bb38d854SSrikanth Yalavarthi #include "test_device_ops.h"
12bb38d854SSrikanth Yalavarthi
13bb38d854SSrikanth Yalavarthi static bool
test_device_cap_check(struct ml_options * opt)14bb38d854SSrikanth Yalavarthi test_device_cap_check(struct ml_options *opt)
15bb38d854SSrikanth Yalavarthi {
16bb38d854SSrikanth Yalavarthi if (!ml_test_cap_check(opt))
17bb38d854SSrikanth Yalavarthi return false;
18bb38d854SSrikanth Yalavarthi
19bb38d854SSrikanth Yalavarthi return true;
20bb38d854SSrikanth Yalavarthi }
21bb38d854SSrikanth Yalavarthi
22bb38d854SSrikanth Yalavarthi static int
test_device_opt_check(struct ml_options * opt)23bb38d854SSrikanth Yalavarthi test_device_opt_check(struct ml_options *opt)
24bb38d854SSrikanth Yalavarthi {
25bb38d854SSrikanth Yalavarthi int ret;
26bb38d854SSrikanth Yalavarthi
27bb38d854SSrikanth Yalavarthi /* check common opts */
28bb38d854SSrikanth Yalavarthi ret = ml_test_opt_check(opt);
29bb38d854SSrikanth Yalavarthi if (ret != 0)
30bb38d854SSrikanth Yalavarthi return ret;
31bb38d854SSrikanth Yalavarthi
32bb38d854SSrikanth Yalavarthi return 0;
33bb38d854SSrikanth Yalavarthi }
34bb38d854SSrikanth Yalavarthi
35bb38d854SSrikanth Yalavarthi static void
test_device_opt_dump(struct ml_options * opt)36bb38d854SSrikanth Yalavarthi test_device_opt_dump(struct ml_options *opt)
37bb38d854SSrikanth Yalavarthi {
38bb38d854SSrikanth Yalavarthi /* dump common opts */
39bb38d854SSrikanth Yalavarthi ml_test_opt_dump(opt);
40bb38d854SSrikanth Yalavarthi }
41bb38d854SSrikanth Yalavarthi
42bb38d854SSrikanth Yalavarthi static int
test_device_setup(struct ml_test * test,struct ml_options * opt)43bb38d854SSrikanth Yalavarthi test_device_setup(struct ml_test *test, struct ml_options *opt)
44bb38d854SSrikanth Yalavarthi {
45bb38d854SSrikanth Yalavarthi struct test_device *t;
46bb38d854SSrikanth Yalavarthi void *test_device;
47bb38d854SSrikanth Yalavarthi int ret = 0;
48bb38d854SSrikanth Yalavarthi
49bb38d854SSrikanth Yalavarthi /* allocate for test structure */
50bb38d854SSrikanth Yalavarthi test_device = rte_zmalloc_socket(test->name, sizeof(struct test_device),
51bb38d854SSrikanth Yalavarthi RTE_CACHE_LINE_SIZE, opt->socket_id);
52bb38d854SSrikanth Yalavarthi if (test_device == NULL) {
53bb38d854SSrikanth Yalavarthi ml_err("failed to allocate memory for test_model");
54bb38d854SSrikanth Yalavarthi ret = -ENOMEM;
55bb38d854SSrikanth Yalavarthi goto error;
56bb38d854SSrikanth Yalavarthi }
57bb38d854SSrikanth Yalavarthi test->test_priv = test_device;
58bb38d854SSrikanth Yalavarthi t = ml_test_priv(test);
59bb38d854SSrikanth Yalavarthi
60bb38d854SSrikanth Yalavarthi t->cmn.result = ML_TEST_FAILED;
61bb38d854SSrikanth Yalavarthi t->cmn.opt = opt;
62bb38d854SSrikanth Yalavarthi
63bb38d854SSrikanth Yalavarthi /* get device info */
64bb38d854SSrikanth Yalavarthi ret = rte_ml_dev_info_get(opt->dev_id, &t->cmn.dev_info);
65bb38d854SSrikanth Yalavarthi if (ret < 0) {
66bb38d854SSrikanth Yalavarthi ml_err("failed to get device info");
67bb38d854SSrikanth Yalavarthi goto error;
68bb38d854SSrikanth Yalavarthi }
69bb38d854SSrikanth Yalavarthi
70bb38d854SSrikanth Yalavarthi return 0;
71bb38d854SSrikanth Yalavarthi
72bb38d854SSrikanth Yalavarthi error:
73bb38d854SSrikanth Yalavarthi rte_free(test_device);
74bb38d854SSrikanth Yalavarthi
75bb38d854SSrikanth Yalavarthi return ret;
76bb38d854SSrikanth Yalavarthi }
77bb38d854SSrikanth Yalavarthi
78bb38d854SSrikanth Yalavarthi static void
test_device_destroy(struct ml_test * test,struct ml_options * opt)79bb38d854SSrikanth Yalavarthi test_device_destroy(struct ml_test *test, struct ml_options *opt)
80bb38d854SSrikanth Yalavarthi {
81bb38d854SSrikanth Yalavarthi struct test_device *t;
82bb38d854SSrikanth Yalavarthi
83bb38d854SSrikanth Yalavarthi RTE_SET_USED(opt);
84bb38d854SSrikanth Yalavarthi
85bb38d854SSrikanth Yalavarthi t = ml_test_priv(test);
86bb38d854SSrikanth Yalavarthi rte_free(t);
87bb38d854SSrikanth Yalavarthi }
88bb38d854SSrikanth Yalavarthi
89bb38d854SSrikanth Yalavarthi static int
test_device_reconfigure(struct ml_test * test,struct ml_options * opt)90bb38d854SSrikanth Yalavarthi test_device_reconfigure(struct ml_test *test, struct ml_options *opt)
91bb38d854SSrikanth Yalavarthi {
92bb38d854SSrikanth Yalavarthi struct rte_ml_dev_config dev_config;
93bb38d854SSrikanth Yalavarthi struct rte_ml_dev_qp_conf qp_conf;
94bb38d854SSrikanth Yalavarthi struct test_device *t;
95bb38d854SSrikanth Yalavarthi uint16_t qp_id = 0;
96bb38d854SSrikanth Yalavarthi int ret = 0;
97bb38d854SSrikanth Yalavarthi
98bb38d854SSrikanth Yalavarthi t = ml_test_priv(test);
99bb38d854SSrikanth Yalavarthi
100bb38d854SSrikanth Yalavarthi /* configure with default options */
101bb38d854SSrikanth Yalavarthi ret = ml_test_device_configure(test, opt);
102bb38d854SSrikanth Yalavarthi if (ret != 0)
103bb38d854SSrikanth Yalavarthi return ret;
104bb38d854SSrikanth Yalavarthi
105*7c4da162SSrikanth Yalavarthi /* setup queue pairs with nb_user options */
106*7c4da162SSrikanth Yalavarthi for (qp_id = 0; qp_id < opt->queue_pairs; qp_id++) {
107*7c4da162SSrikanth Yalavarthi qp_conf.nb_desc = opt->queue_size;
108bb38d854SSrikanth Yalavarthi qp_conf.cb = NULL;
109bb38d854SSrikanth Yalavarthi
110bb38d854SSrikanth Yalavarthi ret = rte_ml_dev_queue_pair_setup(opt->dev_id, qp_id, &qp_conf, opt->socket_id);
111bb38d854SSrikanth Yalavarthi if (ret != 0) {
112bb38d854SSrikanth Yalavarthi ml_err("Failed to setup ML device queue-pair, dev_id = %d, qp_id = %u\n",
113bb38d854SSrikanth Yalavarthi opt->dev_id, qp_id);
114bb38d854SSrikanth Yalavarthi goto error;
115bb38d854SSrikanth Yalavarthi }
116*7c4da162SSrikanth Yalavarthi }
117bb38d854SSrikanth Yalavarthi
118bb38d854SSrikanth Yalavarthi /* start device */
119bb38d854SSrikanth Yalavarthi ret = ml_test_device_start(test, opt);
120bb38d854SSrikanth Yalavarthi if (ret != 0)
121bb38d854SSrikanth Yalavarthi goto error;
122bb38d854SSrikanth Yalavarthi
123bb38d854SSrikanth Yalavarthi /* stop device */
124bb38d854SSrikanth Yalavarthi ret = ml_test_device_stop(test, opt);
125bb38d854SSrikanth Yalavarthi if (ret != 0) {
126bb38d854SSrikanth Yalavarthi ml_err("Failed to stop device");
127bb38d854SSrikanth Yalavarthi goto error;
128bb38d854SSrikanth Yalavarthi }
129bb38d854SSrikanth Yalavarthi
130bb38d854SSrikanth Yalavarthi /* reconfigure device based on dev_info */
131bb38d854SSrikanth Yalavarthi dev_config.socket_id = opt->socket_id;
132bb38d854SSrikanth Yalavarthi dev_config.nb_models = t->cmn.dev_info.max_models;
133bb38d854SSrikanth Yalavarthi dev_config.nb_queue_pairs = t->cmn.dev_info.max_queue_pairs;
134bb38d854SSrikanth Yalavarthi ret = rte_ml_dev_configure(opt->dev_id, &dev_config);
135bb38d854SSrikanth Yalavarthi if (ret != 0) {
136bb38d854SSrikanth Yalavarthi ml_err("Failed to reconfigure ML device, dev_id = %d\n", opt->dev_id);
137bb38d854SSrikanth Yalavarthi return ret;
138bb38d854SSrikanth Yalavarthi }
139bb38d854SSrikanth Yalavarthi
140bb38d854SSrikanth Yalavarthi /* setup queue pairs */
141bb38d854SSrikanth Yalavarthi for (qp_id = 0; qp_id < t->cmn.dev_info.max_queue_pairs; qp_id++) {
142bb38d854SSrikanth Yalavarthi qp_conf.nb_desc = t->cmn.dev_info.max_desc;
143bb38d854SSrikanth Yalavarthi qp_conf.cb = NULL;
144bb38d854SSrikanth Yalavarthi
145bb38d854SSrikanth Yalavarthi ret = rte_ml_dev_queue_pair_setup(opt->dev_id, qp_id, &qp_conf, opt->socket_id);
146bb38d854SSrikanth Yalavarthi if (ret != 0) {
147bb38d854SSrikanth Yalavarthi ml_err("Failed to setup ML device queue-pair, dev_id = %d, qp_id = %u\n",
148bb38d854SSrikanth Yalavarthi opt->dev_id, qp_id);
149bb38d854SSrikanth Yalavarthi goto error;
150bb38d854SSrikanth Yalavarthi }
151bb38d854SSrikanth Yalavarthi }
152bb38d854SSrikanth Yalavarthi
153bb38d854SSrikanth Yalavarthi /* start device */
154bb38d854SSrikanth Yalavarthi ret = ml_test_device_start(test, opt);
155bb38d854SSrikanth Yalavarthi if (ret != 0)
156bb38d854SSrikanth Yalavarthi goto error;
157bb38d854SSrikanth Yalavarthi
158bb38d854SSrikanth Yalavarthi /* stop device */
159bb38d854SSrikanth Yalavarthi ret = ml_test_device_stop(test, opt);
160bb38d854SSrikanth Yalavarthi if (ret != 0)
161bb38d854SSrikanth Yalavarthi goto error;
162bb38d854SSrikanth Yalavarthi
163bb38d854SSrikanth Yalavarthi /* close device */
164bb38d854SSrikanth Yalavarthi ret = ml_test_device_close(test, opt);
165bb38d854SSrikanth Yalavarthi if (ret != 0)
166bb38d854SSrikanth Yalavarthi return ret;
167bb38d854SSrikanth Yalavarthi
168bb38d854SSrikanth Yalavarthi return 0;
169bb38d854SSrikanth Yalavarthi
170bb38d854SSrikanth Yalavarthi error:
171bb38d854SSrikanth Yalavarthi ml_test_device_close(test, opt);
172bb38d854SSrikanth Yalavarthi
173bb38d854SSrikanth Yalavarthi return ret;
174bb38d854SSrikanth Yalavarthi }
175bb38d854SSrikanth Yalavarthi
176bb38d854SSrikanth Yalavarthi static int
test_device_driver(struct ml_test * test,struct ml_options * opt)177bb38d854SSrikanth Yalavarthi test_device_driver(struct ml_test *test, struct ml_options *opt)
178bb38d854SSrikanth Yalavarthi {
179bb38d854SSrikanth Yalavarthi struct test_device *t;
180bb38d854SSrikanth Yalavarthi int ret = 0;
181bb38d854SSrikanth Yalavarthi
182bb38d854SSrikanth Yalavarthi t = ml_test_priv(test);
183bb38d854SSrikanth Yalavarthi
184bb38d854SSrikanth Yalavarthi /* sub-test: device reconfigure */
185bb38d854SSrikanth Yalavarthi ret = test_device_reconfigure(test, opt);
186bb38d854SSrikanth Yalavarthi if (ret != 0) {
187bb38d854SSrikanth Yalavarthi printf("\n");
188bb38d854SSrikanth Yalavarthi printf("Model Device Reconfigure Test: " CLRED "%s" CLNRM "\n", "Failed");
189bb38d854SSrikanth Yalavarthi goto error;
190bb38d854SSrikanth Yalavarthi } else {
191bb38d854SSrikanth Yalavarthi printf("\n");
192bb38d854SSrikanth Yalavarthi printf("Model Device Reconfigure Test: " CLYEL "%s" CLNRM "\n", "Passed");
193bb38d854SSrikanth Yalavarthi }
194bb38d854SSrikanth Yalavarthi
195bb38d854SSrikanth Yalavarthi printf("\n");
196bb38d854SSrikanth Yalavarthi
197bb38d854SSrikanth Yalavarthi t->cmn.result = ML_TEST_SUCCESS;
198bb38d854SSrikanth Yalavarthi
199bb38d854SSrikanth Yalavarthi return 0;
200bb38d854SSrikanth Yalavarthi
201bb38d854SSrikanth Yalavarthi error:
202bb38d854SSrikanth Yalavarthi t->cmn.result = ML_TEST_FAILED;
203bb38d854SSrikanth Yalavarthi return -1;
204bb38d854SSrikanth Yalavarthi }
205bb38d854SSrikanth Yalavarthi
206bb38d854SSrikanth Yalavarthi static int
test_device_result(struct ml_test * test,struct ml_options * opt)207bb38d854SSrikanth Yalavarthi test_device_result(struct ml_test *test, struct ml_options *opt)
208bb38d854SSrikanth Yalavarthi {
209bb38d854SSrikanth Yalavarthi struct test_device *t;
210bb38d854SSrikanth Yalavarthi
211bb38d854SSrikanth Yalavarthi RTE_SET_USED(opt);
212bb38d854SSrikanth Yalavarthi
213bb38d854SSrikanth Yalavarthi t = ml_test_priv(test);
214bb38d854SSrikanth Yalavarthi
215bb38d854SSrikanth Yalavarthi return t->cmn.result;
216bb38d854SSrikanth Yalavarthi }
217bb38d854SSrikanth Yalavarthi
218bb38d854SSrikanth Yalavarthi static const struct ml_test_ops device_ops = {
219bb38d854SSrikanth Yalavarthi .cap_check = test_device_cap_check,
220bb38d854SSrikanth Yalavarthi .opt_check = test_device_opt_check,
221bb38d854SSrikanth Yalavarthi .opt_dump = test_device_opt_dump,
222bb38d854SSrikanth Yalavarthi .test_setup = test_device_setup,
223bb38d854SSrikanth Yalavarthi .test_destroy = test_device_destroy,
224bb38d854SSrikanth Yalavarthi .test_driver = test_device_driver,
225bb38d854SSrikanth Yalavarthi .test_result = test_device_result,
226bb38d854SSrikanth Yalavarthi };
227bb38d854SSrikanth Yalavarthi
228bb38d854SSrikanth Yalavarthi ML_TEST_REGISTER(device_ops);
229