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