xref: /dpdk/lib/mldev/rte_mldev.c (revision 36d0b09e8a1de85440f3ab2d6155ae51302f0c3d)
1d82cac58SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause
2d82cac58SJerin Jacob  * Copyright (c) 2022 Marvell.
3d82cac58SJerin Jacob  */
4d82cac58SJerin Jacob 
5ea80eafbSSrikanth Yalavarthi #include <rte_errno.h>
6d82cac58SJerin Jacob #include <rte_log.h>
7d82cac58SJerin Jacob #include <rte_mldev.h>
8ea80eafbSSrikanth Yalavarthi #include <rte_mldev_pmd.h>
9ea80eafbSSrikanth Yalavarthi 
10ea80eafbSSrikanth Yalavarthi #include <stdlib.h>
11ea80eafbSSrikanth Yalavarthi 
12ea80eafbSSrikanth Yalavarthi static struct rte_ml_dev_global ml_dev_globals = {
13ea80eafbSSrikanth Yalavarthi 	.devs = NULL, .data = NULL, .nb_devs = 0, .max_devs = RTE_MLDEV_DEFAULT_MAX};
14ea80eafbSSrikanth Yalavarthi 
15ea80eafbSSrikanth Yalavarthi struct rte_ml_dev *
16ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_get_dev(int16_t dev_id)
17ea80eafbSSrikanth Yalavarthi {
18ea80eafbSSrikanth Yalavarthi 	return &ml_dev_globals.devs[dev_id];
19ea80eafbSSrikanth Yalavarthi }
20ea80eafbSSrikanth Yalavarthi 
21ea80eafbSSrikanth Yalavarthi struct rte_ml_dev *
22ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_get_named_dev(const char *name)
23ea80eafbSSrikanth Yalavarthi {
24ea80eafbSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
25ea80eafbSSrikanth Yalavarthi 	int16_t dev_id;
26ea80eafbSSrikanth Yalavarthi 
27ea80eafbSSrikanth Yalavarthi 	if (name == NULL)
28ea80eafbSSrikanth Yalavarthi 		return NULL;
29ea80eafbSSrikanth Yalavarthi 
30ea80eafbSSrikanth Yalavarthi 	for (dev_id = 0; dev_id < ml_dev_globals.max_devs; dev_id++) {
31ea80eafbSSrikanth Yalavarthi 		dev = rte_ml_dev_pmd_get_dev(dev_id);
32ea80eafbSSrikanth Yalavarthi 		if ((dev->attached == ML_DEV_ATTACHED) && (strcmp(dev->data->name, name) == 0))
33ea80eafbSSrikanth Yalavarthi 			return dev;
34ea80eafbSSrikanth Yalavarthi 	}
35ea80eafbSSrikanth Yalavarthi 
36ea80eafbSSrikanth Yalavarthi 	return NULL;
37ea80eafbSSrikanth Yalavarthi }
38ea80eafbSSrikanth Yalavarthi 
39ea80eafbSSrikanth Yalavarthi struct rte_ml_dev *
40ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_allocate(const char *name, uint8_t socket_id)
41ea80eafbSSrikanth Yalavarthi {
42ea80eafbSSrikanth Yalavarthi 	char mz_name[RTE_MEMZONE_NAMESIZE];
43ea80eafbSSrikanth Yalavarthi 	const struct rte_memzone *mz;
44ea80eafbSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
45ea80eafbSSrikanth Yalavarthi 	int16_t dev_id;
46ea80eafbSSrikanth Yalavarthi 
47ea80eafbSSrikanth Yalavarthi 	/* implicit initialization of library before adding first device */
48ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.devs == NULL) {
49ea80eafbSSrikanth Yalavarthi 		if (rte_ml_dev_init(RTE_MLDEV_DEFAULT_MAX) != 0)
50ea80eafbSSrikanth Yalavarthi 			return NULL;
51ea80eafbSSrikanth Yalavarthi 	}
52ea80eafbSSrikanth Yalavarthi 
53ea80eafbSSrikanth Yalavarthi 	if (rte_ml_dev_pmd_get_named_dev(name) != NULL) {
54ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "ML device with name %s already allocated!", name);
55ea80eafbSSrikanth Yalavarthi 		return NULL;
56ea80eafbSSrikanth Yalavarthi 	}
57ea80eafbSSrikanth Yalavarthi 
58ea80eafbSSrikanth Yalavarthi 	/* Get a free device ID */
59ea80eafbSSrikanth Yalavarthi 	for (dev_id = 0; dev_id < ml_dev_globals.max_devs; dev_id++) {
60ea80eafbSSrikanth Yalavarthi 		dev = rte_ml_dev_pmd_get_dev(dev_id);
61ea80eafbSSrikanth Yalavarthi 		if (dev->attached == ML_DEV_DETACHED)
62ea80eafbSSrikanth Yalavarthi 			break;
63ea80eafbSSrikanth Yalavarthi 	}
64ea80eafbSSrikanth Yalavarthi 
65ea80eafbSSrikanth Yalavarthi 	if (dev_id == ml_dev_globals.max_devs) {
66ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Reached maximum number of ML devices");
67ea80eafbSSrikanth Yalavarthi 		return NULL;
68ea80eafbSSrikanth Yalavarthi 	}
69ea80eafbSSrikanth Yalavarthi 
70ea80eafbSSrikanth Yalavarthi 	if (dev->data == NULL) {
71ea80eafbSSrikanth Yalavarthi 		/* Reserve memzone name */
72ea80eafbSSrikanth Yalavarthi 		sprintf(mz_name, "rte_ml_dev_data_%d", dev_id);
73ea80eafbSSrikanth Yalavarthi 		if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
74ea80eafbSSrikanth Yalavarthi 			mz = rte_memzone_reserve(mz_name, sizeof(struct rte_ml_dev_data), socket_id,
75ea80eafbSSrikanth Yalavarthi 						 0);
76ea80eafbSSrikanth Yalavarthi 			RTE_MLDEV_LOG(DEBUG, "PRIMARY: reserved memzone for %s (%p)", mz_name, mz);
77ea80eafbSSrikanth Yalavarthi 		} else {
78ea80eafbSSrikanth Yalavarthi 			mz = rte_memzone_lookup(mz_name);
79ea80eafbSSrikanth Yalavarthi 			RTE_MLDEV_LOG(DEBUG, "SECONDARY: looked up memzone for %s (%p)", mz_name,
80ea80eafbSSrikanth Yalavarthi 				      mz);
81ea80eafbSSrikanth Yalavarthi 		}
82ea80eafbSSrikanth Yalavarthi 
83ea80eafbSSrikanth Yalavarthi 		if (mz == NULL)
84ea80eafbSSrikanth Yalavarthi 			return NULL;
85ea80eafbSSrikanth Yalavarthi 
86ea80eafbSSrikanth Yalavarthi 		ml_dev_globals.data[dev_id] = mz->addr;
87ea80eafbSSrikanth Yalavarthi 		if (rte_eal_process_type() == RTE_PROC_PRIMARY)
88ea80eafbSSrikanth Yalavarthi 			memset(ml_dev_globals.data[dev_id], 0, sizeof(struct rte_ml_dev_data));
89ea80eafbSSrikanth Yalavarthi 
90ea80eafbSSrikanth Yalavarthi 		dev->data = ml_dev_globals.data[dev_id];
91ea80eafbSSrikanth Yalavarthi 		if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
92ea80eafbSSrikanth Yalavarthi 			strlcpy(dev->data->name, name, RTE_ML_STR_MAX);
93ea80eafbSSrikanth Yalavarthi 			dev->data->dev_id = dev_id;
94ea80eafbSSrikanth Yalavarthi 			dev->data->socket_id = socket_id;
95ea80eafbSSrikanth Yalavarthi 			dev->data->dev_started = 0;
96ea80eafbSSrikanth Yalavarthi 			RTE_MLDEV_LOG(DEBUG, "PRIMARY: init mldev data");
97ea80eafbSSrikanth Yalavarthi 		}
98ea80eafbSSrikanth Yalavarthi 
99ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(DEBUG, "Data for %s: dev_id %d, socket %u", dev->data->name,
100ea80eafbSSrikanth Yalavarthi 			      dev->data->dev_id, dev->data->socket_id);
101ea80eafbSSrikanth Yalavarthi 
102ea80eafbSSrikanth Yalavarthi 		dev->attached = ML_DEV_ATTACHED;
103ea80eafbSSrikanth Yalavarthi 		ml_dev_globals.nb_devs++;
104ea80eafbSSrikanth Yalavarthi 	}
105ea80eafbSSrikanth Yalavarthi 
106ea80eafbSSrikanth Yalavarthi 	return dev;
107ea80eafbSSrikanth Yalavarthi }
108ea80eafbSSrikanth Yalavarthi 
109ea80eafbSSrikanth Yalavarthi int
110ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_release(struct rte_ml_dev *dev)
111ea80eafbSSrikanth Yalavarthi {
112ea80eafbSSrikanth Yalavarthi 	char mz_name[RTE_MEMZONE_NAMESIZE];
113ea80eafbSSrikanth Yalavarthi 	const struct rte_memzone *mz;
114ea80eafbSSrikanth Yalavarthi 	int16_t dev_id;
115ea80eafbSSrikanth Yalavarthi 	int ret = 0;
116ea80eafbSSrikanth Yalavarthi 
117ea80eafbSSrikanth Yalavarthi 	if (dev == NULL)
118ea80eafbSSrikanth Yalavarthi 		return -EINVAL;
119ea80eafbSSrikanth Yalavarthi 
120ea80eafbSSrikanth Yalavarthi 	dev_id = dev->data->dev_id;
121ea80eafbSSrikanth Yalavarthi 
122ea80eafbSSrikanth Yalavarthi 	/* Memzone lookup */
123ea80eafbSSrikanth Yalavarthi 	sprintf(mz_name, "rte_ml_dev_data_%d", dev_id);
124ea80eafbSSrikanth Yalavarthi 	mz = rte_memzone_lookup(mz_name);
125ea80eafbSSrikanth Yalavarthi 	if (mz == NULL)
126ea80eafbSSrikanth Yalavarthi 		return -ENOMEM;
127ea80eafbSSrikanth Yalavarthi 
128ea80eafbSSrikanth Yalavarthi 	RTE_ASSERT(ml_dev_globals.data[dev_id] == mz->addr);
129ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.data[dev_id] = NULL;
130ea80eafbSSrikanth Yalavarthi 
131ea80eafbSSrikanth Yalavarthi 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
132ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(DEBUG, "PRIMARY: free memzone of %s (%p)", mz_name, mz);
133ea80eafbSSrikanth Yalavarthi 		ret = rte_memzone_free(mz);
134ea80eafbSSrikanth Yalavarthi 	} else {
135ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(DEBUG, "SECONDARY: don't free memzone of %s (%p)", mz_name, mz);
136ea80eafbSSrikanth Yalavarthi 	}
137ea80eafbSSrikanth Yalavarthi 
138ea80eafbSSrikanth Yalavarthi 	dev->attached = ML_DEV_DETACHED;
139ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.nb_devs--;
140ea80eafbSSrikanth Yalavarthi 
141ea80eafbSSrikanth Yalavarthi 	return ret;
142ea80eafbSSrikanth Yalavarthi }
143ea80eafbSSrikanth Yalavarthi 
144ea80eafbSSrikanth Yalavarthi int
145ea80eafbSSrikanth Yalavarthi rte_ml_dev_init(size_t dev_max)
146ea80eafbSSrikanth Yalavarthi {
147ea80eafbSSrikanth Yalavarthi 	if (dev_max == 0 || dev_max > INT16_MAX) {
148ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_max = %zu (> %d)\n", dev_max, INT16_MAX);
149ea80eafbSSrikanth Yalavarthi 		rte_errno = EINVAL;
150ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
151ea80eafbSSrikanth Yalavarthi 	}
152ea80eafbSSrikanth Yalavarthi 
153ea80eafbSSrikanth Yalavarthi 	/* No lock, it must be called before or during first probing. */
154ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.devs != NULL) {
155ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device array already initialized");
156ea80eafbSSrikanth Yalavarthi 		rte_errno = EBUSY;
157ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
158ea80eafbSSrikanth Yalavarthi 	}
159ea80eafbSSrikanth Yalavarthi 
160ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.devs = calloc(dev_max, sizeof(struct rte_ml_dev));
161ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.devs == NULL) {
162ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Cannot initialize MLDEV library");
163ea80eafbSSrikanth Yalavarthi 		rte_errno = ENOMEM;
164ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
165ea80eafbSSrikanth Yalavarthi 	}
166ea80eafbSSrikanth Yalavarthi 
167ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.data = calloc(dev_max, sizeof(struct rte_ml_dev_data *));
168ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.data == NULL) {
169ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Cannot initialize MLDEV library");
170ea80eafbSSrikanth Yalavarthi 		rte_errno = ENOMEM;
171ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
172ea80eafbSSrikanth Yalavarthi 	}
173ea80eafbSSrikanth Yalavarthi 
174ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.max_devs = dev_max;
175ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.devs = ml_dev_globals.devs;
176ea80eafbSSrikanth Yalavarthi 
177ea80eafbSSrikanth Yalavarthi 	return 0;
178ea80eafbSSrikanth Yalavarthi }
179d82cac58SJerin Jacob 
180*36d0b09eSSrikanth Yalavarthi uint16_t
181*36d0b09eSSrikanth Yalavarthi rte_ml_dev_count(void)
182*36d0b09eSSrikanth Yalavarthi {
183*36d0b09eSSrikanth Yalavarthi 	return ml_dev_globals.nb_devs;
184*36d0b09eSSrikanth Yalavarthi }
185*36d0b09eSSrikanth Yalavarthi 
186*36d0b09eSSrikanth Yalavarthi int
187*36d0b09eSSrikanth Yalavarthi rte_ml_dev_is_valid_dev(int16_t dev_id)
188*36d0b09eSSrikanth Yalavarthi {
189*36d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev = NULL;
190*36d0b09eSSrikanth Yalavarthi 
191*36d0b09eSSrikanth Yalavarthi 	if (dev_id >= ml_dev_globals.max_devs || ml_dev_globals.devs[dev_id].data == NULL)
192*36d0b09eSSrikanth Yalavarthi 		return 0;
193*36d0b09eSSrikanth Yalavarthi 
194*36d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
195*36d0b09eSSrikanth Yalavarthi 	if (dev->attached != ML_DEV_ATTACHED)
196*36d0b09eSSrikanth Yalavarthi 		return 0;
197*36d0b09eSSrikanth Yalavarthi 	else
198*36d0b09eSSrikanth Yalavarthi 		return 1;
199*36d0b09eSSrikanth Yalavarthi }
200*36d0b09eSSrikanth Yalavarthi 
201*36d0b09eSSrikanth Yalavarthi int
202*36d0b09eSSrikanth Yalavarthi rte_ml_dev_socket_id(int16_t dev_id)
203*36d0b09eSSrikanth Yalavarthi {
204*36d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
205*36d0b09eSSrikanth Yalavarthi 
206*36d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
207*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
208*36d0b09eSSrikanth Yalavarthi 		return -EINVAL;
209*36d0b09eSSrikanth Yalavarthi 	}
210*36d0b09eSSrikanth Yalavarthi 
211*36d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
212*36d0b09eSSrikanth Yalavarthi 
213*36d0b09eSSrikanth Yalavarthi 	return dev->data->socket_id;
214*36d0b09eSSrikanth Yalavarthi }
215*36d0b09eSSrikanth Yalavarthi 
216*36d0b09eSSrikanth Yalavarthi int
217*36d0b09eSSrikanth Yalavarthi rte_ml_dev_info_get(int16_t dev_id, struct rte_ml_dev_info *dev_info)
218*36d0b09eSSrikanth Yalavarthi {
219*36d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
220*36d0b09eSSrikanth Yalavarthi 
221*36d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
222*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
223*36d0b09eSSrikanth Yalavarthi 		return -EINVAL;
224*36d0b09eSSrikanth Yalavarthi 	}
225*36d0b09eSSrikanth Yalavarthi 
226*36d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
227*36d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_info_get == NULL)
228*36d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
229*36d0b09eSSrikanth Yalavarthi 
230*36d0b09eSSrikanth Yalavarthi 	if (dev_info == NULL) {
231*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dev_info cannot be NULL\n", dev_id);
232*36d0b09eSSrikanth Yalavarthi 		return -EINVAL;
233*36d0b09eSSrikanth Yalavarthi 	}
234*36d0b09eSSrikanth Yalavarthi 	memset(dev_info, 0, sizeof(struct rte_ml_dev_info));
235*36d0b09eSSrikanth Yalavarthi 
236*36d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_info_get)(dev, dev_info);
237*36d0b09eSSrikanth Yalavarthi }
238*36d0b09eSSrikanth Yalavarthi 
239*36d0b09eSSrikanth Yalavarthi int
240*36d0b09eSSrikanth Yalavarthi rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *config)
241*36d0b09eSSrikanth Yalavarthi {
242*36d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev_info dev_info;
243*36d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
244*36d0b09eSSrikanth Yalavarthi 	int ret;
245*36d0b09eSSrikanth Yalavarthi 
246*36d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
247*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
248*36d0b09eSSrikanth Yalavarthi 		return -EINVAL;
249*36d0b09eSSrikanth Yalavarthi 	}
250*36d0b09eSSrikanth Yalavarthi 
251*36d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
252*36d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_configure == NULL)
253*36d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
254*36d0b09eSSrikanth Yalavarthi 
255*36d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started) {
256*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id);
257*36d0b09eSSrikanth Yalavarthi 		return -EBUSY;
258*36d0b09eSSrikanth Yalavarthi 	}
259*36d0b09eSSrikanth Yalavarthi 
260*36d0b09eSSrikanth Yalavarthi 	if (config == NULL) {
261*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, config cannot be NULL\n", dev_id);
262*36d0b09eSSrikanth Yalavarthi 		return -EINVAL;
263*36d0b09eSSrikanth Yalavarthi 	}
264*36d0b09eSSrikanth Yalavarthi 
265*36d0b09eSSrikanth Yalavarthi 	ret = rte_ml_dev_info_get(dev_id, &dev_info);
266*36d0b09eSSrikanth Yalavarthi 	if (ret < 0)
267*36d0b09eSSrikanth Yalavarthi 		return ret;
268*36d0b09eSSrikanth Yalavarthi 
269*36d0b09eSSrikanth Yalavarthi 	if (config->nb_queue_pairs > dev_info.max_queue_pairs) {
270*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d num of queues %u > %u\n", dev_id,
271*36d0b09eSSrikanth Yalavarthi 			      config->nb_queue_pairs, dev_info.max_queue_pairs);
272*36d0b09eSSrikanth Yalavarthi 		return -EINVAL;
273*36d0b09eSSrikanth Yalavarthi 	}
274*36d0b09eSSrikanth Yalavarthi 
275*36d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_configure)(dev, config);
276*36d0b09eSSrikanth Yalavarthi }
277*36d0b09eSSrikanth Yalavarthi 
278*36d0b09eSSrikanth Yalavarthi int
279*36d0b09eSSrikanth Yalavarthi rte_ml_dev_close(int16_t dev_id)
280*36d0b09eSSrikanth Yalavarthi {
281*36d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
282*36d0b09eSSrikanth Yalavarthi 
283*36d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
284*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
285*36d0b09eSSrikanth Yalavarthi 		return -EINVAL;
286*36d0b09eSSrikanth Yalavarthi 	}
287*36d0b09eSSrikanth Yalavarthi 
288*36d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
289*36d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_close == NULL)
290*36d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
291*36d0b09eSSrikanth Yalavarthi 
292*36d0b09eSSrikanth Yalavarthi 	/* Device must be stopped before it can be closed */
293*36d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 1) {
294*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped before closing", dev_id);
295*36d0b09eSSrikanth Yalavarthi 		return -EBUSY;
296*36d0b09eSSrikanth Yalavarthi 	}
297*36d0b09eSSrikanth Yalavarthi 
298*36d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_close)(dev);
299*36d0b09eSSrikanth Yalavarthi }
300*36d0b09eSSrikanth Yalavarthi 
301*36d0b09eSSrikanth Yalavarthi int
302*36d0b09eSSrikanth Yalavarthi rte_ml_dev_start(int16_t dev_id)
303*36d0b09eSSrikanth Yalavarthi {
304*36d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
305*36d0b09eSSrikanth Yalavarthi 	int ret;
306*36d0b09eSSrikanth Yalavarthi 
307*36d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
308*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
309*36d0b09eSSrikanth Yalavarthi 		return -EINVAL;
310*36d0b09eSSrikanth Yalavarthi 	}
311*36d0b09eSSrikanth Yalavarthi 
312*36d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
313*36d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_start == NULL)
314*36d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
315*36d0b09eSSrikanth Yalavarthi 
316*36d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started != 0) {
317*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is already started", dev_id);
318*36d0b09eSSrikanth Yalavarthi 		return -EBUSY;
319*36d0b09eSSrikanth Yalavarthi 	}
320*36d0b09eSSrikanth Yalavarthi 
321*36d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_start)(dev);
322*36d0b09eSSrikanth Yalavarthi 	if (ret == 0)
323*36d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 1;
324*36d0b09eSSrikanth Yalavarthi 
325*36d0b09eSSrikanth Yalavarthi 	return ret;
326*36d0b09eSSrikanth Yalavarthi }
327*36d0b09eSSrikanth Yalavarthi 
328*36d0b09eSSrikanth Yalavarthi int
329*36d0b09eSSrikanth Yalavarthi rte_ml_dev_stop(int16_t dev_id)
330*36d0b09eSSrikanth Yalavarthi {
331*36d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
332*36d0b09eSSrikanth Yalavarthi 	int ret;
333*36d0b09eSSrikanth Yalavarthi 
334*36d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
335*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
336*36d0b09eSSrikanth Yalavarthi 		return -EINVAL;
337*36d0b09eSSrikanth Yalavarthi 	}
338*36d0b09eSSrikanth Yalavarthi 
339*36d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
340*36d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stop == NULL)
341*36d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
342*36d0b09eSSrikanth Yalavarthi 
343*36d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 0) {
344*36d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is not started", dev_id);
345*36d0b09eSSrikanth Yalavarthi 		return -EBUSY;
346*36d0b09eSSrikanth Yalavarthi 	}
347*36d0b09eSSrikanth Yalavarthi 
348*36d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_stop)(dev);
349*36d0b09eSSrikanth Yalavarthi 	if (ret == 0)
350*36d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 0;
351*36d0b09eSSrikanth Yalavarthi 
352*36d0b09eSSrikanth Yalavarthi 	return ret;
353*36d0b09eSSrikanth Yalavarthi }
354*36d0b09eSSrikanth Yalavarthi 
355d82cac58SJerin Jacob RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO);
356