1d82cac58SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 2d82cac58SJerin Jacob * Copyright (c) 2022 Marvell. 3d82cac58SJerin Jacob */ 4d82cac58SJerin Jacob 5ea80eafbSSrikanth Yalavarthi #include <rte_errno.h> 6d82cac58SJerin Jacob #include <rte_log.h> 7d82cac58SJerin Jacob #include <rte_mldev.h> 8ea80eafbSSrikanth Yalavarthi #include <rte_mldev_pmd.h> 9ea80eafbSSrikanth Yalavarthi 10ea80eafbSSrikanth Yalavarthi #include <stdlib.h> 11ea80eafbSSrikanth Yalavarthi 12ea80eafbSSrikanth Yalavarthi static struct rte_ml_dev_global ml_dev_globals = { 13ea80eafbSSrikanth Yalavarthi .devs = NULL, .data = NULL, .nb_devs = 0, .max_devs = RTE_MLDEV_DEFAULT_MAX}; 14ea80eafbSSrikanth Yalavarthi 151b365349SSrikanth Yalavarthi /* 161b365349SSrikanth Yalavarthi * Private data structure of an operation pool. 171b365349SSrikanth Yalavarthi * 181b365349SSrikanth Yalavarthi * A structure that contains ml op_pool specific data that is 191b365349SSrikanth Yalavarthi * appended after the mempool structure (in private data). 201b365349SSrikanth Yalavarthi */ 211b365349SSrikanth Yalavarthi struct rte_ml_op_pool_private { 221b365349SSrikanth Yalavarthi uint16_t user_size; 231b365349SSrikanth Yalavarthi /*< Size of private user data with each operation. */ 241b365349SSrikanth Yalavarthi }; 251b365349SSrikanth Yalavarthi 26ea80eafbSSrikanth Yalavarthi struct rte_ml_dev * 27ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_get_dev(int16_t dev_id) 28ea80eafbSSrikanth Yalavarthi { 29ea80eafbSSrikanth Yalavarthi return &ml_dev_globals.devs[dev_id]; 30ea80eafbSSrikanth Yalavarthi } 31ea80eafbSSrikanth Yalavarthi 32ea80eafbSSrikanth Yalavarthi struct rte_ml_dev * 33ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_get_named_dev(const char *name) 34ea80eafbSSrikanth Yalavarthi { 35ea80eafbSSrikanth Yalavarthi struct rte_ml_dev *dev; 36ea80eafbSSrikanth Yalavarthi int16_t dev_id; 37ea80eafbSSrikanth Yalavarthi 38ea80eafbSSrikanth Yalavarthi if (name == NULL) 39ea80eafbSSrikanth Yalavarthi return NULL; 40ea80eafbSSrikanth Yalavarthi 41ea80eafbSSrikanth Yalavarthi for (dev_id = 0; dev_id < ml_dev_globals.max_devs; dev_id++) { 42ea80eafbSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 43ea80eafbSSrikanth Yalavarthi if ((dev->attached == ML_DEV_ATTACHED) && (strcmp(dev->data->name, name) == 0)) 44ea80eafbSSrikanth Yalavarthi return dev; 45ea80eafbSSrikanth Yalavarthi } 46ea80eafbSSrikanth Yalavarthi 47ea80eafbSSrikanth Yalavarthi return NULL; 48ea80eafbSSrikanth Yalavarthi } 49ea80eafbSSrikanth Yalavarthi 50ea80eafbSSrikanth Yalavarthi struct rte_ml_dev * 51ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_allocate(const char *name, uint8_t socket_id) 52ea80eafbSSrikanth Yalavarthi { 53ea80eafbSSrikanth Yalavarthi char mz_name[RTE_MEMZONE_NAMESIZE]; 54ea80eafbSSrikanth Yalavarthi const struct rte_memzone *mz; 55ea80eafbSSrikanth Yalavarthi struct rte_ml_dev *dev; 56ea80eafbSSrikanth Yalavarthi int16_t dev_id; 57ea80eafbSSrikanth Yalavarthi 58ea80eafbSSrikanth Yalavarthi /* implicit initialization of library before adding first device */ 59ea80eafbSSrikanth Yalavarthi if (ml_dev_globals.devs == NULL) { 60ea80eafbSSrikanth Yalavarthi if (rte_ml_dev_init(RTE_MLDEV_DEFAULT_MAX) != 0) 61ea80eafbSSrikanth Yalavarthi return NULL; 62ea80eafbSSrikanth Yalavarthi } 63ea80eafbSSrikanth Yalavarthi 64ea80eafbSSrikanth Yalavarthi if (rte_ml_dev_pmd_get_named_dev(name) != NULL) { 65ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "ML device with name %s already allocated!", name); 66ea80eafbSSrikanth Yalavarthi return NULL; 67ea80eafbSSrikanth Yalavarthi } 68ea80eafbSSrikanth Yalavarthi 69ea80eafbSSrikanth Yalavarthi /* Get a free device ID */ 70ea80eafbSSrikanth Yalavarthi for (dev_id = 0; dev_id < ml_dev_globals.max_devs; dev_id++) { 71ea80eafbSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 72ea80eafbSSrikanth Yalavarthi if (dev->attached == ML_DEV_DETACHED) 73ea80eafbSSrikanth Yalavarthi break; 74ea80eafbSSrikanth Yalavarthi } 75ea80eafbSSrikanth Yalavarthi 76ea80eafbSSrikanth Yalavarthi if (dev_id == ml_dev_globals.max_devs) { 77ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Reached maximum number of ML devices"); 78ea80eafbSSrikanth Yalavarthi return NULL; 79ea80eafbSSrikanth Yalavarthi } 80ea80eafbSSrikanth Yalavarthi 81ea80eafbSSrikanth Yalavarthi if (dev->data == NULL) { 82ea80eafbSSrikanth Yalavarthi /* Reserve memzone name */ 83ea80eafbSSrikanth Yalavarthi sprintf(mz_name, "rte_ml_dev_data_%d", dev_id); 84ea80eafbSSrikanth Yalavarthi if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 85ea80eafbSSrikanth Yalavarthi mz = rte_memzone_reserve(mz_name, sizeof(struct rte_ml_dev_data), socket_id, 86ea80eafbSSrikanth Yalavarthi 0); 87ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(DEBUG, "PRIMARY: reserved memzone for %s (%p)", mz_name, mz); 88ea80eafbSSrikanth Yalavarthi } else { 89ea80eafbSSrikanth Yalavarthi mz = rte_memzone_lookup(mz_name); 90ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(DEBUG, "SECONDARY: looked up memzone for %s (%p)", mz_name, 91ea80eafbSSrikanth Yalavarthi mz); 92ea80eafbSSrikanth Yalavarthi } 93ea80eafbSSrikanth Yalavarthi 94ea80eafbSSrikanth Yalavarthi if (mz == NULL) 95ea80eafbSSrikanth Yalavarthi return NULL; 96ea80eafbSSrikanth Yalavarthi 97ea80eafbSSrikanth Yalavarthi ml_dev_globals.data[dev_id] = mz->addr; 98ea80eafbSSrikanth Yalavarthi if (rte_eal_process_type() == RTE_PROC_PRIMARY) 99ea80eafbSSrikanth Yalavarthi memset(ml_dev_globals.data[dev_id], 0, sizeof(struct rte_ml_dev_data)); 100ea80eafbSSrikanth Yalavarthi 101ea80eafbSSrikanth Yalavarthi dev->data = ml_dev_globals.data[dev_id]; 102ea80eafbSSrikanth Yalavarthi if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 103ea80eafbSSrikanth Yalavarthi strlcpy(dev->data->name, name, RTE_ML_STR_MAX); 104ea80eafbSSrikanth Yalavarthi dev->data->dev_id = dev_id; 105ea80eafbSSrikanth Yalavarthi dev->data->socket_id = socket_id; 106ea80eafbSSrikanth Yalavarthi dev->data->dev_started = 0; 107ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(DEBUG, "PRIMARY: init mldev data"); 108ea80eafbSSrikanth Yalavarthi } 109ea80eafbSSrikanth Yalavarthi 110ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(DEBUG, "Data for %s: dev_id %d, socket %u", dev->data->name, 111ea80eafbSSrikanth Yalavarthi dev->data->dev_id, dev->data->socket_id); 112ea80eafbSSrikanth Yalavarthi 113ea80eafbSSrikanth Yalavarthi dev->attached = ML_DEV_ATTACHED; 114ea80eafbSSrikanth Yalavarthi ml_dev_globals.nb_devs++; 115ea80eafbSSrikanth Yalavarthi } 116ea80eafbSSrikanth Yalavarthi 117c775df1cSSrikanth Yalavarthi dev->enqueue_burst = NULL; 118c775df1cSSrikanth Yalavarthi dev->dequeue_burst = NULL; 119c775df1cSSrikanth Yalavarthi 120ea80eafbSSrikanth Yalavarthi return dev; 121ea80eafbSSrikanth Yalavarthi } 122ea80eafbSSrikanth Yalavarthi 123ea80eafbSSrikanth Yalavarthi int 124ea80eafbSSrikanth Yalavarthi rte_ml_dev_pmd_release(struct rte_ml_dev *dev) 125ea80eafbSSrikanth Yalavarthi { 126ea80eafbSSrikanth Yalavarthi char mz_name[RTE_MEMZONE_NAMESIZE]; 127ea80eafbSSrikanth Yalavarthi const struct rte_memzone *mz; 128ea80eafbSSrikanth Yalavarthi int16_t dev_id; 129ea80eafbSSrikanth Yalavarthi int ret = 0; 130ea80eafbSSrikanth Yalavarthi 131ea80eafbSSrikanth Yalavarthi if (dev == NULL) 132ea80eafbSSrikanth Yalavarthi return -EINVAL; 133ea80eafbSSrikanth Yalavarthi 134ea80eafbSSrikanth Yalavarthi dev_id = dev->data->dev_id; 135ea80eafbSSrikanth Yalavarthi 136ea80eafbSSrikanth Yalavarthi /* Memzone lookup */ 137ea80eafbSSrikanth Yalavarthi sprintf(mz_name, "rte_ml_dev_data_%d", dev_id); 138ea80eafbSSrikanth Yalavarthi mz = rte_memzone_lookup(mz_name); 139ea80eafbSSrikanth Yalavarthi if (mz == NULL) 140ea80eafbSSrikanth Yalavarthi return -ENOMEM; 141ea80eafbSSrikanth Yalavarthi 142ea80eafbSSrikanth Yalavarthi RTE_ASSERT(ml_dev_globals.data[dev_id] == mz->addr); 143ea80eafbSSrikanth Yalavarthi ml_dev_globals.data[dev_id] = NULL; 144ea80eafbSSrikanth Yalavarthi 145ea80eafbSSrikanth Yalavarthi if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 146ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(DEBUG, "PRIMARY: free memzone of %s (%p)", mz_name, mz); 147ea80eafbSSrikanth Yalavarthi ret = rte_memzone_free(mz); 148ea80eafbSSrikanth Yalavarthi } else { 149ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(DEBUG, "SECONDARY: don't free memzone of %s (%p)", mz_name, mz); 150ea80eafbSSrikanth Yalavarthi } 151ea80eafbSSrikanth Yalavarthi 152ea80eafbSSrikanth Yalavarthi dev->attached = ML_DEV_DETACHED; 153ea80eafbSSrikanth Yalavarthi ml_dev_globals.nb_devs--; 154ea80eafbSSrikanth Yalavarthi 155ea80eafbSSrikanth Yalavarthi return ret; 156ea80eafbSSrikanth Yalavarthi } 157ea80eafbSSrikanth Yalavarthi 158ea80eafbSSrikanth Yalavarthi int 159ea80eafbSSrikanth Yalavarthi rte_ml_dev_init(size_t dev_max) 160ea80eafbSSrikanth Yalavarthi { 161ea80eafbSSrikanth Yalavarthi if (dev_max == 0 || dev_max > INT16_MAX) { 162ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_max = %zu (> %d)\n", dev_max, INT16_MAX); 163ea80eafbSSrikanth Yalavarthi rte_errno = EINVAL; 164ea80eafbSSrikanth Yalavarthi return -rte_errno; 165ea80eafbSSrikanth Yalavarthi } 166ea80eafbSSrikanth Yalavarthi 167ea80eafbSSrikanth Yalavarthi /* No lock, it must be called before or during first probing. */ 168ea80eafbSSrikanth Yalavarthi if (ml_dev_globals.devs != NULL) { 169ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device array already initialized"); 170ea80eafbSSrikanth Yalavarthi rte_errno = EBUSY; 171ea80eafbSSrikanth Yalavarthi return -rte_errno; 172ea80eafbSSrikanth Yalavarthi } 173ea80eafbSSrikanth Yalavarthi 174ea80eafbSSrikanth Yalavarthi ml_dev_globals.devs = calloc(dev_max, sizeof(struct rte_ml_dev)); 175ea80eafbSSrikanth Yalavarthi if (ml_dev_globals.devs == NULL) { 176ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Cannot initialize MLDEV library"); 177ea80eafbSSrikanth Yalavarthi rte_errno = ENOMEM; 178ea80eafbSSrikanth Yalavarthi return -rte_errno; 179ea80eafbSSrikanth Yalavarthi } 180ea80eafbSSrikanth Yalavarthi 181ea80eafbSSrikanth Yalavarthi ml_dev_globals.data = calloc(dev_max, sizeof(struct rte_ml_dev_data *)); 182ea80eafbSSrikanth Yalavarthi if (ml_dev_globals.data == NULL) { 183ea80eafbSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Cannot initialize MLDEV library"); 184ea80eafbSSrikanth Yalavarthi rte_errno = ENOMEM; 185ea80eafbSSrikanth Yalavarthi return -rte_errno; 186ea80eafbSSrikanth Yalavarthi } 187ea80eafbSSrikanth Yalavarthi 188ea80eafbSSrikanth Yalavarthi ml_dev_globals.max_devs = dev_max; 189ea80eafbSSrikanth Yalavarthi ml_dev_globals.devs = ml_dev_globals.devs; 190ea80eafbSSrikanth Yalavarthi 191ea80eafbSSrikanth Yalavarthi return 0; 192ea80eafbSSrikanth Yalavarthi } 193d82cac58SJerin Jacob 19436d0b09eSSrikanth Yalavarthi uint16_t 19536d0b09eSSrikanth Yalavarthi rte_ml_dev_count(void) 19636d0b09eSSrikanth Yalavarthi { 19736d0b09eSSrikanth Yalavarthi return ml_dev_globals.nb_devs; 19836d0b09eSSrikanth Yalavarthi } 19936d0b09eSSrikanth Yalavarthi 20036d0b09eSSrikanth Yalavarthi int 20136d0b09eSSrikanth Yalavarthi rte_ml_dev_is_valid_dev(int16_t dev_id) 20236d0b09eSSrikanth Yalavarthi { 20336d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev = NULL; 20436d0b09eSSrikanth Yalavarthi 20536d0b09eSSrikanth Yalavarthi if (dev_id >= ml_dev_globals.max_devs || ml_dev_globals.devs[dev_id].data == NULL) 20636d0b09eSSrikanth Yalavarthi return 0; 20736d0b09eSSrikanth Yalavarthi 20836d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 20936d0b09eSSrikanth Yalavarthi if (dev->attached != ML_DEV_ATTACHED) 21036d0b09eSSrikanth Yalavarthi return 0; 21136d0b09eSSrikanth Yalavarthi else 21236d0b09eSSrikanth Yalavarthi return 1; 21336d0b09eSSrikanth Yalavarthi } 21436d0b09eSSrikanth Yalavarthi 21536d0b09eSSrikanth Yalavarthi int 21636d0b09eSSrikanth Yalavarthi rte_ml_dev_socket_id(int16_t dev_id) 21736d0b09eSSrikanth Yalavarthi { 21836d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 21936d0b09eSSrikanth Yalavarthi 22036d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 22136d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 22236d0b09eSSrikanth Yalavarthi return -EINVAL; 22336d0b09eSSrikanth Yalavarthi } 22436d0b09eSSrikanth Yalavarthi 22536d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 22636d0b09eSSrikanth Yalavarthi 22736d0b09eSSrikanth Yalavarthi return dev->data->socket_id; 22836d0b09eSSrikanth Yalavarthi } 22936d0b09eSSrikanth Yalavarthi 23036d0b09eSSrikanth Yalavarthi int 23136d0b09eSSrikanth Yalavarthi rte_ml_dev_info_get(int16_t dev_id, struct rte_ml_dev_info *dev_info) 23236d0b09eSSrikanth Yalavarthi { 23336d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 23436d0b09eSSrikanth Yalavarthi 23536d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 23636d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 23736d0b09eSSrikanth Yalavarthi return -EINVAL; 23836d0b09eSSrikanth Yalavarthi } 23936d0b09eSSrikanth Yalavarthi 24036d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 24136d0b09eSSrikanth Yalavarthi if (*dev->dev_ops->dev_info_get == NULL) 24236d0b09eSSrikanth Yalavarthi return -ENOTSUP; 24336d0b09eSSrikanth Yalavarthi 24436d0b09eSSrikanth Yalavarthi if (dev_info == NULL) { 24536d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, dev_info cannot be NULL\n", dev_id); 24636d0b09eSSrikanth Yalavarthi return -EINVAL; 24736d0b09eSSrikanth Yalavarthi } 24836d0b09eSSrikanth Yalavarthi memset(dev_info, 0, sizeof(struct rte_ml_dev_info)); 24936d0b09eSSrikanth Yalavarthi 25036d0b09eSSrikanth Yalavarthi return (*dev->dev_ops->dev_info_get)(dev, dev_info); 25136d0b09eSSrikanth Yalavarthi } 25236d0b09eSSrikanth Yalavarthi 25336d0b09eSSrikanth Yalavarthi int 25436d0b09eSSrikanth Yalavarthi rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *config) 25536d0b09eSSrikanth Yalavarthi { 25636d0b09eSSrikanth Yalavarthi struct rte_ml_dev_info dev_info; 25736d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 25836d0b09eSSrikanth Yalavarthi int ret; 25936d0b09eSSrikanth Yalavarthi 26036d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 26136d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 26236d0b09eSSrikanth Yalavarthi return -EINVAL; 26336d0b09eSSrikanth Yalavarthi } 26436d0b09eSSrikanth Yalavarthi 26536d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 26636d0b09eSSrikanth Yalavarthi if (*dev->dev_ops->dev_configure == NULL) 26736d0b09eSSrikanth Yalavarthi return -ENOTSUP; 26836d0b09eSSrikanth Yalavarthi 26936d0b09eSSrikanth Yalavarthi if (dev->data->dev_started) { 27036d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id); 27136d0b09eSSrikanth Yalavarthi return -EBUSY; 27236d0b09eSSrikanth Yalavarthi } 27336d0b09eSSrikanth Yalavarthi 27436d0b09eSSrikanth Yalavarthi if (config == NULL) { 27536d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, config cannot be NULL\n", dev_id); 27636d0b09eSSrikanth Yalavarthi return -EINVAL; 27736d0b09eSSrikanth Yalavarthi } 27836d0b09eSSrikanth Yalavarthi 27936d0b09eSSrikanth Yalavarthi ret = rte_ml_dev_info_get(dev_id, &dev_info); 28036d0b09eSSrikanth Yalavarthi if (ret < 0) 28136d0b09eSSrikanth Yalavarthi return ret; 28236d0b09eSSrikanth Yalavarthi 28336d0b09eSSrikanth Yalavarthi if (config->nb_queue_pairs > dev_info.max_queue_pairs) { 28436d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device %d num of queues %u > %u\n", dev_id, 28536d0b09eSSrikanth Yalavarthi config->nb_queue_pairs, dev_info.max_queue_pairs); 28636d0b09eSSrikanth Yalavarthi return -EINVAL; 28736d0b09eSSrikanth Yalavarthi } 28836d0b09eSSrikanth Yalavarthi 28936d0b09eSSrikanth Yalavarthi return (*dev->dev_ops->dev_configure)(dev, config); 29036d0b09eSSrikanth Yalavarthi } 29136d0b09eSSrikanth Yalavarthi 29236d0b09eSSrikanth Yalavarthi int 29336d0b09eSSrikanth Yalavarthi rte_ml_dev_close(int16_t dev_id) 29436d0b09eSSrikanth Yalavarthi { 29536d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 29636d0b09eSSrikanth Yalavarthi 29736d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 29836d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 29936d0b09eSSrikanth Yalavarthi return -EINVAL; 30036d0b09eSSrikanth Yalavarthi } 30136d0b09eSSrikanth Yalavarthi 30236d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 30336d0b09eSSrikanth Yalavarthi if (*dev->dev_ops->dev_close == NULL) 30436d0b09eSSrikanth Yalavarthi return -ENOTSUP; 30536d0b09eSSrikanth Yalavarthi 30636d0b09eSSrikanth Yalavarthi /* Device must be stopped before it can be closed */ 30736d0b09eSSrikanth Yalavarthi if (dev->data->dev_started == 1) { 30836d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device %d must be stopped before closing", dev_id); 30936d0b09eSSrikanth Yalavarthi return -EBUSY; 31036d0b09eSSrikanth Yalavarthi } 31136d0b09eSSrikanth Yalavarthi 31236d0b09eSSrikanth Yalavarthi return (*dev->dev_ops->dev_close)(dev); 31336d0b09eSSrikanth Yalavarthi } 31436d0b09eSSrikanth Yalavarthi 31536d0b09eSSrikanth Yalavarthi int 31636d0b09eSSrikanth Yalavarthi rte_ml_dev_start(int16_t dev_id) 31736d0b09eSSrikanth Yalavarthi { 31836d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 31936d0b09eSSrikanth Yalavarthi int ret; 32036d0b09eSSrikanth Yalavarthi 32136d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 32236d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 32336d0b09eSSrikanth Yalavarthi return -EINVAL; 32436d0b09eSSrikanth Yalavarthi } 32536d0b09eSSrikanth Yalavarthi 32636d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 32736d0b09eSSrikanth Yalavarthi if (*dev->dev_ops->dev_start == NULL) 32836d0b09eSSrikanth Yalavarthi return -ENOTSUP; 32936d0b09eSSrikanth Yalavarthi 33036d0b09eSSrikanth Yalavarthi if (dev->data->dev_started != 0) { 33136d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device %d is already started", dev_id); 33236d0b09eSSrikanth Yalavarthi return -EBUSY; 33336d0b09eSSrikanth Yalavarthi } 33436d0b09eSSrikanth Yalavarthi 33536d0b09eSSrikanth Yalavarthi ret = (*dev->dev_ops->dev_start)(dev); 33636d0b09eSSrikanth Yalavarthi if (ret == 0) 33736d0b09eSSrikanth Yalavarthi dev->data->dev_started = 1; 33836d0b09eSSrikanth Yalavarthi 33936d0b09eSSrikanth Yalavarthi return ret; 34036d0b09eSSrikanth Yalavarthi } 34136d0b09eSSrikanth Yalavarthi 34236d0b09eSSrikanth Yalavarthi int 34336d0b09eSSrikanth Yalavarthi rte_ml_dev_stop(int16_t dev_id) 34436d0b09eSSrikanth Yalavarthi { 34536d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 34636d0b09eSSrikanth Yalavarthi int ret; 34736d0b09eSSrikanth Yalavarthi 34836d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 34936d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 35036d0b09eSSrikanth Yalavarthi return -EINVAL; 35136d0b09eSSrikanth Yalavarthi } 35236d0b09eSSrikanth Yalavarthi 35336d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 35436d0b09eSSrikanth Yalavarthi if (*dev->dev_ops->dev_stop == NULL) 35536d0b09eSSrikanth Yalavarthi return -ENOTSUP; 35636d0b09eSSrikanth Yalavarthi 35736d0b09eSSrikanth Yalavarthi if (dev->data->dev_started == 0) { 35836d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device %d is not started", dev_id); 35936d0b09eSSrikanth Yalavarthi return -EBUSY; 36036d0b09eSSrikanth Yalavarthi } 36136d0b09eSSrikanth Yalavarthi 36236d0b09eSSrikanth Yalavarthi ret = (*dev->dev_ops->dev_stop)(dev); 36336d0b09eSSrikanth Yalavarthi if (ret == 0) 36436d0b09eSSrikanth Yalavarthi dev->data->dev_started = 0; 36536d0b09eSSrikanth Yalavarthi 36636d0b09eSSrikanth Yalavarthi return ret; 36736d0b09eSSrikanth Yalavarthi } 36836d0b09eSSrikanth Yalavarthi 369b5f0df64SSrikanth Yalavarthi int 370b5f0df64SSrikanth Yalavarthi rte_ml_dev_queue_pair_setup(int16_t dev_id, uint16_t queue_pair_id, 371b5f0df64SSrikanth Yalavarthi const struct rte_ml_dev_qp_conf *qp_conf, int socket_id) 372b5f0df64SSrikanth Yalavarthi { 373b5f0df64SSrikanth Yalavarthi struct rte_ml_dev *dev; 374b5f0df64SSrikanth Yalavarthi 375b5f0df64SSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 376b5f0df64SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 377b5f0df64SSrikanth Yalavarthi return -EINVAL; 378b5f0df64SSrikanth Yalavarthi } 379b5f0df64SSrikanth Yalavarthi 380b5f0df64SSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 381b5f0df64SSrikanth Yalavarthi if (*dev->dev_ops->dev_queue_pair_setup == NULL) 382b5f0df64SSrikanth Yalavarthi return -ENOTSUP; 383b5f0df64SSrikanth Yalavarthi 384b5f0df64SSrikanth Yalavarthi if (queue_pair_id >= dev->data->nb_queue_pairs) { 385b5f0df64SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid queue_pair_id = %d", queue_pair_id); 386b5f0df64SSrikanth Yalavarthi return -EINVAL; 387b5f0df64SSrikanth Yalavarthi } 388b5f0df64SSrikanth Yalavarthi 389b5f0df64SSrikanth Yalavarthi if (qp_conf == NULL) { 390b5f0df64SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, qp_conf cannot be NULL\n", dev_id); 391b5f0df64SSrikanth Yalavarthi return -EINVAL; 392b5f0df64SSrikanth Yalavarthi } 393b5f0df64SSrikanth Yalavarthi 394b5f0df64SSrikanth Yalavarthi if (dev->data->dev_started) { 395b5f0df64SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id); 396b5f0df64SSrikanth Yalavarthi return -EBUSY; 397b5f0df64SSrikanth Yalavarthi } 398b5f0df64SSrikanth Yalavarthi 399b5f0df64SSrikanth Yalavarthi return (*dev->dev_ops->dev_queue_pair_setup)(dev, queue_pair_id, qp_conf, socket_id); 400b5f0df64SSrikanth Yalavarthi } 401b5f0df64SSrikanth Yalavarthi 4024a662f54SSrikanth Yalavarthi int 403*b3caa0f8SSrikanth Yalavarthi rte_ml_dev_stats_get(int16_t dev_id, struct rte_ml_dev_stats *stats) 404*b3caa0f8SSrikanth Yalavarthi { 405*b3caa0f8SSrikanth Yalavarthi struct rte_ml_dev *dev; 406*b3caa0f8SSrikanth Yalavarthi 407*b3caa0f8SSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 408*b3caa0f8SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 409*b3caa0f8SSrikanth Yalavarthi return -EINVAL; 410*b3caa0f8SSrikanth Yalavarthi } 411*b3caa0f8SSrikanth Yalavarthi 412*b3caa0f8SSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 413*b3caa0f8SSrikanth Yalavarthi if (*dev->dev_ops->dev_stats_get == NULL) 414*b3caa0f8SSrikanth Yalavarthi return -ENOTSUP; 415*b3caa0f8SSrikanth Yalavarthi 416*b3caa0f8SSrikanth Yalavarthi if (stats == NULL) { 417*b3caa0f8SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, stats cannot be NULL\n", dev_id); 418*b3caa0f8SSrikanth Yalavarthi return -EINVAL; 419*b3caa0f8SSrikanth Yalavarthi } 420*b3caa0f8SSrikanth Yalavarthi memset(stats, 0, sizeof(struct rte_ml_dev_stats)); 421*b3caa0f8SSrikanth Yalavarthi 422*b3caa0f8SSrikanth Yalavarthi return (*dev->dev_ops->dev_stats_get)(dev, stats); 423*b3caa0f8SSrikanth Yalavarthi } 424*b3caa0f8SSrikanth Yalavarthi 425*b3caa0f8SSrikanth Yalavarthi void 426*b3caa0f8SSrikanth Yalavarthi rte_ml_dev_stats_reset(int16_t dev_id) 427*b3caa0f8SSrikanth Yalavarthi { 428*b3caa0f8SSrikanth Yalavarthi struct rte_ml_dev *dev; 429*b3caa0f8SSrikanth Yalavarthi 430*b3caa0f8SSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 431*b3caa0f8SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 432*b3caa0f8SSrikanth Yalavarthi return; 433*b3caa0f8SSrikanth Yalavarthi } 434*b3caa0f8SSrikanth Yalavarthi 435*b3caa0f8SSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 436*b3caa0f8SSrikanth Yalavarthi if (*dev->dev_ops->dev_stats_reset == NULL) 437*b3caa0f8SSrikanth Yalavarthi return; 438*b3caa0f8SSrikanth Yalavarthi 439*b3caa0f8SSrikanth Yalavarthi (*dev->dev_ops->dev_stats_reset)(dev); 440*b3caa0f8SSrikanth Yalavarthi } 441*b3caa0f8SSrikanth Yalavarthi 442*b3caa0f8SSrikanth Yalavarthi int 4434a662f54SSrikanth Yalavarthi rte_ml_model_load(int16_t dev_id, struct rte_ml_model_params *params, uint16_t *model_id) 4444a662f54SSrikanth Yalavarthi { 4454a662f54SSrikanth Yalavarthi struct rte_ml_dev *dev; 4464a662f54SSrikanth Yalavarthi 4474a662f54SSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 4484a662f54SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 4494a662f54SSrikanth Yalavarthi return -EINVAL; 4504a662f54SSrikanth Yalavarthi } 4514a662f54SSrikanth Yalavarthi 4524a662f54SSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 4534a662f54SSrikanth Yalavarthi if (*dev->dev_ops->model_load == NULL) 4544a662f54SSrikanth Yalavarthi return -ENOTSUP; 4554a662f54SSrikanth Yalavarthi 4564a662f54SSrikanth Yalavarthi if (params == NULL) { 4574a662f54SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, params cannot be NULL\n", dev_id); 4584a662f54SSrikanth Yalavarthi return -EINVAL; 4594a662f54SSrikanth Yalavarthi } 4604a662f54SSrikanth Yalavarthi 4614a662f54SSrikanth Yalavarthi if (model_id == NULL) { 4624a662f54SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, model_id cannot be NULL\n", dev_id); 4634a662f54SSrikanth Yalavarthi return -EINVAL; 4644a662f54SSrikanth Yalavarthi } 4654a662f54SSrikanth Yalavarthi 4664a662f54SSrikanth Yalavarthi return (*dev->dev_ops->model_load)(dev, params, model_id); 4674a662f54SSrikanth Yalavarthi } 4684a662f54SSrikanth Yalavarthi 4694a662f54SSrikanth Yalavarthi int 4704a662f54SSrikanth Yalavarthi rte_ml_model_unload(int16_t dev_id, uint16_t model_id) 4714a662f54SSrikanth Yalavarthi { 4724a662f54SSrikanth Yalavarthi struct rte_ml_dev *dev; 4734a662f54SSrikanth Yalavarthi 4744a662f54SSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 4754a662f54SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 4764a662f54SSrikanth Yalavarthi return -EINVAL; 4774a662f54SSrikanth Yalavarthi } 4784a662f54SSrikanth Yalavarthi 4794a662f54SSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 4804a662f54SSrikanth Yalavarthi if (*dev->dev_ops->model_unload == NULL) 4814a662f54SSrikanth Yalavarthi return -ENOTSUP; 4824a662f54SSrikanth Yalavarthi 4834a662f54SSrikanth Yalavarthi return (*dev->dev_ops->model_unload)(dev, model_id); 4844a662f54SSrikanth Yalavarthi } 4854a662f54SSrikanth Yalavarthi 4864a662f54SSrikanth Yalavarthi int 4874a662f54SSrikanth Yalavarthi rte_ml_model_start(int16_t dev_id, uint16_t model_id) 4884a662f54SSrikanth Yalavarthi { 4894a662f54SSrikanth Yalavarthi struct rte_ml_dev *dev; 4904a662f54SSrikanth Yalavarthi 4914a662f54SSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 4924a662f54SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 4934a662f54SSrikanth Yalavarthi return -EINVAL; 4944a662f54SSrikanth Yalavarthi } 4954a662f54SSrikanth Yalavarthi 4964a662f54SSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 4974a662f54SSrikanth Yalavarthi if (*dev->dev_ops->model_start == NULL) 4984a662f54SSrikanth Yalavarthi return -ENOTSUP; 4994a662f54SSrikanth Yalavarthi 5004a662f54SSrikanth Yalavarthi return (*dev->dev_ops->model_start)(dev, model_id); 5014a662f54SSrikanth Yalavarthi } 5024a662f54SSrikanth Yalavarthi 5034a662f54SSrikanth Yalavarthi int 5044a662f54SSrikanth Yalavarthi rte_ml_model_stop(int16_t dev_id, uint16_t model_id) 5054a662f54SSrikanth Yalavarthi { 5064a662f54SSrikanth Yalavarthi struct rte_ml_dev *dev; 5074a662f54SSrikanth Yalavarthi 5084a662f54SSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 5094a662f54SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 5104a662f54SSrikanth Yalavarthi return -EINVAL; 5114a662f54SSrikanth Yalavarthi } 5124a662f54SSrikanth Yalavarthi 5134a662f54SSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 5144a662f54SSrikanth Yalavarthi if (*dev->dev_ops->model_stop == NULL) 5154a662f54SSrikanth Yalavarthi return -ENOTSUP; 5164a662f54SSrikanth Yalavarthi 5174a662f54SSrikanth Yalavarthi return (*dev->dev_ops->model_stop)(dev, model_id); 5184a662f54SSrikanth Yalavarthi } 5194a662f54SSrikanth Yalavarthi 5204a662f54SSrikanth Yalavarthi int 5214a662f54SSrikanth Yalavarthi rte_ml_model_info_get(int16_t dev_id, uint16_t model_id, struct rte_ml_model_info *model_info) 5224a662f54SSrikanth Yalavarthi { 5234a662f54SSrikanth Yalavarthi struct rte_ml_dev *dev; 5244a662f54SSrikanth Yalavarthi 5254a662f54SSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 5264a662f54SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 5274a662f54SSrikanth Yalavarthi return -EINVAL; 5284a662f54SSrikanth Yalavarthi } 5294a662f54SSrikanth Yalavarthi 5304a662f54SSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 5314a662f54SSrikanth Yalavarthi if (*dev->dev_ops->model_info_get == NULL) 5324a662f54SSrikanth Yalavarthi return -ENOTSUP; 5334a662f54SSrikanth Yalavarthi 5344a662f54SSrikanth Yalavarthi if (model_info == NULL) { 5354a662f54SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, model_id %u, model_info cannot be NULL\n", dev_id, 5364a662f54SSrikanth Yalavarthi model_id); 5374a662f54SSrikanth Yalavarthi return -EINVAL; 5384a662f54SSrikanth Yalavarthi } 5394a662f54SSrikanth Yalavarthi 5404a662f54SSrikanth Yalavarthi return (*dev->dev_ops->model_info_get)(dev, model_id, model_info); 5414a662f54SSrikanth Yalavarthi } 5424a662f54SSrikanth Yalavarthi 5434a662f54SSrikanth Yalavarthi int 5444a662f54SSrikanth Yalavarthi rte_ml_model_params_update(int16_t dev_id, uint16_t model_id, void *buffer) 5454a662f54SSrikanth Yalavarthi { 5464a662f54SSrikanth Yalavarthi struct rte_ml_dev *dev; 5474a662f54SSrikanth Yalavarthi 5484a662f54SSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 5494a662f54SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 5504a662f54SSrikanth Yalavarthi return -EINVAL; 5514a662f54SSrikanth Yalavarthi } 5524a662f54SSrikanth Yalavarthi 5534a662f54SSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 5544a662f54SSrikanth Yalavarthi if (*dev->dev_ops->model_params_update == NULL) 5554a662f54SSrikanth Yalavarthi return -ENOTSUP; 5564a662f54SSrikanth Yalavarthi 5574a662f54SSrikanth Yalavarthi if (buffer == NULL) { 5584a662f54SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, buffer cannot be NULL\n", dev_id); 5594a662f54SSrikanth Yalavarthi return -EINVAL; 5604a662f54SSrikanth Yalavarthi } 5614a662f54SSrikanth Yalavarthi 5624a662f54SSrikanth Yalavarthi return (*dev->dev_ops->model_params_update)(dev, model_id, buffer); 5634a662f54SSrikanth Yalavarthi } 5644a662f54SSrikanth Yalavarthi 56550818b0aSSrikanth Yalavarthi int 56650818b0aSSrikanth Yalavarthi rte_ml_io_input_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches, 56750818b0aSSrikanth Yalavarthi uint64_t *input_qsize, uint64_t *input_dsize) 56850818b0aSSrikanth Yalavarthi { 56950818b0aSSrikanth Yalavarthi struct rte_ml_dev *dev; 57050818b0aSSrikanth Yalavarthi 57150818b0aSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 57250818b0aSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 57350818b0aSSrikanth Yalavarthi return -EINVAL; 57450818b0aSSrikanth Yalavarthi } 57550818b0aSSrikanth Yalavarthi 57650818b0aSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 57750818b0aSSrikanth Yalavarthi if (*dev->dev_ops->io_input_size_get == NULL) 57850818b0aSSrikanth Yalavarthi return -ENOTSUP; 57950818b0aSSrikanth Yalavarthi 58050818b0aSSrikanth Yalavarthi return (*dev->dev_ops->io_input_size_get)(dev, model_id, nb_batches, input_qsize, 58150818b0aSSrikanth Yalavarthi input_dsize); 58250818b0aSSrikanth Yalavarthi } 58350818b0aSSrikanth Yalavarthi 58450818b0aSSrikanth Yalavarthi int 58550818b0aSSrikanth Yalavarthi rte_ml_io_output_size_get(int16_t dev_id, uint16_t model_id, uint32_t nb_batches, 58650818b0aSSrikanth Yalavarthi uint64_t *output_qsize, uint64_t *output_dsize) 58750818b0aSSrikanth Yalavarthi { 58850818b0aSSrikanth Yalavarthi struct rte_ml_dev *dev; 58950818b0aSSrikanth Yalavarthi 59050818b0aSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 59150818b0aSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 59250818b0aSSrikanth Yalavarthi return -EINVAL; 59350818b0aSSrikanth Yalavarthi } 59450818b0aSSrikanth Yalavarthi 59550818b0aSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 59650818b0aSSrikanth Yalavarthi if (*dev->dev_ops->io_output_size_get == NULL) 59750818b0aSSrikanth Yalavarthi return -ENOTSUP; 59850818b0aSSrikanth Yalavarthi 59950818b0aSSrikanth Yalavarthi return (*dev->dev_ops->io_output_size_get)(dev, model_id, nb_batches, output_qsize, 60050818b0aSSrikanth Yalavarthi output_dsize); 60150818b0aSSrikanth Yalavarthi } 60250818b0aSSrikanth Yalavarthi 60350818b0aSSrikanth Yalavarthi int 60450818b0aSSrikanth Yalavarthi rte_ml_io_quantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *dbuffer, 60550818b0aSSrikanth Yalavarthi void *qbuffer) 60650818b0aSSrikanth Yalavarthi { 60750818b0aSSrikanth Yalavarthi struct rte_ml_dev *dev; 60850818b0aSSrikanth Yalavarthi 60950818b0aSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 61050818b0aSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 61150818b0aSSrikanth Yalavarthi return -EINVAL; 61250818b0aSSrikanth Yalavarthi } 61350818b0aSSrikanth Yalavarthi 61450818b0aSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 61550818b0aSSrikanth Yalavarthi if (*dev->dev_ops->io_quantize == NULL) 61650818b0aSSrikanth Yalavarthi return -ENOTSUP; 61750818b0aSSrikanth Yalavarthi 61850818b0aSSrikanth Yalavarthi if (dbuffer == NULL) { 61950818b0aSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id); 62050818b0aSSrikanth Yalavarthi return -EINVAL; 62150818b0aSSrikanth Yalavarthi } 62250818b0aSSrikanth Yalavarthi 62350818b0aSSrikanth Yalavarthi if (qbuffer == NULL) { 62450818b0aSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id); 62550818b0aSSrikanth Yalavarthi return -EINVAL; 62650818b0aSSrikanth Yalavarthi } 62750818b0aSSrikanth Yalavarthi 62850818b0aSSrikanth Yalavarthi return (*dev->dev_ops->io_quantize)(dev, model_id, nb_batches, dbuffer, qbuffer); 62950818b0aSSrikanth Yalavarthi } 63050818b0aSSrikanth Yalavarthi 63150818b0aSSrikanth Yalavarthi int 63250818b0aSSrikanth Yalavarthi rte_ml_io_dequantize(int16_t dev_id, uint16_t model_id, uint16_t nb_batches, void *qbuffer, 63350818b0aSSrikanth Yalavarthi void *dbuffer) 63450818b0aSSrikanth Yalavarthi { 63550818b0aSSrikanth Yalavarthi struct rte_ml_dev *dev; 63650818b0aSSrikanth Yalavarthi 63750818b0aSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 63850818b0aSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 63950818b0aSSrikanth Yalavarthi return -EINVAL; 64050818b0aSSrikanth Yalavarthi } 64150818b0aSSrikanth Yalavarthi 64250818b0aSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 64350818b0aSSrikanth Yalavarthi if (*dev->dev_ops->io_dequantize == NULL) 64450818b0aSSrikanth Yalavarthi return -ENOTSUP; 64550818b0aSSrikanth Yalavarthi 64650818b0aSSrikanth Yalavarthi if (qbuffer == NULL) { 64750818b0aSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, qbuffer cannot be NULL\n", dev_id); 64850818b0aSSrikanth Yalavarthi return -EINVAL; 64950818b0aSSrikanth Yalavarthi } 65050818b0aSSrikanth Yalavarthi 65150818b0aSSrikanth Yalavarthi if (dbuffer == NULL) { 65250818b0aSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, dbuffer cannot be NULL\n", dev_id); 65350818b0aSSrikanth Yalavarthi return -EINVAL; 65450818b0aSSrikanth Yalavarthi } 65550818b0aSSrikanth Yalavarthi 65650818b0aSSrikanth Yalavarthi return (*dev->dev_ops->io_dequantize)(dev, model_id, nb_batches, qbuffer, dbuffer); 65750818b0aSSrikanth Yalavarthi } 65850818b0aSSrikanth Yalavarthi 6591b365349SSrikanth Yalavarthi /** Initialise rte_ml_op mempool element */ 6601b365349SSrikanth Yalavarthi static void 6611b365349SSrikanth Yalavarthi ml_op_init(struct rte_mempool *mempool, __rte_unused void *opaque_arg, void *_op_data, 6621b365349SSrikanth Yalavarthi __rte_unused unsigned int i) 6631b365349SSrikanth Yalavarthi { 6641b365349SSrikanth Yalavarthi struct rte_ml_op *op = _op_data; 6651b365349SSrikanth Yalavarthi 6661b365349SSrikanth Yalavarthi memset(_op_data, 0, mempool->elt_size); 6671b365349SSrikanth Yalavarthi op->status = RTE_ML_OP_STATUS_NOT_PROCESSED; 6681b365349SSrikanth Yalavarthi op->mempool = mempool; 6691b365349SSrikanth Yalavarthi } 6701b365349SSrikanth Yalavarthi 6711b365349SSrikanth Yalavarthi struct rte_mempool * 6721b365349SSrikanth Yalavarthi rte_ml_op_pool_create(const char *name, unsigned int nb_elts, unsigned int cache_size, 6731b365349SSrikanth Yalavarthi uint16_t user_size, int socket_id) 6741b365349SSrikanth Yalavarthi { 6751b365349SSrikanth Yalavarthi struct rte_ml_op_pool_private *priv; 6761b365349SSrikanth Yalavarthi struct rte_mempool *mp; 6771b365349SSrikanth Yalavarthi unsigned int elt_size; 6781b365349SSrikanth Yalavarthi 6791b365349SSrikanth Yalavarthi /* lookup mempool in case already allocated */ 6801b365349SSrikanth Yalavarthi mp = rte_mempool_lookup(name); 6811b365349SSrikanth Yalavarthi elt_size = sizeof(struct rte_ml_op) + user_size; 6821b365349SSrikanth Yalavarthi 6831b365349SSrikanth Yalavarthi if (mp != NULL) { 6841b365349SSrikanth Yalavarthi priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp); 6851b365349SSrikanth Yalavarthi if (mp->elt_size != elt_size || mp->cache_size < cache_size || mp->size < nb_elts || 6861b365349SSrikanth Yalavarthi priv->user_size < user_size) { 6871b365349SSrikanth Yalavarthi mp = NULL; 6881b365349SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, 6891b365349SSrikanth Yalavarthi "Mempool %s already exists but with incompatible parameters", 6901b365349SSrikanth Yalavarthi name); 6911b365349SSrikanth Yalavarthi return NULL; 6921b365349SSrikanth Yalavarthi } 6931b365349SSrikanth Yalavarthi return mp; 6941b365349SSrikanth Yalavarthi } 6951b365349SSrikanth Yalavarthi 6961b365349SSrikanth Yalavarthi mp = rte_mempool_create(name, nb_elts, elt_size, cache_size, 6971b365349SSrikanth Yalavarthi sizeof(struct rte_ml_op_pool_private), NULL, NULL, ml_op_init, NULL, 6981b365349SSrikanth Yalavarthi socket_id, 0); 6991b365349SSrikanth Yalavarthi if (mp == NULL) { 7001b365349SSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Failed to create mempool %s", name); 7011b365349SSrikanth Yalavarthi return NULL; 7021b365349SSrikanth Yalavarthi } 7031b365349SSrikanth Yalavarthi 7041b365349SSrikanth Yalavarthi priv = (struct rte_ml_op_pool_private *)rte_mempool_get_priv(mp); 7051b365349SSrikanth Yalavarthi priv->user_size = user_size; 7061b365349SSrikanth Yalavarthi 7071b365349SSrikanth Yalavarthi return mp; 7081b365349SSrikanth Yalavarthi } 7091b365349SSrikanth Yalavarthi 7101b365349SSrikanth Yalavarthi void 7111b365349SSrikanth Yalavarthi rte_ml_op_pool_free(struct rte_mempool *mempool) 7121b365349SSrikanth Yalavarthi { 7131b365349SSrikanth Yalavarthi if (mempool != NULL) 7141b365349SSrikanth Yalavarthi rte_mempool_free(mempool); 7151b365349SSrikanth Yalavarthi } 7161b365349SSrikanth Yalavarthi 717c775df1cSSrikanth Yalavarthi uint16_t 718c775df1cSSrikanth Yalavarthi rte_ml_enqueue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops) 719c775df1cSSrikanth Yalavarthi { 720c775df1cSSrikanth Yalavarthi struct rte_ml_dev *dev; 721c775df1cSSrikanth Yalavarthi 722c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG 723c775df1cSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 724c775df1cSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 725c775df1cSSrikanth Yalavarthi rte_errno = -EINVAL; 726c775df1cSSrikanth Yalavarthi return 0; 727c775df1cSSrikanth Yalavarthi } 728c775df1cSSrikanth Yalavarthi 729c775df1cSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 730c775df1cSSrikanth Yalavarthi if (*dev->enqueue_burst == NULL) { 731c775df1cSSrikanth Yalavarthi rte_errno = -ENOTSUP; 732c775df1cSSrikanth Yalavarthi return 0; 733c775df1cSSrikanth Yalavarthi } 734c775df1cSSrikanth Yalavarthi 735c775df1cSSrikanth Yalavarthi if (ops == NULL) { 736c775df1cSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL\n", dev_id); 737c775df1cSSrikanth Yalavarthi rte_errno = -EINVAL; 738c775df1cSSrikanth Yalavarthi return 0; 739c775df1cSSrikanth Yalavarthi } 740c775df1cSSrikanth Yalavarthi 741c775df1cSSrikanth Yalavarthi if (qp_id >= dev->data->nb_queue_pairs) { 742c775df1cSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid qp_id %u\n", qp_id); 743c775df1cSSrikanth Yalavarthi rte_errno = -EINVAL; 744c775df1cSSrikanth Yalavarthi return 0; 745c775df1cSSrikanth Yalavarthi } 746c775df1cSSrikanth Yalavarthi #else 747c775df1cSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 748c775df1cSSrikanth Yalavarthi #endif 749c775df1cSSrikanth Yalavarthi 750c775df1cSSrikanth Yalavarthi return (*dev->enqueue_burst)(dev, qp_id, ops, nb_ops); 751c775df1cSSrikanth Yalavarthi } 752c775df1cSSrikanth Yalavarthi 753c775df1cSSrikanth Yalavarthi uint16_t 754c775df1cSSrikanth Yalavarthi rte_ml_dequeue_burst(int16_t dev_id, uint16_t qp_id, struct rte_ml_op **ops, uint16_t nb_ops) 755c775df1cSSrikanth Yalavarthi { 756c775df1cSSrikanth Yalavarthi struct rte_ml_dev *dev; 757c775df1cSSrikanth Yalavarthi 758c775df1cSSrikanth Yalavarthi #ifdef RTE_LIBRTE_ML_DEV_DEBUG 759c775df1cSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 760c775df1cSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 761c775df1cSSrikanth Yalavarthi rte_errno = -EINVAL; 762c775df1cSSrikanth Yalavarthi return 0; 763c775df1cSSrikanth Yalavarthi } 764c775df1cSSrikanth Yalavarthi 765c775df1cSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 766c775df1cSSrikanth Yalavarthi if (*dev->dequeue_burst == NULL) { 767c775df1cSSrikanth Yalavarthi rte_errno = -ENOTSUP; 768c775df1cSSrikanth Yalavarthi return 0; 769c775df1cSSrikanth Yalavarthi } 770c775df1cSSrikanth Yalavarthi 771c775df1cSSrikanth Yalavarthi if (ops == NULL) { 772c775df1cSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, ops cannot be NULL\n", dev_id); 773c775df1cSSrikanth Yalavarthi rte_errno = -EINVAL; 774c775df1cSSrikanth Yalavarthi return 0; 775c775df1cSSrikanth Yalavarthi } 776c775df1cSSrikanth Yalavarthi 777c775df1cSSrikanth Yalavarthi if (qp_id >= dev->data->nb_queue_pairs) { 778c775df1cSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid qp_id %u\n", qp_id); 779c775df1cSSrikanth Yalavarthi rte_errno = -EINVAL; 780c775df1cSSrikanth Yalavarthi return 0; 781c775df1cSSrikanth Yalavarthi } 782c775df1cSSrikanth Yalavarthi #else 783c775df1cSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 784c775df1cSSrikanth Yalavarthi #endif 785c775df1cSSrikanth Yalavarthi 786c775df1cSSrikanth Yalavarthi return (*dev->dequeue_burst)(dev, qp_id, ops, nb_ops); 787c775df1cSSrikanth Yalavarthi } 788c775df1cSSrikanth Yalavarthi 789d82cac58SJerin Jacob RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO); 790