xref: /dpdk/lib/mldev/rte_mldev.c (revision c32be5aa19fb78c42c3a37b481c8868d4d28b55c)
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 	ml_dev_globals.devs = ml_dev_globals.devs;
190ea80eafbSSrikanth Yalavarthi 
191ea80eafbSSrikanth Yalavarthi 	return 0;
192ea80eafbSSrikanth Yalavarthi }
193d82cac58SJerin Jacob 
19436d0b09eSSrikanth Yalavarthi uint16_t
19536d0b09eSSrikanth Yalavarthi rte_ml_dev_count(void)
19636d0b09eSSrikanth Yalavarthi {
19736d0b09eSSrikanth Yalavarthi 	return ml_dev_globals.nb_devs;
19836d0b09eSSrikanth Yalavarthi }
19936d0b09eSSrikanth Yalavarthi 
20036d0b09eSSrikanth Yalavarthi int
20136d0b09eSSrikanth Yalavarthi rte_ml_dev_is_valid_dev(int16_t dev_id)
20236d0b09eSSrikanth Yalavarthi {
20336d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev = NULL;
20436d0b09eSSrikanth Yalavarthi 
20536d0b09eSSrikanth Yalavarthi 	if (dev_id >= ml_dev_globals.max_devs || ml_dev_globals.devs[dev_id].data == NULL)
20636d0b09eSSrikanth Yalavarthi 		return 0;
20736d0b09eSSrikanth Yalavarthi 
20836d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
20936d0b09eSSrikanth Yalavarthi 	if (dev->attached != ML_DEV_ATTACHED)
21036d0b09eSSrikanth Yalavarthi 		return 0;
21136d0b09eSSrikanth Yalavarthi 	else
21236d0b09eSSrikanth Yalavarthi 		return 1;
21336d0b09eSSrikanth Yalavarthi }
21436d0b09eSSrikanth Yalavarthi 
21536d0b09eSSrikanth Yalavarthi int
21636d0b09eSSrikanth Yalavarthi rte_ml_dev_socket_id(int16_t dev_id)
21736d0b09eSSrikanth Yalavarthi {
21836d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
21936d0b09eSSrikanth Yalavarthi 
22036d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
22136d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
22236d0b09eSSrikanth Yalavarthi 		return -EINVAL;
22336d0b09eSSrikanth Yalavarthi 	}
22436d0b09eSSrikanth Yalavarthi 
22536d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
22636d0b09eSSrikanth Yalavarthi 
22736d0b09eSSrikanth Yalavarthi 	return dev->data->socket_id;
22836d0b09eSSrikanth Yalavarthi }
22936d0b09eSSrikanth Yalavarthi 
23036d0b09eSSrikanth Yalavarthi int
23136d0b09eSSrikanth Yalavarthi rte_ml_dev_info_get(int16_t dev_id, struct rte_ml_dev_info *dev_info)
23236d0b09eSSrikanth Yalavarthi {
23336d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
23436d0b09eSSrikanth Yalavarthi 
23536d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
23636d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
23736d0b09eSSrikanth Yalavarthi 		return -EINVAL;
23836d0b09eSSrikanth Yalavarthi 	}
23936d0b09eSSrikanth Yalavarthi 
24036d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
24136d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_info_get == NULL)
24236d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
24336d0b09eSSrikanth Yalavarthi 
24436d0b09eSSrikanth Yalavarthi 	if (dev_info == NULL) {
24536d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dev_info cannot be NULL\n", dev_id);
24636d0b09eSSrikanth Yalavarthi 		return -EINVAL;
24736d0b09eSSrikanth Yalavarthi 	}
24836d0b09eSSrikanth Yalavarthi 	memset(dev_info, 0, sizeof(struct rte_ml_dev_info));
24936d0b09eSSrikanth Yalavarthi 
25036d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_info_get)(dev, dev_info);
25136d0b09eSSrikanth Yalavarthi }
25236d0b09eSSrikanth Yalavarthi 
25336d0b09eSSrikanth Yalavarthi int
25436d0b09eSSrikanth Yalavarthi rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *config)
25536d0b09eSSrikanth Yalavarthi {
25636d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev_info dev_info;
25736d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
25836d0b09eSSrikanth Yalavarthi 	int ret;
25936d0b09eSSrikanth Yalavarthi 
26036d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
26136d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
26236d0b09eSSrikanth Yalavarthi 		return -EINVAL;
26336d0b09eSSrikanth Yalavarthi 	}
26436d0b09eSSrikanth Yalavarthi 
26536d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
26636d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_configure == NULL)
26736d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
26836d0b09eSSrikanth Yalavarthi 
26936d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started) {
27036d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id);
27136d0b09eSSrikanth Yalavarthi 		return -EBUSY;
27236d0b09eSSrikanth Yalavarthi 	}
27336d0b09eSSrikanth Yalavarthi 
27436d0b09eSSrikanth Yalavarthi 	if (config == NULL) {
27536d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, config cannot be NULL\n", dev_id);
27636d0b09eSSrikanth Yalavarthi 		return -EINVAL;
27736d0b09eSSrikanth Yalavarthi 	}
27836d0b09eSSrikanth Yalavarthi 
27936d0b09eSSrikanth Yalavarthi 	ret = rte_ml_dev_info_get(dev_id, &dev_info);
28036d0b09eSSrikanth Yalavarthi 	if (ret < 0)
28136d0b09eSSrikanth Yalavarthi 		return ret;
28236d0b09eSSrikanth Yalavarthi 
28336d0b09eSSrikanth Yalavarthi 	if (config->nb_queue_pairs > dev_info.max_queue_pairs) {
28436d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d num of queues %u > %u\n", dev_id,
28536d0b09eSSrikanth Yalavarthi 			      config->nb_queue_pairs, dev_info.max_queue_pairs);
28636d0b09eSSrikanth Yalavarthi 		return -EINVAL;
28736d0b09eSSrikanth Yalavarthi 	}
28836d0b09eSSrikanth Yalavarthi 
28936d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_configure)(dev, config);
29036d0b09eSSrikanth Yalavarthi }
29136d0b09eSSrikanth Yalavarthi 
29236d0b09eSSrikanth Yalavarthi int
29336d0b09eSSrikanth Yalavarthi rte_ml_dev_close(int16_t dev_id)
29436d0b09eSSrikanth Yalavarthi {
29536d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
29636d0b09eSSrikanth Yalavarthi 
29736d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
29836d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
29936d0b09eSSrikanth Yalavarthi 		return -EINVAL;
30036d0b09eSSrikanth Yalavarthi 	}
30136d0b09eSSrikanth Yalavarthi 
30236d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
30336d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_close == NULL)
30436d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
30536d0b09eSSrikanth Yalavarthi 
30636d0b09eSSrikanth Yalavarthi 	/* Device must be stopped before it can be closed */
30736d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 1) {
30836d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped before closing", dev_id);
30936d0b09eSSrikanth Yalavarthi 		return -EBUSY;
31036d0b09eSSrikanth Yalavarthi 	}
31136d0b09eSSrikanth Yalavarthi 
31236d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_close)(dev);
31336d0b09eSSrikanth Yalavarthi }
31436d0b09eSSrikanth Yalavarthi 
31536d0b09eSSrikanth Yalavarthi int
31636d0b09eSSrikanth Yalavarthi rte_ml_dev_start(int16_t dev_id)
31736d0b09eSSrikanth Yalavarthi {
31836d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
31936d0b09eSSrikanth Yalavarthi 	int ret;
32036d0b09eSSrikanth Yalavarthi 
32136d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
32236d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
32336d0b09eSSrikanth Yalavarthi 		return -EINVAL;
32436d0b09eSSrikanth Yalavarthi 	}
32536d0b09eSSrikanth Yalavarthi 
32636d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
32736d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_start == NULL)
32836d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
32936d0b09eSSrikanth Yalavarthi 
33036d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started != 0) {
33136d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is already started", dev_id);
33236d0b09eSSrikanth Yalavarthi 		return -EBUSY;
33336d0b09eSSrikanth Yalavarthi 	}
33436d0b09eSSrikanth Yalavarthi 
33536d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_start)(dev);
33636d0b09eSSrikanth Yalavarthi 	if (ret == 0)
33736d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 1;
33836d0b09eSSrikanth Yalavarthi 
33936d0b09eSSrikanth Yalavarthi 	return ret;
34036d0b09eSSrikanth Yalavarthi }
34136d0b09eSSrikanth Yalavarthi 
34236d0b09eSSrikanth Yalavarthi int
34336d0b09eSSrikanth Yalavarthi rte_ml_dev_stop(int16_t dev_id)
34436d0b09eSSrikanth Yalavarthi {
34536d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
34636d0b09eSSrikanth Yalavarthi 	int ret;
34736d0b09eSSrikanth Yalavarthi 
34836d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
34936d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
35036d0b09eSSrikanth Yalavarthi 		return -EINVAL;
35136d0b09eSSrikanth Yalavarthi 	}
35236d0b09eSSrikanth Yalavarthi 
35336d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
35436d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stop == NULL)
35536d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
35636d0b09eSSrikanth Yalavarthi 
35736d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 0) {
35836d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is not started", dev_id);
35936d0b09eSSrikanth Yalavarthi 		return -EBUSY;
36036d0b09eSSrikanth Yalavarthi 	}
36136d0b09eSSrikanth Yalavarthi 
36236d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_stop)(dev);
36336d0b09eSSrikanth Yalavarthi 	if (ret == 0)
36436d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 0;
36536d0b09eSSrikanth Yalavarthi 
36636d0b09eSSrikanth Yalavarthi 	return ret;
36736d0b09eSSrikanth Yalavarthi }
36836d0b09eSSrikanth Yalavarthi 
369b5f0df64SSrikanth Yalavarthi int
370b5f0df64SSrikanth Yalavarthi rte_ml_dev_queue_pair_setup(int16_t dev_id, uint16_t queue_pair_id,
371b5f0df64SSrikanth Yalavarthi 			    const struct rte_ml_dev_qp_conf *qp_conf, int socket_id)
372b5f0df64SSrikanth Yalavarthi {
373b5f0df64SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
374b5f0df64SSrikanth Yalavarthi 
375b5f0df64SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
376b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
377b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
378b5f0df64SSrikanth Yalavarthi 	}
379b5f0df64SSrikanth Yalavarthi 
380b5f0df64SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
381b5f0df64SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_queue_pair_setup == NULL)
382b5f0df64SSrikanth Yalavarthi 		return -ENOTSUP;
383b5f0df64SSrikanth Yalavarthi 
384b5f0df64SSrikanth Yalavarthi 	if (queue_pair_id >= dev->data->nb_queue_pairs) {
385b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid queue_pair_id = %d", queue_pair_id);
386b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
387b5f0df64SSrikanth Yalavarthi 	}
388b5f0df64SSrikanth Yalavarthi 
389b5f0df64SSrikanth Yalavarthi 	if (qp_conf == NULL) {
390b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qp_conf cannot be NULL\n", dev_id);
391b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
392b5f0df64SSrikanth Yalavarthi 	}
393b5f0df64SSrikanth Yalavarthi 
394b5f0df64SSrikanth Yalavarthi 	if (dev->data->dev_started) {
395b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id);
396b5f0df64SSrikanth Yalavarthi 		return -EBUSY;
397b5f0df64SSrikanth Yalavarthi 	}
398b5f0df64SSrikanth Yalavarthi 
399b5f0df64SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_queue_pair_setup)(dev, queue_pair_id, qp_conf, socket_id);
400b5f0df64SSrikanth Yalavarthi }
401b5f0df64SSrikanth Yalavarthi 
4024a662f54SSrikanth Yalavarthi int
403b3caa0f8SSrikanth Yalavarthi rte_ml_dev_stats_get(int16_t dev_id, struct rte_ml_dev_stats *stats)
404b3caa0f8SSrikanth Yalavarthi {
405b3caa0f8SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
406b3caa0f8SSrikanth Yalavarthi 
407b3caa0f8SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
408b3caa0f8SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
409b3caa0f8SSrikanth Yalavarthi 		return -EINVAL;
410b3caa0f8SSrikanth Yalavarthi 	}
411b3caa0f8SSrikanth Yalavarthi 
412b3caa0f8SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
413b3caa0f8SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stats_get == NULL)
414b3caa0f8SSrikanth Yalavarthi 		return -ENOTSUP;
415b3caa0f8SSrikanth Yalavarthi 
416b3caa0f8SSrikanth Yalavarthi 	if (stats == NULL) {
417b3caa0f8SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, stats cannot be NULL\n", dev_id);
418b3caa0f8SSrikanth Yalavarthi 		return -EINVAL;
419b3caa0f8SSrikanth Yalavarthi 	}
420b3caa0f8SSrikanth Yalavarthi 	memset(stats, 0, sizeof(struct rte_ml_dev_stats));
421b3caa0f8SSrikanth Yalavarthi 
422b3caa0f8SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_stats_get)(dev, stats);
423b3caa0f8SSrikanth Yalavarthi }
424b3caa0f8SSrikanth Yalavarthi 
425b3caa0f8SSrikanth Yalavarthi void
426b3caa0f8SSrikanth Yalavarthi rte_ml_dev_stats_reset(int16_t dev_id)
427b3caa0f8SSrikanth Yalavarthi {
428b3caa0f8SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
429b3caa0f8SSrikanth Yalavarthi 
430b3caa0f8SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
431b3caa0f8SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
432b3caa0f8SSrikanth Yalavarthi 		return;
433b3caa0f8SSrikanth Yalavarthi 	}
434b3caa0f8SSrikanth Yalavarthi 
435b3caa0f8SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
436b3caa0f8SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stats_reset == NULL)
437b3caa0f8SSrikanth Yalavarthi 		return;
438b3caa0f8SSrikanth Yalavarthi 
439b3caa0f8SSrikanth Yalavarthi 	(*dev->dev_ops->dev_stats_reset)(dev);
440b3caa0f8SSrikanth Yalavarthi }
441b3caa0f8SSrikanth Yalavarthi 
442b3caa0f8SSrikanth Yalavarthi int
44369707febSSrikanth Yalavarthi rte_ml_dev_xstats_names_get(int16_t dev_id, struct rte_ml_dev_xstats_map *xstats_map, uint32_t size)
44469707febSSrikanth Yalavarthi {
44569707febSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
44669707febSSrikanth Yalavarthi 
44769707febSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
44869707febSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
44969707febSSrikanth Yalavarthi 		return -EINVAL;
45069707febSSrikanth Yalavarthi 	}
45169707febSSrikanth Yalavarthi 
45269707febSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
45369707febSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_names_get == NULL)
45469707febSSrikanth Yalavarthi 		return -ENOTSUP;
45569707febSSrikanth Yalavarthi 
45669707febSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_names_get)(dev, xstats_map, size);
45769707febSSrikanth Yalavarthi }
45869707febSSrikanth Yalavarthi 
45969707febSSrikanth Yalavarthi int
46069707febSSrikanth Yalavarthi rte_ml_dev_xstats_by_name_get(int16_t dev_id, const char *name, uint16_t *stat_id, uint64_t *value)
46169707febSSrikanth Yalavarthi {
46269707febSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
46369707febSSrikanth Yalavarthi 
46469707febSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
46569707febSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
46669707febSSrikanth Yalavarthi 		return -EINVAL;
46769707febSSrikanth Yalavarthi 	}
46869707febSSrikanth Yalavarthi 
46969707febSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
47069707febSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_by_name_get == NULL)
47169707febSSrikanth Yalavarthi 		return -ENOTSUP;
47269707febSSrikanth Yalavarthi 
47369707febSSrikanth Yalavarthi 	if (name == NULL) {
47469707febSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, name cannot be NULL\n", dev_id);
47569707febSSrikanth Yalavarthi 		return -EINVAL;
47669707febSSrikanth Yalavarthi 	}
47769707febSSrikanth Yalavarthi 
47869707febSSrikanth Yalavarthi 	if (value == NULL) {
47969707febSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, value cannot be NULL\n", dev_id);
48069707febSSrikanth Yalavarthi 		return -EINVAL;
48169707febSSrikanth Yalavarthi 	}
48269707febSSrikanth Yalavarthi 
48369707febSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_by_name_get)(dev, name, stat_id, value);
48469707febSSrikanth Yalavarthi }
48569707febSSrikanth Yalavarthi 
48669707febSSrikanth Yalavarthi int
48769707febSSrikanth Yalavarthi rte_ml_dev_xstats_get(int16_t dev_id, const uint16_t *stat_ids, uint64_t *values, uint16_t nb_ids)
48869707febSSrikanth Yalavarthi {
48969707febSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
49069707febSSrikanth Yalavarthi 
49169707febSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
49269707febSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
49369707febSSrikanth Yalavarthi 		return -EINVAL;
49469707febSSrikanth Yalavarthi 	}
49569707febSSrikanth Yalavarthi 
49669707febSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
49769707febSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_get == NULL)
49869707febSSrikanth Yalavarthi 		return -ENOTSUP;
49969707febSSrikanth Yalavarthi 
50069707febSSrikanth Yalavarthi 	if (stat_ids == NULL) {
50169707febSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, stat_ids cannot be NULL\n", dev_id);
50269707febSSrikanth Yalavarthi 		return -EINVAL;
50369707febSSrikanth Yalavarthi 	}
50469707febSSrikanth Yalavarthi 
50569707febSSrikanth Yalavarthi 	if (values == NULL) {
50669707febSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, values cannot be NULL\n", dev_id);
50769707febSSrikanth Yalavarthi 		return -EINVAL;
50869707febSSrikanth Yalavarthi 	}
50969707febSSrikanth Yalavarthi 
51069707febSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_get)(dev, stat_ids, values, nb_ids);
51169707febSSrikanth Yalavarthi }
51269707febSSrikanth Yalavarthi 
51369707febSSrikanth Yalavarthi int
51469707febSSrikanth Yalavarthi rte_ml_dev_xstats_reset(int16_t dev_id, const uint16_t *stat_ids, uint16_t nb_ids)
51569707febSSrikanth Yalavarthi {
51669707febSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
51769707febSSrikanth Yalavarthi 
51869707febSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
51969707febSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
52069707febSSrikanth Yalavarthi 		return -EINVAL;
52169707febSSrikanth Yalavarthi 	}
52269707febSSrikanth Yalavarthi 
52369707febSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
52469707febSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_reset == NULL)
52569707febSSrikanth Yalavarthi 		return -ENOTSUP;
52669707febSSrikanth Yalavarthi 
52769707febSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_reset)(dev, stat_ids, nb_ids);
52869707febSSrikanth Yalavarthi }
52969707febSSrikanth Yalavarthi 
53069707febSSrikanth Yalavarthi int
531*c32be5aaSSrikanth Yalavarthi rte_ml_dev_dump(int16_t dev_id, FILE *fd)
532*c32be5aaSSrikanth Yalavarthi {
533*c32be5aaSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
534*c32be5aaSSrikanth Yalavarthi 
535*c32be5aaSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
536*c32be5aaSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
537*c32be5aaSSrikanth Yalavarthi 		return -EINVAL;
538*c32be5aaSSrikanth Yalavarthi 	}
539*c32be5aaSSrikanth Yalavarthi 
540*c32be5aaSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
541*c32be5aaSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_dump == NULL)
542*c32be5aaSSrikanth Yalavarthi 		return -ENOTSUP;
543*c32be5aaSSrikanth Yalavarthi 
544*c32be5aaSSrikanth Yalavarthi 	if (fd == NULL) {
545*c32be5aaSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, file descriptor cannot be NULL\n", dev_id);
546*c32be5aaSSrikanth Yalavarthi 		return -EINVAL;
547*c32be5aaSSrikanth Yalavarthi 	}
548*c32be5aaSSrikanth Yalavarthi 
549*c32be5aaSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_dump)(dev, fd);
550*c32be5aaSSrikanth Yalavarthi }
551*c32be5aaSSrikanth Yalavarthi 
552*c32be5aaSSrikanth Yalavarthi int
553*c32be5aaSSrikanth Yalavarthi rte_ml_dev_selftest(int16_t dev_id)
554*c32be5aaSSrikanth Yalavarthi {
555*c32be5aaSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
556*c32be5aaSSrikanth Yalavarthi 
557*c32be5aaSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
558*c32be5aaSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
559*c32be5aaSSrikanth Yalavarthi 		return -EINVAL;
560*c32be5aaSSrikanth Yalavarthi 	}
561*c32be5aaSSrikanth Yalavarthi 
562*c32be5aaSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
563*c32be5aaSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_selftest == NULL)
564*c32be5aaSSrikanth Yalavarthi 		return -ENOTSUP;
565*c32be5aaSSrikanth Yalavarthi 
566*c32be5aaSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_selftest)(dev);
567*c32be5aaSSrikanth Yalavarthi }
568*c32be5aaSSrikanth Yalavarthi 
569*c32be5aaSSrikanth Yalavarthi int
5704a662f54SSrikanth Yalavarthi rte_ml_model_load(int16_t dev_id, struct rte_ml_model_params *params, uint16_t *model_id)
5714a662f54SSrikanth Yalavarthi {
5724a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
5734a662f54SSrikanth Yalavarthi 
5744a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
5754a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
5764a662f54SSrikanth Yalavarthi 		return -EINVAL;
5774a662f54SSrikanth Yalavarthi 	}
5784a662f54SSrikanth Yalavarthi 
5794a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
5804a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_load == NULL)
5814a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
5824a662f54SSrikanth Yalavarthi 
5834a662f54SSrikanth Yalavarthi 	if (params == NULL) {
5844a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, params cannot be NULL\n", dev_id);
5854a662f54SSrikanth Yalavarthi 		return -EINVAL;
5864a662f54SSrikanth Yalavarthi 	}
5874a662f54SSrikanth Yalavarthi 
5884a662f54SSrikanth Yalavarthi 	if (model_id == NULL) {
5894a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id cannot be NULL\n", dev_id);
5904a662f54SSrikanth Yalavarthi 		return -EINVAL;
5914a662f54SSrikanth Yalavarthi 	}
5924a662f54SSrikanth Yalavarthi 
5934a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_load)(dev, params, model_id);
5944a662f54SSrikanth Yalavarthi }
5954a662f54SSrikanth Yalavarthi 
5964a662f54SSrikanth Yalavarthi int
5974a662f54SSrikanth Yalavarthi rte_ml_model_unload(int16_t dev_id, uint16_t model_id)
5984a662f54SSrikanth Yalavarthi {
5994a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6004a662f54SSrikanth Yalavarthi 
6014a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
6024a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
6034a662f54SSrikanth Yalavarthi 		return -EINVAL;
6044a662f54SSrikanth Yalavarthi 	}
6054a662f54SSrikanth Yalavarthi 
6064a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6074a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_unload == NULL)
6084a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6094a662f54SSrikanth Yalavarthi 
6104a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_unload)(dev, model_id);
6114a662f54SSrikanth Yalavarthi }
6124a662f54SSrikanth Yalavarthi 
6134a662f54SSrikanth Yalavarthi int
6144a662f54SSrikanth Yalavarthi rte_ml_model_start(int16_t dev_id, uint16_t model_id)
6154a662f54SSrikanth Yalavarthi {
6164a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6174a662f54SSrikanth Yalavarthi 
6184a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
6194a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
6204a662f54SSrikanth Yalavarthi 		return -EINVAL;
6214a662f54SSrikanth Yalavarthi 	}
6224a662f54SSrikanth Yalavarthi 
6234a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6244a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_start == NULL)
6254a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6264a662f54SSrikanth Yalavarthi 
6274a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_start)(dev, model_id);
6284a662f54SSrikanth Yalavarthi }
6294a662f54SSrikanth Yalavarthi 
6304a662f54SSrikanth Yalavarthi int
6314a662f54SSrikanth Yalavarthi rte_ml_model_stop(int16_t dev_id, uint16_t model_id)
6324a662f54SSrikanth Yalavarthi {
6334a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6344a662f54SSrikanth Yalavarthi 
6354a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
6364a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
6374a662f54SSrikanth Yalavarthi 		return -EINVAL;
6384a662f54SSrikanth Yalavarthi 	}
6394a662f54SSrikanth Yalavarthi 
6404a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6414a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_stop == NULL)
6424a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6434a662f54SSrikanth Yalavarthi 
6444a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_stop)(dev, model_id);
6454a662f54SSrikanth Yalavarthi }
6464a662f54SSrikanth Yalavarthi 
6474a662f54SSrikanth Yalavarthi int
6484a662f54SSrikanth Yalavarthi rte_ml_model_info_get(int16_t dev_id, uint16_t model_id, struct rte_ml_model_info *model_info)
6494a662f54SSrikanth Yalavarthi {
6504a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6514a662f54SSrikanth Yalavarthi 
6524a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
6534a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
6544a662f54SSrikanth Yalavarthi 		return -EINVAL;
6554a662f54SSrikanth Yalavarthi 	}
6564a662f54SSrikanth Yalavarthi 
6574a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6584a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_info_get == NULL)
6594a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6604a662f54SSrikanth Yalavarthi 
6614a662f54SSrikanth Yalavarthi 	if (model_info == NULL) {
6624a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id %u, model_info cannot be NULL\n", dev_id,
6634a662f54SSrikanth Yalavarthi 			      model_id);
6644a662f54SSrikanth Yalavarthi 		return -EINVAL;
6654a662f54SSrikanth Yalavarthi 	}
6664a662f54SSrikanth Yalavarthi 
6674a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_info_get)(dev, model_id, model_info);
6684a662f54SSrikanth Yalavarthi }
6694a662f54SSrikanth Yalavarthi 
6704a662f54SSrikanth Yalavarthi int
6714a662f54SSrikanth Yalavarthi rte_ml_model_params_update(int16_t dev_id, uint16_t model_id, void *buffer)
6724a662f54SSrikanth Yalavarthi {
6734a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6744a662f54SSrikanth Yalavarthi 
6754a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
6764a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
6774a662f54SSrikanth Yalavarthi 		return -EINVAL;
6784a662f54SSrikanth Yalavarthi 	}
6794a662f54SSrikanth Yalavarthi 
6804a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6814a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_params_update == NULL)
6824a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6834a662f54SSrikanth Yalavarthi 
6844a662f54SSrikanth Yalavarthi 	if (buffer == NULL) {
6854a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, buffer cannot be NULL\n", dev_id);
6864a662f54SSrikanth Yalavarthi 		return -EINVAL;
6874a662f54SSrikanth Yalavarthi 	}
6884a662f54SSrikanth Yalavarthi 
6894a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_params_update)(dev, model_id, buffer);
6904a662f54SSrikanth Yalavarthi }
6914a662f54SSrikanth Yalavarthi 
69250818b0aSSrikanth Yalavarthi int
69350818b0aSSrikanth Yalavarthi rte_ml_io_input_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,
69450818b0aSSrikanth Yalavarthi 			 uint64_t *input_qsize, uint64_t *input_dsize)
69550818b0aSSrikanth Yalavarthi {
69650818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
69750818b0aSSrikanth Yalavarthi 
69850818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
69950818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
70050818b0aSSrikanth Yalavarthi 		return -EINVAL;
70150818b0aSSrikanth Yalavarthi 	}
70250818b0aSSrikanth Yalavarthi 
70350818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
70450818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_input_size_get == NULL)
70550818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
70650818b0aSSrikanth Yalavarthi 
70750818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_input_size_get)(dev, model_id, nb_batches, input_qsize,
70850818b0aSSrikanth Yalavarthi 						  input_dsize);
70950818b0aSSrikanth Yalavarthi }
71050818b0aSSrikanth Yalavarthi 
71150818b0aSSrikanth Yalavarthi int
71250818b0aSSrikanth Yalavarthi rte_ml_io_output_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,
71350818b0aSSrikanth Yalavarthi 			  uint64_t *output_qsize, uint64_t *output_dsize)
71450818b0aSSrikanth Yalavarthi {
71550818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
71650818b0aSSrikanth Yalavarthi 
71750818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
71850818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
71950818b0aSSrikanth Yalavarthi 		return -EINVAL;
72050818b0aSSrikanth Yalavarthi 	}
72150818b0aSSrikanth Yalavarthi 
72250818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
72350818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_output_size_get == NULL)
72450818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
72550818b0aSSrikanth Yalavarthi 
72650818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_output_size_get)(dev, model_id, nb_batches, output_qsize,
72750818b0aSSrikanth Yalavarthi 						   output_dsize);
72850818b0aSSrikanth Yalavarthi }
72950818b0aSSrikanth Yalavarthi 
73050818b0aSSrikanth Yalavarthi int
73150818b0aSSrikanth Yalavarthi rte_ml_io_quantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *dbuffer,
73250818b0aSSrikanth Yalavarthi 		   void *qbuffer)
73350818b0aSSrikanth Yalavarthi {
73450818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
73550818b0aSSrikanth Yalavarthi 
73650818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
73750818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
73850818b0aSSrikanth Yalavarthi 		return -EINVAL;
73950818b0aSSrikanth Yalavarthi 	}
74050818b0aSSrikanth Yalavarthi 
74150818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
74250818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_quantize == NULL)
74350818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
74450818b0aSSrikanth Yalavarthi 
74550818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
74650818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id);
74750818b0aSSrikanth Yalavarthi 		return -EINVAL;
74850818b0aSSrikanth Yalavarthi 	}
74950818b0aSSrikanth Yalavarthi 
75050818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
75150818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id);
75250818b0aSSrikanth Yalavarthi 		return -EINVAL;
75350818b0aSSrikanth Yalavarthi 	}
75450818b0aSSrikanth Yalavarthi 
75550818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_quantize)(dev, model_id, nb_batches, dbuffer, qbuffer);
75650818b0aSSrikanth Yalavarthi }
75750818b0aSSrikanth Yalavarthi 
75850818b0aSSrikanth Yalavarthi int
75950818b0aSSrikanth Yalavarthi rte_ml_io_dequantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *qbuffer,
76050818b0aSSrikanth Yalavarthi 		     void *dbuffer)
76150818b0aSSrikanth Yalavarthi {
76250818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
76350818b0aSSrikanth Yalavarthi 
76450818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
76550818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
76650818b0aSSrikanth Yalavarthi 		return -EINVAL;
76750818b0aSSrikanth Yalavarthi 	}
76850818b0aSSrikanth Yalavarthi 
76950818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
77050818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_dequantize == NULL)
77150818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
77250818b0aSSrikanth Yalavarthi 
77350818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
77450818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id);
77550818b0aSSrikanth Yalavarthi 		return -EINVAL;
77650818b0aSSrikanth Yalavarthi 	}
77750818b0aSSrikanth Yalavarthi 
77850818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
77950818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id);
78050818b0aSSrikanth Yalavarthi 		return -EINVAL;
78150818b0aSSrikanth Yalavarthi 	}
78250818b0aSSrikanth Yalavarthi 
78350818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_dequantize)(dev, model_id, nb_batches, qbuffer, dbuffer);
78450818b0aSSrikanth Yalavarthi }
78550818b0aSSrikanth Yalavarthi 
7861b365349SSrikanth Yalavarthi /** Initialise rte_ml_op mempool element */
7871b365349SSrikanth Yalavarthi static void
7881b365349SSrikanth Yalavarthi ml_op_init(struct rte_mempool *mempool, __rte_unused void *opaque_arg, void *_op_data,
7891b365349SSrikanth Yalavarthi 	   __rte_unused unsigned int i)
7901b365349SSrikanth Yalavarthi {
7911b365349SSrikanth Yalavarthi 	struct rte_ml_op *op = _op_data;
7921b365349SSrikanth Yalavarthi 
7931b365349SSrikanth Yalavarthi 	memset(_op_data, 0, mempool->elt_size);
7941b365349SSrikanth Yalavarthi 	op->status = RTE_ML_OP_STATUS_NOT_PROCESSED;
7951b365349SSrikanth Yalavarthi 	op->mempool = mempool;
7961b365349SSrikanth Yalavarthi }
7971b365349SSrikanth Yalavarthi 
7981b365349SSrikanth Yalavarthi struct rte_mempool *
7991b365349SSrikanth Yalavarthi rte_ml_op_pool_create(const char *name, unsigned int nb_elts, unsigned int cache_size,
8001b365349SSrikanth Yalavarthi 		      uint16_t user_size, int socket_id)
8011b365349SSrikanth Yalavarthi {
8021b365349SSrikanth Yalavarthi 	struct rte_ml_op_pool_private *priv;
8031b365349SSrikanth Yalavarthi 	struct rte_mempool *mp;
8041b365349SSrikanth Yalavarthi 	unsigned int elt_size;
8051b365349SSrikanth Yalavarthi 
8061b365349SSrikanth Yalavarthi 	/* lookup mempool in case already allocated */
8071b365349SSrikanth Yalavarthi 	mp = rte_mempool_lookup(name);
8081b365349SSrikanth Yalavarthi 	elt_size = sizeof(struct rte_ml_op) + user_size;
8091b365349SSrikanth Yalavarthi 
8101b365349SSrikanth Yalavarthi 	if (mp != NULL) {
8111b365349SSrikanth Yalavarthi 		priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp);
8121b365349SSrikanth Yalavarthi 		if (mp->elt_size != elt_size || mp->cache_size < cache_size || mp->size < nb_elts ||
8131b365349SSrikanth Yalavarthi 		    priv->user_size < user_size) {
8141b365349SSrikanth Yalavarthi 			mp = NULL;
8151b365349SSrikanth Yalavarthi 			RTE_MLDEV_LOG(ERR,
8161b365349SSrikanth Yalavarthi 				      "Mempool %s already exists but with incompatible parameters",
8171b365349SSrikanth Yalavarthi 				      name);
8181b365349SSrikanth Yalavarthi 			return NULL;
8191b365349SSrikanth Yalavarthi 		}
8201b365349SSrikanth Yalavarthi 		return mp;
8211b365349SSrikanth Yalavarthi 	}
8221b365349SSrikanth Yalavarthi 
8231b365349SSrikanth Yalavarthi 	mp = rte_mempool_create(name, nb_elts, elt_size, cache_size,
8241b365349SSrikanth Yalavarthi 				sizeof(struct rte_ml_op_pool_private), NULL, NULL, ml_op_init, NULL,
8251b365349SSrikanth Yalavarthi 				socket_id, 0);
8261b365349SSrikanth Yalavarthi 	if (mp == NULL) {
8271b365349SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Failed to create mempool %s", name);
8281b365349SSrikanth Yalavarthi 		return NULL;
8291b365349SSrikanth Yalavarthi 	}
8301b365349SSrikanth Yalavarthi 
8311b365349SSrikanth Yalavarthi 	priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp);
8321b365349SSrikanth Yalavarthi 	priv->user_size = user_size;
8331b365349SSrikanth Yalavarthi 
8341b365349SSrikanth Yalavarthi 	return mp;
8351b365349SSrikanth Yalavarthi }
8361b365349SSrikanth Yalavarthi 
8371b365349SSrikanth Yalavarthi void
8381b365349SSrikanth Yalavarthi rte_ml_op_pool_free(struct rte_mempool *mempool)
8391b365349SSrikanth Yalavarthi {
8401b365349SSrikanth Yalavarthi 	if (mempool != NULL)
8411b365349SSrikanth Yalavarthi 		rte_mempool_free(mempool);
8421b365349SSrikanth Yalavarthi }
8431b365349SSrikanth Yalavarthi 
844c775df1cSSrikanth Yalavarthi uint16_t
845c775df1cSSrikanth Yalavarthi rte_ml_enqueue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops)
846c775df1cSSrikanth Yalavarthi {
847c775df1cSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
848c775df1cSSrikanth Yalavarthi 
849c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
850c775df1cSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
851c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
852c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
853c775df1cSSrikanth Yalavarthi 		return 0;
854c775df1cSSrikanth Yalavarthi 	}
855c775df1cSSrikanth Yalavarthi 
856c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
857c775df1cSSrikanth Yalavarthi 	if (*dev->enqueue_burst == NULL) {
858c775df1cSSrikanth Yalavarthi 		rte_errno = -ENOTSUP;
859c775df1cSSrikanth Yalavarthi 		return 0;
860c775df1cSSrikanth Yalavarthi 	}
861c775df1cSSrikanth Yalavarthi 
862c775df1cSSrikanth Yalavarthi 	if (ops == NULL) {
863c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL\n", dev_id);
864c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
865c775df1cSSrikanth Yalavarthi 		return 0;
866c775df1cSSrikanth Yalavarthi 	}
867c775df1cSSrikanth Yalavarthi 
868c775df1cSSrikanth Yalavarthi 	if (qp_id >= dev->data->nb_queue_pairs) {
869c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid qp_id %u\n", qp_id);
870c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
871c775df1cSSrikanth Yalavarthi 		return 0;
872c775df1cSSrikanth Yalavarthi 	}
873c775df1cSSrikanth Yalavarthi #else
874c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
875c775df1cSSrikanth Yalavarthi #endif
876c775df1cSSrikanth Yalavarthi 
877c775df1cSSrikanth Yalavarthi 	return (*dev->enqueue_burst)(dev, qp_id, ops, nb_ops);
878c775df1cSSrikanth Yalavarthi }
879c775df1cSSrikanth Yalavarthi 
880c775df1cSSrikanth Yalavarthi uint16_t
881c775df1cSSrikanth Yalavarthi rte_ml_dequeue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops)
882c775df1cSSrikanth Yalavarthi {
883c775df1cSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
884c775df1cSSrikanth Yalavarthi 
885c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
886c775df1cSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
887c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
888c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
889c775df1cSSrikanth Yalavarthi 		return 0;
890c775df1cSSrikanth Yalavarthi 	}
891c775df1cSSrikanth Yalavarthi 
892c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
893c775df1cSSrikanth Yalavarthi 	if (*dev->dequeue_burst == NULL) {
894c775df1cSSrikanth Yalavarthi 		rte_errno = -ENOTSUP;
895c775df1cSSrikanth Yalavarthi 		return 0;
896c775df1cSSrikanth Yalavarthi 	}
897c775df1cSSrikanth Yalavarthi 
898c775df1cSSrikanth Yalavarthi 	if (ops == NULL) {
899c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL\n", dev_id);
900c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
901c775df1cSSrikanth Yalavarthi 		return 0;
902c775df1cSSrikanth Yalavarthi 	}
903c775df1cSSrikanth Yalavarthi 
904c775df1cSSrikanth Yalavarthi 	if (qp_id >= dev->data->nb_queue_pairs) {
905c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid qp_id %u\n", qp_id);
906c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
907c775df1cSSrikanth Yalavarthi 		return 0;
908c775df1cSSrikanth Yalavarthi 	}
909c775df1cSSrikanth Yalavarthi #else
910c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
911c775df1cSSrikanth Yalavarthi #endif
912c775df1cSSrikanth Yalavarthi 
913c775df1cSSrikanth Yalavarthi 	return (*dev->dequeue_burst)(dev, qp_id, ops, nb_ops);
914c775df1cSSrikanth Yalavarthi }
915c775df1cSSrikanth Yalavarthi 
916698d9061SSrikanth Yalavarthi int
917698d9061SSrikanth Yalavarthi rte_ml_op_error_get(int16_t dev_id, struct rte_ml_op *op, struct rte_ml_op_error *error)
918698d9061SSrikanth Yalavarthi {
919698d9061SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
920698d9061SSrikanth Yalavarthi 
921698d9061SSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
922698d9061SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
923698d9061SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
924698d9061SSrikanth Yalavarthi 		return -EINVAL;
925698d9061SSrikanth Yalavarthi 	}
926698d9061SSrikanth Yalavarthi 
927698d9061SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
928698d9061SSrikanth Yalavarthi 	if (*dev->op_error_get == NULL)
929698d9061SSrikanth Yalavarthi 		return -ENOTSUP;
930698d9061SSrikanth Yalavarthi 
931698d9061SSrikanth Yalavarthi 	if (op == NULL) {
932698d9061SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, op cannot be NULL\n", dev_id);
933698d9061SSrikanth Yalavarthi 		return -EINVAL;
934698d9061SSrikanth Yalavarthi 	}
935698d9061SSrikanth Yalavarthi 
936698d9061SSrikanth Yalavarthi 	if (error == NULL) {
937698d9061SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, error cannot be NULL\n", dev_id);
938698d9061SSrikanth Yalavarthi 		return -EINVAL;
939698d9061SSrikanth Yalavarthi 	}
940698d9061SSrikanth Yalavarthi #else
941698d9061SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
942698d9061SSrikanth Yalavarthi #endif
943698d9061SSrikanth Yalavarthi 
944698d9061SSrikanth Yalavarthi 	return (*dev->op_error_get)(dev, op, error);
945698d9061SSrikanth Yalavarthi }
946698d9061SSrikanth Yalavarthi 
947d82cac58SJerin Jacob RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO);
948