xref: /dpdk/lib/mldev/rte_mldev.c (revision 804786f1012a35ee665e9d0fdf3bee1847a374fc)
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) {
162ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_max = %zu (> %d)", dev_max, INT16_MAX);
163ea80eafbSSrikanth Yalavarthi 		rte_errno = EINVAL;
164ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
165ea80eafbSSrikanth Yalavarthi 	}
166ea80eafbSSrikanth Yalavarthi 
167ea80eafbSSrikanth Yalavarthi 	/* No lock, it must be called before or during first probing. */
168ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.devs != NULL) {
169ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device array already initialized");
170ea80eafbSSrikanth Yalavarthi 		rte_errno = EBUSY;
171ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
172ea80eafbSSrikanth Yalavarthi 	}
173ea80eafbSSrikanth Yalavarthi 
174ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.devs = calloc(dev_max, sizeof(struct rte_ml_dev));
175ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.devs == NULL) {
176ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Cannot initialize MLDEV library");
177ea80eafbSSrikanth Yalavarthi 		rte_errno = ENOMEM;
178ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
179ea80eafbSSrikanth Yalavarthi 	}
180ea80eafbSSrikanth Yalavarthi 
181ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.data = calloc(dev_max, sizeof(struct rte_ml_dev_data *));
182ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.data == NULL) {
183ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Cannot initialize MLDEV library");
184ea80eafbSSrikanth Yalavarthi 		rte_errno = ENOMEM;
185ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
186ea80eafbSSrikanth Yalavarthi 	}
187ea80eafbSSrikanth Yalavarthi 
188ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.max_devs = dev_max;
189ea80eafbSSrikanth Yalavarthi 
190ea80eafbSSrikanth Yalavarthi 	return 0;
191ea80eafbSSrikanth Yalavarthi }
192d82cac58SJerin Jacob 
19336d0b09eSSrikanth Yalavarthi uint16_t
19436d0b09eSSrikanth Yalavarthi rte_ml_dev_count(void)
19536d0b09eSSrikanth Yalavarthi {
19636d0b09eSSrikanth Yalavarthi 	return ml_dev_globals.nb_devs;
19736d0b09eSSrikanth Yalavarthi }
19836d0b09eSSrikanth Yalavarthi 
19936d0b09eSSrikanth Yalavarthi int
20036d0b09eSSrikanth Yalavarthi rte_ml_dev_is_valid_dev(int16_t dev_id)
20136d0b09eSSrikanth Yalavarthi {
20236d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev = NULL;
20336d0b09eSSrikanth Yalavarthi 
20436d0b09eSSrikanth Yalavarthi 	if (dev_id >= ml_dev_globals.max_devs || ml_dev_globals.devs[dev_id].data == NULL)
20536d0b09eSSrikanth Yalavarthi 		return 0;
20636d0b09eSSrikanth Yalavarthi 
20736d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
20836d0b09eSSrikanth Yalavarthi 	if (dev->attached != ML_DEV_ATTACHED)
20936d0b09eSSrikanth Yalavarthi 		return 0;
21036d0b09eSSrikanth Yalavarthi 	else
21136d0b09eSSrikanth Yalavarthi 		return 1;
21236d0b09eSSrikanth Yalavarthi }
21336d0b09eSSrikanth Yalavarthi 
21436d0b09eSSrikanth Yalavarthi int
21536d0b09eSSrikanth Yalavarthi rte_ml_dev_socket_id(int16_t dev_id)
21636d0b09eSSrikanth Yalavarthi {
21736d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
21836d0b09eSSrikanth Yalavarthi 
21936d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
220ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
22136d0b09eSSrikanth Yalavarthi 		return -EINVAL;
22236d0b09eSSrikanth Yalavarthi 	}
22336d0b09eSSrikanth Yalavarthi 
22436d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
22536d0b09eSSrikanth Yalavarthi 
22636d0b09eSSrikanth Yalavarthi 	return dev->data->socket_id;
22736d0b09eSSrikanth Yalavarthi }
22836d0b09eSSrikanth Yalavarthi 
22936d0b09eSSrikanth Yalavarthi int
23036d0b09eSSrikanth Yalavarthi rte_ml_dev_info_get(int16_t dev_id, struct rte_ml_dev_info *dev_info)
23136d0b09eSSrikanth Yalavarthi {
23236d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
23336d0b09eSSrikanth Yalavarthi 
23436d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
235ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
23636d0b09eSSrikanth Yalavarthi 		return -EINVAL;
23736d0b09eSSrikanth Yalavarthi 	}
23836d0b09eSSrikanth Yalavarthi 
23936d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
24036d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_info_get == NULL)
24136d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
24236d0b09eSSrikanth Yalavarthi 
24336d0b09eSSrikanth Yalavarthi 	if (dev_info == NULL) {
244ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, dev_info cannot be NULL", dev_id);
24536d0b09eSSrikanth Yalavarthi 		return -EINVAL;
24636d0b09eSSrikanth Yalavarthi 	}
24736d0b09eSSrikanth Yalavarthi 	memset(dev_info, 0, sizeof(struct rte_ml_dev_info));
24836d0b09eSSrikanth Yalavarthi 
24936d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_info_get)(dev, dev_info);
25036d0b09eSSrikanth Yalavarthi }
25136d0b09eSSrikanth Yalavarthi 
25236d0b09eSSrikanth Yalavarthi int
25336d0b09eSSrikanth Yalavarthi rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *config)
25436d0b09eSSrikanth Yalavarthi {
25536d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev_info dev_info;
25636d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
25736d0b09eSSrikanth Yalavarthi 	int ret;
25836d0b09eSSrikanth Yalavarthi 
25936d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
260ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
26136d0b09eSSrikanth Yalavarthi 		return -EINVAL;
26236d0b09eSSrikanth Yalavarthi 	}
26336d0b09eSSrikanth Yalavarthi 
26436d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
26536d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_configure == NULL)
26636d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
26736d0b09eSSrikanth Yalavarthi 
26836d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started) {
26936d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id);
27036d0b09eSSrikanth Yalavarthi 		return -EBUSY;
27136d0b09eSSrikanth Yalavarthi 	}
27236d0b09eSSrikanth Yalavarthi 
27336d0b09eSSrikanth Yalavarthi 	if (config == NULL) {
274ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, config cannot be NULL", dev_id);
27536d0b09eSSrikanth Yalavarthi 		return -EINVAL;
27636d0b09eSSrikanth Yalavarthi 	}
27736d0b09eSSrikanth Yalavarthi 
27836d0b09eSSrikanth Yalavarthi 	ret = rte_ml_dev_info_get(dev_id, &dev_info);
27936d0b09eSSrikanth Yalavarthi 	if (ret < 0)
28036d0b09eSSrikanth Yalavarthi 		return ret;
28136d0b09eSSrikanth Yalavarthi 
28236d0b09eSSrikanth Yalavarthi 	if (config->nb_queue_pairs > dev_info.max_queue_pairs) {
283ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Device %d num of queues %u > %u", dev_id,
28436d0b09eSSrikanth Yalavarthi 			      config->nb_queue_pairs, dev_info.max_queue_pairs);
28536d0b09eSSrikanth Yalavarthi 		return -EINVAL;
28636d0b09eSSrikanth Yalavarthi 	}
28736d0b09eSSrikanth Yalavarthi 
28836d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_configure)(dev, config);
28936d0b09eSSrikanth Yalavarthi }
29036d0b09eSSrikanth Yalavarthi 
29136d0b09eSSrikanth Yalavarthi int
29236d0b09eSSrikanth Yalavarthi rte_ml_dev_close(int16_t dev_id)
29336d0b09eSSrikanth Yalavarthi {
29436d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
29536d0b09eSSrikanth Yalavarthi 
29636d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
297ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
29836d0b09eSSrikanth Yalavarthi 		return -EINVAL;
29936d0b09eSSrikanth Yalavarthi 	}
30036d0b09eSSrikanth Yalavarthi 
30136d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
30236d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_close == NULL)
30336d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
30436d0b09eSSrikanth Yalavarthi 
30536d0b09eSSrikanth Yalavarthi 	/* Device must be stopped before it can be closed */
30636d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 1) {
30736d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped before closing", dev_id);
30836d0b09eSSrikanth Yalavarthi 		return -EBUSY;
30936d0b09eSSrikanth Yalavarthi 	}
31036d0b09eSSrikanth Yalavarthi 
31136d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_close)(dev);
31236d0b09eSSrikanth Yalavarthi }
31336d0b09eSSrikanth Yalavarthi 
31436d0b09eSSrikanth Yalavarthi int
31536d0b09eSSrikanth Yalavarthi rte_ml_dev_start(int16_t dev_id)
31636d0b09eSSrikanth Yalavarthi {
31736d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
31836d0b09eSSrikanth Yalavarthi 	int ret;
31936d0b09eSSrikanth Yalavarthi 
32036d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
321ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
32236d0b09eSSrikanth Yalavarthi 		return -EINVAL;
32336d0b09eSSrikanth Yalavarthi 	}
32436d0b09eSSrikanth Yalavarthi 
32536d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
32636d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_start == NULL)
32736d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
32836d0b09eSSrikanth Yalavarthi 
32936d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started != 0) {
33036d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is already started", dev_id);
33136d0b09eSSrikanth Yalavarthi 		return -EBUSY;
33236d0b09eSSrikanth Yalavarthi 	}
33336d0b09eSSrikanth Yalavarthi 
33436d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_start)(dev);
33536d0b09eSSrikanth Yalavarthi 	if (ret == 0)
33636d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 1;
33736d0b09eSSrikanth Yalavarthi 
33836d0b09eSSrikanth Yalavarthi 	return ret;
33936d0b09eSSrikanth Yalavarthi }
34036d0b09eSSrikanth Yalavarthi 
34136d0b09eSSrikanth Yalavarthi int
34236d0b09eSSrikanth Yalavarthi rte_ml_dev_stop(int16_t dev_id)
34336d0b09eSSrikanth Yalavarthi {
34436d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
34536d0b09eSSrikanth Yalavarthi 	int ret;
34636d0b09eSSrikanth Yalavarthi 
34736d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
348ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
34936d0b09eSSrikanth Yalavarthi 		return -EINVAL;
35036d0b09eSSrikanth Yalavarthi 	}
35136d0b09eSSrikanth Yalavarthi 
35236d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
35336d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stop == NULL)
35436d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
35536d0b09eSSrikanth Yalavarthi 
35636d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 0) {
35736d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is not started", dev_id);
35836d0b09eSSrikanth Yalavarthi 		return -EBUSY;
35936d0b09eSSrikanth Yalavarthi 	}
36036d0b09eSSrikanth Yalavarthi 
36136d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_stop)(dev);
36236d0b09eSSrikanth Yalavarthi 	if (ret == 0)
36336d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 0;
36436d0b09eSSrikanth Yalavarthi 
36536d0b09eSSrikanth Yalavarthi 	return ret;
36636d0b09eSSrikanth Yalavarthi }
36736d0b09eSSrikanth Yalavarthi 
368*804786f1SSrikanth Yalavarthi uint16_t
369*804786f1SSrikanth Yalavarthi rte_ml_dev_queue_pair_count(int16_t dev_id)
370*804786f1SSrikanth Yalavarthi {
371*804786f1SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
372*804786f1SSrikanth Yalavarthi 
373*804786f1SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
374*804786f1SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
375*804786f1SSrikanth Yalavarthi 		return -EINVAL;
376*804786f1SSrikanth Yalavarthi 	}
377*804786f1SSrikanth Yalavarthi 
378*804786f1SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
379*804786f1SSrikanth Yalavarthi 
380*804786f1SSrikanth Yalavarthi 	return dev->data->nb_queue_pairs;
381*804786f1SSrikanth Yalavarthi }
382*804786f1SSrikanth Yalavarthi 
383b5f0df64SSrikanth Yalavarthi int
384b5f0df64SSrikanth Yalavarthi rte_ml_dev_queue_pair_setup(int16_t dev_id, uint16_t queue_pair_id,
385b5f0df64SSrikanth Yalavarthi 			    const struct rte_ml_dev_qp_conf *qp_conf, int socket_id)
386b5f0df64SSrikanth Yalavarthi {
387b5f0df64SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
388b5f0df64SSrikanth Yalavarthi 
389b5f0df64SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
390ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
391b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
392b5f0df64SSrikanth Yalavarthi 	}
393b5f0df64SSrikanth Yalavarthi 
394b5f0df64SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
395b5f0df64SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_queue_pair_setup == NULL)
396b5f0df64SSrikanth Yalavarthi 		return -ENOTSUP;
397b5f0df64SSrikanth Yalavarthi 
398b5f0df64SSrikanth Yalavarthi 	if (queue_pair_id >= dev->data->nb_queue_pairs) {
399b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid queue_pair_id = %d", queue_pair_id);
400b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
401b5f0df64SSrikanth Yalavarthi 	}
402b5f0df64SSrikanth Yalavarthi 
403b5f0df64SSrikanth Yalavarthi 	if (qp_conf == NULL) {
404ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, qp_conf cannot be NULL", dev_id);
405b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
406b5f0df64SSrikanth Yalavarthi 	}
407b5f0df64SSrikanth Yalavarthi 
408b5f0df64SSrikanth Yalavarthi 	if (dev->data->dev_started) {
409b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id);
410b5f0df64SSrikanth Yalavarthi 		return -EBUSY;
411b5f0df64SSrikanth Yalavarthi 	}
412b5f0df64SSrikanth Yalavarthi 
413b5f0df64SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_queue_pair_setup)(dev, queue_pair_id, qp_conf, socket_id);
414b5f0df64SSrikanth Yalavarthi }
415b5f0df64SSrikanth Yalavarthi 
4164a662f54SSrikanth Yalavarthi int
417b3caa0f8SSrikanth Yalavarthi rte_ml_dev_stats_get(int16_t dev_id, struct rte_ml_dev_stats *stats)
418b3caa0f8SSrikanth Yalavarthi {
419b3caa0f8SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
420b3caa0f8SSrikanth Yalavarthi 
421b3caa0f8SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
422ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
423b3caa0f8SSrikanth Yalavarthi 		return -EINVAL;
424b3caa0f8SSrikanth Yalavarthi 	}
425b3caa0f8SSrikanth Yalavarthi 
426b3caa0f8SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
427b3caa0f8SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stats_get == NULL)
428b3caa0f8SSrikanth Yalavarthi 		return -ENOTSUP;
429b3caa0f8SSrikanth Yalavarthi 
430b3caa0f8SSrikanth Yalavarthi 	if (stats == NULL) {
431ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, stats cannot be NULL", dev_id);
432b3caa0f8SSrikanth Yalavarthi 		return -EINVAL;
433b3caa0f8SSrikanth Yalavarthi 	}
434b3caa0f8SSrikanth Yalavarthi 	memset(stats, 0, sizeof(struct rte_ml_dev_stats));
435b3caa0f8SSrikanth Yalavarthi 
436b3caa0f8SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_stats_get)(dev, stats);
437b3caa0f8SSrikanth Yalavarthi }
438b3caa0f8SSrikanth Yalavarthi 
439b3caa0f8SSrikanth Yalavarthi void
440b3caa0f8SSrikanth Yalavarthi rte_ml_dev_stats_reset(int16_t dev_id)
441b3caa0f8SSrikanth Yalavarthi {
442b3caa0f8SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
443b3caa0f8SSrikanth Yalavarthi 
444b3caa0f8SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
445ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
446b3caa0f8SSrikanth Yalavarthi 		return;
447b3caa0f8SSrikanth Yalavarthi 	}
448b3caa0f8SSrikanth Yalavarthi 
449b3caa0f8SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
450b3caa0f8SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stats_reset == NULL)
451b3caa0f8SSrikanth Yalavarthi 		return;
452b3caa0f8SSrikanth Yalavarthi 
453b3caa0f8SSrikanth Yalavarthi 	(*dev->dev_ops->dev_stats_reset)(dev);
454b3caa0f8SSrikanth Yalavarthi }
455b3caa0f8SSrikanth Yalavarthi 
456b3caa0f8SSrikanth Yalavarthi int
457f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_names_get(int16_t dev_id, enum rte_ml_dev_xstats_mode mode, int32_t model_id,
458f06968e9SSrikanth Yalavarthi 			    struct rte_ml_dev_xstats_map *xstats_map, uint32_t size)
459f06968e9SSrikanth Yalavarthi {
460f06968e9SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
461f06968e9SSrikanth Yalavarthi 
462f06968e9SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
463ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
464f06968e9SSrikanth Yalavarthi 		return -EINVAL;
465f06968e9SSrikanth Yalavarthi 	}
466f06968e9SSrikanth Yalavarthi 
467f06968e9SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
468f06968e9SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_names_get == NULL)
469f06968e9SSrikanth Yalavarthi 		return -ENOTSUP;
470f06968e9SSrikanth Yalavarthi 
471f06968e9SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_names_get)(dev, mode, model_id, xstats_map, size);
472f06968e9SSrikanth Yalavarthi }
473f06968e9SSrikanth Yalavarthi 
474f06968e9SSrikanth Yalavarthi int
475f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_by_name_get(int16_t dev_id, const char *name, uint16_t *stat_id, uint64_t *value)
476f06968e9SSrikanth Yalavarthi {
477f06968e9SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
478f06968e9SSrikanth Yalavarthi 
479f06968e9SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
480ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
481f06968e9SSrikanth Yalavarthi 		return -EINVAL;
482f06968e9SSrikanth Yalavarthi 	}
483f06968e9SSrikanth Yalavarthi 
484f06968e9SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
485f06968e9SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_by_name_get == NULL)
486f06968e9SSrikanth Yalavarthi 		return -ENOTSUP;
487f06968e9SSrikanth Yalavarthi 
488f06968e9SSrikanth Yalavarthi 	if (name == NULL) {
489ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, name cannot be NULL", dev_id);
490f06968e9SSrikanth Yalavarthi 		return -EINVAL;
491f06968e9SSrikanth Yalavarthi 	}
492f06968e9SSrikanth Yalavarthi 
493f06968e9SSrikanth Yalavarthi 	if (value == NULL) {
494ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, value cannot be NULL", dev_id);
495f06968e9SSrikanth Yalavarthi 		return -EINVAL;
496f06968e9SSrikanth Yalavarthi 	}
497f06968e9SSrikanth Yalavarthi 
498f06968e9SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_by_name_get)(dev, name, stat_id, value);
499f06968e9SSrikanth Yalavarthi }
500f06968e9SSrikanth Yalavarthi 
501f06968e9SSrikanth Yalavarthi int
502f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_get(int16_t dev_id, enum rte_ml_dev_xstats_mode mode, int32_t model_id,
503f06968e9SSrikanth Yalavarthi 		      const uint16_t stat_ids[], uint64_t values[], uint16_t nb_ids)
504f06968e9SSrikanth Yalavarthi {
505f06968e9SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
506f06968e9SSrikanth Yalavarthi 
507f06968e9SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
508ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
509f06968e9SSrikanth Yalavarthi 		return -EINVAL;
510f06968e9SSrikanth Yalavarthi 	}
511f06968e9SSrikanth Yalavarthi 
512f06968e9SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
513f06968e9SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_get == NULL)
514f06968e9SSrikanth Yalavarthi 		return -ENOTSUP;
515f06968e9SSrikanth Yalavarthi 
516f06968e9SSrikanth Yalavarthi 	if (stat_ids == NULL) {
517ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, stat_ids cannot be NULL", dev_id);
518f06968e9SSrikanth Yalavarthi 		return -EINVAL;
519f06968e9SSrikanth Yalavarthi 	}
520f06968e9SSrikanth Yalavarthi 
521f06968e9SSrikanth Yalavarthi 	if (values == NULL) {
522ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, values cannot be NULL", dev_id);
523f06968e9SSrikanth Yalavarthi 		return -EINVAL;
524f06968e9SSrikanth Yalavarthi 	}
525f06968e9SSrikanth Yalavarthi 
526f06968e9SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_get)(dev, mode, model_id, stat_ids, values, nb_ids);
527f06968e9SSrikanth Yalavarthi }
528f06968e9SSrikanth Yalavarthi 
529f06968e9SSrikanth Yalavarthi int
530f06968e9SSrikanth Yalavarthi rte_ml_dev_xstats_reset(int16_t dev_id, enum rte_ml_dev_xstats_mode mode, int32_t model_id,
531f06968e9SSrikanth Yalavarthi 			const uint16_t stat_ids[], uint16_t nb_ids)
532f06968e9SSrikanth Yalavarthi {
533f06968e9SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
534f06968e9SSrikanth Yalavarthi 
535f06968e9SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
536ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
537f06968e9SSrikanth Yalavarthi 		return -EINVAL;
538f06968e9SSrikanth Yalavarthi 	}
539f06968e9SSrikanth Yalavarthi 
540f06968e9SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
541f06968e9SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_xstats_reset == NULL)
542f06968e9SSrikanth Yalavarthi 		return -ENOTSUP;
543f06968e9SSrikanth Yalavarthi 
544f06968e9SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_xstats_reset)(dev, mode, model_id, stat_ids, nb_ids);
545f06968e9SSrikanth Yalavarthi }
546f06968e9SSrikanth Yalavarthi 
547f06968e9SSrikanth Yalavarthi int
548c32be5aaSSrikanth Yalavarthi rte_ml_dev_dump(int16_t dev_id, FILE *fd)
549c32be5aaSSrikanth Yalavarthi {
550c32be5aaSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
551c32be5aaSSrikanth Yalavarthi 
552c32be5aaSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
553ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
554c32be5aaSSrikanth Yalavarthi 		return -EINVAL;
555c32be5aaSSrikanth Yalavarthi 	}
556c32be5aaSSrikanth Yalavarthi 
557c32be5aaSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
558c32be5aaSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_dump == NULL)
559c32be5aaSSrikanth Yalavarthi 		return -ENOTSUP;
560c32be5aaSSrikanth Yalavarthi 
561c32be5aaSSrikanth Yalavarthi 	if (fd == NULL) {
562ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, file descriptor cannot be NULL", dev_id);
563c32be5aaSSrikanth Yalavarthi 		return -EINVAL;
564c32be5aaSSrikanth Yalavarthi 	}
565c32be5aaSSrikanth Yalavarthi 
566c32be5aaSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_dump)(dev, fd);
567c32be5aaSSrikanth Yalavarthi }
568c32be5aaSSrikanth Yalavarthi 
569c32be5aaSSrikanth Yalavarthi int
570c32be5aaSSrikanth Yalavarthi rte_ml_dev_selftest(int16_t dev_id)
571c32be5aaSSrikanth Yalavarthi {
572c32be5aaSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
573c32be5aaSSrikanth Yalavarthi 
574c32be5aaSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
575ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
576c32be5aaSSrikanth Yalavarthi 		return -EINVAL;
577c32be5aaSSrikanth Yalavarthi 	}
578c32be5aaSSrikanth Yalavarthi 
579c32be5aaSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
580c32be5aaSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_selftest == NULL)
581c32be5aaSSrikanth Yalavarthi 		return -ENOTSUP;
582c32be5aaSSrikanth Yalavarthi 
583c32be5aaSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_selftest)(dev);
584c32be5aaSSrikanth Yalavarthi }
585c32be5aaSSrikanth Yalavarthi 
586c32be5aaSSrikanth Yalavarthi int
5874a662f54SSrikanth Yalavarthi rte_ml_model_load(int16_t dev_id, struct rte_ml_model_params *params, uint16_t *model_id)
5884a662f54SSrikanth Yalavarthi {
5894a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
5904a662f54SSrikanth Yalavarthi 
5914a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
592ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
5934a662f54SSrikanth Yalavarthi 		return -EINVAL;
5944a662f54SSrikanth Yalavarthi 	}
5954a662f54SSrikanth Yalavarthi 
5964a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
5974a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_load == NULL)
5984a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
5994a662f54SSrikanth Yalavarthi 
6004a662f54SSrikanth Yalavarthi 	if (params == NULL) {
601ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, params cannot be NULL", dev_id);
6024a662f54SSrikanth Yalavarthi 		return -EINVAL;
6034a662f54SSrikanth Yalavarthi 	}
6044a662f54SSrikanth Yalavarthi 
6054a662f54SSrikanth Yalavarthi 	if (model_id == NULL) {
606ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id cannot be NULL", dev_id);
6074a662f54SSrikanth Yalavarthi 		return -EINVAL;
6084a662f54SSrikanth Yalavarthi 	}
6094a662f54SSrikanth Yalavarthi 
6104a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_load)(dev, params, model_id);
6114a662f54SSrikanth Yalavarthi }
6124a662f54SSrikanth Yalavarthi 
6134a662f54SSrikanth Yalavarthi int
6144a662f54SSrikanth Yalavarthi rte_ml_model_unload(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)) {
619ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", 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_unload == NULL)
6254a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6264a662f54SSrikanth Yalavarthi 
6274a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_unload)(dev, model_id);
6284a662f54SSrikanth Yalavarthi }
6294a662f54SSrikanth Yalavarthi 
6304a662f54SSrikanth Yalavarthi int
6314a662f54SSrikanth Yalavarthi rte_ml_model_start(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)) {
636ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", 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_start == NULL)
6424a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6434a662f54SSrikanth Yalavarthi 
6444a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_start)(dev, model_id);
6454a662f54SSrikanth Yalavarthi }
6464a662f54SSrikanth Yalavarthi 
6474a662f54SSrikanth Yalavarthi int
6484a662f54SSrikanth Yalavarthi rte_ml_model_stop(int16_t dev_id, uint16_t model_id)
6494a662f54SSrikanth Yalavarthi {
6504a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6514a662f54SSrikanth Yalavarthi 
6524a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
653ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", 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_stop == NULL)
6594a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6604a662f54SSrikanth Yalavarthi 
6614a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_stop)(dev, model_id);
6624a662f54SSrikanth Yalavarthi }
6634a662f54SSrikanth Yalavarthi 
6644a662f54SSrikanth Yalavarthi int
6654a662f54SSrikanth Yalavarthi rte_ml_model_info_get(int16_t dev_id, uint16_t model_id, struct rte_ml_model_info *model_info)
6664a662f54SSrikanth Yalavarthi {
6674a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6684a662f54SSrikanth Yalavarthi 
6694a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
670ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
6714a662f54SSrikanth Yalavarthi 		return -EINVAL;
6724a662f54SSrikanth Yalavarthi 	}
6734a662f54SSrikanth Yalavarthi 
6744a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6754a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_info_get == NULL)
6764a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
6774a662f54SSrikanth Yalavarthi 
6784a662f54SSrikanth Yalavarthi 	if (model_info == NULL) {
679ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id %u, model_info cannot be NULL", dev_id,
6804a662f54SSrikanth Yalavarthi 			      model_id);
6814a662f54SSrikanth Yalavarthi 		return -EINVAL;
6824a662f54SSrikanth Yalavarthi 	}
6834a662f54SSrikanth Yalavarthi 
6844a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_info_get)(dev, model_id, model_info);
6854a662f54SSrikanth Yalavarthi }
6864a662f54SSrikanth Yalavarthi 
6874a662f54SSrikanth Yalavarthi int
6884a662f54SSrikanth Yalavarthi rte_ml_model_params_update(int16_t dev_id, uint16_t model_id, void *buffer)
6894a662f54SSrikanth Yalavarthi {
6904a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
6914a662f54SSrikanth Yalavarthi 
6924a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
693ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
6944a662f54SSrikanth Yalavarthi 		return -EINVAL;
6954a662f54SSrikanth Yalavarthi 	}
6964a662f54SSrikanth Yalavarthi 
6974a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
6984a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_params_update == NULL)
6994a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
7004a662f54SSrikanth Yalavarthi 
7014a662f54SSrikanth Yalavarthi 	if (buffer == NULL) {
702ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, buffer cannot be NULL", dev_id);
7034a662f54SSrikanth Yalavarthi 		return -EINVAL;
7044a662f54SSrikanth Yalavarthi 	}
7054a662f54SSrikanth Yalavarthi 
7064a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_params_update)(dev, model_id, buffer);
7074a662f54SSrikanth Yalavarthi }
7084a662f54SSrikanth Yalavarthi 
70950818b0aSSrikanth Yalavarthi int
71024364292SSrikanth Yalavarthi rte_ml_io_quantize(int16_t dev_id, uint16_t model_id, struct rte_ml_buff_seg **dbuffer,
71124364292SSrikanth Yalavarthi 		   struct rte_ml_buff_seg **qbuffer)
71250818b0aSSrikanth Yalavarthi {
71350818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
71450818b0aSSrikanth Yalavarthi 
71550818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
716ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
71750818b0aSSrikanth Yalavarthi 		return -EINVAL;
71850818b0aSSrikanth Yalavarthi 	}
71950818b0aSSrikanth Yalavarthi 
72050818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
72150818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_quantize == NULL)
72250818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
72350818b0aSSrikanth Yalavarthi 
72450818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
725ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL", dev_id);
72650818b0aSSrikanth Yalavarthi 		return -EINVAL;
72750818b0aSSrikanth Yalavarthi 	}
72850818b0aSSrikanth Yalavarthi 
72950818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
730ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL", dev_id);
73150818b0aSSrikanth Yalavarthi 		return -EINVAL;
73250818b0aSSrikanth Yalavarthi 	}
73350818b0aSSrikanth Yalavarthi 
73424364292SSrikanth Yalavarthi 	return (*dev->dev_ops->io_quantize)(dev, model_id, dbuffer, qbuffer);
73550818b0aSSrikanth Yalavarthi }
73650818b0aSSrikanth Yalavarthi 
73750818b0aSSrikanth Yalavarthi int
73824364292SSrikanth Yalavarthi rte_ml_io_dequantize(int16_t dev_id, uint16_t model_id, struct rte_ml_buff_seg **qbuffer,
73924364292SSrikanth Yalavarthi 		     struct rte_ml_buff_seg **dbuffer)
74050818b0aSSrikanth Yalavarthi {
74150818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
74250818b0aSSrikanth Yalavarthi 
74350818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
744ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
74550818b0aSSrikanth Yalavarthi 		return -EINVAL;
74650818b0aSSrikanth Yalavarthi 	}
74750818b0aSSrikanth Yalavarthi 
74850818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
74950818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_dequantize == NULL)
75050818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
75150818b0aSSrikanth Yalavarthi 
75250818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
753ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL", dev_id);
75450818b0aSSrikanth Yalavarthi 		return -EINVAL;
75550818b0aSSrikanth Yalavarthi 	}
75650818b0aSSrikanth Yalavarthi 
75750818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
758ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL", dev_id);
75950818b0aSSrikanth Yalavarthi 		return -EINVAL;
76050818b0aSSrikanth Yalavarthi 	}
76150818b0aSSrikanth Yalavarthi 
76224364292SSrikanth Yalavarthi 	return (*dev->dev_ops->io_dequantize)(dev, model_id, qbuffer, dbuffer);
76350818b0aSSrikanth Yalavarthi }
76450818b0aSSrikanth Yalavarthi 
7651b365349SSrikanth Yalavarthi /** Initialise rte_ml_op mempool element */
7661b365349SSrikanth Yalavarthi static void
7671b365349SSrikanth Yalavarthi ml_op_init(struct rte_mempool *mempool, __rte_unused void *opaque_arg, void *_op_data,
7681b365349SSrikanth Yalavarthi 	   __rte_unused unsigned int i)
7691b365349SSrikanth Yalavarthi {
7701b365349SSrikanth Yalavarthi 	struct rte_ml_op *op = _op_data;
7711b365349SSrikanth Yalavarthi 
7721b365349SSrikanth Yalavarthi 	memset(_op_data, 0, mempool->elt_size);
7731b365349SSrikanth Yalavarthi 	op->status = RTE_ML_OP_STATUS_NOT_PROCESSED;
7741b365349SSrikanth Yalavarthi 	op->mempool = mempool;
7751b365349SSrikanth Yalavarthi }
7761b365349SSrikanth Yalavarthi 
7771b365349SSrikanth Yalavarthi struct rte_mempool *
7781b365349SSrikanth Yalavarthi rte_ml_op_pool_create(const char *name, unsigned int nb_elts, unsigned int cache_size,
7791b365349SSrikanth Yalavarthi 		      uint16_t user_size, int socket_id)
7801b365349SSrikanth Yalavarthi {
7811b365349SSrikanth Yalavarthi 	struct rte_ml_op_pool_private *priv;
7821b365349SSrikanth Yalavarthi 	struct rte_mempool *mp;
7831b365349SSrikanth Yalavarthi 	unsigned int elt_size;
7841b365349SSrikanth Yalavarthi 
7851b365349SSrikanth Yalavarthi 	/* lookup mempool in case already allocated */
7861b365349SSrikanth Yalavarthi 	mp = rte_mempool_lookup(name);
7871b365349SSrikanth Yalavarthi 	elt_size = sizeof(struct rte_ml_op) + user_size;
7881b365349SSrikanth Yalavarthi 
7891b365349SSrikanth Yalavarthi 	if (mp != NULL) {
7901b365349SSrikanth Yalavarthi 		priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp);
7911b365349SSrikanth Yalavarthi 		if (mp->elt_size != elt_size || mp->cache_size < cache_size || mp->size < nb_elts ||
7921b365349SSrikanth Yalavarthi 		    priv->user_size < user_size) {
7931b365349SSrikanth Yalavarthi 			mp = NULL;
7941b365349SSrikanth Yalavarthi 			RTE_MLDEV_LOG(ERR,
7951b365349SSrikanth Yalavarthi 				      "Mempool %s already exists but with incompatible parameters",
7961b365349SSrikanth Yalavarthi 				      name);
7971b365349SSrikanth Yalavarthi 			return NULL;
7981b365349SSrikanth Yalavarthi 		}
7991b365349SSrikanth Yalavarthi 		return mp;
8001b365349SSrikanth Yalavarthi 	}
8011b365349SSrikanth Yalavarthi 
8021b365349SSrikanth Yalavarthi 	mp = rte_mempool_create(name, nb_elts, elt_size, cache_size,
8031b365349SSrikanth Yalavarthi 				sizeof(struct rte_ml_op_pool_private), NULL, NULL, ml_op_init, NULL,
8041b365349SSrikanth Yalavarthi 				socket_id, 0);
8051b365349SSrikanth Yalavarthi 	if (mp == NULL) {
8061b365349SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Failed to create mempool %s", name);
8071b365349SSrikanth Yalavarthi 		return NULL;
8081b365349SSrikanth Yalavarthi 	}
8091b365349SSrikanth Yalavarthi 
8101b365349SSrikanth Yalavarthi 	priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp);
8111b365349SSrikanth Yalavarthi 	priv->user_size = user_size;
8121b365349SSrikanth Yalavarthi 
8131b365349SSrikanth Yalavarthi 	return mp;
8141b365349SSrikanth Yalavarthi }
8151b365349SSrikanth Yalavarthi 
8161b365349SSrikanth Yalavarthi void
8171b365349SSrikanth Yalavarthi rte_ml_op_pool_free(struct rte_mempool *mempool)
8181b365349SSrikanth Yalavarthi {
8191b365349SSrikanth Yalavarthi 	rte_mempool_free(mempool);
8201b365349SSrikanth Yalavarthi }
8211b365349SSrikanth Yalavarthi 
822c775df1cSSrikanth Yalavarthi uint16_t
823c775df1cSSrikanth Yalavarthi rte_ml_enqueue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops)
824c775df1cSSrikanth Yalavarthi {
825c775df1cSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
826c775df1cSSrikanth Yalavarthi 
827c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
828c775df1cSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
829ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
830c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
831c775df1cSSrikanth Yalavarthi 		return 0;
832c775df1cSSrikanth Yalavarthi 	}
833c775df1cSSrikanth Yalavarthi 
834c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
835c775df1cSSrikanth Yalavarthi 	if (*dev->enqueue_burst == NULL) {
836c775df1cSSrikanth Yalavarthi 		rte_errno = -ENOTSUP;
837c775df1cSSrikanth Yalavarthi 		return 0;
838c775df1cSSrikanth Yalavarthi 	}
839c775df1cSSrikanth Yalavarthi 
840c775df1cSSrikanth Yalavarthi 	if (ops == NULL) {
841ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL", dev_id);
842c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
843c775df1cSSrikanth Yalavarthi 		return 0;
844c775df1cSSrikanth Yalavarthi 	}
845c775df1cSSrikanth Yalavarthi 
846c775df1cSSrikanth Yalavarthi 	if (qp_id >= dev->data->nb_queue_pairs) {
847ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid qp_id %u", qp_id);
848c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
849c775df1cSSrikanth Yalavarthi 		return 0;
850c775df1cSSrikanth Yalavarthi 	}
851c775df1cSSrikanth Yalavarthi #else
852c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
853c775df1cSSrikanth Yalavarthi #endif
854c775df1cSSrikanth Yalavarthi 
855c775df1cSSrikanth Yalavarthi 	return (*dev->enqueue_burst)(dev, qp_id, ops, nb_ops);
856c775df1cSSrikanth Yalavarthi }
857c775df1cSSrikanth Yalavarthi 
858c775df1cSSrikanth Yalavarthi uint16_t
859c775df1cSSrikanth Yalavarthi rte_ml_dequeue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops)
860c775df1cSSrikanth Yalavarthi {
861c775df1cSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
862c775df1cSSrikanth Yalavarthi 
863c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
864c775df1cSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
865ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
866c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
867c775df1cSSrikanth Yalavarthi 		return 0;
868c775df1cSSrikanth Yalavarthi 	}
869c775df1cSSrikanth Yalavarthi 
870c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
871c775df1cSSrikanth Yalavarthi 	if (*dev->dequeue_burst == NULL) {
872c775df1cSSrikanth Yalavarthi 		rte_errno = -ENOTSUP;
873c775df1cSSrikanth Yalavarthi 		return 0;
874c775df1cSSrikanth Yalavarthi 	}
875c775df1cSSrikanth Yalavarthi 
876c775df1cSSrikanth Yalavarthi 	if (ops == NULL) {
877ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL", dev_id);
878c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
879c775df1cSSrikanth Yalavarthi 		return 0;
880c775df1cSSrikanth Yalavarthi 	}
881c775df1cSSrikanth Yalavarthi 
882c775df1cSSrikanth Yalavarthi 	if (qp_id >= dev->data->nb_queue_pairs) {
883ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid qp_id %u", qp_id);
884c775df1cSSrikanth Yalavarthi 		rte_errno = -EINVAL;
885c775df1cSSrikanth Yalavarthi 		return 0;
886c775df1cSSrikanth Yalavarthi 	}
887c775df1cSSrikanth Yalavarthi #else
888c775df1cSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
889c775df1cSSrikanth Yalavarthi #endif
890c775df1cSSrikanth Yalavarthi 
891c775df1cSSrikanth Yalavarthi 	return (*dev->dequeue_burst)(dev, qp_id, ops, nb_ops);
892c775df1cSSrikanth Yalavarthi }
893c775df1cSSrikanth Yalavarthi 
894698d9061SSrikanth Yalavarthi int
895698d9061SSrikanth Yalavarthi rte_ml_op_error_get(int16_t dev_id, struct rte_ml_op *op, struct rte_ml_op_error *error)
896698d9061SSrikanth Yalavarthi {
897698d9061SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
898698d9061SSrikanth Yalavarthi 
899698d9061SSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG
900698d9061SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
901ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d", dev_id);
902698d9061SSrikanth Yalavarthi 		return -EINVAL;
903698d9061SSrikanth Yalavarthi 	}
904698d9061SSrikanth Yalavarthi 
905698d9061SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
906698d9061SSrikanth Yalavarthi 	if (*dev->op_error_get == NULL)
907698d9061SSrikanth Yalavarthi 		return -ENOTSUP;
908698d9061SSrikanth Yalavarthi 
909698d9061SSrikanth Yalavarthi 	if (op == NULL) {
910ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, op cannot be NULL", dev_id);
911698d9061SSrikanth Yalavarthi 		return -EINVAL;
912698d9061SSrikanth Yalavarthi 	}
913698d9061SSrikanth Yalavarthi 
914698d9061SSrikanth Yalavarthi 	if (error == NULL) {
915ae282b06SDavid Marchand 		RTE_MLDEV_LOG(ERR, "Dev %d, error cannot be NULL", dev_id);
916698d9061SSrikanth Yalavarthi 		return -EINVAL;
917698d9061SSrikanth Yalavarthi 	}
918698d9061SSrikanth Yalavarthi #else
919698d9061SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
920698d9061SSrikanth Yalavarthi #endif
921698d9061SSrikanth Yalavarthi 
922698d9061SSrikanth Yalavarthi 	return (*dev->op_error_get)(dev, op, error);
923698d9061SSrikanth Yalavarthi }
924698d9061SSrikanth Yalavarthi 
925d82cac58SJerin Jacob RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO);
926