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 180*36d0b09eSSrikanth Yalavarthi uint16_t 181*36d0b09eSSrikanth Yalavarthi rte_ml_dev_count(void) 182*36d0b09eSSrikanth Yalavarthi { 183*36d0b09eSSrikanth Yalavarthi return ml_dev_globals.nb_devs; 184*36d0b09eSSrikanth Yalavarthi } 185*36d0b09eSSrikanth Yalavarthi 186*36d0b09eSSrikanth Yalavarthi int 187*36d0b09eSSrikanth Yalavarthi rte_ml_dev_is_valid_dev(int16_t dev_id) 188*36d0b09eSSrikanth Yalavarthi { 189*36d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev = NULL; 190*36d0b09eSSrikanth Yalavarthi 191*36d0b09eSSrikanth Yalavarthi if (dev_id >= ml_dev_globals.max_devs || ml_dev_globals.devs[dev_id].data == NULL) 192*36d0b09eSSrikanth Yalavarthi return 0; 193*36d0b09eSSrikanth Yalavarthi 194*36d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 195*36d0b09eSSrikanth Yalavarthi if (dev->attached != ML_DEV_ATTACHED) 196*36d0b09eSSrikanth Yalavarthi return 0; 197*36d0b09eSSrikanth Yalavarthi else 198*36d0b09eSSrikanth Yalavarthi return 1; 199*36d0b09eSSrikanth Yalavarthi } 200*36d0b09eSSrikanth Yalavarthi 201*36d0b09eSSrikanth Yalavarthi int 202*36d0b09eSSrikanth Yalavarthi rte_ml_dev_socket_id(int16_t dev_id) 203*36d0b09eSSrikanth Yalavarthi { 204*36d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 205*36d0b09eSSrikanth Yalavarthi 206*36d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 207*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 208*36d0b09eSSrikanth Yalavarthi return -EINVAL; 209*36d0b09eSSrikanth Yalavarthi } 210*36d0b09eSSrikanth Yalavarthi 211*36d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 212*36d0b09eSSrikanth Yalavarthi 213*36d0b09eSSrikanth Yalavarthi return dev->data->socket_id; 214*36d0b09eSSrikanth Yalavarthi } 215*36d0b09eSSrikanth Yalavarthi 216*36d0b09eSSrikanth Yalavarthi int 217*36d0b09eSSrikanth Yalavarthi rte_ml_dev_info_get(int16_t dev_id, struct rte_ml_dev_info *dev_info) 218*36d0b09eSSrikanth Yalavarthi { 219*36d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 220*36d0b09eSSrikanth Yalavarthi 221*36d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 222*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 223*36d0b09eSSrikanth Yalavarthi return -EINVAL; 224*36d0b09eSSrikanth Yalavarthi } 225*36d0b09eSSrikanth Yalavarthi 226*36d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 227*36d0b09eSSrikanth Yalavarthi if (*dev->dev_ops->dev_info_get == NULL) 228*36d0b09eSSrikanth Yalavarthi return -ENOTSUP; 229*36d0b09eSSrikanth Yalavarthi 230*36d0b09eSSrikanth Yalavarthi if (dev_info == NULL) { 231*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, dev_info cannot be NULL\n", dev_id); 232*36d0b09eSSrikanth Yalavarthi return -EINVAL; 233*36d0b09eSSrikanth Yalavarthi } 234*36d0b09eSSrikanth Yalavarthi memset(dev_info, 0, sizeof(struct rte_ml_dev_info)); 235*36d0b09eSSrikanth Yalavarthi 236*36d0b09eSSrikanth Yalavarthi return (*dev->dev_ops->dev_info_get)(dev, dev_info); 237*36d0b09eSSrikanth Yalavarthi } 238*36d0b09eSSrikanth Yalavarthi 239*36d0b09eSSrikanth Yalavarthi int 240*36d0b09eSSrikanth Yalavarthi rte_ml_dev_configure(int16_t dev_id, const struct rte_ml_dev_config *config) 241*36d0b09eSSrikanth Yalavarthi { 242*36d0b09eSSrikanth Yalavarthi struct rte_ml_dev_info dev_info; 243*36d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 244*36d0b09eSSrikanth Yalavarthi int ret; 245*36d0b09eSSrikanth Yalavarthi 246*36d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 247*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 248*36d0b09eSSrikanth Yalavarthi return -EINVAL; 249*36d0b09eSSrikanth Yalavarthi } 250*36d0b09eSSrikanth Yalavarthi 251*36d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 252*36d0b09eSSrikanth Yalavarthi if (*dev->dev_ops->dev_configure == NULL) 253*36d0b09eSSrikanth Yalavarthi return -ENOTSUP; 254*36d0b09eSSrikanth Yalavarthi 255*36d0b09eSSrikanth Yalavarthi if (dev->data->dev_started) { 256*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device %d must be stopped to allow configuration", dev_id); 257*36d0b09eSSrikanth Yalavarthi return -EBUSY; 258*36d0b09eSSrikanth Yalavarthi } 259*36d0b09eSSrikanth Yalavarthi 260*36d0b09eSSrikanth Yalavarthi if (config == NULL) { 261*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Dev %d, config cannot be NULL\n", dev_id); 262*36d0b09eSSrikanth Yalavarthi return -EINVAL; 263*36d0b09eSSrikanth Yalavarthi } 264*36d0b09eSSrikanth Yalavarthi 265*36d0b09eSSrikanth Yalavarthi ret = rte_ml_dev_info_get(dev_id, &dev_info); 266*36d0b09eSSrikanth Yalavarthi if (ret < 0) 267*36d0b09eSSrikanth Yalavarthi return ret; 268*36d0b09eSSrikanth Yalavarthi 269*36d0b09eSSrikanth Yalavarthi if (config->nb_queue_pairs > dev_info.max_queue_pairs) { 270*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device %d num of queues %u > %u\n", dev_id, 271*36d0b09eSSrikanth Yalavarthi config->nb_queue_pairs, dev_info.max_queue_pairs); 272*36d0b09eSSrikanth Yalavarthi return -EINVAL; 273*36d0b09eSSrikanth Yalavarthi } 274*36d0b09eSSrikanth Yalavarthi 275*36d0b09eSSrikanth Yalavarthi return (*dev->dev_ops->dev_configure)(dev, config); 276*36d0b09eSSrikanth Yalavarthi } 277*36d0b09eSSrikanth Yalavarthi 278*36d0b09eSSrikanth Yalavarthi int 279*36d0b09eSSrikanth Yalavarthi rte_ml_dev_close(int16_t dev_id) 280*36d0b09eSSrikanth Yalavarthi { 281*36d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 282*36d0b09eSSrikanth Yalavarthi 283*36d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 284*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 285*36d0b09eSSrikanth Yalavarthi return -EINVAL; 286*36d0b09eSSrikanth Yalavarthi } 287*36d0b09eSSrikanth Yalavarthi 288*36d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 289*36d0b09eSSrikanth Yalavarthi if (*dev->dev_ops->dev_close == NULL) 290*36d0b09eSSrikanth Yalavarthi return -ENOTSUP; 291*36d0b09eSSrikanth Yalavarthi 292*36d0b09eSSrikanth Yalavarthi /* Device must be stopped before it can be closed */ 293*36d0b09eSSrikanth Yalavarthi if (dev->data->dev_started == 1) { 294*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device %d must be stopped before closing", dev_id); 295*36d0b09eSSrikanth Yalavarthi return -EBUSY; 296*36d0b09eSSrikanth Yalavarthi } 297*36d0b09eSSrikanth Yalavarthi 298*36d0b09eSSrikanth Yalavarthi return (*dev->dev_ops->dev_close)(dev); 299*36d0b09eSSrikanth Yalavarthi } 300*36d0b09eSSrikanth Yalavarthi 301*36d0b09eSSrikanth Yalavarthi int 302*36d0b09eSSrikanth Yalavarthi rte_ml_dev_start(int16_t dev_id) 303*36d0b09eSSrikanth Yalavarthi { 304*36d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 305*36d0b09eSSrikanth Yalavarthi int ret; 306*36d0b09eSSrikanth Yalavarthi 307*36d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 308*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 309*36d0b09eSSrikanth Yalavarthi return -EINVAL; 310*36d0b09eSSrikanth Yalavarthi } 311*36d0b09eSSrikanth Yalavarthi 312*36d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 313*36d0b09eSSrikanth Yalavarthi if (*dev->dev_ops->dev_start == NULL) 314*36d0b09eSSrikanth Yalavarthi return -ENOTSUP; 315*36d0b09eSSrikanth Yalavarthi 316*36d0b09eSSrikanth Yalavarthi if (dev->data->dev_started != 0) { 317*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device %d is already started", dev_id); 318*36d0b09eSSrikanth Yalavarthi return -EBUSY; 319*36d0b09eSSrikanth Yalavarthi } 320*36d0b09eSSrikanth Yalavarthi 321*36d0b09eSSrikanth Yalavarthi ret = (*dev->dev_ops->dev_start)(dev); 322*36d0b09eSSrikanth Yalavarthi if (ret == 0) 323*36d0b09eSSrikanth Yalavarthi dev->data->dev_started = 1; 324*36d0b09eSSrikanth Yalavarthi 325*36d0b09eSSrikanth Yalavarthi return ret; 326*36d0b09eSSrikanth Yalavarthi } 327*36d0b09eSSrikanth Yalavarthi 328*36d0b09eSSrikanth Yalavarthi int 329*36d0b09eSSrikanth Yalavarthi rte_ml_dev_stop(int16_t dev_id) 330*36d0b09eSSrikanth Yalavarthi { 331*36d0b09eSSrikanth Yalavarthi struct rte_ml_dev *dev; 332*36d0b09eSSrikanth Yalavarthi int ret; 333*36d0b09eSSrikanth Yalavarthi 334*36d0b09eSSrikanth Yalavarthi if (!rte_ml_dev_is_valid_dev(dev_id)) { 335*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id); 336*36d0b09eSSrikanth Yalavarthi return -EINVAL; 337*36d0b09eSSrikanth Yalavarthi } 338*36d0b09eSSrikanth Yalavarthi 339*36d0b09eSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_dev(dev_id); 340*36d0b09eSSrikanth Yalavarthi if (*dev->dev_ops->dev_stop == NULL) 341*36d0b09eSSrikanth Yalavarthi return -ENOTSUP; 342*36d0b09eSSrikanth Yalavarthi 343*36d0b09eSSrikanth Yalavarthi if (dev->data->dev_started == 0) { 344*36d0b09eSSrikanth Yalavarthi RTE_MLDEV_LOG(ERR, "Device %d is not started", dev_id); 345*36d0b09eSSrikanth Yalavarthi return -EBUSY; 346*36d0b09eSSrikanth Yalavarthi } 347*36d0b09eSSrikanth Yalavarthi 348*36d0b09eSSrikanth Yalavarthi ret = (*dev->dev_ops->dev_stop)(dev); 349*36d0b09eSSrikanth Yalavarthi if (ret == 0) 350*36d0b09eSSrikanth Yalavarthi dev->data->dev_started = 0; 351*36d0b09eSSrikanth Yalavarthi 352*36d0b09eSSrikanth Yalavarthi return ret; 353*36d0b09eSSrikanth Yalavarthi } 354*36d0b09eSSrikanth Yalavarthi 355d82cac58SJerin Jacob RTE_LOG_REGISTER_DEFAULT(rte_ml_dev_logtype, INFO); 356