xref: /dpdk/lib/mldev/rte_mldev.c (revision 50818b0a2ce66dad3fe9accbef090b336a32311c)
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 
15ea80eafbSSrikanth Yalavarthi struct rte_ml_dev *
16ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_get_dev(int16_t dev_id)
17ea80eafbSSrikanth Yalavarthi {
18ea80eafbSSrikanth Yalavarthi 	return &ml_dev_globals.devs[dev_id];
19ea80eafbSSrikanth Yalavarthi }
20ea80eafbSSrikanth Yalavarthi 
21ea80eafbSSrikanth Yalavarthi struct rte_ml_dev *
22ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_get_named_dev(const char *name)
23ea80eafbSSrikanth Yalavarthi {
24ea80eafbSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
25ea80eafbSSrikanth Yalavarthi 	int16_t dev_id;
26ea80eafbSSrikanth Yalavarthi 
27ea80eafbSSrikanth Yalavarthi 	if (name == NULL)
28ea80eafbSSrikanth Yalavarthi 		return NULL;
29ea80eafbSSrikanth Yalavarthi 
30ea80eafbSSrikanth Yalavarthi 	for (dev_id = 0; dev_id < ml_dev_globals.max_devs; dev_id++) {
31ea80eafbSSrikanth Yalavarthi 		dev = rte_ml_dev_pmd_get_dev(dev_id);
32ea80eafbSSrikanth Yalavarthi 		if ((dev->attached == ML_DEV_ATTACHED) && (strcmp(dev->data->name, name) == 0))
33ea80eafbSSrikanth Yalavarthi 			return dev;
34ea80eafbSSrikanth Yalavarthi 	}
35ea80eafbSSrikanth Yalavarthi 
36ea80eafbSSrikanth Yalavarthi 	return NULL;
37ea80eafbSSrikanth Yalavarthi }
38ea80eafbSSrikanth Yalavarthi 
39ea80eafbSSrikanth Yalavarthi struct rte_ml_dev *
40ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_allocate(const char *name, uint8_t socket_id)
41ea80eafbSSrikanth Yalavarthi {
42ea80eafbSSrikanth Yalavarthi 	char mz_name[RTE_MEMZONE_NAMESIZE];
43ea80eafbSSrikanth Yalavarthi 	const struct rte_memzone *mz;
44ea80eafbSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
45ea80eafbSSrikanth Yalavarthi 	int16_t dev_id;
46ea80eafbSSrikanth Yalavarthi 
47ea80eafbSSrikanth Yalavarthi 	/* implicit initialization of library before adding first device */
48ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.devs == NULL) {
49ea80eafbSSrikanth Yalavarthi 		if (rte_ml_dev_init(RTE_MLDEV_DEFAULT_MAX) != 0)
50ea80eafbSSrikanth Yalavarthi 			return NULL;
51ea80eafbSSrikanth Yalavarthi 	}
52ea80eafbSSrikanth Yalavarthi 
53ea80eafbSSrikanth Yalavarthi 	if (rte_ml_dev_pmd_get_named_dev(name) != NULL) {
54ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "ML device with name %s already allocated!", name);
55ea80eafbSSrikanth Yalavarthi 		return NULL;
56ea80eafbSSrikanth Yalavarthi 	}
57ea80eafbSSrikanth Yalavarthi 
58ea80eafbSSrikanth Yalavarthi 	/* Get a free device ID */
59ea80eafbSSrikanth Yalavarthi 	for (dev_id = 0; dev_id < ml_dev_globals.max_devs; dev_id++) {
60ea80eafbSSrikanth Yalavarthi 		dev = rte_ml_dev_pmd_get_dev(dev_id);
61ea80eafbSSrikanth Yalavarthi 		if (dev->attached == ML_DEV_DETACHED)
62ea80eafbSSrikanth Yalavarthi 			break;
63ea80eafbSSrikanth Yalavarthi 	}
64ea80eafbSSrikanth Yalavarthi 
65ea80eafbSSrikanth Yalavarthi 	if (dev_id == ml_dev_globals.max_devs) {
66ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Reached maximum number of ML devices");
67ea80eafbSSrikanth Yalavarthi 		return NULL;
68ea80eafbSSrikanth Yalavarthi 	}
69ea80eafbSSrikanth Yalavarthi 
70ea80eafbSSrikanth Yalavarthi 	if (dev->data == NULL) {
71ea80eafbSSrikanth Yalavarthi 		/* Reserve memzone name */
72ea80eafbSSrikanth Yalavarthi 		sprintf(mz_name, "rte_ml_dev_data_%d", dev_id);
73ea80eafbSSrikanth Yalavarthi 		if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
74ea80eafbSSrikanth Yalavarthi 			mz = rte_memzone_reserve(mz_name, sizeof(struct rte_ml_dev_data), socket_id,
75ea80eafbSSrikanth Yalavarthi 						 0);
76ea80eafbSSrikanth Yalavarthi 			RTE_MLDEV_LOG(DEBUG, "PRIMARY: reserved memzone for %s (%p)", mz_name, mz);
77ea80eafbSSrikanth Yalavarthi 		} else {
78ea80eafbSSrikanth Yalavarthi 			mz = rte_memzone_lookup(mz_name);
79ea80eafbSSrikanth Yalavarthi 			RTE_MLDEV_LOG(DEBUG, "SECONDARY: looked up memzone for %s (%p)", mz_name,
80ea80eafbSSrikanth Yalavarthi 				      mz);
81ea80eafbSSrikanth Yalavarthi 		}
82ea80eafbSSrikanth Yalavarthi 
83ea80eafbSSrikanth Yalavarthi 		if (mz == NULL)
84ea80eafbSSrikanth Yalavarthi 			return NULL;
85ea80eafbSSrikanth Yalavarthi 
86ea80eafbSSrikanth Yalavarthi 		ml_dev_globals.data[dev_id] = mz->addr;
87ea80eafbSSrikanth Yalavarthi 		if (rte_eal_process_type() == RTE_PROC_PRIMARY)
88ea80eafbSSrikanth Yalavarthi 			memset(ml_dev_globals.data[dev_id], 0, sizeof(struct rte_ml_dev_data));
89ea80eafbSSrikanth Yalavarthi 
90ea80eafbSSrikanth Yalavarthi 		dev->data = ml_dev_globals.data[dev_id];
91ea80eafbSSrikanth Yalavarthi 		if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
92ea80eafbSSrikanth Yalavarthi 			strlcpy(dev->data->name, name, RTE_ML_STR_MAX);
93ea80eafbSSrikanth Yalavarthi 			dev->data->dev_id = dev_id;
94ea80eafbSSrikanth Yalavarthi 			dev->data->socket_id = socket_id;
95ea80eafbSSrikanth Yalavarthi 			dev->data->dev_started = 0;
96ea80eafbSSrikanth Yalavarthi 			RTE_MLDEV_LOG(DEBUG, "PRIMARY: init mldev data");
97ea80eafbSSrikanth Yalavarthi 		}
98ea80eafbSSrikanth Yalavarthi 
99ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(DEBUG, "Data for %s: dev_id %d, socket %u", dev->data->name,
100ea80eafbSSrikanth Yalavarthi 			      dev->data->dev_id, dev->data->socket_id);
101ea80eafbSSrikanth Yalavarthi 
102ea80eafbSSrikanth Yalavarthi 		dev->attached = ML_DEV_ATTACHED;
103ea80eafbSSrikanth Yalavarthi 		ml_dev_globals.nb_devs++;
104ea80eafbSSrikanth Yalavarthi 	}
105ea80eafbSSrikanth Yalavarthi 
106ea80eafbSSrikanth Yalavarthi 	return dev;
107ea80eafbSSrikanth Yalavarthi }
108ea80eafbSSrikanth Yalavarthi 
109ea80eafbSSrikanth Yalavarthi int
110ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_release(struct rte_ml_dev *dev)
111ea80eafbSSrikanth Yalavarthi {
112ea80eafbSSrikanth Yalavarthi 	char mz_name[RTE_MEMZONE_NAMESIZE];
113ea80eafbSSrikanth Yalavarthi 	const struct rte_memzone *mz;
114ea80eafbSSrikanth Yalavarthi 	int16_t dev_id;
115ea80eafbSSrikanth Yalavarthi 	int ret = 0;
116ea80eafbSSrikanth Yalavarthi 
117ea80eafbSSrikanth Yalavarthi 	if (dev == NULL)
118ea80eafbSSrikanth Yalavarthi 		return -EINVAL;
119ea80eafbSSrikanth Yalavarthi 
120ea80eafbSSrikanth Yalavarthi 	dev_id = dev->data->dev_id;
121ea80eafbSSrikanth Yalavarthi 
122ea80eafbSSrikanth Yalavarthi 	/* Memzone lookup */
123ea80eafbSSrikanth Yalavarthi 	sprintf(mz_name, "rte_ml_dev_data_%d", dev_id);
124ea80eafbSSrikanth Yalavarthi 	mz = rte_memzone_lookup(mz_name);
125ea80eafbSSrikanth Yalavarthi 	if (mz == NULL)
126ea80eafbSSrikanth Yalavarthi 		return -ENOMEM;
127ea80eafbSSrikanth Yalavarthi 
128ea80eafbSSrikanth Yalavarthi 	RTE_ASSERT(ml_dev_globals.data[dev_id] == mz->addr);
129ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.data[dev_id] = NULL;
130ea80eafbSSrikanth Yalavarthi 
131ea80eafbSSrikanth Yalavarthi 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
132ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(DEBUG, "PRIMARY: free memzone of %s (%p)", mz_name, mz);
133ea80eafbSSrikanth Yalavarthi 		ret = rte_memzone_free(mz);
134ea80eafbSSrikanth Yalavarthi 	} else {
135ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(DEBUG, "SECONDARY: don't free memzone of %s (%p)", mz_name, mz);
136ea80eafbSSrikanth Yalavarthi 	}
137ea80eafbSSrikanth Yalavarthi 
138ea80eafbSSrikanth Yalavarthi 	dev->attached = ML_DEV_DETACHED;
139ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.nb_devs--;
140ea80eafbSSrikanth Yalavarthi 
141ea80eafbSSrikanth Yalavarthi 	return ret;
142ea80eafbSSrikanth Yalavarthi }
143ea80eafbSSrikanth Yalavarthi 
144ea80eafbSSrikanth Yalavarthi int
145ea80eafbSSrikanth Yalavarthi rte_ml_dev_init(size_t dev_max)
146ea80eafbSSrikanth Yalavarthi {
147ea80eafbSSrikanth Yalavarthi 	if (dev_max == 0 || dev_max > INT16_MAX) {
148ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_max = %zu (> %d)\n", dev_max, INT16_MAX);
149ea80eafbSSrikanth Yalavarthi 		rte_errno = EINVAL;
150ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
151ea80eafbSSrikanth Yalavarthi 	}
152ea80eafbSSrikanth Yalavarthi 
153ea80eafbSSrikanth Yalavarthi 	/* No lock, it must be called before or during first probing. */
154ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.devs != NULL) {
155ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device array already initialized");
156ea80eafbSSrikanth Yalavarthi 		rte_errno = EBUSY;
157ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
158ea80eafbSSrikanth Yalavarthi 	}
159ea80eafbSSrikanth Yalavarthi 
160ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.devs = calloc(dev_max, sizeof(struct rte_ml_dev));
161ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.devs == NULL) {
162ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Cannot initialize MLDEV library");
163ea80eafbSSrikanth Yalavarthi 		rte_errno = ENOMEM;
164ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
165ea80eafbSSrikanth Yalavarthi 	}
166ea80eafbSSrikanth Yalavarthi 
167ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.data = calloc(dev_max, sizeof(struct rte_ml_dev_data *));
168ea80eafbSSrikanth Yalavarthi 	if (ml_dev_globals.data == NULL) {
169ea80eafbSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Cannot initialize MLDEV library");
170ea80eafbSSrikanth Yalavarthi 		rte_errno = ENOMEM;
171ea80eafbSSrikanth Yalavarthi 		return -rte_errno;
172ea80eafbSSrikanth Yalavarthi 	}
173ea80eafbSSrikanth Yalavarthi 
174ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.max_devs = dev_max;
175ea80eafbSSrikanth Yalavarthi 	ml_dev_globals.devs = ml_dev_globals.devs;
176ea80eafbSSrikanth Yalavarthi 
177ea80eafbSSrikanth Yalavarthi 	return 0;
178ea80eafbSSrikanth Yalavarthi }
179d82cac58SJerin Jacob 
18036d0b09eSSrikanth Yalavarthi uint16_t
18136d0b09eSSrikanth Yalavarthi rte_ml_dev_count(void)
18236d0b09eSSrikanth Yalavarthi {
18336d0b09eSSrikanth Yalavarthi 	return ml_dev_globals.nb_devs;
18436d0b09eSSrikanth Yalavarthi }
18536d0b09eSSrikanth Yalavarthi 
18636d0b09eSSrikanth Yalavarthi int
18736d0b09eSSrikanth Yalavarthi rte_ml_dev_is_valid_dev(int16_t dev_id)
18836d0b09eSSrikanth Yalavarthi {
18936d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev = NULL;
19036d0b09eSSrikanth Yalavarthi 
19136d0b09eSSrikanth Yalavarthi 	if (dev_id >= ml_dev_globals.max_devs || ml_dev_globals.devs[dev_id].data == NULL)
19236d0b09eSSrikanth Yalavarthi 		return 0;
19336d0b09eSSrikanth Yalavarthi 
19436d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
19536d0b09eSSrikanth Yalavarthi 	if (dev->attached != ML_DEV_ATTACHED)
19636d0b09eSSrikanth Yalavarthi 		return 0;
19736d0b09eSSrikanth Yalavarthi 	else
19836d0b09eSSrikanth Yalavarthi 		return 1;
19936d0b09eSSrikanth Yalavarthi }
20036d0b09eSSrikanth Yalavarthi 
20136d0b09eSSrikanth Yalavarthi int
20236d0b09eSSrikanth Yalavarthi rte_ml_dev_socket_id(int16_t dev_id)
20336d0b09eSSrikanth Yalavarthi {
20436d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
20536d0b09eSSrikanth Yalavarthi 
20636d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
20736d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
20836d0b09eSSrikanth Yalavarthi 		return -EINVAL;
20936d0b09eSSrikanth Yalavarthi 	}
21036d0b09eSSrikanth Yalavarthi 
21136d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
21236d0b09eSSrikanth Yalavarthi 
21336d0b09eSSrikanth Yalavarthi 	return dev->data->socket_id;
21436d0b09eSSrikanth Yalavarthi }
21536d0b09eSSrikanth Yalavarthi 
21636d0b09eSSrikanth Yalavarthi int
21736d0b09eSSrikanth Yalavarthi rte_ml_dev_info_get(int16_t dev_id, struct rte_ml_dev_info *dev_info)
21836d0b09eSSrikanth Yalavarthi {
21936d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
22036d0b09eSSrikanth Yalavarthi 
22136d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
22236d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
22336d0b09eSSrikanth Yalavarthi 		return -EINVAL;
22436d0b09eSSrikanth Yalavarthi 	}
22536d0b09eSSrikanth Yalavarthi 
22636d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
22736d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_info_get == NULL)
22836d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
22936d0b09eSSrikanth Yalavarthi 
23036d0b09eSSrikanth Yalavarthi 	if (dev_info == NULL) {
23136d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dev_info cannot be NULL\n", dev_id);
23236d0b09eSSrikanth Yalavarthi 		return -EINVAL;
23336d0b09eSSrikanth Yalavarthi 	}
23436d0b09eSSrikanth Yalavarthi 	memset(dev_info, 0, sizeof(struct rte_ml_dev_info));
23536d0b09eSSrikanth Yalavarthi 
23636d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_info_get)(dev, dev_info);
23736d0b09eSSrikanth Yalavarthi }
23836d0b09eSSrikanth Yalavarthi 
23936d0b09eSSrikanth Yalavarthi int
24036d0b09eSSrikanth Yalavarthi rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *config)
24136d0b09eSSrikanth Yalavarthi {
24236d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev_info dev_info;
24336d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
24436d0b09eSSrikanth Yalavarthi 	int ret;
24536d0b09eSSrikanth Yalavarthi 
24636d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
24736d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
24836d0b09eSSrikanth Yalavarthi 		return -EINVAL;
24936d0b09eSSrikanth Yalavarthi 	}
25036d0b09eSSrikanth Yalavarthi 
25136d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
25236d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_configure == NULL)
25336d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
25436d0b09eSSrikanth Yalavarthi 
25536d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started) {
25636d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id);
25736d0b09eSSrikanth Yalavarthi 		return -EBUSY;
25836d0b09eSSrikanth Yalavarthi 	}
25936d0b09eSSrikanth Yalavarthi 
26036d0b09eSSrikanth Yalavarthi 	if (config == NULL) {
26136d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, config cannot be NULL\n", dev_id);
26236d0b09eSSrikanth Yalavarthi 		return -EINVAL;
26336d0b09eSSrikanth Yalavarthi 	}
26436d0b09eSSrikanth Yalavarthi 
26536d0b09eSSrikanth Yalavarthi 	ret = rte_ml_dev_info_get(dev_id, &dev_info);
26636d0b09eSSrikanth Yalavarthi 	if (ret < 0)
26736d0b09eSSrikanth Yalavarthi 		return ret;
26836d0b09eSSrikanth Yalavarthi 
26936d0b09eSSrikanth Yalavarthi 	if (config->nb_queue_pairs > dev_info.max_queue_pairs) {
27036d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d num of queues %u > %u\n", dev_id,
27136d0b09eSSrikanth Yalavarthi 			      config->nb_queue_pairs, dev_info.max_queue_pairs);
27236d0b09eSSrikanth Yalavarthi 		return -EINVAL;
27336d0b09eSSrikanth Yalavarthi 	}
27436d0b09eSSrikanth Yalavarthi 
27536d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_configure)(dev, config);
27636d0b09eSSrikanth Yalavarthi }
27736d0b09eSSrikanth Yalavarthi 
27836d0b09eSSrikanth Yalavarthi int
27936d0b09eSSrikanth Yalavarthi rte_ml_dev_close(int16_t dev_id)
28036d0b09eSSrikanth Yalavarthi {
28136d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
28236d0b09eSSrikanth Yalavarthi 
28336d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
28436d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
28536d0b09eSSrikanth Yalavarthi 		return -EINVAL;
28636d0b09eSSrikanth Yalavarthi 	}
28736d0b09eSSrikanth Yalavarthi 
28836d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
28936d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_close == NULL)
29036d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
29136d0b09eSSrikanth Yalavarthi 
29236d0b09eSSrikanth Yalavarthi 	/* Device must be stopped before it can be closed */
29336d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 1) {
29436d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped before closing", dev_id);
29536d0b09eSSrikanth Yalavarthi 		return -EBUSY;
29636d0b09eSSrikanth Yalavarthi 	}
29736d0b09eSSrikanth Yalavarthi 
29836d0b09eSSrikanth Yalavarthi 	return (*dev->dev_ops->dev_close)(dev);
29936d0b09eSSrikanth Yalavarthi }
30036d0b09eSSrikanth Yalavarthi 
30136d0b09eSSrikanth Yalavarthi int
30236d0b09eSSrikanth Yalavarthi rte_ml_dev_start(int16_t dev_id)
30336d0b09eSSrikanth Yalavarthi {
30436d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
30536d0b09eSSrikanth Yalavarthi 	int ret;
30636d0b09eSSrikanth Yalavarthi 
30736d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
30836d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
30936d0b09eSSrikanth Yalavarthi 		return -EINVAL;
31036d0b09eSSrikanth Yalavarthi 	}
31136d0b09eSSrikanth Yalavarthi 
31236d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
31336d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_start == NULL)
31436d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
31536d0b09eSSrikanth Yalavarthi 
31636d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started != 0) {
31736d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is already started", dev_id);
31836d0b09eSSrikanth Yalavarthi 		return -EBUSY;
31936d0b09eSSrikanth Yalavarthi 	}
32036d0b09eSSrikanth Yalavarthi 
32136d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_start)(dev);
32236d0b09eSSrikanth Yalavarthi 	if (ret == 0)
32336d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 1;
32436d0b09eSSrikanth Yalavarthi 
32536d0b09eSSrikanth Yalavarthi 	return ret;
32636d0b09eSSrikanth Yalavarthi }
32736d0b09eSSrikanth Yalavarthi 
32836d0b09eSSrikanth Yalavarthi int
32936d0b09eSSrikanth Yalavarthi rte_ml_dev_stop(int16_t dev_id)
33036d0b09eSSrikanth Yalavarthi {
33136d0b09eSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
33236d0b09eSSrikanth Yalavarthi 	int ret;
33336d0b09eSSrikanth Yalavarthi 
33436d0b09eSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
33536d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
33636d0b09eSSrikanth Yalavarthi 		return -EINVAL;
33736d0b09eSSrikanth Yalavarthi 	}
33836d0b09eSSrikanth Yalavarthi 
33936d0b09eSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
34036d0b09eSSrikanth Yalavarthi 	if (*dev->dev_ops->dev_stop == NULL)
34136d0b09eSSrikanth Yalavarthi 		return -ENOTSUP;
34236d0b09eSSrikanth Yalavarthi 
34336d0b09eSSrikanth Yalavarthi 	if (dev->data->dev_started == 0) {
34436d0b09eSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d is not started", dev_id);
34536d0b09eSSrikanth Yalavarthi 		return -EBUSY;
34636d0b09eSSrikanth Yalavarthi 	}
34736d0b09eSSrikanth Yalavarthi 
34836d0b09eSSrikanth Yalavarthi 	ret = (*dev->dev_ops->dev_stop)(dev);
34936d0b09eSSrikanth Yalavarthi 	if (ret == 0)
35036d0b09eSSrikanth Yalavarthi 		dev->data->dev_started = 0;
35136d0b09eSSrikanth Yalavarthi 
35236d0b09eSSrikanth Yalavarthi 	return ret;
35336d0b09eSSrikanth Yalavarthi }
35436d0b09eSSrikanth Yalavarthi 
355b5f0df64SSrikanth Yalavarthi int
356b5f0df64SSrikanth Yalavarthi rte_ml_dev_queue_pair_setup(int16_t dev_id, uint16_t queue_pair_id,
357b5f0df64SSrikanth Yalavarthi 			    const struct rte_ml_dev_qp_conf *qp_conf, int socket_id)
358b5f0df64SSrikanth Yalavarthi {
359b5f0df64SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
360b5f0df64SSrikanth Yalavarthi 
361b5f0df64SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
362b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
363b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
364b5f0df64SSrikanth Yalavarthi 	}
365b5f0df64SSrikanth Yalavarthi 
366b5f0df64SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
367b5f0df64SSrikanth Yalavarthi 	if (*dev->dev_ops->dev_queue_pair_setup == NULL)
368b5f0df64SSrikanth Yalavarthi 		return -ENOTSUP;
369b5f0df64SSrikanth Yalavarthi 
370b5f0df64SSrikanth Yalavarthi 	if (queue_pair_id >= dev->data->nb_queue_pairs) {
371b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid queue_pair_id = %d", queue_pair_id);
372b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
373b5f0df64SSrikanth Yalavarthi 	}
374b5f0df64SSrikanth Yalavarthi 
375b5f0df64SSrikanth Yalavarthi 	if (qp_conf == NULL) {
376b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qp_conf cannot be NULL\n", dev_id);
377b5f0df64SSrikanth Yalavarthi 		return -EINVAL;
378b5f0df64SSrikanth Yalavarthi 	}
379b5f0df64SSrikanth Yalavarthi 
380b5f0df64SSrikanth Yalavarthi 	if (dev->data->dev_started) {
381b5f0df64SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id);
382b5f0df64SSrikanth Yalavarthi 		return -EBUSY;
383b5f0df64SSrikanth Yalavarthi 	}
384b5f0df64SSrikanth Yalavarthi 
385b5f0df64SSrikanth Yalavarthi 	return (*dev->dev_ops->dev_queue_pair_setup)(dev, queue_pair_id, qp_conf, socket_id);
386b5f0df64SSrikanth Yalavarthi }
387b5f0df64SSrikanth Yalavarthi 
3884a662f54SSrikanth Yalavarthi int
3894a662f54SSrikanth Yalavarthi rte_ml_model_load(int16_t dev_id, struct rte_ml_model_params *params, uint16_t *model_id)
3904a662f54SSrikanth Yalavarthi {
3914a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
3924a662f54SSrikanth Yalavarthi 
3934a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
3944a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
3954a662f54SSrikanth Yalavarthi 		return -EINVAL;
3964a662f54SSrikanth Yalavarthi 	}
3974a662f54SSrikanth Yalavarthi 
3984a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
3994a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_load == NULL)
4004a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4014a662f54SSrikanth Yalavarthi 
4024a662f54SSrikanth Yalavarthi 	if (params == NULL) {
4034a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, params cannot be NULL\n", dev_id);
4044a662f54SSrikanth Yalavarthi 		return -EINVAL;
4054a662f54SSrikanth Yalavarthi 	}
4064a662f54SSrikanth Yalavarthi 
4074a662f54SSrikanth Yalavarthi 	if (model_id == NULL) {
4084a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id cannot be NULL\n", dev_id);
4094a662f54SSrikanth Yalavarthi 		return -EINVAL;
4104a662f54SSrikanth Yalavarthi 	}
4114a662f54SSrikanth Yalavarthi 
4124a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_load)(dev, params, model_id);
4134a662f54SSrikanth Yalavarthi }
4144a662f54SSrikanth Yalavarthi 
4154a662f54SSrikanth Yalavarthi int
4164a662f54SSrikanth Yalavarthi rte_ml_model_unload(int16_t dev_id, uint16_t model_id)
4174a662f54SSrikanth Yalavarthi {
4184a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4194a662f54SSrikanth Yalavarthi 
4204a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4214a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4224a662f54SSrikanth Yalavarthi 		return -EINVAL;
4234a662f54SSrikanth Yalavarthi 	}
4244a662f54SSrikanth Yalavarthi 
4254a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4264a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_unload == NULL)
4274a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4284a662f54SSrikanth Yalavarthi 
4294a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_unload)(dev, model_id);
4304a662f54SSrikanth Yalavarthi }
4314a662f54SSrikanth Yalavarthi 
4324a662f54SSrikanth Yalavarthi int
4334a662f54SSrikanth Yalavarthi rte_ml_model_start(int16_t dev_id, uint16_t model_id)
4344a662f54SSrikanth Yalavarthi {
4354a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4364a662f54SSrikanth Yalavarthi 
4374a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4384a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4394a662f54SSrikanth Yalavarthi 		return -EINVAL;
4404a662f54SSrikanth Yalavarthi 	}
4414a662f54SSrikanth Yalavarthi 
4424a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4434a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_start == NULL)
4444a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4454a662f54SSrikanth Yalavarthi 
4464a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_start)(dev, model_id);
4474a662f54SSrikanth Yalavarthi }
4484a662f54SSrikanth Yalavarthi 
4494a662f54SSrikanth Yalavarthi int
4504a662f54SSrikanth Yalavarthi rte_ml_model_stop(int16_t dev_id, uint16_t model_id)
4514a662f54SSrikanth Yalavarthi {
4524a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4534a662f54SSrikanth Yalavarthi 
4544a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4554a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4564a662f54SSrikanth Yalavarthi 		return -EINVAL;
4574a662f54SSrikanth Yalavarthi 	}
4584a662f54SSrikanth Yalavarthi 
4594a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4604a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_stop == NULL)
4614a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4624a662f54SSrikanth Yalavarthi 
4634a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_stop)(dev, model_id);
4644a662f54SSrikanth Yalavarthi }
4654a662f54SSrikanth Yalavarthi 
4664a662f54SSrikanth Yalavarthi int
4674a662f54SSrikanth Yalavarthi rte_ml_model_info_get(int16_t dev_id, uint16_t model_id, struct rte_ml_model_info *model_info)
4684a662f54SSrikanth Yalavarthi {
4694a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4704a662f54SSrikanth Yalavarthi 
4714a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4724a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4734a662f54SSrikanth Yalavarthi 		return -EINVAL;
4744a662f54SSrikanth Yalavarthi 	}
4754a662f54SSrikanth Yalavarthi 
4764a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
4774a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_info_get == NULL)
4784a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
4794a662f54SSrikanth Yalavarthi 
4804a662f54SSrikanth Yalavarthi 	if (model_info == NULL) {
4814a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, model_id %u, model_info cannot be NULL\n", dev_id,
4824a662f54SSrikanth Yalavarthi 			      model_id);
4834a662f54SSrikanth Yalavarthi 		return -EINVAL;
4844a662f54SSrikanth Yalavarthi 	}
4854a662f54SSrikanth Yalavarthi 
4864a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_info_get)(dev, model_id, model_info);
4874a662f54SSrikanth Yalavarthi }
4884a662f54SSrikanth Yalavarthi 
4894a662f54SSrikanth Yalavarthi int
4904a662f54SSrikanth Yalavarthi rte_ml_model_params_update(int16_t dev_id, uint16_t model_id, void *buffer)
4914a662f54SSrikanth Yalavarthi {
4924a662f54SSrikanth Yalavarthi 	struct rte_ml_dev *dev;
4934a662f54SSrikanth Yalavarthi 
4944a662f54SSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
4954a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
4964a662f54SSrikanth Yalavarthi 		return -EINVAL;
4974a662f54SSrikanth Yalavarthi 	}
4984a662f54SSrikanth Yalavarthi 
4994a662f54SSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
5004a662f54SSrikanth Yalavarthi 	if (*dev->dev_ops->model_params_update == NULL)
5014a662f54SSrikanth Yalavarthi 		return -ENOTSUP;
5024a662f54SSrikanth Yalavarthi 
5034a662f54SSrikanth Yalavarthi 	if (buffer == NULL) {
5044a662f54SSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, buffer cannot be NULL\n", dev_id);
5054a662f54SSrikanth Yalavarthi 		return -EINVAL;
5064a662f54SSrikanth Yalavarthi 	}
5074a662f54SSrikanth Yalavarthi 
5084a662f54SSrikanth Yalavarthi 	return (*dev->dev_ops->model_params_update)(dev, model_id, buffer);
5094a662f54SSrikanth Yalavarthi }
5104a662f54SSrikanth Yalavarthi 
511*50818b0aSSrikanth Yalavarthi int
512*50818b0aSSrikanth Yalavarthi rte_ml_io_input_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,
513*50818b0aSSrikanth Yalavarthi 			 uint64_t *input_qsize, uint64_t *input_dsize)
514*50818b0aSSrikanth Yalavarthi {
515*50818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
516*50818b0aSSrikanth Yalavarthi 
517*50818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
518*50818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
519*50818b0aSSrikanth Yalavarthi 		return -EINVAL;
520*50818b0aSSrikanth Yalavarthi 	}
521*50818b0aSSrikanth Yalavarthi 
522*50818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
523*50818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_input_size_get == NULL)
524*50818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
525*50818b0aSSrikanth Yalavarthi 
526*50818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_input_size_get)(dev, model_id, nb_batches, input_qsize,
527*50818b0aSSrikanth Yalavarthi 						  input_dsize);
528*50818b0aSSrikanth Yalavarthi }
529*50818b0aSSrikanth Yalavarthi 
530*50818b0aSSrikanth Yalavarthi int
531*50818b0aSSrikanth Yalavarthi rte_ml_io_output_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches,
532*50818b0aSSrikanth Yalavarthi 			  uint64_t *output_qsize, uint64_t *output_dsize)
533*50818b0aSSrikanth Yalavarthi {
534*50818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
535*50818b0aSSrikanth Yalavarthi 
536*50818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
537*50818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
538*50818b0aSSrikanth Yalavarthi 		return -EINVAL;
539*50818b0aSSrikanth Yalavarthi 	}
540*50818b0aSSrikanth Yalavarthi 
541*50818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
542*50818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_output_size_get == NULL)
543*50818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
544*50818b0aSSrikanth Yalavarthi 
545*50818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_output_size_get)(dev, model_id, nb_batches, output_qsize,
546*50818b0aSSrikanth Yalavarthi 						   output_dsize);
547*50818b0aSSrikanth Yalavarthi }
548*50818b0aSSrikanth Yalavarthi 
549*50818b0aSSrikanth Yalavarthi int
550*50818b0aSSrikanth Yalavarthi rte_ml_io_quantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *dbuffer,
551*50818b0aSSrikanth Yalavarthi 		   void *qbuffer)
552*50818b0aSSrikanth Yalavarthi {
553*50818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
554*50818b0aSSrikanth Yalavarthi 
555*50818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
556*50818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
557*50818b0aSSrikanth Yalavarthi 		return -EINVAL;
558*50818b0aSSrikanth Yalavarthi 	}
559*50818b0aSSrikanth Yalavarthi 
560*50818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
561*50818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_quantize == NULL)
562*50818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
563*50818b0aSSrikanth Yalavarthi 
564*50818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
565*50818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id);
566*50818b0aSSrikanth Yalavarthi 		return -EINVAL;
567*50818b0aSSrikanth Yalavarthi 	}
568*50818b0aSSrikanth Yalavarthi 
569*50818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
570*50818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id);
571*50818b0aSSrikanth Yalavarthi 		return -EINVAL;
572*50818b0aSSrikanth Yalavarthi 	}
573*50818b0aSSrikanth Yalavarthi 
574*50818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_quantize)(dev, model_id, nb_batches, dbuffer, qbuffer);
575*50818b0aSSrikanth Yalavarthi }
576*50818b0aSSrikanth Yalavarthi 
577*50818b0aSSrikanth Yalavarthi int
578*50818b0aSSrikanth Yalavarthi rte_ml_io_dequantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *qbuffer,
579*50818b0aSSrikanth Yalavarthi 		     void *dbuffer)
580*50818b0aSSrikanth Yalavarthi {
581*50818b0aSSrikanth Yalavarthi 	struct rte_ml_dev *dev;
582*50818b0aSSrikanth Yalavarthi 
583*50818b0aSSrikanth Yalavarthi 	if (!rte_ml_dev_is_valid_dev(dev_id)) {
584*50818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
585*50818b0aSSrikanth Yalavarthi 		return -EINVAL;
586*50818b0aSSrikanth Yalavarthi 	}
587*50818b0aSSrikanth Yalavarthi 
588*50818b0aSSrikanth Yalavarthi 	dev = rte_ml_dev_pmd_get_dev(dev_id);
589*50818b0aSSrikanth Yalavarthi 	if (*dev->dev_ops->io_dequantize == NULL)
590*50818b0aSSrikanth Yalavarthi 		return -ENOTSUP;
591*50818b0aSSrikanth Yalavarthi 
592*50818b0aSSrikanth Yalavarthi 	if (qbuffer == NULL) {
593*50818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id);
594*50818b0aSSrikanth Yalavarthi 		return -EINVAL;
595*50818b0aSSrikanth Yalavarthi 	}
596*50818b0aSSrikanth Yalavarthi 
597*50818b0aSSrikanth Yalavarthi 	if (dbuffer == NULL) {
598*50818b0aSSrikanth Yalavarthi 		RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id);
599*50818b0aSSrikanth Yalavarthi 		return -EINVAL;
600*50818b0aSSrikanth Yalavarthi 	}
601*50818b0aSSrikanth Yalavarthi 
602*50818b0aSSrikanth Yalavarthi 	return (*dev->dev_ops->io_dequantize)(dev, model_id, nb_batches, qbuffer, dbuffer);
603*50818b0aSSrikanth Yalavarthi }
604*50818b0aSSrikanth Yalavarthi 
605d82cac58SJerin Jacob RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO);
606