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