xref: /dpdk/lib/mldev/rte_mldev.c (revision 24364292061f197a9f608b1020b6886ec7b1216d)
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 
151b365349SSrikanth Yalavarthi /*
161b365349SSrikanth Yalavarthi  * Private data structure of an operation pool.
171b365349SSrikanth Yalavarthi  *
181b365349SSrikanth Yalavarthi  * A structure that contains ml op_pool specific data that is
191b365349SSrikanth Yalavarthi  * appended after the mempool structure (in private data).
201b365349SSrikanth Yalavarthi  */
211b365349SSrikanth Yalavarthi struct rte_ml_op_pool_private {
221b365349SSrikanth Yalavarthi 	uint16_t user_size;
231b365349SSrikanth Yalavarthi 	/*< Size of private user data with each operation. */
241b365349SSrikanth Yalavarthi };
251b365349SSrikanth Yalavarthi 
26ea80eafbSSrikanth Yalavarthi struct rte_ml_dev *
27ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_get_dev(int16_t dev_id)
28ea80eafbSSrikanth Yalavarthi {
29ea80eafbSSrikanth Yalavarthi 	return &ml_dev_globals.devs[dev_id];
30ea80eafbSSrikanth Yalavarthi }
31ea80eafbSSrikanth Yalavarthi 
32ea80eafbSSrikanth Yalavarthi struct rte_ml_dev *
33ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_get_named_dev(const char *name)
34ea80eafbSSrikanth Yalavarthi {
35ea80eafbSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
36ea80eafbSSrikanth Yalavarthi 	int16_t dev_id;
37ea80eafbSSrikanth Yalavarthi 
38ea80eafbSSrikanth Yalavarthi 	if (name == NULL)
39ea80eafbSSrikanth Yalavarthi 		return NULL;
40ea80eafbSSrikanth Yalavarthi 
41ea80eafbSSrikanth Yalavarthi 	for (dev_id = 0; dev_id < ml_dev_globals.max_devs; dev_id++) {
42ea80eafbSSrikanth Yalavarthi 		dev = rte_ml_dev_pmd_get_dev(dev_id);
43ea80eafbSSrikanth Yalavarthi 		if ((dev->attached == ML_DEV_ATTACHED) && (strcmp(dev->data->name, name) == 0))
44ea80eafbSSrikanth Yalavarthi 			return dev;
45ea80eafbSSrikanth Yalavarthi 	}
46ea80eafbSSrikanth Yalavarthi 
47ea80eafbSSrikanth Yalavarthi 	return NULL;
48ea80eafbSSrikanth Yalavarthi }
49ea80eafbSSrikanth Yalavarthi 
50ea80eafbSSrikanth Yalavarthi struct rte_ml_dev *
51ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_allocate(const char *name, uint8_t socket_id)
52ea80eafbSSrikanth Yalavarthi {
53ea80eafbSSrikanth Yalavarthi 	char mz_name[RTE_MEMZONE_NAMESIZE];
54ea80eafbSSrikanth Yalavarthi 	const struct rte_memzone *mz;
55ea80eafbSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
56ea80eafbSSrikanth Yalavarthi 	int16_t dev_id;
57ea80eafbSSrikanth Yalavarthi 
58ea80eafbSSrikanth Yalavarthi 	/* implicit initialization of library before adding first device */
59ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.devs == NULL) {
60ea80eafbSSrikanth Yalavarthi 		if (rte_ml_dev_init(RTE_MLDEV_DEFAULT_MAX) != 0)
61ea80eafbSSrikanth Yalavarthi 			return NULL;
62ea80eafbSSrikanth Yalavarthi 	}
63ea80eafbSSrikanth Yalavarthi 
64ea80eafbSSrikanth Yalavarthi 	if (rte_ml_dev_pmd_get_named_dev(name) != NULL) {
65ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "ML device with name %s already allocated!", name);
66ea80eafbSSrikanth Yalavarthi 		return NULL;
67ea80eafbSSrikanth Yalavarthi 	}
68ea80eafbSSrikanth Yalavarthi 
69ea80eafbSSrikanth Yalavarthi 	/* Get a free device ID */
70ea80eafbSSrikanth Yalavarthi 	for (dev_id = 0; dev_id < ml_dev_globals.max_devs; dev_id++) {
71ea80eafbSSrikanth Yalavarthi 		dev = rte_ml_dev_pmd_get_dev(dev_id);
72ea80eafbSSrikanth Yalavarthi 		if (dev->attached == ML_DEV_DETACHED)
73ea80eafbSSrikanth Yalavarthi 			break;
74ea80eafbSSrikanth Yalavarthi 	}
75ea80eafbSSrikanth Yalavarthi 
76ea80eafbSSrikanth Yalavarthi 	if (dev_id == ml_dev_globals.max_devs) {
77ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Reached maximum number of ML devices");
78ea80eafbSSrikanth Yalavarthi 		return NULL;
79ea80eafbSSrikanth Yalavarthi 	}
80ea80eafbSSrikanth Yalavarthi 
81ea80eafbSSrikanth Yalavarthi 	if (dev->data == NULL) {
82ea80eafbSSrikanth Yalavarthi 		/* Reserve memzone name */
83ea80eafbSSrikanth Yalavarthi 		sprintf(mz_name, "rte_ml_dev_data_%d", dev_id);
84ea80eafbSSrikanth Yalavarthi 		if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
85ea80eafbSSrikanth Yalavarthi 			mz = rte_memzone_reserve(mz_name, sizeof(struct rte_ml_dev_data), socket_id,
86ea80eafbSSrikanth Yalavarthi 						 0);
87ea80eafbSSrikanth Yalavarthi 			RTE_MLDEV_LOG(DEBUG, "PRIMARY: reserved memzone for %s (%p)", mz_name, mz);
88ea80eafbSSrikanth Yalavarthi 		} else {
89ea80eafbSSrikanth Yalavarthi 			mz = rte_memzone_lookup(mz_name);
90ea80eafbSSrikanth Yalavarthi 			RTE_MLDEV_LOG(DEBUG, "SECONDARY: looked up memzone for %s (%p)", mz_name,
91ea80eafbSSrikanth Yalavarthi 				      mz);
92ea80eafbSSrikanth Yalavarthi 		}
93ea80eafbSSrikanth Yalavarthi 
94ea80eafbSSrikanth Yalavarthi 		if (mz == NULL)
95ea80eafbSSrikanth Yalavarthi 			return NULL;
96ea80eafbSSrikanth Yalavarthi 
97ea80eafbSSrikanth Yalavarthi 		ml_dev_globals.data[dev_id] = mz->addr;
98ea80eafbSSrikanth Yalavarthi 		if (rte_eal_process_type() == RTE_PROC_PRIMARY)
99ea80eafbSSrikanth Yalavarthi 			memset(ml_dev_globals.data[dev_id], 0, sizeof(struct rte_ml_dev_data));
100ea80eafbSSrikanth Yalavarthi 
101ea80eafbSSrikanth Yalavarthi 		dev->data = ml_dev_globals.data[dev_id];
102ea80eafbSSrikanth Yalavarthi 		if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
103ea80eafbSSrikanth Yalavarthi 			strlcpy(dev->data->name, name, RTE_ML_STR_MAX);
104ea80eafbSSrikanth Yalavarthi 			dev->data->dev_id = dev_id;
105ea80eafbSSrikanth Yalavarthi 			dev->data->socket_id = socket_id;
106ea80eafbSSrikanth Yalavarthi 			dev->data->dev_started = 0;
107ea80eafbSSrikanth Yalavarthi 			RTE_MLDEV_LOG(DEBUG, "PRIMARY: init mldev data");
108ea80eafbSSrikanth Yalavarthi 		}
109ea80eafbSSrikanth Yalavarthi 
110ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(DEBUG, "Data for %s: dev_id %d, socket %u", dev->data->name,
111ea80eafbSSrikanth Yalavarthi 			      dev->data->dev_id, dev->data->socket_id);
112ea80eafbSSrikanth Yalavarthi 
113ea80eafbSSrikanth Yalavarthi 		dev->attached = ML_DEV_ATTACHED;
114ea80eafbSSrikanth Yalavarthi 		ml_dev_globals.nb_devs++;
115ea80eafbSSrikanth Yalavarthi 	}
116ea80eafbSSrikanth Yalavarthi 
117c775df1cSSrikanth Yalavarthi 	dev->enqueue_burst = NULL;
118c775df1cSSrikanth Yalavarthi 	dev->dequeue_burst = NULL;
119c775df1cSSrikanth Yalavarthi 
120ea80eafbSSrikanth Yalavarthi 	return dev;
121ea80eafbSSrikanth Yalavarthi }
122ea80eafbSSrikanth Yalavarthi 
123ea80eafbSSrikanth Yalavarthi int
124ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_release(struct rte_ml_dev *dev)
125ea80eafbSSrikanth Yalavarthi {
126ea80eafbSSrikanth Yalavarthi 	char mz_name[RTE_MEMZONE_NAMESIZE];
127ea80eafbSSrikanth Yalavarthi 	const struct rte_memzone *mz;
128ea80eafbSSrikanth Yalavarthi 	int16_t dev_id;
129ea80eafbSSrikanth Yalavarthi 	int ret = 0;
130ea80eafbSSrikanth Yalavarthi 
131ea80eafbSSrikanth Yalavarthi 	if (dev == NULL)
132ea80eafbSSrikanth Yalavarthi 		return -EINVAL;
133ea80eafbSSrikanth Yalavarthi 
134ea80eafbSSrikanth Yalavarthi 	dev_id = dev->data->dev_id;
135ea80eafbSSrikanth Yalavarthi 
136ea80eafbSSrikanth Yalavarthi 	/* Memzone lookup */
137ea80eafbSSrikanth Yalavarthi 	sprintf(mz_name, "rte_ml_dev_data_%d", dev_id);
138ea80eafbSSrikanth Yalavarthi 	mz = rte_memzone_lookup(mz_name);
139ea80eafbSSrikanth Yalavarthi 	if (mz == NULL)
140ea80eafbSSrikanth Yalavarthi 		return -ENOMEM;
141ea80eafbSSrikanth Yalavarthi 
142ea80eafbSSrikanth Yalavarthi 	RTE_ASSERT(ml_dev_globals.data[dev_id] == mz->addr);
143ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.data[dev_id] = NULL;
144ea80eafbSSrikanth Yalavarthi 
145ea80eafbSSrikanth Yalavarthi 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
146ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(DEBUG, "PRIMARY: free memzone of %s (%p)", mz_name, mz);
147ea80eafbSSrikanth Yalavarthi 		ret = rte_memzone_free(mz);
148ea80eafbSSrikanth Yalavarthi 	} else {
149ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(DEBUG, "SECONDARY: don't free memzone of %s (%p)", mz_name, mz);
150ea80eafbSSrikanth Yalavarthi 	}
151ea80eafbSSrikanth Yalavarthi 
152ea80eafbSSrikanth Yalavarthi 	dev->attached = ML_DEV_DETACHED;
153ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.nb_devs--;
154ea80eafbSSrikanth Yalavarthi 
155ea80eafbSSrikanth Yalavarthi 	return ret;
156ea80eafbSSrikanth Yalavarthi }
157ea80eafbSSrikanth Yalavarthi 
158ea80eafbSSrikanth Yalavarthi int
159ea80eafbSSrikanth Yalavarthi rte_ml_dev_init(size_t dev_max)
160ea80eafbSSrikanth Yalavarthi {
161ea80eafbSSrikanth Yalavarthi 	if (dev_max == 0 || dev_max > INT16_MAX) {
162ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_max = %zu (> %d)\n", dev_max, INT16_MAX);
163ea80eafbSSrikanth Yalavarthi 		rte_errno = EINVAL;
164ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
165ea80eafbSSrikanth Yalavarthi 	}
166ea80eafbSSrikanth Yalavarthi 
167ea80eafbSSrikanth Yalavarthi 	/* No lock, it must be called before or during first probing. */
168ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.devs != NULL) {
169ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device array already initialized");
170ea80eafbSSrikanth Yalavarthi 		rte_errno = EBUSY;
171ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
172ea80eafbSSrikanth Yalavarthi 	}
173ea80eafbSSrikanth Yalavarthi 
174ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.devs = calloc(dev_max, sizeof(struct rte_ml_dev));
175ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.devs == NULL) {
176ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Cannot initialize MLDEV library");
177ea80eafbSSrikanth Yalavarthi 		rte_errno = ENOMEM;
178ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
179ea80eafbSSrikanth Yalavarthi 	}
180ea80eafbSSrikanth Yalavarthi 
181ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.data = calloc(dev_max, sizeof(struct rte_ml_dev_data *));
182ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.data == NULL) {
183ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Cannot initialize MLDEV library");
184ea80eafbSSrikanth Yalavarthi 		rte_errno = ENOMEM;
185ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
186ea80eafbSSrikanth Yalavarthi 	}
187ea80eafbSSrikanth Yalavarthi 
188ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.max_devs = dev_max;
189ea80eafbSSrikanth Yalavarthi 
190ea80eafbSSrikanth Yalavarthi 	return 0;
191ea80eafbSSrikanth Yalavarthi }
192d82cac58SJerin Jacob 
19336d0b09eSSrikanth Yalavarthi uint16_t
19436d0b09eSSrikanth Yalavarthi rte_ml_dev_count(void)
19536d0b09eSSrikanth Yalavarthi {
19636d0b09eSSrikanth Yalavarthi 	return ml_dev_globals.nb_devs;
19736d0b09eSSrikanth Yalavarthi }
19836d0b09eSSrikanth Yalavarthi 
19936d0b09eSSrikanth Yalavarthi int
20036d0b09eSSrikanth Yalavarthi rte_ml_dev_is_valid_dev(int16_t dev_id)
20136d0b09eSSrikanth Yalavarthi {
20236d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev = NULL;
20336d0b09eSSrikanth Yalavarthi 
20436d0b09eSSrikanth Yalavarthi 	if (dev_id >= ml_dev_globals.max_devs || ml_dev_globals.devs[dev_id].data == NULL)
20536d0b09eSSrikanth Yalavarthi 		return 0;
20636d0b09eSSrikanth Yalavarthi 
20736d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
20836d0b09eSSrikanth Yalavarthi 	if (dev->attached != ML_DEV_ATTACHED)
20936d0b09eSSrikanth Yalavarthi 		return 0;
21036d0b09eSSrikanth Yalavarthi 	else
21136d0b09eSSrikanth Yalavarthi 		return 1;
21236d0b09eSSrikanth Yalavarthi }
21336d0b09eSSrikanth Yalavarthi 
21436d0b09eSSrikanth Yalavarthi int
21536d0b09eSSrikanth Yalavarthi rte_ml_dev_socket_id(int16_t dev_id)
21636d0b09eSSrikanth Yalavarthi {
21736d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
21836d0b09eSSrikanth Yalavarthi 
21936d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
22036d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
22136d0b09eSSrikanth Yalavarthi 		return -EINVAL;
22236d0b09eSSrikanth Yalavarthi 	}
22336d0b09eSSrikanth Yalavarthi 
22436d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
22536d0b09eSSrikanth Yalavarthi 
22636d0b09eSSrikanth Yalavarthi 	return dev->data->socket_id;
22736d0b09eSSrikanth Yalavarthi }
22836d0b09eSSrikanth Yalavarthi 
22936d0b09eSSrikanth Yalavarthi int
23036d0b09eSSrikanth Yalavarthi rte_ml_dev_info_get(int16_t dev_id, struct rte_ml_dev_info *dev_info)
23136d0b09eSSrikanth Yalavarthi {
23236d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
23336d0b09eSSrikanth Yalavarthi 
23436d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
23536d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
23636d0b09eSSrikanth Yalavarthi 		return -EINVAL;
23736d0b09eSSrikanth Yalavarthi 	}
23836d0b09eSSrikanth Yalavarthi 
23936d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
24036d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_info_get == NULL)
24136d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
24236d0b09eSSrikanth Yalavarthi 
24336d0b09eSSrikanth Yalavarthi 	if (dev_info == NULL) {
24436d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dev_info cannot be NULL\n", dev_id);
24536d0b09eSSrikanth Yalavarthi 		return -EINVAL;
24636d0b09eSSrikanth Yalavarthi 	}
24736d0b09eSSrikanth Yalavarthi 	memset(dev_info, 0, sizeof(struct rte_ml_dev_info));
24836d0b09eSSrikanth Yalavarthi 
24936d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_info_get)(dev, dev_info);
25036d0b09eSSrikanth Yalavarthi }
25136d0b09eSSrikanth Yalavarthi 
25236d0b09eSSrikanth Yalavarthi int
25336d0b09eSSrikanth Yalavarthi rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *config)
25436d0b09eSSrikanth Yalavarthi {
25536d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev_info dev_info;
25636d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
25736d0b09eSSrikanth Yalavarthi 	int ret;
25836d0b09eSSrikanth Yalavarthi 
25936d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
26036d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
26136d0b09eSSrikanth Yalavarthi 		return -EINVAL;
26236d0b09eSSrikanth Yalavarthi 	}
26336d0b09eSSrikanth Yalavarthi 
26436d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
26536d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_configure == NULL)
26636d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
26736d0b09eSSrikanth Yalavarthi 
26836d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started) {
26936d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id);
27036d0b09eSSrikanth Yalavarthi 		return -EBUSY;
27136d0b09eSSrikanth Yalavarthi 	}
27236d0b09eSSrikanth Yalavarthi 
27336d0b09eSSrikanth Yalavarthi 	if (config == NULL) {
27436d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, config cannot be NULL\n", dev_id);
27536d0b09eSSrikanth Yalavarthi 		return -EINVAL;
27636d0b09eSSrikanth Yalavarthi 	}
27736d0b09eSSrikanth Yalavarthi 
27836d0b09eSSrikanth Yalavarthi 	ret = rte_ml_dev_info_get(dev_id, &dev_info);
27936d0b09eSSrikanth Yalavarthi 	if (ret < 0)
28036d0b09eSSrikanth Yalavarthi 		return ret;
28136d0b09eSSrikanth Yalavarthi 
28236d0b09eSSrikanth Yalavarthi 	if (config->nb_queue_pairs > dev_info.max_queue_pairs) {
28336d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d num of queues %u > %u\n", dev_id,
28436d0b09eSSrikanth Yalavarthi 			      config->nb_queue_pairs, dev_info.max_queue_pairs);
28536d0b09eSSrikanth Yalavarthi 		return -EINVAL;
28636d0b09eSSrikanth Yalavarthi 	}
28736d0b09eSSrikanth Yalavarthi 
28836d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_configure)(dev, config);
28936d0b09eSSrikanth Yalavarthi }
29036d0b09eSSrikanth Yalavarthi 
29136d0b09eSSrikanth Yalavarthi int
29236d0b09eSSrikanth Yalavarthi rte_ml_dev_close(int16_t dev_id)
29336d0b09eSSrikanth Yalavarthi {
29436d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
29536d0b09eSSrikanth Yalavarthi 
29636d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
29736d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
29836d0b09eSSrikanth Yalavarthi 		return -EINVAL;
29936d0b09eSSrikanth Yalavarthi 	}
30036d0b09eSSrikanth Yalavarthi 
30136d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
30236d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_close == NULL)
30336d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
30436d0b09eSSrikanth Yalavarthi 
30536d0b09eSSrikanth Yalavarthi 	/* Device must be stopped before it can be closed */
30636d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 1) {
30736d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped before closing", dev_id);
30836d0b09eSSrikanth Yalavarthi 		return -EBUSY;
30936d0b09eSSrikanth Yalavarthi 	}
31036d0b09eSSrikanth Yalavarthi 
31136d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_close)(dev);
31236d0b09eSSrikanth Yalavarthi }
31336d0b09eSSrikanth Yalavarthi 
31436d0b09eSSrikanth Yalavarthi int
31536d0b09eSSrikanth Yalavarthi rte_ml_dev_start(int16_t dev_id)
31636d0b09eSSrikanth Yalavarthi {
31736d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
31836d0b09eSSrikanth Yalavarthi 	int ret;
31936d0b09eSSrikanth Yalavarthi 
32036d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
32136d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
32236d0b09eSSrikanth Yalavarthi 		return -EINVAL;
32336d0b09eSSrikanth Yalavarthi 	}
32436d0b09eSSrikanth Yalavarthi 
32536d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
32636d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_start == NULL)
32736d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
32836d0b09eSSrikanth Yalavarthi 
32936d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started != 0) {
33036d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is already started", dev_id);
33136d0b09eSSrikanth Yalavarthi 		return -EBUSY;
33236d0b09eSSrikanth Yalavarthi 	}
33336d0b09eSSrikanth Yalavarthi 
33436d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_start)(dev);
33536d0b09eSSrikanth Yalavarthi 	if (ret == 0)
33636d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 1;
33736d0b09eSSrikanth Yalavarthi 
33836d0b09eSSrikanth Yalavarthi 	return ret;
33936d0b09eSSrikanth Yalavarthi }
34036d0b09eSSrikanth Yalavarthi 
34136d0b09eSSrikanth Yalavarthi int
34236d0b09eSSrikanth Yalavarthi rte_ml_dev_stop(int16_t dev_id)
34336d0b09eSSrikanth Yalavarthi {
34436d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
34536d0b09eSSrikanth Yalavarthi 	int ret;
34636d0b09eSSrikanth Yalavarthi 
34736d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
34836d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
34936d0b09eSSrikanth Yalavarthi 		return -EINVAL;
35036d0b09eSSrikanth Yalavarthi 	}
35136d0b09eSSrikanth Yalavarthi 
35236d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
35336d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stop == NULL)
35436d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
35536d0b09eSSrikanth Yalavarthi 
35636d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 0) {
35736d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is not started", dev_id);
35836d0b09eSSrikanth Yalavarthi 		return -EBUSY;
35936d0b09eSSrikanth Yalavarthi 	}
36036d0b09eSSrikanth Yalavarthi 
36136d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_stop)(dev);
36236d0b09eSSrikanth Yalavarthi 	if (ret == 0)
36336d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 0;
36436d0b09eSSrikanth Yalavarthi 
36536d0b09eSSrikanth Yalavarthi 	return ret;
36636d0b09eSSrikanth Yalavarthi }
36736d0b09eSSrikanth Yalavarthi 
368b5f0df64SSrikanth Yalavarthi int
369b5f0df64SSrikanth Yalavarthi rte_ml_dev_queue_pair_setup(int16_t dev_id, uint16_t queue_pair_id,
370b5f0df64SSrikanth Yalavarthi 			    const struct rte_ml_dev_qp_conf *qp_conf, int socket_id)
371b5f0df64SSrikanth Yalavarthi {
372b5f0df64SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
373b5f0df64SSrikanth Yalavarthi 
374b5f0df64SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
375b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
376b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
377b5f0df64SSrikanth Yalavarthi 	}
378b5f0df64SSrikanth Yalavarthi 
379b5f0df64SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
380b5f0df64SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_queue_pair_setup == NULL)
381b5f0df64SSrikanth Yalavarthi 		return -ENOTSUP;
382b5f0df64SSrikanth Yalavarthi 
383b5f0df64SSrikanth Yalavarthi 	if (queue_pair_id >= dev->data->nb_queue_pairs) {
384b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid queue_pair_id = %d", queue_pair_id);
385b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
386b5f0df64SSrikanth Yalavarthi 	}
387b5f0df64SSrikanth Yalavarthi 
388b5f0df64SSrikanth Yalavarthi 	if (qp_conf == NULL) {
389b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qp_conf cannot be NULL\n", dev_id);
390b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
391b5f0df64SSrikanth Yalavarthi 	}
392b5f0df64SSrikanth Yalavarthi 
393b5f0df64SSrikanth Yalavarthi 	if (dev->data->dev_started) {
394b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id);
395b5f0df64SSrikanth Yalavarthi 		return -EBUSY;
396b5f0df64SSrikanth Yalavarthi 	}
397b5f0df64SSrikanth Yalavarthi 
398b5f0df64SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_queue_pair_setup)(dev, queue_pair_id, qp_conf, socket_id);
399b5f0df64SSrikanth Yalavarthi }
400b5f0df64SSrikanth Yalavarthi 
4014a662f54SSrikanth Yalavarthi int
402b3caa0f8SSrikanth Yalavarthi rte_ml_dev_stats_get(int16_t dev_id, struct rte_ml_dev_stats *stats)
403b3caa0f8SSrikanth Yalavarthi {
404b3caa0f8SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
405b3caa0f8SSrikanth Yalavarthi 
406b3caa0f8SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
407b3caa0f8SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
408b3caa0f8SSrikanth Yalavarthi 		return -EINVAL;
409b3caa0f8SSrikanth Yalavarthi 	}
410b3caa0f8SSrikanth Yalavarthi 
411b3caa0f8SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
412b3caa0f8SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stats_get == NULL)
413b3caa0f8SSrikanth Yalavarthi 		return -ENOTSUP;
414b3caa0f8SSrikanth Yalavarthi 
415b3caa0f8SSrikanth Yalavarthi 	if (stats == NULL) {
416b3caa0f8SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, stats cannot be NULL\n", dev_id);
417b3caa0f8SSrikanth Yalavarthi 		return -EINVAL;
418b3caa0f8SSrikanth Yalavarthi 	}
419b3caa0f8SSrikanth Yalavarthi 	memset(stats, 0, sizeof(struct rte_ml_dev_stats));
420b3caa0f8SSrikanth Yalavarthi 
421b3caa0f8SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_stats_get)(dev, stats);
422b3caa0f8SSrikanth Yalavarthi }
423b3caa0f8SSrikanth Yalavarthi 
424b3caa0f8SSrikanth Yalavarthi void
425b3caa0f8SSrikanth Yalavarthi rte_ml_dev_stats_reset(int16_t dev_id)
426b3caa0f8SSrikanth Yalavarthi {
427b3caa0f8SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
428b3caa0f8SSrikanth Yalavarthi 
429b3caa0f8SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
430b3caa0f8SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
431b3caa0f8SSrikanth Yalavarthi 		return;
432b3caa0f8SSrikanth Yalavarthi 	}
433b3caa0f8SSrikanth Yalavarthi 
434b3caa0f8SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
435b3caa0f8SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stats_reset == NULL)
436b3caa0f8SSrikanth Yalavarthi 		return;
437b3caa0f8SSrikanth Yalavarthi 
438b3caa0f8SSrikanth Yalavarthi 	(*dev->dev_ops->dev_stats_reset)(dev);
439b3caa0f8SSrikanth Yalavarthi }
440b3caa0f8SSrikanth Yalavarthi 
441b3caa0f8SSrikanth Yalavarthi int
442f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_names_get(int16_t dev_id, enum rte_ml_dev_xstats_mode mode, int32_t model_id,
443f06968e9SSrikanth Yalavarthi 			    struct rte_ml_dev_xstats_map *xstats_map, uint32_t size)
444f06968e9SSrikanth Yalavarthi {
445f06968e9SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
446f06968e9SSrikanth Yalavarthi 
447f06968e9SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
448f06968e9SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
449f06968e9SSrikanth Yalavarthi 		return -EINVAL;
450f06968e9SSrikanth Yalavarthi 	}
451f06968e9SSrikanth Yalavarthi 
452f06968e9SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
453f06968e9SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_names_get == NULL)
454f06968e9SSrikanth Yalavarthi 		return -ENOTSUP;
455f06968e9SSrikanth Yalavarthi 
456f06968e9SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_names_get)(dev, mode, model_id, xstats_map, size);
457f06968e9SSrikanth Yalavarthi }
458f06968e9SSrikanth Yalavarthi 
459f06968e9SSrikanth Yalavarthi int
460f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_by_name_get(int16_t dev_id, const char *name, uint16_t *stat_id, uint64_t *value)
461f06968e9SSrikanth Yalavarthi {
462f06968e9SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
463f06968e9SSrikanth Yalavarthi 
464f06968e9SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
465f06968e9SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
466f06968e9SSrikanth Yalavarthi 		return -EINVAL;
467f06968e9SSrikanth Yalavarthi 	}
468f06968e9SSrikanth Yalavarthi 
469f06968e9SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
470f06968e9SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_by_name_get == NULL)
471f06968e9SSrikanth Yalavarthi 		return -ENOTSUP;
472f06968e9SSrikanth Yalavarthi 
473f06968e9SSrikanth Yalavarthi 	if (name == NULL) {
474f06968e9SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, name cannot be NULL\n", dev_id);
475f06968e9SSrikanth Yalavarthi 		return -EINVAL;
476f06968e9SSrikanth Yalavarthi 	}
477f06968e9SSrikanth Yalavarthi 
478f06968e9SSrikanth Yalavarthi 	if (value == NULL) {
479f06968e9SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, value cannot be NULL\n", dev_id);
480f06968e9SSrikanth Yalavarthi 		return -EINVAL;
481f06968e9SSrikanth Yalavarthi 	}
482f06968e9SSrikanth Yalavarthi 
483f06968e9SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_by_name_get)(dev, name, stat_id, value);
484f06968e9SSrikanth Yalavarthi }
485f06968e9SSrikanth Yalavarthi 
486f06968e9SSrikanth Yalavarthi int
487f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_get(int16_t dev_id, enum rte_ml_dev_xstats_mode mode, int32_t model_id,
488f06968e9SSrikanth Yalavarthi 		      const uint16_t stat_ids[], uint64_t values[], uint16_t nb_ids)
489f06968e9SSrikanth Yalavarthi {
490f06968e9SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
491f06968e9SSrikanth Yalavarthi 
492f06968e9SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
493f06968e9SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
494f06968e9SSrikanth Yalavarthi 		return -EINVAL;
495f06968e9SSrikanth Yalavarthi 	}
496f06968e9SSrikanth Yalavarthi 
497f06968e9SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
498f06968e9SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_get == NULL)
499f06968e9SSrikanth Yalavarthi 		return -ENOTSUP;
500f06968e9SSrikanth Yalavarthi 
501f06968e9SSrikanth Yalavarthi 	if (stat_ids == NULL) {
502f06968e9SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, stat_ids cannot be NULL\n", dev_id);
503f06968e9SSrikanth Yalavarthi 		return -EINVAL;
504f06968e9SSrikanth Yalavarthi 	}
505f06968e9SSrikanth Yalavarthi 
506f06968e9SSrikanth Yalavarthi 	if (values == NULL) {
507f06968e9SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, values cannot be NULL\n", dev_id);
508f06968e9SSrikanth Yalavarthi 		return -EINVAL;
509f06968e9SSrikanth Yalavarthi 	}
510f06968e9SSrikanth Yalavarthi 
511f06968e9SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_get)(dev, mode, model_id, stat_ids, values, nb_ids);
512f06968e9SSrikanth Yalavarthi }
513f06968e9SSrikanth Yalavarthi 
514f06968e9SSrikanth Yalavarthi int
515f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_reset(int16_t dev_id, enum rte_ml_dev_xstats_mode mode, int32_t model_id,
516f06968e9SSrikanth Yalavarthi 			const uint16_t stat_ids[], uint16_t nb_ids)
517f06968e9SSrikanth Yalavarthi {
518f06968e9SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
519f06968e9SSrikanth Yalavarthi 
520f06968e9SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
521f06968e9SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
522f06968e9SSrikanth Yalavarthi 		return -EINVAL;
523f06968e9SSrikanth Yalavarthi 	}
524f06968e9SSrikanth Yalavarthi 
525f06968e9SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
526f06968e9SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_reset == NULL)
527f06968e9SSrikanth Yalavarthi 		return -ENOTSUP;
528f06968e9SSrikanth Yalavarthi 
529f06968e9SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_reset)(dev, mode, model_id, stat_ids, nb_ids);
530f06968e9SSrikanth Yalavarthi }
531f06968e9SSrikanth Yalavarthi 
532f06968e9SSrikanth Yalavarthi int
533c32be5aaSSrikanth Yalavarthi rte_ml_dev_dump(int16_t dev_id, FILE *fd)
534c32be5aaSSrikanth Yalavarthi {
535c32be5aaSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
536c32be5aaSSrikanth Yalavarthi 
537c32be5aaSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
538c32be5aaSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
539c32be5aaSSrikanth Yalavarthi 		return -EINVAL;
540c32be5aaSSrikanth Yalavarthi 	}
541c32be5aaSSrikanth Yalavarthi 
542c32be5aaSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
543c32be5aaSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_dump == NULL)
544c32be5aaSSrikanth Yalavarthi 		return -ENOTSUP;
545c32be5aaSSrikanth Yalavarthi 
546c32be5aaSSrikanth Yalavarthi 	if (fd == NULL) {
547c32be5aaSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, file descriptor cannot be NULL\n", dev_id);
548c32be5aaSSrikanth Yalavarthi 		return -EINVAL;
549c32be5aaSSrikanth Yalavarthi 	}
550c32be5aaSSrikanth Yalavarthi 
551c32be5aaSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_dump)(dev, fd);
552c32be5aaSSrikanth Yalavarthi }
553c32be5aaSSrikanth Yalavarthi 
554c32be5aaSSrikanth Yalavarthi int
555c32be5aaSSrikanth Yalavarthi rte_ml_dev_selftest(int16_t dev_id)
556c32be5aaSSrikanth Yalavarthi {
557c32be5aaSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
558c32be5aaSSrikanth Yalavarthi 
559c32be5aaSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
560c32be5aaSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
561c32be5aaSSrikanth Yalavarthi 		return -EINVAL;
562c32be5aaSSrikanth Yalavarthi 	}
563c32be5aaSSrikanth Yalavarthi 
564c32be5aaSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
565c32be5aaSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_selftest == NULL)
566c32be5aaSSrikanth Yalavarthi 		return -ENOTSUP;
567c32be5aaSSrikanth Yalavarthi 
568c32be5aaSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_selftest)(dev);
569c32be5aaSSrikanth Yalavarthi }
570c32be5aaSSrikanth Yalavarthi 
571c32be5aaSSrikanth Yalavarthi int
5724a662f54SSrikanth Yalavarthi rte_ml_model_load(int16_t dev_id, struct rte_ml_model_params *params, uint16_t *model_id)
5734a662f54SSrikanth Yalavarthi {
5744a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
5754a662f54SSrikanth Yalavarthi 
5764a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
5774a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
5784a662f54SSrikanth Yalavarthi 		return -EINVAL;
5794a662f54SSrikanth Yalavarthi 	}
5804a662f54SSrikanth Yalavarthi 
5814a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
5824a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_load == NULL)
5834a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
5844a662f54SSrikanth Yalavarthi 
5854a662f54SSrikanth Yalavarthi 	if (params == NULL) {
5864a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, params cannot be NULL\n", dev_id);
5874a662f54SSrikanth Yalavarthi 		return -EINVAL;
5884a662f54SSrikanth Yalavarthi 	}
5894a662f54SSrikanth Yalavarthi 
5904a662f54SSrikanth Yalavarthi 	if (model_id == NULL) {
5914a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id cannot be NULL\n", dev_id);
5924a662f54SSrikanth Yalavarthi 		return -EINVAL;
5934a662f54SSrikanth Yalavarthi 	}
5944a662f54SSrikanth Yalavarthi 
5954a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_load)(dev, params, model_id);
5964a662f54SSrikanth Yalavarthi }
5974a662f54SSrikanth Yalavarthi 
5984a662f54SSrikanth Yalavarthi int
5994a662f54SSrikanth Yalavarthi rte_ml_model_unload(int16_t dev_id, uint16_t model_id)
6004a662f54SSrikanth Yalavarthi {
6014a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6024a662f54SSrikanth Yalavarthi 
6034a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
6044a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
6054a662f54SSrikanth Yalavarthi 		return -EINVAL;
6064a662f54SSrikanth Yalavarthi 	}
6074a662f54SSrikanth Yalavarthi 
6084a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6094a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_unload == NULL)
6104a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6114a662f54SSrikanth Yalavarthi 
6124a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_unload)(dev, model_id);
6134a662f54SSrikanth Yalavarthi }
6144a662f54SSrikanth Yalavarthi 
6154a662f54SSrikanth Yalavarthi int
6164a662f54SSrikanth Yalavarthi rte_ml_model_start(int16_t dev_id, uint16_t model_id)
6174a662f54SSrikanth Yalavarthi {
6184a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6194a662f54SSrikanth Yalavarthi 
6204a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
6214a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
6224a662f54SSrikanth Yalavarthi 		return -EINVAL;
6234a662f54SSrikanth Yalavarthi 	}
6244a662f54SSrikanth Yalavarthi 
6254a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6264a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_start == NULL)
6274a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6284a662f54SSrikanth Yalavarthi 
6294a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_start)(dev, model_id);
6304a662f54SSrikanth Yalavarthi }
6314a662f54SSrikanth Yalavarthi 
6324a662f54SSrikanth Yalavarthi int
6334a662f54SSrikanth Yalavarthi rte_ml_model_stop(int16_t dev_id, uint16_t model_id)
6344a662f54SSrikanth Yalavarthi {
6354a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6364a662f54SSrikanth Yalavarthi 
6374a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
6384a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
6394a662f54SSrikanth Yalavarthi 		return -EINVAL;
6404a662f54SSrikanth Yalavarthi 	}
6414a662f54SSrikanth Yalavarthi 
6424a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6434a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_stop == NULL)
6444a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6454a662f54SSrikanth Yalavarthi 
6464a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_stop)(dev, model_id);
6474a662f54SSrikanth Yalavarthi }
6484a662f54SSrikanth Yalavarthi 
6494a662f54SSrikanth Yalavarthi int
6504a662f54SSrikanth Yalavarthi rte_ml_model_info_get(int16_t dev_id, uint16_t model_id, struct rte_ml_model_info *model_info)
6514a662f54SSrikanth Yalavarthi {
6524a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6534a662f54SSrikanth Yalavarthi 
6544a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
6554a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
6564a662f54SSrikanth Yalavarthi 		return -EINVAL;
6574a662f54SSrikanth Yalavarthi 	}
6584a662f54SSrikanth Yalavarthi 
6594a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6604a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_info_get == NULL)
6614a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6624a662f54SSrikanth Yalavarthi 
6634a662f54SSrikanth Yalavarthi 	if (model_info == NULL) {
6644a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id %u, model_info cannot be NULL\n", dev_id,
6654a662f54SSrikanth Yalavarthi 			      model_id);
6664a662f54SSrikanth Yalavarthi 		return -EINVAL;
6674a662f54SSrikanth Yalavarthi 	}
6684a662f54SSrikanth Yalavarthi 
6694a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_info_get)(dev, model_id, model_info);
6704a662f54SSrikanth Yalavarthi }
6714a662f54SSrikanth Yalavarthi 
6724a662f54SSrikanth Yalavarthi int
6734a662f54SSrikanth Yalavarthi rte_ml_model_params_update(int16_t dev_id, uint16_t model_id, void *buffer)
6744a662f54SSrikanth Yalavarthi {
6754a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6764a662f54SSrikanth Yalavarthi 
6774a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
6784a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
6794a662f54SSrikanth Yalavarthi 		return -EINVAL;
6804a662f54SSrikanth Yalavarthi 	}
6814a662f54SSrikanth Yalavarthi 
6824a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6834a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_params_update == NULL)
6844a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6854a662f54SSrikanth Yalavarthi 
6864a662f54SSrikanth Yalavarthi 	if (buffer == NULL) {
6874a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, buffer cannot be NULL\n", dev_id);
6884a662f54SSrikanth Yalavarthi 		return -EINVAL;
6894a662f54SSrikanth Yalavarthi 	}
6904a662f54SSrikanth Yalavarthi 
6914a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_params_update)(dev, model_id, buffer);
6924a662f54SSrikanth Yalavarthi }
6934a662f54SSrikanth Yalavarthi 
69450818b0aSSrikanth Yalavarthi int
69550818b0aSSrikanth Yalavarthi rte_ml_io_input_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,
69650818b0aSSrikanth Yalavarthi 			 uint64_t *input_qsize, uint64_t *input_dsize)
69750818b0aSSrikanth Yalavarthi {
69850818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
69950818b0aSSrikanth Yalavarthi 
70050818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
70150818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
70250818b0aSSrikanth Yalavarthi 		return -EINVAL;
70350818b0aSSrikanth Yalavarthi 	}
70450818b0aSSrikanth Yalavarthi 
70550818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
70650818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_input_size_get == NULL)
70750818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
70850818b0aSSrikanth Yalavarthi 
70950818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_input_size_get)(dev, model_id, nb_batches, input_qsize,
71050818b0aSSrikanth Yalavarthi 						  input_dsize);
71150818b0aSSrikanth Yalavarthi }
71250818b0aSSrikanth Yalavarthi 
71350818b0aSSrikanth Yalavarthi int
71450818b0aSSrikanth Yalavarthi rte_ml_io_output_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,
71550818b0aSSrikanth Yalavarthi 			  uint64_t *output_qsize, uint64_t *output_dsize)
71650818b0aSSrikanth Yalavarthi {
71750818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
71850818b0aSSrikanth Yalavarthi 
71950818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
72050818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
72150818b0aSSrikanth Yalavarthi 		return -EINVAL;
72250818b0aSSrikanth Yalavarthi 	}
72350818b0aSSrikanth Yalavarthi 
72450818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
72550818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_output_size_get == NULL)
72650818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
72750818b0aSSrikanth Yalavarthi 
72850818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_output_size_get)(dev, model_id, nb_batches, output_qsize,
72950818b0aSSrikanth Yalavarthi 						   output_dsize);
73050818b0aSSrikanth Yalavarthi }
73150818b0aSSrikanth Yalavarthi 
73250818b0aSSrikanth Yalavarthi int
733*24364292SSrikanth Yalavarthi rte_ml_io_quantize(int16_t dev_id, uint16_t model_id, struct rte_ml_buff_seg **dbuffer,
734*24364292SSrikanth Yalavarthi 		   struct rte_ml_buff_seg **qbuffer)
73550818b0aSSrikanth Yalavarthi {
73650818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
73750818b0aSSrikanth Yalavarthi 
73850818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
73950818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
74050818b0aSSrikanth Yalavarthi 		return -EINVAL;
74150818b0aSSrikanth Yalavarthi 	}
74250818b0aSSrikanth Yalavarthi 
74350818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
74450818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_quantize == NULL)
74550818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
74650818b0aSSrikanth Yalavarthi 
74750818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
74850818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id);
74950818b0aSSrikanth Yalavarthi 		return -EINVAL;
75050818b0aSSrikanth Yalavarthi 	}
75150818b0aSSrikanth Yalavarthi 
75250818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
75350818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id);
75450818b0aSSrikanth Yalavarthi 		return -EINVAL;
75550818b0aSSrikanth Yalavarthi 	}
75650818b0aSSrikanth Yalavarthi 
757*24364292SSrikanth Yalavarthi 	return (*dev->dev_ops->io_quantize)(dev, model_id, dbuffer, qbuffer);
75850818b0aSSrikanth Yalavarthi }
75950818b0aSSrikanth Yalavarthi 
76050818b0aSSrikanth Yalavarthi int
761*24364292SSrikanth Yalavarthi rte_ml_io_dequantize(int16_t dev_id, uint16_t model_id, struct rte_ml_buff_seg **qbuffer,
762*24364292SSrikanth Yalavarthi 		     struct rte_ml_buff_seg **dbuffer)
76350818b0aSSrikanth Yalavarthi {
76450818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
76550818b0aSSrikanth Yalavarthi 
76650818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
76750818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
76850818b0aSSrikanth Yalavarthi 		return -EINVAL;
76950818b0aSSrikanth Yalavarthi 	}
77050818b0aSSrikanth Yalavarthi 
77150818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
77250818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_dequantize == NULL)
77350818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
77450818b0aSSrikanth Yalavarthi 
77550818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
77650818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id);
77750818b0aSSrikanth Yalavarthi 		return -EINVAL;
77850818b0aSSrikanth Yalavarthi 	}
77950818b0aSSrikanth Yalavarthi 
78050818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
78150818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id);
78250818b0aSSrikanth Yalavarthi 		return -EINVAL;
78350818b0aSSrikanth Yalavarthi 	}
78450818b0aSSrikanth Yalavarthi 
785*24364292SSrikanth Yalavarthi 	return (*dev->dev_ops->io_dequantize)(dev, model_id, qbuffer, dbuffer);
78650818b0aSSrikanth Yalavarthi }
78750818b0aSSrikanth Yalavarthi 
7881b365349SSrikanth Yalavarthi /** Initialise rte_ml_op mempool element */
7891b365349SSrikanth Yalavarthi static void
7901b365349SSrikanth Yalavarthi ml_op_init(struct rte_mempool *mempool, __rte_unused void *opaque_arg, void *_op_data,
7911b365349SSrikanth Yalavarthi 	   __rte_unused unsigned int i)
7921b365349SSrikanth Yalavarthi {
7931b365349SSrikanth Yalavarthi 	struct rte_ml_op *op = _op_data;
7941b365349SSrikanth Yalavarthi 
7951b365349SSrikanth Yalavarthi 	memset(_op_data, 0, mempool->elt_size);
7961b365349SSrikanth Yalavarthi 	op->status = RTE_ML_OP_STATUS_NOT_PROCESSED;
7971b365349SSrikanth Yalavarthi 	op->mempool = mempool;
7981b365349SSrikanth Yalavarthi }
7991b365349SSrikanth Yalavarthi 
8001b365349SSrikanth Yalavarthi struct rte_mempool *
8011b365349SSrikanth Yalavarthi rte_ml_op_pool_create(const char *name, unsigned int nb_elts, unsigned int cache_size,
8021b365349SSrikanth Yalavarthi 		      uint16_t user_size, int socket_id)
8031b365349SSrikanth Yalavarthi {
8041b365349SSrikanth Yalavarthi 	struct rte_ml_op_pool_private *priv;
8051b365349SSrikanth Yalavarthi 	struct rte_mempool *mp;
8061b365349SSrikanth Yalavarthi 	unsigned int elt_size;
8071b365349SSrikanth Yalavarthi 
8081b365349SSrikanth Yalavarthi 	/* lookup mempool in case already allocated */
8091b365349SSrikanth Yalavarthi 	mp = rte_mempool_lookup(name);
8101b365349SSrikanth Yalavarthi 	elt_size = sizeof(struct rte_ml_op) + user_size;
8111b365349SSrikanth Yalavarthi 
8121b365349SSrikanth Yalavarthi 	if (mp != NULL) {
8131b365349SSrikanth Yalavarthi 		priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp);
8141b365349SSrikanth Yalavarthi 		if (mp->elt_size != elt_size || mp->cache_size < cache_size || mp->size < nb_elts ||
8151b365349SSrikanth Yalavarthi 		    priv->user_size < user_size) {
8161b365349SSrikanth Yalavarthi 			mp = NULL;
8171b365349SSrikanth Yalavarthi 			RTE_MLDEV_LOG(ERR,
8181b365349SSrikanth Yalavarthi 				      "Mempool %s already exists but with incompatible parameters",
8191b365349SSrikanth Yalavarthi 				      name);
8201b365349SSrikanth Yalavarthi 			return NULL;
8211b365349SSrikanth Yalavarthi 		}
8221b365349SSrikanth Yalavarthi 		return mp;
8231b365349SSrikanth Yalavarthi 	}
8241b365349SSrikanth Yalavarthi 
8251b365349SSrikanth Yalavarthi 	mp = rte_mempool_create(name, nb_elts, elt_size, cache_size,
8261b365349SSrikanth Yalavarthi 				sizeof(struct rte_ml_op_pool_private), NULL, NULL, ml_op_init, NULL,
8271b365349SSrikanth Yalavarthi 				socket_id, 0);
8281b365349SSrikanth Yalavarthi 	if (mp == NULL) {
8291b365349SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Failed to create mempool %s", name);
8301b365349SSrikanth Yalavarthi 		return NULL;
8311b365349SSrikanth Yalavarthi 	}
8321b365349SSrikanth Yalavarthi 
8331b365349SSrikanth Yalavarthi 	priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp);
8341b365349SSrikanth Yalavarthi 	priv->user_size = user_size;
8351b365349SSrikanth Yalavarthi 
8361b365349SSrikanth Yalavarthi 	return mp;
8371b365349SSrikanth Yalavarthi }
8381b365349SSrikanth Yalavarthi 
8391b365349SSrikanth Yalavarthi void
8401b365349SSrikanth Yalavarthi rte_ml_op_pool_free(struct rte_mempool *mempool)
8411b365349SSrikanth Yalavarthi {
8421b365349SSrikanth Yalavarthi 	rte_mempool_free(mempool);
8431b365349SSrikanth Yalavarthi }
8441b365349SSrikanth Yalavarthi 
845c775df1cSSrikanth Yalavarthi uint16_t
846c775df1cSSrikanth Yalavarthi rte_ml_enqueue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops)
847c775df1cSSrikanth Yalavarthi {
848c775df1cSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
849c775df1cSSrikanth Yalavarthi 
850c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
851c775df1cSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
852c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
853c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
854c775df1cSSrikanth Yalavarthi 		return 0;
855c775df1cSSrikanth Yalavarthi 	}
856c775df1cSSrikanth Yalavarthi 
857c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
858c775df1cSSrikanth Yalavarthi 	if (*dev->enqueue_burst == NULL) {
859c775df1cSSrikanth Yalavarthi 		rte_errno = -ENOTSUP;
860c775df1cSSrikanth Yalavarthi 		return 0;
861c775df1cSSrikanth Yalavarthi 	}
862c775df1cSSrikanth Yalavarthi 
863c775df1cSSrikanth Yalavarthi 	if (ops == NULL) {
864c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL\n", dev_id);
865c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
866c775df1cSSrikanth Yalavarthi 		return 0;
867c775df1cSSrikanth Yalavarthi 	}
868c775df1cSSrikanth Yalavarthi 
869c775df1cSSrikanth Yalavarthi 	if (qp_id >= dev->data->nb_queue_pairs) {
870c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid qp_id %u\n", qp_id);
871c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
872c775df1cSSrikanth Yalavarthi 		return 0;
873c775df1cSSrikanth Yalavarthi 	}
874c775df1cSSrikanth Yalavarthi #else
875c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
876c775df1cSSrikanth Yalavarthi #endif
877c775df1cSSrikanth Yalavarthi 
878c775df1cSSrikanth Yalavarthi 	return (*dev->enqueue_burst)(dev, qp_id, ops, nb_ops);
879c775df1cSSrikanth Yalavarthi }
880c775df1cSSrikanth Yalavarthi 
881c775df1cSSrikanth Yalavarthi uint16_t
882c775df1cSSrikanth Yalavarthi rte_ml_dequeue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops)
883c775df1cSSrikanth Yalavarthi {
884c775df1cSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
885c775df1cSSrikanth Yalavarthi 
886c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
887c775df1cSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
888c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
889c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
890c775df1cSSrikanth Yalavarthi 		return 0;
891c775df1cSSrikanth Yalavarthi 	}
892c775df1cSSrikanth Yalavarthi 
893c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
894c775df1cSSrikanth Yalavarthi 	if (*dev->dequeue_burst == NULL) {
895c775df1cSSrikanth Yalavarthi 		rte_errno = -ENOTSUP;
896c775df1cSSrikanth Yalavarthi 		return 0;
897c775df1cSSrikanth Yalavarthi 	}
898c775df1cSSrikanth Yalavarthi 
899c775df1cSSrikanth Yalavarthi 	if (ops == NULL) {
900c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL\n", dev_id);
901c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
902c775df1cSSrikanth Yalavarthi 		return 0;
903c775df1cSSrikanth Yalavarthi 	}
904c775df1cSSrikanth Yalavarthi 
905c775df1cSSrikanth Yalavarthi 	if (qp_id >= dev->data->nb_queue_pairs) {
906c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid qp_id %u\n", qp_id);
907c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
908c775df1cSSrikanth Yalavarthi 		return 0;
909c775df1cSSrikanth Yalavarthi 	}
910c775df1cSSrikanth Yalavarthi #else
911c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
912c775df1cSSrikanth Yalavarthi #endif
913c775df1cSSrikanth Yalavarthi 
914c775df1cSSrikanth Yalavarthi 	return (*dev->dequeue_burst)(dev, qp_id, ops, nb_ops);
915c775df1cSSrikanth Yalavarthi }
916c775df1cSSrikanth Yalavarthi 
917698d9061SSrikanth Yalavarthi int
918698d9061SSrikanth Yalavarthi rte_ml_op_error_get(int16_t dev_id, struct rte_ml_op *op, struct rte_ml_op_error *error)
919698d9061SSrikanth Yalavarthi {
920698d9061SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
921698d9061SSrikanth Yalavarthi 
922698d9061SSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
923698d9061SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
924698d9061SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
925698d9061SSrikanth Yalavarthi 		return -EINVAL;
926698d9061SSrikanth Yalavarthi 	}
927698d9061SSrikanth Yalavarthi 
928698d9061SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
929698d9061SSrikanth Yalavarthi 	if (*dev->op_error_get == NULL)
930698d9061SSrikanth Yalavarthi 		return -ENOTSUP;
931698d9061SSrikanth Yalavarthi 
932698d9061SSrikanth Yalavarthi 	if (op == NULL) {
933698d9061SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, op cannot be NULL\n", dev_id);
934698d9061SSrikanth Yalavarthi 		return -EINVAL;
935698d9061SSrikanth Yalavarthi 	}
936698d9061SSrikanth Yalavarthi 
937698d9061SSrikanth Yalavarthi 	if (error == NULL) {
938698d9061SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, error cannot be NULL\n", dev_id);
939698d9061SSrikanth Yalavarthi 		return -EINVAL;
940698d9061SSrikanth Yalavarthi 	}
941698d9061SSrikanth Yalavarthi #else
942698d9061SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
943698d9061SSrikanth Yalavarthi #endif
944698d9061SSrikanth Yalavarthi 
945698d9061SSrikanth Yalavarthi 	return (*dev->op_error_get)(dev, op, error);
946698d9061SSrikanth Yalavarthi }
947698d9061SSrikanth Yalavarthi 
948d82cac58SJerin Jacob RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO);
949