xref: /dpdk/lib/mldev/rte_mldev.c (revision b5f0df64c760ab3fb21788b505b302e898d46aa9)
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 
18036d0b09eSSrikanth Yalavarthi uint16_t
18136d0b09eSSrikanth Yalavarthi rte_ml_dev_count(void)
18236d0b09eSSrikanth Yalavarthi {
18336d0b09eSSrikanth Yalavarthi 	return ml_dev_globals.nb_devs;
18436d0b09eSSrikanth Yalavarthi }
18536d0b09eSSrikanth Yalavarthi 
18636d0b09eSSrikanth Yalavarthi int
18736d0b09eSSrikanth Yalavarthi rte_ml_dev_is_valid_dev(int16_t dev_id)
18836d0b09eSSrikanth Yalavarthi {
18936d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev = NULL;
19036d0b09eSSrikanth Yalavarthi 
19136d0b09eSSrikanth Yalavarthi 	if (dev_id >= ml_dev_globals.max_devs || ml_dev_globals.devs[dev_id].data == NULL)
19236d0b09eSSrikanth Yalavarthi 		return 0;
19336d0b09eSSrikanth Yalavarthi 
19436d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
19536d0b09eSSrikanth Yalavarthi 	if (dev->attached != ML_DEV_ATTACHED)
19636d0b09eSSrikanth Yalavarthi 		return 0;
19736d0b09eSSrikanth Yalavarthi 	else
19836d0b09eSSrikanth Yalavarthi 		return 1;
19936d0b09eSSrikanth Yalavarthi }
20036d0b09eSSrikanth Yalavarthi 
20136d0b09eSSrikanth Yalavarthi int
20236d0b09eSSrikanth Yalavarthi rte_ml_dev_socket_id(int16_t dev_id)
20336d0b09eSSrikanth Yalavarthi {
20436d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
20536d0b09eSSrikanth Yalavarthi 
20636d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
20736d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
20836d0b09eSSrikanth Yalavarthi 		return -EINVAL;
20936d0b09eSSrikanth Yalavarthi 	}
21036d0b09eSSrikanth Yalavarthi 
21136d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
21236d0b09eSSrikanth Yalavarthi 
21336d0b09eSSrikanth Yalavarthi 	return dev->data->socket_id;
21436d0b09eSSrikanth Yalavarthi }
21536d0b09eSSrikanth Yalavarthi 
21636d0b09eSSrikanth Yalavarthi int
21736d0b09eSSrikanth Yalavarthi rte_ml_dev_info_get(int16_t dev_id, struct rte_ml_dev_info *dev_info)
21836d0b09eSSrikanth Yalavarthi {
21936d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
22036d0b09eSSrikanth Yalavarthi 
22136d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
22236d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
22336d0b09eSSrikanth Yalavarthi 		return -EINVAL;
22436d0b09eSSrikanth Yalavarthi 	}
22536d0b09eSSrikanth Yalavarthi 
22636d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
22736d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_info_get == NULL)
22836d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
22936d0b09eSSrikanth Yalavarthi 
23036d0b09eSSrikanth Yalavarthi 	if (dev_info == NULL) {
23136d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dev_info cannot be NULL\n", dev_id);
23236d0b09eSSrikanth Yalavarthi 		return -EINVAL;
23336d0b09eSSrikanth Yalavarthi 	}
23436d0b09eSSrikanth Yalavarthi 	memset(dev_info, 0, sizeof(struct rte_ml_dev_info));
23536d0b09eSSrikanth Yalavarthi 
23636d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_info_get)(dev, dev_info);
23736d0b09eSSrikanth Yalavarthi }
23836d0b09eSSrikanth Yalavarthi 
23936d0b09eSSrikanth Yalavarthi int
24036d0b09eSSrikanth Yalavarthi rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *config)
24136d0b09eSSrikanth Yalavarthi {
24236d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev_info dev_info;
24336d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
24436d0b09eSSrikanth Yalavarthi 	int ret;
24536d0b09eSSrikanth Yalavarthi 
24636d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
24736d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
24836d0b09eSSrikanth Yalavarthi 		return -EINVAL;
24936d0b09eSSrikanth Yalavarthi 	}
25036d0b09eSSrikanth Yalavarthi 
25136d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
25236d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_configure == NULL)
25336d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
25436d0b09eSSrikanth Yalavarthi 
25536d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started) {
25636d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id);
25736d0b09eSSrikanth Yalavarthi 		return -EBUSY;
25836d0b09eSSrikanth Yalavarthi 	}
25936d0b09eSSrikanth Yalavarthi 
26036d0b09eSSrikanth Yalavarthi 	if (config == NULL) {
26136d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, config cannot be NULL\n", dev_id);
26236d0b09eSSrikanth Yalavarthi 		return -EINVAL;
26336d0b09eSSrikanth Yalavarthi 	}
26436d0b09eSSrikanth Yalavarthi 
26536d0b09eSSrikanth Yalavarthi 	ret = rte_ml_dev_info_get(dev_id, &dev_info);
26636d0b09eSSrikanth Yalavarthi 	if (ret < 0)
26736d0b09eSSrikanth Yalavarthi 		return ret;
26836d0b09eSSrikanth Yalavarthi 
26936d0b09eSSrikanth Yalavarthi 	if (config->nb_queue_pairs > dev_info.max_queue_pairs) {
27036d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d num of queues %u > %u\n", dev_id,
27136d0b09eSSrikanth Yalavarthi 			      config->nb_queue_pairs, dev_info.max_queue_pairs);
27236d0b09eSSrikanth Yalavarthi 		return -EINVAL;
27336d0b09eSSrikanth Yalavarthi 	}
27436d0b09eSSrikanth Yalavarthi 
27536d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_configure)(dev, config);
27636d0b09eSSrikanth Yalavarthi }
27736d0b09eSSrikanth Yalavarthi 
27836d0b09eSSrikanth Yalavarthi int
27936d0b09eSSrikanth Yalavarthi rte_ml_dev_close(int16_t dev_id)
28036d0b09eSSrikanth Yalavarthi {
28136d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
28236d0b09eSSrikanth Yalavarthi 
28336d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
28436d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
28536d0b09eSSrikanth Yalavarthi 		return -EINVAL;
28636d0b09eSSrikanth Yalavarthi 	}
28736d0b09eSSrikanth Yalavarthi 
28836d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
28936d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_close == NULL)
29036d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
29136d0b09eSSrikanth Yalavarthi 
29236d0b09eSSrikanth Yalavarthi 	/* Device must be stopped before it can be closed */
29336d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 1) {
29436d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped before closing", dev_id);
29536d0b09eSSrikanth Yalavarthi 		return -EBUSY;
29636d0b09eSSrikanth Yalavarthi 	}
29736d0b09eSSrikanth Yalavarthi 
29836d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_close)(dev);
29936d0b09eSSrikanth Yalavarthi }
30036d0b09eSSrikanth Yalavarthi 
30136d0b09eSSrikanth Yalavarthi int
30236d0b09eSSrikanth Yalavarthi rte_ml_dev_start(int16_t dev_id)
30336d0b09eSSrikanth Yalavarthi {
30436d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
30536d0b09eSSrikanth Yalavarthi 	int ret;
30636d0b09eSSrikanth Yalavarthi 
30736d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
30836d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
30936d0b09eSSrikanth Yalavarthi 		return -EINVAL;
31036d0b09eSSrikanth Yalavarthi 	}
31136d0b09eSSrikanth Yalavarthi 
31236d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
31336d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_start == NULL)
31436d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
31536d0b09eSSrikanth Yalavarthi 
31636d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started != 0) {
31736d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is already started", dev_id);
31836d0b09eSSrikanth Yalavarthi 		return -EBUSY;
31936d0b09eSSrikanth Yalavarthi 	}
32036d0b09eSSrikanth Yalavarthi 
32136d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_start)(dev);
32236d0b09eSSrikanth Yalavarthi 	if (ret == 0)
32336d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 1;
32436d0b09eSSrikanth Yalavarthi 
32536d0b09eSSrikanth Yalavarthi 	return ret;
32636d0b09eSSrikanth Yalavarthi }
32736d0b09eSSrikanth Yalavarthi 
32836d0b09eSSrikanth Yalavarthi int
32936d0b09eSSrikanth Yalavarthi rte_ml_dev_stop(int16_t dev_id)
33036d0b09eSSrikanth Yalavarthi {
33136d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
33236d0b09eSSrikanth Yalavarthi 	int ret;
33336d0b09eSSrikanth Yalavarthi 
33436d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
33536d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
33636d0b09eSSrikanth Yalavarthi 		return -EINVAL;
33736d0b09eSSrikanth Yalavarthi 	}
33836d0b09eSSrikanth Yalavarthi 
33936d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
34036d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stop == NULL)
34136d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
34236d0b09eSSrikanth Yalavarthi 
34336d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 0) {
34436d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is not started", dev_id);
34536d0b09eSSrikanth Yalavarthi 		return -EBUSY;
34636d0b09eSSrikanth Yalavarthi 	}
34736d0b09eSSrikanth Yalavarthi 
34836d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_stop)(dev);
34936d0b09eSSrikanth Yalavarthi 	if (ret == 0)
35036d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 0;
35136d0b09eSSrikanth Yalavarthi 
35236d0b09eSSrikanth Yalavarthi 	return ret;
35336d0b09eSSrikanth Yalavarthi }
35436d0b09eSSrikanth Yalavarthi 
355*b5f0df64SSrikanth Yalavarthi int
356*b5f0df64SSrikanth Yalavarthi rte_ml_dev_queue_pair_setup(int16_t dev_id, uint16_t queue_pair_id,
357*b5f0df64SSrikanth Yalavarthi 			    const struct rte_ml_dev_qp_conf *qp_conf, int socket_id)
358*b5f0df64SSrikanth Yalavarthi {
359*b5f0df64SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
360*b5f0df64SSrikanth Yalavarthi 
361*b5f0df64SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
362*b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
363*b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
364*b5f0df64SSrikanth Yalavarthi 	}
365*b5f0df64SSrikanth Yalavarthi 
366*b5f0df64SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
367*b5f0df64SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_queue_pair_setup == NULL)
368*b5f0df64SSrikanth Yalavarthi 		return -ENOTSUP;
369*b5f0df64SSrikanth Yalavarthi 
370*b5f0df64SSrikanth Yalavarthi 	if (queue_pair_id >= dev->data->nb_queue_pairs) {
371*b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid queue_pair_id = %d", queue_pair_id);
372*b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
373*b5f0df64SSrikanth Yalavarthi 	}
374*b5f0df64SSrikanth Yalavarthi 
375*b5f0df64SSrikanth Yalavarthi 	if (qp_conf == NULL) {
376*b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qp_conf cannot be NULL\n", dev_id);
377*b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
378*b5f0df64SSrikanth Yalavarthi 	}
379*b5f0df64SSrikanth Yalavarthi 
380*b5f0df64SSrikanth Yalavarthi 	if (dev->data->dev_started) {
381*b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id);
382*b5f0df64SSrikanth Yalavarthi 		return -EBUSY;
383*b5f0df64SSrikanth Yalavarthi 	}
384*b5f0df64SSrikanth Yalavarthi 
385*b5f0df64SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_queue_pair_setup)(dev, queue_pair_id, qp_conf, socket_id);
386*b5f0df64SSrikanth Yalavarthi }
387*b5f0df64SSrikanth Yalavarthi 
388d82cac58SJerin Jacob RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO);
389