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