148c6081aSSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause 248c6081aSSrikanth Yalavarthi * Copyright (c) 2023 Marvell. 348c6081aSSrikanth Yalavarthi */ 448c6081aSSrikanth Yalavarthi 548c6081aSSrikanth Yalavarthi #include <rte_kvargs.h> 648c6081aSSrikanth Yalavarthi #include <rte_mldev.h> 748c6081aSSrikanth Yalavarthi #include <rte_mldev_pmd.h> 848c6081aSSrikanth Yalavarthi 948c6081aSSrikanth Yalavarthi #include <bus_vdev_driver.h> 1048c6081aSSrikanth Yalavarthi 1148c6081aSSrikanth Yalavarthi #include <roc_api.h> 1248c6081aSSrikanth Yalavarthi 1348c6081aSSrikanth Yalavarthi #include "cnxk_ml_dev.h" 1448c6081aSSrikanth Yalavarthi 1548c6081aSSrikanth Yalavarthi #define MVTVM_ML_DEV_MAX_QPS "max_qps" 1648c6081aSSrikanth Yalavarthi #define MVTVM_ML_DEV_CACHE_MODEL_DATA "cache_model_data" 1748c6081aSSrikanth Yalavarthi 1848c6081aSSrikanth Yalavarthi #define MVTVM_ML_DEV_MAX_QPS_DEFAULT 32 1948c6081aSSrikanth Yalavarthi #define CN10K_ML_DEV_CACHE_MODEL_DATA_DEFAULT 1 2048c6081aSSrikanth Yalavarthi 2148c6081aSSrikanth Yalavarthi static const char *const valid_args[] = {MVTVM_ML_DEV_MAX_QPS, MVTVM_ML_DEV_CACHE_MODEL_DATA, NULL}; 2248c6081aSSrikanth Yalavarthi 2348c6081aSSrikanth Yalavarthi static int 2448c6081aSSrikanth Yalavarthi parse_integer_arg(const char *key __rte_unused, const char *value, void *extra_args) 2548c6081aSSrikanth Yalavarthi { 2648c6081aSSrikanth Yalavarthi int *i = (int *)extra_args; 2748c6081aSSrikanth Yalavarthi 2848c6081aSSrikanth Yalavarthi *i = atoi(value); 2948c6081aSSrikanth Yalavarthi if (*i < 0) { 3048c6081aSSrikanth Yalavarthi plt_err("Argument has to be positive."); 3148c6081aSSrikanth Yalavarthi return -EINVAL; 3248c6081aSSrikanth Yalavarthi } 3348c6081aSSrikanth Yalavarthi 3448c6081aSSrikanth Yalavarthi return 0; 3548c6081aSSrikanth Yalavarthi } 3648c6081aSSrikanth Yalavarthi 3748c6081aSSrikanth Yalavarthi static int 3848c6081aSSrikanth Yalavarthi parse_uint_arg(const char *key __rte_unused, const char *value, void *extra_args) 3948c6081aSSrikanth Yalavarthi { 4048c6081aSSrikanth Yalavarthi int i; 4148c6081aSSrikanth Yalavarthi char *end; 4248c6081aSSrikanth Yalavarthi errno = 0; 4348c6081aSSrikanth Yalavarthi 4448c6081aSSrikanth Yalavarthi i = strtol(value, &end, 10); 4548c6081aSSrikanth Yalavarthi if (*end != 0 || errno != 0 || i < 0) 4648c6081aSSrikanth Yalavarthi return -EINVAL; 4748c6081aSSrikanth Yalavarthi 4848c6081aSSrikanth Yalavarthi *((uint32_t *)extra_args) = i; 4948c6081aSSrikanth Yalavarthi 5048c6081aSSrikanth Yalavarthi return 0; 5148c6081aSSrikanth Yalavarthi } 5248c6081aSSrikanth Yalavarthi 5348c6081aSSrikanth Yalavarthi static int 5448c6081aSSrikanth Yalavarthi mvtvm_mldev_parse_devargs(const char *args, struct mvtvm_ml_dev *mvtvm_mldev) 5548c6081aSSrikanth Yalavarthi { 5648c6081aSSrikanth Yalavarthi bool cache_model_data_set = false; 5748c6081aSSrikanth Yalavarthi struct rte_kvargs *kvlist = NULL; 5848c6081aSSrikanth Yalavarthi bool max_qps_set = false; 5948c6081aSSrikanth Yalavarthi int ret = 0; 6048c6081aSSrikanth Yalavarthi 6148c6081aSSrikanth Yalavarthi if (args == NULL) 6248c6081aSSrikanth Yalavarthi goto check_args; 6348c6081aSSrikanth Yalavarthi 6448c6081aSSrikanth Yalavarthi kvlist = rte_kvargs_parse(args, valid_args); 6548c6081aSSrikanth Yalavarthi if (kvlist == NULL) { 66*8df71650SJerin Jacob plt_err("Error parsing %s devargs", "MLDEV_NAME_MVTVM_PMD"); 6748c6081aSSrikanth Yalavarthi return -EINVAL; 6848c6081aSSrikanth Yalavarthi } 6948c6081aSSrikanth Yalavarthi 7048c6081aSSrikanth Yalavarthi if (rte_kvargs_count(kvlist, MVTVM_ML_DEV_MAX_QPS) == 1) { 7148c6081aSSrikanth Yalavarthi ret = rte_kvargs_process(kvlist, MVTVM_ML_DEV_MAX_QPS, &parse_uint_arg, 7248c6081aSSrikanth Yalavarthi &mvtvm_mldev->max_nb_qpairs); 7348c6081aSSrikanth Yalavarthi if (ret < 0) { 74*8df71650SJerin Jacob plt_err("Error processing arguments, key = %s", MVTVM_ML_DEV_MAX_QPS); 7548c6081aSSrikanth Yalavarthi ret = -EINVAL; 7648c6081aSSrikanth Yalavarthi goto exit; 7748c6081aSSrikanth Yalavarthi } 7848c6081aSSrikanth Yalavarthi max_qps_set = true; 7948c6081aSSrikanth Yalavarthi } 8048c6081aSSrikanth Yalavarthi 8148c6081aSSrikanth Yalavarthi if (rte_kvargs_count(kvlist, MVTVM_ML_DEV_CACHE_MODEL_DATA) == 1) { 8248c6081aSSrikanth Yalavarthi ret = rte_kvargs_process(kvlist, MVTVM_ML_DEV_CACHE_MODEL_DATA, &parse_integer_arg, 8348c6081aSSrikanth Yalavarthi &mvtvm_mldev->cache_model_data); 8448c6081aSSrikanth Yalavarthi if (ret < 0) { 85*8df71650SJerin Jacob plt_err("Error processing arguments, key = %s", 8648c6081aSSrikanth Yalavarthi MVTVM_ML_DEV_CACHE_MODEL_DATA); 8748c6081aSSrikanth Yalavarthi ret = -EINVAL; 8848c6081aSSrikanth Yalavarthi goto exit; 8948c6081aSSrikanth Yalavarthi } 9048c6081aSSrikanth Yalavarthi cache_model_data_set = true; 9148c6081aSSrikanth Yalavarthi } 9248c6081aSSrikanth Yalavarthi 9348c6081aSSrikanth Yalavarthi check_args: 9448c6081aSSrikanth Yalavarthi if (!max_qps_set) 9548c6081aSSrikanth Yalavarthi mvtvm_mldev->max_nb_qpairs = MVTVM_ML_DEV_MAX_QPS_DEFAULT; 9648c6081aSSrikanth Yalavarthi plt_ml_dbg("ML: %s = %u", MVTVM_ML_DEV_MAX_QPS, mvtvm_mldev->max_nb_qpairs); 9748c6081aSSrikanth Yalavarthi 9848c6081aSSrikanth Yalavarthi if (!cache_model_data_set) { 9948c6081aSSrikanth Yalavarthi mvtvm_mldev->cache_model_data = CN10K_ML_DEV_CACHE_MODEL_DATA_DEFAULT; 10048c6081aSSrikanth Yalavarthi } else { 10148c6081aSSrikanth Yalavarthi if ((mvtvm_mldev->cache_model_data < 0) || (mvtvm_mldev->cache_model_data > 1)) { 102*8df71650SJerin Jacob plt_err("Invalid argument, %s = %d", MVTVM_ML_DEV_CACHE_MODEL_DATA, 10348c6081aSSrikanth Yalavarthi mvtvm_mldev->cache_model_data); 10448c6081aSSrikanth Yalavarthi ret = -EINVAL; 10548c6081aSSrikanth Yalavarthi goto exit; 10648c6081aSSrikanth Yalavarthi } 10748c6081aSSrikanth Yalavarthi } 10848c6081aSSrikanth Yalavarthi plt_ml_dbg("ML: %s = %d", MVTVM_ML_DEV_CACHE_MODEL_DATA, mvtvm_mldev->cache_model_data); 10948c6081aSSrikanth Yalavarthi 11048c6081aSSrikanth Yalavarthi exit: 11148c6081aSSrikanth Yalavarthi rte_kvargs_free(kvlist); 11248c6081aSSrikanth Yalavarthi 11348c6081aSSrikanth Yalavarthi return ret; 11448c6081aSSrikanth Yalavarthi } 11548c6081aSSrikanth Yalavarthi 11648c6081aSSrikanth Yalavarthi static int 11748c6081aSSrikanth Yalavarthi mvtvm_ml_vdev_probe(struct rte_vdev_device *vdev) 11848c6081aSSrikanth Yalavarthi { 11948c6081aSSrikanth Yalavarthi struct rte_ml_dev_pmd_init_params init_params; 12048c6081aSSrikanth Yalavarthi struct mvtvm_ml_dev *mvtvm_mldev; 12148c6081aSSrikanth Yalavarthi struct cnxk_ml_dev *cnxk_mldev; 12248c6081aSSrikanth Yalavarthi struct rte_ml_dev *dev; 12348c6081aSSrikanth Yalavarthi const char *input_args; 12448c6081aSSrikanth Yalavarthi const char *name; 12548c6081aSSrikanth Yalavarthi int ret = 0; 12648c6081aSSrikanth Yalavarthi 12748c6081aSSrikanth Yalavarthi if (cnxk_ml_dev_initialized == 1) { 12848c6081aSSrikanth Yalavarthi plt_err("ML CNXK device already initialized!"); 12948c6081aSSrikanth Yalavarthi plt_err("Not creating ml_mvtvm vdev!"); 13048c6081aSSrikanth Yalavarthi return 0; 13148c6081aSSrikanth Yalavarthi } 13248c6081aSSrikanth Yalavarthi 13348c6081aSSrikanth Yalavarthi init_params = (struct rte_ml_dev_pmd_init_params){ 13448c6081aSSrikanth Yalavarthi .socket_id = rte_socket_id(), .private_data_size = sizeof(struct cnxk_ml_dev)}; 13548c6081aSSrikanth Yalavarthi 13648c6081aSSrikanth Yalavarthi name = rte_vdev_device_name(vdev); 13748c6081aSSrikanth Yalavarthi if (name == NULL) 13848c6081aSSrikanth Yalavarthi return -EINVAL; 13948c6081aSSrikanth Yalavarthi input_args = rte_vdev_device_args(vdev); 14048c6081aSSrikanth Yalavarthi 14148c6081aSSrikanth Yalavarthi dev = rte_ml_dev_pmd_create(name, &vdev->device, &init_params); 14248c6081aSSrikanth Yalavarthi if (dev == NULL) { 14348c6081aSSrikanth Yalavarthi ret = -EFAULT; 14448c6081aSSrikanth Yalavarthi goto error_exit; 14548c6081aSSrikanth Yalavarthi } 14648c6081aSSrikanth Yalavarthi 14748c6081aSSrikanth Yalavarthi cnxk_mldev = dev->data->dev_private; 14848c6081aSSrikanth Yalavarthi cnxk_mldev->mldev = dev; 14948c6081aSSrikanth Yalavarthi mvtvm_mldev = &cnxk_mldev->mvtvm_mldev; 15048c6081aSSrikanth Yalavarthi mvtvm_mldev->vdev = vdev; 15148c6081aSSrikanth Yalavarthi 15248c6081aSSrikanth Yalavarthi ret = mvtvm_mldev_parse_devargs(input_args, mvtvm_mldev); 15348c6081aSSrikanth Yalavarthi if (ret < 0) 15448c6081aSSrikanth Yalavarthi goto error_exit; 15548c6081aSSrikanth Yalavarthi 15648c6081aSSrikanth Yalavarthi dev->dev_ops = &cnxk_ml_ops; 15748c6081aSSrikanth Yalavarthi dev->enqueue_burst = NULL; 15848c6081aSSrikanth Yalavarthi dev->dequeue_burst = NULL; 15948c6081aSSrikanth Yalavarthi dev->op_error_get = NULL; 16048c6081aSSrikanth Yalavarthi 16148c6081aSSrikanth Yalavarthi cnxk_ml_dev_initialized = 1; 16248c6081aSSrikanth Yalavarthi cnxk_mldev->type = CNXK_ML_DEV_TYPE_VDEV; 16348c6081aSSrikanth Yalavarthi 16448c6081aSSrikanth Yalavarthi return 0; 16548c6081aSSrikanth Yalavarthi 16648c6081aSSrikanth Yalavarthi error_exit: 16748c6081aSSrikanth Yalavarthi plt_err("Could not create device: ml_mvtvm"); 16848c6081aSSrikanth Yalavarthi 16948c6081aSSrikanth Yalavarthi return ret; 17048c6081aSSrikanth Yalavarthi } 17148c6081aSSrikanth Yalavarthi 17248c6081aSSrikanth Yalavarthi static int 17348c6081aSSrikanth Yalavarthi mvtvm_ml_vdev_remove(struct rte_vdev_device *vdev) 17448c6081aSSrikanth Yalavarthi { 17548c6081aSSrikanth Yalavarthi struct rte_ml_dev *dev; 17648c6081aSSrikanth Yalavarthi const char *name; 17748c6081aSSrikanth Yalavarthi 17848c6081aSSrikanth Yalavarthi name = rte_vdev_device_name(vdev); 17948c6081aSSrikanth Yalavarthi if (name == NULL) 18048c6081aSSrikanth Yalavarthi return -EINVAL; 18148c6081aSSrikanth Yalavarthi 18248c6081aSSrikanth Yalavarthi dev = rte_ml_dev_pmd_get_named_dev(name); 18348c6081aSSrikanth Yalavarthi if (dev == NULL) 18448c6081aSSrikanth Yalavarthi return -ENODEV; 18548c6081aSSrikanth Yalavarthi 18648c6081aSSrikanth Yalavarthi return rte_ml_dev_pmd_destroy(dev); 18748c6081aSSrikanth Yalavarthi } 18848c6081aSSrikanth Yalavarthi 18948c6081aSSrikanth Yalavarthi static struct rte_vdev_driver mvtvm_mldev_pmd = {.probe = mvtvm_ml_vdev_probe, 19048c6081aSSrikanth Yalavarthi .remove = mvtvm_ml_vdev_remove}; 19148c6081aSSrikanth Yalavarthi 19248c6081aSSrikanth Yalavarthi RTE_PMD_REGISTER_VDEV(MLDEV_NAME_MVTVM_PMD, mvtvm_mldev_pmd); 19348c6081aSSrikanth Yalavarthi 19448c6081aSSrikanth Yalavarthi RTE_PMD_REGISTER_PARAM_STRING(MLDEV_NAME_MVTVM_PMD, 19548c6081aSSrikanth Yalavarthi MVTVM_ML_DEV_MAX_QPS "=<int>" MVTVM_ML_DEV_CACHE_MODEL_DATA "=<0|1>"); 196