xref: /dpdk/lib/mldev/rte_mldev.c (revision c775df1ca36effd7dcb3909dc870e8614b7ec764)
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 
117*c775df1cSSrikanth Yalavarthi 	dev->enqueue_burst = NULL;
118*c775df1cSSrikanth Yalavarthi 	dev->dequeue_burst = NULL;
119*c775df1cSSrikanth 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
4034a662f54SSrikanth Yalavarthi rte_ml_model_load(int16_t dev_id, struct rte_ml_model_params *params, uint16_t *model_id)
4044a662f54SSrikanth Yalavarthi {
4054a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4064a662f54SSrikanth Yalavarthi 
4074a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4084a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4094a662f54SSrikanth Yalavarthi 		return -EINVAL;
4104a662f54SSrikanth Yalavarthi 	}
4114a662f54SSrikanth Yalavarthi 
4124a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4134a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_load == NULL)
4144a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4154a662f54SSrikanth Yalavarthi 
4164a662f54SSrikanth Yalavarthi 	if (params == NULL) {
4174a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, params cannot be NULL\n", dev_id);
4184a662f54SSrikanth Yalavarthi 		return -EINVAL;
4194a662f54SSrikanth Yalavarthi 	}
4204a662f54SSrikanth Yalavarthi 
4214a662f54SSrikanth Yalavarthi 	if (model_id == NULL) {
4224a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id cannot be NULL\n", dev_id);
4234a662f54SSrikanth Yalavarthi 		return -EINVAL;
4244a662f54SSrikanth Yalavarthi 	}
4254a662f54SSrikanth Yalavarthi 
4264a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_load)(dev, params, model_id);
4274a662f54SSrikanth Yalavarthi }
4284a662f54SSrikanth Yalavarthi 
4294a662f54SSrikanth Yalavarthi int
4304a662f54SSrikanth Yalavarthi rte_ml_model_unload(int16_t dev_id, uint16_t model_id)
4314a662f54SSrikanth Yalavarthi {
4324a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4334a662f54SSrikanth Yalavarthi 
4344a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4354a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4364a662f54SSrikanth Yalavarthi 		return -EINVAL;
4374a662f54SSrikanth Yalavarthi 	}
4384a662f54SSrikanth Yalavarthi 
4394a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4404a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_unload == NULL)
4414a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4424a662f54SSrikanth Yalavarthi 
4434a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_unload)(dev, model_id);
4444a662f54SSrikanth Yalavarthi }
4454a662f54SSrikanth Yalavarthi 
4464a662f54SSrikanth Yalavarthi int
4474a662f54SSrikanth Yalavarthi rte_ml_model_start(int16_t dev_id, uint16_t model_id)
4484a662f54SSrikanth Yalavarthi {
4494a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4504a662f54SSrikanth Yalavarthi 
4514a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4524a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4534a662f54SSrikanth Yalavarthi 		return -EINVAL;
4544a662f54SSrikanth Yalavarthi 	}
4554a662f54SSrikanth Yalavarthi 
4564a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4574a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_start == NULL)
4584a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4594a662f54SSrikanth Yalavarthi 
4604a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_start)(dev, model_id);
4614a662f54SSrikanth Yalavarthi }
4624a662f54SSrikanth Yalavarthi 
4634a662f54SSrikanth Yalavarthi int
4644a662f54SSrikanth Yalavarthi rte_ml_model_stop(int16_t dev_id, uint16_t model_id)
4654a662f54SSrikanth Yalavarthi {
4664a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4674a662f54SSrikanth Yalavarthi 
4684a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4694a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4704a662f54SSrikanth Yalavarthi 		return -EINVAL;
4714a662f54SSrikanth Yalavarthi 	}
4724a662f54SSrikanth Yalavarthi 
4734a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4744a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_stop == NULL)
4754a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4764a662f54SSrikanth Yalavarthi 
4774a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_stop)(dev, model_id);
4784a662f54SSrikanth Yalavarthi }
4794a662f54SSrikanth Yalavarthi 
4804a662f54SSrikanth Yalavarthi int
4814a662f54SSrikanth Yalavarthi rte_ml_model_info_get(int16_t dev_id, uint16_t model_id, struct rte_ml_model_info *model_info)
4824a662f54SSrikanth Yalavarthi {
4834a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4844a662f54SSrikanth Yalavarthi 
4854a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4864a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4874a662f54SSrikanth Yalavarthi 		return -EINVAL;
4884a662f54SSrikanth Yalavarthi 	}
4894a662f54SSrikanth Yalavarthi 
4904a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4914a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_info_get == NULL)
4924a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4934a662f54SSrikanth Yalavarthi 
4944a662f54SSrikanth Yalavarthi 	if (model_info == NULL) {
4954a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id %u, model_info cannot be NULL\n", dev_id,
4964a662f54SSrikanth Yalavarthi 			      model_id);
4974a662f54SSrikanth Yalavarthi 		return -EINVAL;
4984a662f54SSrikanth Yalavarthi 	}
4994a662f54SSrikanth Yalavarthi 
5004a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_info_get)(dev, model_id, model_info);
5014a662f54SSrikanth Yalavarthi }
5024a662f54SSrikanth Yalavarthi 
5034a662f54SSrikanth Yalavarthi int
5044a662f54SSrikanth Yalavarthi rte_ml_model_params_update(int16_t dev_id, uint16_t model_id, void *buffer)
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_params_update == NULL)
5154a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
5164a662f54SSrikanth Yalavarthi 
5174a662f54SSrikanth Yalavarthi 	if (buffer == NULL) {
5184a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, buffer cannot be NULL\n", dev_id);
5194a662f54SSrikanth Yalavarthi 		return -EINVAL;
5204a662f54SSrikanth Yalavarthi 	}
5214a662f54SSrikanth Yalavarthi 
5224a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_params_update)(dev, model_id, buffer);
5234a662f54SSrikanth Yalavarthi }
5244a662f54SSrikanth Yalavarthi 
52550818b0aSSrikanth Yalavarthi int
52650818b0aSSrikanth Yalavarthi rte_ml_io_input_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,
52750818b0aSSrikanth Yalavarthi 			 uint64_t *input_qsize, uint64_t *input_dsize)
52850818b0aSSrikanth Yalavarthi {
52950818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
53050818b0aSSrikanth Yalavarthi 
53150818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
53250818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
53350818b0aSSrikanth Yalavarthi 		return -EINVAL;
53450818b0aSSrikanth Yalavarthi 	}
53550818b0aSSrikanth Yalavarthi 
53650818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
53750818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_input_size_get == NULL)
53850818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
53950818b0aSSrikanth Yalavarthi 
54050818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_input_size_get)(dev, model_id, nb_batches, input_qsize,
54150818b0aSSrikanth Yalavarthi 						  input_dsize);
54250818b0aSSrikanth Yalavarthi }
54350818b0aSSrikanth Yalavarthi 
54450818b0aSSrikanth Yalavarthi int
54550818b0aSSrikanth Yalavarthi rte_ml_io_output_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,
54650818b0aSSrikanth Yalavarthi 			  uint64_t *output_qsize, uint64_t *output_dsize)
54750818b0aSSrikanth Yalavarthi {
54850818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
54950818b0aSSrikanth Yalavarthi 
55050818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
55150818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
55250818b0aSSrikanth Yalavarthi 		return -EINVAL;
55350818b0aSSrikanth Yalavarthi 	}
55450818b0aSSrikanth Yalavarthi 
55550818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
55650818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_output_size_get == NULL)
55750818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
55850818b0aSSrikanth Yalavarthi 
55950818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_output_size_get)(dev, model_id, nb_batches, output_qsize,
56050818b0aSSrikanth Yalavarthi 						   output_dsize);
56150818b0aSSrikanth Yalavarthi }
56250818b0aSSrikanth Yalavarthi 
56350818b0aSSrikanth Yalavarthi int
56450818b0aSSrikanth Yalavarthi rte_ml_io_quantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *dbuffer,
56550818b0aSSrikanth Yalavarthi 		   void *qbuffer)
56650818b0aSSrikanth Yalavarthi {
56750818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
56850818b0aSSrikanth Yalavarthi 
56950818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
57050818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
57150818b0aSSrikanth Yalavarthi 		return -EINVAL;
57250818b0aSSrikanth Yalavarthi 	}
57350818b0aSSrikanth Yalavarthi 
57450818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
57550818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_quantize == NULL)
57650818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
57750818b0aSSrikanth Yalavarthi 
57850818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
57950818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id);
58050818b0aSSrikanth Yalavarthi 		return -EINVAL;
58150818b0aSSrikanth Yalavarthi 	}
58250818b0aSSrikanth Yalavarthi 
58350818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
58450818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id);
58550818b0aSSrikanth Yalavarthi 		return -EINVAL;
58650818b0aSSrikanth Yalavarthi 	}
58750818b0aSSrikanth Yalavarthi 
58850818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_quantize)(dev, model_id, nb_batches, dbuffer, qbuffer);
58950818b0aSSrikanth Yalavarthi }
59050818b0aSSrikanth Yalavarthi 
59150818b0aSSrikanth Yalavarthi int
59250818b0aSSrikanth Yalavarthi rte_ml_io_dequantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *qbuffer,
59350818b0aSSrikanth Yalavarthi 		     void *dbuffer)
59450818b0aSSrikanth Yalavarthi {
59550818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
59650818b0aSSrikanth Yalavarthi 
59750818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
59850818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
59950818b0aSSrikanth Yalavarthi 		return -EINVAL;
60050818b0aSSrikanth Yalavarthi 	}
60150818b0aSSrikanth Yalavarthi 
60250818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
60350818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_dequantize == NULL)
60450818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
60550818b0aSSrikanth Yalavarthi 
60650818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
60750818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id);
60850818b0aSSrikanth Yalavarthi 		return -EINVAL;
60950818b0aSSrikanth Yalavarthi 	}
61050818b0aSSrikanth Yalavarthi 
61150818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
61250818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id);
61350818b0aSSrikanth Yalavarthi 		return -EINVAL;
61450818b0aSSrikanth Yalavarthi 	}
61550818b0aSSrikanth Yalavarthi 
61650818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_dequantize)(dev, model_id, nb_batches, qbuffer, dbuffer);
61750818b0aSSrikanth Yalavarthi }
61850818b0aSSrikanth Yalavarthi 
6191b365349SSrikanth Yalavarthi /** Initialise rte_ml_op mempool element */
6201b365349SSrikanth Yalavarthi static void
6211b365349SSrikanth Yalavarthi ml_op_init(struct rte_mempool *mempool, __rte_unused void *opaque_arg, void *_op_data,
6221b365349SSrikanth Yalavarthi 	   __rte_unused unsigned int i)
6231b365349SSrikanth Yalavarthi {
6241b365349SSrikanth Yalavarthi 	struct rte_ml_op *op = _op_data;
6251b365349SSrikanth Yalavarthi 
6261b365349SSrikanth Yalavarthi 	memset(_op_data, 0, mempool->elt_size);
6271b365349SSrikanth Yalavarthi 	op->status = RTE_ML_OP_STATUS_NOT_PROCESSED;
6281b365349SSrikanth Yalavarthi 	op->mempool = mempool;
6291b365349SSrikanth Yalavarthi }
6301b365349SSrikanth Yalavarthi 
6311b365349SSrikanth Yalavarthi struct rte_mempool *
6321b365349SSrikanth Yalavarthi rte_ml_op_pool_create(const char *name, unsigned int nb_elts, unsigned int cache_size,
6331b365349SSrikanth Yalavarthi 		      uint16_t user_size, int socket_id)
6341b365349SSrikanth Yalavarthi {
6351b365349SSrikanth Yalavarthi 	struct rte_ml_op_pool_private *priv;
6361b365349SSrikanth Yalavarthi 	struct rte_mempool *mp;
6371b365349SSrikanth Yalavarthi 	unsigned int elt_size;
6381b365349SSrikanth Yalavarthi 
6391b365349SSrikanth Yalavarthi 	/* lookup mempool in case already allocated */
6401b365349SSrikanth Yalavarthi 	mp = rte_mempool_lookup(name);
6411b365349SSrikanth Yalavarthi 	elt_size = sizeof(struct rte_ml_op) + user_size;
6421b365349SSrikanth Yalavarthi 
6431b365349SSrikanth Yalavarthi 	if (mp != NULL) {
6441b365349SSrikanth Yalavarthi 		priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp);
6451b365349SSrikanth Yalavarthi 		if (mp->elt_size != elt_size || mp->cache_size < cache_size || mp->size < nb_elts ||
6461b365349SSrikanth Yalavarthi 		    priv->user_size < user_size) {
6471b365349SSrikanth Yalavarthi 			mp = NULL;
6481b365349SSrikanth Yalavarthi 			RTE_MLDEV_LOG(ERR,
6491b365349SSrikanth Yalavarthi 				      "Mempool %s already exists but with incompatible parameters",
6501b365349SSrikanth Yalavarthi 				      name);
6511b365349SSrikanth Yalavarthi 			return NULL;
6521b365349SSrikanth Yalavarthi 		}
6531b365349SSrikanth Yalavarthi 		return mp;
6541b365349SSrikanth Yalavarthi 	}
6551b365349SSrikanth Yalavarthi 
6561b365349SSrikanth Yalavarthi 	mp = rte_mempool_create(name, nb_elts, elt_size, cache_size,
6571b365349SSrikanth Yalavarthi 				sizeof(struct rte_ml_op_pool_private), NULL, NULL, ml_op_init, NULL,
6581b365349SSrikanth Yalavarthi 				socket_id, 0);
6591b365349SSrikanth Yalavarthi 	if (mp == NULL) {
6601b365349SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Failed to create mempool %s", name);
6611b365349SSrikanth Yalavarthi 		return NULL;
6621b365349SSrikanth Yalavarthi 	}
6631b365349SSrikanth Yalavarthi 
6641b365349SSrikanth Yalavarthi 	priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp);
6651b365349SSrikanth Yalavarthi 	priv->user_size = user_size;
6661b365349SSrikanth Yalavarthi 
6671b365349SSrikanth Yalavarthi 	return mp;
6681b365349SSrikanth Yalavarthi }
6691b365349SSrikanth Yalavarthi 
6701b365349SSrikanth Yalavarthi void
6711b365349SSrikanth Yalavarthi rte_ml_op_pool_free(struct rte_mempool *mempool)
6721b365349SSrikanth Yalavarthi {
6731b365349SSrikanth Yalavarthi 	if (mempool != NULL)
6741b365349SSrikanth Yalavarthi 		rte_mempool_free(mempool);
6751b365349SSrikanth Yalavarthi }
6761b365349SSrikanth Yalavarthi 
677*c775df1cSSrikanth Yalavarthi uint16_t
678*c775df1cSSrikanth Yalavarthi rte_ml_enqueue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops)
679*c775df1cSSrikanth Yalavarthi {
680*c775df1cSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
681*c775df1cSSrikanth Yalavarthi 
682*c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
683*c775df1cSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
684*c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
685*c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
686*c775df1cSSrikanth Yalavarthi 		return 0;
687*c775df1cSSrikanth Yalavarthi 	}
688*c775df1cSSrikanth Yalavarthi 
689*c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
690*c775df1cSSrikanth Yalavarthi 	if (*dev->enqueue_burst == NULL) {
691*c775df1cSSrikanth Yalavarthi 		rte_errno = -ENOTSUP;
692*c775df1cSSrikanth Yalavarthi 		return 0;
693*c775df1cSSrikanth Yalavarthi 	}
694*c775df1cSSrikanth Yalavarthi 
695*c775df1cSSrikanth Yalavarthi 	if (ops == NULL) {
696*c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL\n", dev_id);
697*c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
698*c775df1cSSrikanth Yalavarthi 		return 0;
699*c775df1cSSrikanth Yalavarthi 	}
700*c775df1cSSrikanth Yalavarthi 
701*c775df1cSSrikanth Yalavarthi 	if (qp_id >= dev->data->nb_queue_pairs) {
702*c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid qp_id %u\n", qp_id);
703*c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
704*c775df1cSSrikanth Yalavarthi 		return 0;
705*c775df1cSSrikanth Yalavarthi 	}
706*c775df1cSSrikanth Yalavarthi #else
707*c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
708*c775df1cSSrikanth Yalavarthi #endif
709*c775df1cSSrikanth Yalavarthi 
710*c775df1cSSrikanth Yalavarthi 	return (*dev->enqueue_burst)(dev, qp_id, ops, nb_ops);
711*c775df1cSSrikanth Yalavarthi }
712*c775df1cSSrikanth Yalavarthi 
713*c775df1cSSrikanth Yalavarthi uint16_t
714*c775df1cSSrikanth Yalavarthi rte_ml_dequeue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops)
715*c775df1cSSrikanth Yalavarthi {
716*c775df1cSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
717*c775df1cSSrikanth Yalavarthi 
718*c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
719*c775df1cSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
720*c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
721*c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
722*c775df1cSSrikanth Yalavarthi 		return 0;
723*c775df1cSSrikanth Yalavarthi 	}
724*c775df1cSSrikanth Yalavarthi 
725*c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
726*c775df1cSSrikanth Yalavarthi 	if (*dev->dequeue_burst == NULL) {
727*c775df1cSSrikanth Yalavarthi 		rte_errno = -ENOTSUP;
728*c775df1cSSrikanth Yalavarthi 		return 0;
729*c775df1cSSrikanth Yalavarthi 	}
730*c775df1cSSrikanth Yalavarthi 
731*c775df1cSSrikanth Yalavarthi 	if (ops == NULL) {
732*c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL\n", dev_id);
733*c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
734*c775df1cSSrikanth Yalavarthi 		return 0;
735*c775df1cSSrikanth Yalavarthi 	}
736*c775df1cSSrikanth Yalavarthi 
737*c775df1cSSrikanth Yalavarthi 	if (qp_id >= dev->data->nb_queue_pairs) {
738*c775df1cSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid qp_id %u\n", qp_id);
739*c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
740*c775df1cSSrikanth Yalavarthi 		return 0;
741*c775df1cSSrikanth Yalavarthi 	}
742*c775df1cSSrikanth Yalavarthi #else
743*c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
744*c775df1cSSrikanth Yalavarthi #endif
745*c775df1cSSrikanth Yalavarthi 
746*c775df1cSSrikanth Yalavarthi 	return (*dev->dequeue_burst)(dev, qp_id, ops, nb_ops);
747*c775df1cSSrikanth Yalavarthi }
748*c775df1cSSrikanth Yalavarthi 
749d82cac58SJerin Jacob RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO);
750