xref: /dpdk/lib/mldev/rte_mldev.c (revision b3caa0f819dd08ac90397c3c176345ef71725cdd)
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
403*b3caa0f8SSrikanth Yalavarthi rte_ml_dev_stats_get(int16_t dev_id, struct rte_ml_dev_stats *stats)
404*b3caa0f8SSrikanth Yalavarthi {
405*b3caa0f8SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
406*b3caa0f8SSrikanth Yalavarthi 
407*b3caa0f8SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
408*b3caa0f8SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
409*b3caa0f8SSrikanth Yalavarthi 		return -EINVAL;
410*b3caa0f8SSrikanth Yalavarthi 	}
411*b3caa0f8SSrikanth Yalavarthi 
412*b3caa0f8SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
413*b3caa0f8SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stats_get == NULL)
414*b3caa0f8SSrikanth Yalavarthi 		return -ENOTSUP;
415*b3caa0f8SSrikanth Yalavarthi 
416*b3caa0f8SSrikanth Yalavarthi 	if (stats == NULL) {
417*b3caa0f8SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, stats cannot be NULL\n", dev_id);
418*b3caa0f8SSrikanth Yalavarthi 		return -EINVAL;
419*b3caa0f8SSrikanth Yalavarthi 	}
420*b3caa0f8SSrikanth Yalavarthi 	memset(stats, 0, sizeof(struct rte_ml_dev_stats));
421*b3caa0f8SSrikanth Yalavarthi 
422*b3caa0f8SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_stats_get)(dev, stats);
423*b3caa0f8SSrikanth Yalavarthi }
424*b3caa0f8SSrikanth Yalavarthi 
425*b3caa0f8SSrikanth Yalavarthi void
426*b3caa0f8SSrikanth Yalavarthi rte_ml_dev_stats_reset(int16_t dev_id)
427*b3caa0f8SSrikanth Yalavarthi {
428*b3caa0f8SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
429*b3caa0f8SSrikanth Yalavarthi 
430*b3caa0f8SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
431*b3caa0f8SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
432*b3caa0f8SSrikanth Yalavarthi 		return;
433*b3caa0f8SSrikanth Yalavarthi 	}
434*b3caa0f8SSrikanth Yalavarthi 
435*b3caa0f8SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
436*b3caa0f8SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stats_reset == NULL)
437*b3caa0f8SSrikanth Yalavarthi 		return;
438*b3caa0f8SSrikanth Yalavarthi 
439*b3caa0f8SSrikanth Yalavarthi 	(*dev->dev_ops->dev_stats_reset)(dev);
440*b3caa0f8SSrikanth Yalavarthi }
441*b3caa0f8SSrikanth Yalavarthi 
442*b3caa0f8SSrikanth Yalavarthi int
4434a662f54SSrikanth Yalavarthi rte_ml_model_load(int16_t dev_id, struct rte_ml_model_params *params, uint16_t *model_id)
4444a662f54SSrikanth Yalavarthi {
4454a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4464a662f54SSrikanth Yalavarthi 
4474a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4484a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4494a662f54SSrikanth Yalavarthi 		return -EINVAL;
4504a662f54SSrikanth Yalavarthi 	}
4514a662f54SSrikanth Yalavarthi 
4524a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4534a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_load == NULL)
4544a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4554a662f54SSrikanth Yalavarthi 
4564a662f54SSrikanth Yalavarthi 	if (params == NULL) {
4574a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, params cannot be NULL\n", dev_id);
4584a662f54SSrikanth Yalavarthi 		return -EINVAL;
4594a662f54SSrikanth Yalavarthi 	}
4604a662f54SSrikanth Yalavarthi 
4614a662f54SSrikanth Yalavarthi 	if (model_id == NULL) {
4624a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id cannot be NULL\n", dev_id);
4634a662f54SSrikanth Yalavarthi 		return -EINVAL;
4644a662f54SSrikanth Yalavarthi 	}
4654a662f54SSrikanth Yalavarthi 
4664a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_load)(dev, params, model_id);
4674a662f54SSrikanth Yalavarthi }
4684a662f54SSrikanth Yalavarthi 
4694a662f54SSrikanth Yalavarthi int
4704a662f54SSrikanth Yalavarthi rte_ml_model_unload(int16_t dev_id, uint16_t model_id)
4714a662f54SSrikanth Yalavarthi {
4724a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4734a662f54SSrikanth Yalavarthi 
4744a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4754a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4764a662f54SSrikanth Yalavarthi 		return -EINVAL;
4774a662f54SSrikanth Yalavarthi 	}
4784a662f54SSrikanth Yalavarthi 
4794a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4804a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_unload == NULL)
4814a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4824a662f54SSrikanth Yalavarthi 
4834a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_unload)(dev, model_id);
4844a662f54SSrikanth Yalavarthi }
4854a662f54SSrikanth Yalavarthi 
4864a662f54SSrikanth Yalavarthi int
4874a662f54SSrikanth Yalavarthi rte_ml_model_start(int16_t dev_id, uint16_t model_id)
4884a662f54SSrikanth Yalavarthi {
4894a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4904a662f54SSrikanth Yalavarthi 
4914a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4924a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4934a662f54SSrikanth Yalavarthi 		return -EINVAL;
4944a662f54SSrikanth Yalavarthi 	}
4954a662f54SSrikanth Yalavarthi 
4964a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4974a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_start == NULL)
4984a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4994a662f54SSrikanth Yalavarthi 
5004a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_start)(dev, model_id);
5014a662f54SSrikanth Yalavarthi }
5024a662f54SSrikanth Yalavarthi 
5034a662f54SSrikanth Yalavarthi int
5044a662f54SSrikanth Yalavarthi rte_ml_model_stop(int16_t dev_id, uint16_t model_id)
5054a662f54SSrikanth Yalavarthi {
5064a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
5074a662f54SSrikanth Yalavarthi 
5084a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
5094a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
5104a662f54SSrikanth Yalavarthi 		return -EINVAL;
5114a662f54SSrikanth Yalavarthi 	}
5124a662f54SSrikanth Yalavarthi 
5134a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
5144a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_stop == NULL)
5154a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
5164a662f54SSrikanth Yalavarthi 
5174a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_stop)(dev, model_id);
5184a662f54SSrikanth Yalavarthi }
5194a662f54SSrikanth Yalavarthi 
5204a662f54SSrikanth Yalavarthi int
5214a662f54SSrikanth Yalavarthi rte_ml_model_info_get(int16_t dev_id, uint16_t model_id, struct rte_ml_model_info *model_info)
5224a662f54SSrikanth Yalavarthi {
5234a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
5244a662f54SSrikanth Yalavarthi 
5254a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
5264a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
5274a662f54SSrikanth Yalavarthi 		return -EINVAL;
5284a662f54SSrikanth Yalavarthi 	}
5294a662f54SSrikanth Yalavarthi 
5304a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
5314a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_info_get == NULL)
5324a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
5334a662f54SSrikanth Yalavarthi 
5344a662f54SSrikanth Yalavarthi 	if (model_info == NULL) {
5354a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id %u, model_info cannot be NULL\n", dev_id,
5364a662f54SSrikanth Yalavarthi 			      model_id);
5374a662f54SSrikanth Yalavarthi 		return -EINVAL;
5384a662f54SSrikanth Yalavarthi 	}
5394a662f54SSrikanth Yalavarthi 
5404a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_info_get)(dev, model_id, model_info);
5414a662f54SSrikanth Yalavarthi }
5424a662f54SSrikanth Yalavarthi 
5434a662f54SSrikanth Yalavarthi int
5444a662f54SSrikanth Yalavarthi rte_ml_model_params_update(int16_t dev_id, uint16_t model_id, void *buffer)
5454a662f54SSrikanth Yalavarthi {
5464a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
5474a662f54SSrikanth Yalavarthi 
5484a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
5494a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
5504a662f54SSrikanth Yalavarthi 		return -EINVAL;
5514a662f54SSrikanth Yalavarthi 	}
5524a662f54SSrikanth Yalavarthi 
5534a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
5544a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_params_update == NULL)
5554a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
5564a662f54SSrikanth Yalavarthi 
5574a662f54SSrikanth Yalavarthi 	if (buffer == NULL) {
5584a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, buffer cannot be NULL\n", dev_id);
5594a662f54SSrikanth Yalavarthi 		return -EINVAL;
5604a662f54SSrikanth Yalavarthi 	}
5614a662f54SSrikanth Yalavarthi 
5624a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_params_update)(dev, model_id, buffer);
5634a662f54SSrikanth Yalavarthi }
5644a662f54SSrikanth Yalavarthi 
56550818b0aSSrikanth Yalavarthi int
56650818b0aSSrikanth Yalavarthi rte_ml_io_input_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,
56750818b0aSSrikanth Yalavarthi 			 uint64_t *input_qsize, uint64_t *input_dsize)
56850818b0aSSrikanth Yalavarthi {
56950818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
57050818b0aSSrikanth Yalavarthi 
57150818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
57250818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
57350818b0aSSrikanth Yalavarthi 		return -EINVAL;
57450818b0aSSrikanth Yalavarthi 	}
57550818b0aSSrikanth Yalavarthi 
57650818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
57750818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_input_size_get == NULL)
57850818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
57950818b0aSSrikanth Yalavarthi 
58050818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_input_size_get)(dev, model_id, nb_batches, input_qsize,
58150818b0aSSrikanth Yalavarthi 						  input_dsize);
58250818b0aSSrikanth Yalavarthi }
58350818b0aSSrikanth Yalavarthi 
58450818b0aSSrikanth Yalavarthi int
58550818b0aSSrikanth Yalavarthi rte_ml_io_output_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,
58650818b0aSSrikanth Yalavarthi 			  uint64_t *output_qsize, uint64_t *output_dsize)
58750818b0aSSrikanth Yalavarthi {
58850818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
58950818b0aSSrikanth Yalavarthi 
59050818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
59150818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
59250818b0aSSrikanth Yalavarthi 		return -EINVAL;
59350818b0aSSrikanth Yalavarthi 	}
59450818b0aSSrikanth Yalavarthi 
59550818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
59650818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_output_size_get == NULL)
59750818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
59850818b0aSSrikanth Yalavarthi 
59950818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_output_size_get)(dev, model_id, nb_batches, output_qsize,
60050818b0aSSrikanth Yalavarthi 						   output_dsize);
60150818b0aSSrikanth Yalavarthi }
60250818b0aSSrikanth Yalavarthi 
60350818b0aSSrikanth Yalavarthi int
60450818b0aSSrikanth Yalavarthi rte_ml_io_quantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *dbuffer,
60550818b0aSSrikanth Yalavarthi 		   void *qbuffer)
60650818b0aSSrikanth Yalavarthi {
60750818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
60850818b0aSSrikanth Yalavarthi 
60950818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
61050818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
61150818b0aSSrikanth Yalavarthi 		return -EINVAL;
61250818b0aSSrikanth Yalavarthi 	}
61350818b0aSSrikanth Yalavarthi 
61450818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
61550818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_quantize == NULL)
61650818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
61750818b0aSSrikanth Yalavarthi 
61850818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
61950818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id);
62050818b0aSSrikanth Yalavarthi 		return -EINVAL;
62150818b0aSSrikanth Yalavarthi 	}
62250818b0aSSrikanth Yalavarthi 
62350818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
62450818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id);
62550818b0aSSrikanth Yalavarthi 		return -EINVAL;
62650818b0aSSrikanth Yalavarthi 	}
62750818b0aSSrikanth Yalavarthi 
62850818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_quantize)(dev, model_id, nb_batches, dbuffer, qbuffer);
62950818b0aSSrikanth Yalavarthi }
63050818b0aSSrikanth Yalavarthi 
63150818b0aSSrikanth Yalavarthi int
63250818b0aSSrikanth Yalavarthi rte_ml_io_dequantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *qbuffer,
63350818b0aSSrikanth Yalavarthi 		     void *dbuffer)
63450818b0aSSrikanth Yalavarthi {
63550818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
63650818b0aSSrikanth Yalavarthi 
63750818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
63850818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
63950818b0aSSrikanth Yalavarthi 		return -EINVAL;
64050818b0aSSrikanth Yalavarthi 	}
64150818b0aSSrikanth Yalavarthi 
64250818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
64350818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_dequantize == NULL)
64450818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
64550818b0aSSrikanth Yalavarthi 
64650818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
64750818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id);
64850818b0aSSrikanth Yalavarthi 		return -EINVAL;
64950818b0aSSrikanth Yalavarthi 	}
65050818b0aSSrikanth Yalavarthi 
65150818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
65250818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id);
65350818b0aSSrikanth Yalavarthi 		return -EINVAL;
65450818b0aSSrikanth Yalavarthi 	}
65550818b0aSSrikanth Yalavarthi 
65650818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_dequantize)(dev, model_id, nb_batches, qbuffer, dbuffer);
65750818b0aSSrikanth Yalavarthi }
65850818b0aSSrikanth Yalavarthi 
6591b365349SSrikanth Yalavarthi /** Initialise rte_ml_op mempool element */
6601b365349SSrikanth Yalavarthi static void
6611b365349SSrikanth Yalavarthi ml_op_init(struct rte_mempool *mempool, __rte_unused void *opaque_arg, void *_op_data,
6621b365349SSrikanth Yalavarthi 	   __rte_unused unsigned int i)
6631b365349SSrikanth Yalavarthi {
6641b365349SSrikanth Yalavarthi 	struct rte_ml_op *op = _op_data;
6651b365349SSrikanth Yalavarthi 
6661b365349SSrikanth Yalavarthi 	memset(_op_data, 0, mempool->elt_size);
6671b365349SSrikanth Yalavarthi 	op->status = RTE_ML_OP_STATUS_NOT_PROCESSED;
6681b365349SSrikanth Yalavarthi 	op->mempool = mempool;
6691b365349SSrikanth Yalavarthi }
6701b365349SSrikanth Yalavarthi 
6711b365349SSrikanth Yalavarthi struct rte_mempool *
6721b365349SSrikanth Yalavarthi rte_ml_op_pool_create(const char *name, unsigned int nb_elts, unsigned int cache_size,
6731b365349SSrikanth Yalavarthi 		      uint16_t user_size, int socket_id)
6741b365349SSrikanth Yalavarthi {
6751b365349SSrikanth Yalavarthi 	struct rte_ml_op_pool_private *priv;
6761b365349SSrikanth Yalavarthi 	struct rte_mempool *mp;
6771b365349SSrikanth Yalavarthi 	unsigned int elt_size;
6781b365349SSrikanth Yalavarthi 
6791b365349SSrikanth Yalavarthi 	/* lookup mempool in case already allocated */
6801b365349SSrikanth Yalavarthi 	mp = rte_mempool_lookup(name);
6811b365349SSrikanth Yalavarthi 	elt_size = sizeof(struct rte_ml_op) + user_size;
6821b365349SSrikanth Yalavarthi 
6831b365349SSrikanth Yalavarthi 	if (mp != NULL) {
6841b365349SSrikanth Yalavarthi 		priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp);
6851b365349SSrikanth Yalavarthi 		if (mp->elt_size != elt_size || mp->cache_size < cache_size || mp->size < nb_elts ||
6861b365349SSrikanth Yalavarthi 		    priv->user_size < user_size) {
6871b365349SSrikanth Yalavarthi 			mp = NULL;
6881b365349SSrikanth Yalavarthi 			RTE_MLDEV_LOG(ERR,
6891b365349SSrikanth Yalavarthi 				      "Mempool %s already exists but with incompatible parameters",
6901b365349SSrikanth Yalavarthi 				      name);
6911b365349SSrikanth Yalavarthi 			return NULL;
6921b365349SSrikanth Yalavarthi 		}
6931b365349SSrikanth Yalavarthi 		return mp;
6941b365349SSrikanth Yalavarthi 	}
6951b365349SSrikanth Yalavarthi 
6961b365349SSrikanth Yalavarthi 	mp = rte_mempool_create(name, nb_elts, elt_size, cache_size,
6971b365349SSrikanth Yalavarthi 				sizeof(struct rte_ml_op_pool_private), NULL, NULL, ml_op_init, NULL,
6981b365349SSrikanth Yalavarthi 				socket_id, 0);
6991b365349SSrikanth Yalavarthi 	if (mp == NULL) {
7001b365349SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Failed to create mempool %s", name);
7011b365349SSrikanth Yalavarthi 		return NULL;
7021b365349SSrikanth Yalavarthi 	}
7031b365349SSrikanth Yalavarthi 
7041b365349SSrikanth Yalavarthi 	priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp);
7051b365349SSrikanth Yalavarthi 	priv->user_size = user_size;
7061b365349SSrikanth Yalavarthi 
7071b365349SSrikanth Yalavarthi 	return mp;
7081b365349SSrikanth Yalavarthi }
7091b365349SSrikanth Yalavarthi 
7101b365349SSrikanth Yalavarthi void
7111b365349SSrikanth Yalavarthi rte_ml_op_pool_free(struct rte_mempool *mempool)
7121b365349SSrikanth Yalavarthi {
7131b365349SSrikanth Yalavarthi 	if (mempool != NULL)
7141b365349SSrikanth Yalavarthi 		rte_mempool_free(mempool);
7151b365349SSrikanth Yalavarthi }
7161b365349SSrikanth Yalavarthi 
717c775df1cSSrikanth Yalavarthi uint16_t
718c775df1cSSrikanth Yalavarthi rte_ml_enqueue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops)
719c775df1cSSrikanth Yalavarthi {
720c775df1cSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
721c775df1cSSrikanth Yalavarthi 
722c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
723c775df1cSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
724c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
725c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
726c775df1cSSrikanth Yalavarthi 		return 0;
727c775df1cSSrikanth Yalavarthi 	}
728c775df1cSSrikanth Yalavarthi 
729c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
730c775df1cSSrikanth Yalavarthi 	if (*dev->enqueue_burst == NULL) {
731c775df1cSSrikanth Yalavarthi 		rte_errno = -ENOTSUP;
732c775df1cSSrikanth Yalavarthi 		return 0;
733c775df1cSSrikanth Yalavarthi 	}
734c775df1cSSrikanth Yalavarthi 
735c775df1cSSrikanth Yalavarthi 	if (ops == NULL) {
736c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL\n", dev_id);
737c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
738c775df1cSSrikanth Yalavarthi 		return 0;
739c775df1cSSrikanth Yalavarthi 	}
740c775df1cSSrikanth Yalavarthi 
741c775df1cSSrikanth Yalavarthi 	if (qp_id >= dev->data->nb_queue_pairs) {
742c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid qp_id %u\n", qp_id);
743c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
744c775df1cSSrikanth Yalavarthi 		return 0;
745c775df1cSSrikanth Yalavarthi 	}
746c775df1cSSrikanth Yalavarthi #else
747c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
748c775df1cSSrikanth Yalavarthi #endif
749c775df1cSSrikanth Yalavarthi 
750c775df1cSSrikanth Yalavarthi 	return (*dev->enqueue_burst)(dev, qp_id, ops, nb_ops);
751c775df1cSSrikanth Yalavarthi }
752c775df1cSSrikanth Yalavarthi 
753c775df1cSSrikanth Yalavarthi uint16_t
754c775df1cSSrikanth Yalavarthi rte_ml_dequeue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops)
755c775df1cSSrikanth Yalavarthi {
756c775df1cSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
757c775df1cSSrikanth Yalavarthi 
758c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
759c775df1cSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
760c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
761c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
762c775df1cSSrikanth Yalavarthi 		return 0;
763c775df1cSSrikanth Yalavarthi 	}
764c775df1cSSrikanth Yalavarthi 
765c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
766c775df1cSSrikanth Yalavarthi 	if (*dev->dequeue_burst == NULL) {
767c775df1cSSrikanth Yalavarthi 		rte_errno = -ENOTSUP;
768c775df1cSSrikanth Yalavarthi 		return 0;
769c775df1cSSrikanth Yalavarthi 	}
770c775df1cSSrikanth Yalavarthi 
771c775df1cSSrikanth Yalavarthi 	if (ops == NULL) {
772c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL\n", dev_id);
773c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
774c775df1cSSrikanth Yalavarthi 		return 0;
775c775df1cSSrikanth Yalavarthi 	}
776c775df1cSSrikanth Yalavarthi 
777c775df1cSSrikanth Yalavarthi 	if (qp_id >= dev->data->nb_queue_pairs) {
778c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid qp_id %u\n", qp_id);
779c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
780c775df1cSSrikanth Yalavarthi 		return 0;
781c775df1cSSrikanth Yalavarthi 	}
782c775df1cSSrikanth Yalavarthi #else
783c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
784c775df1cSSrikanth Yalavarthi #endif
785c775df1cSSrikanth Yalavarthi 
786c775df1cSSrikanth Yalavarthi 	return (*dev->dequeue_burst)(dev, qp_id, ops, nb_ops);
787c775df1cSSrikanth Yalavarthi }
788c775df1cSSrikanth Yalavarthi 
789d82cac58SJerin Jacob RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO);
790