xref: /dpdk/drivers/ml/cnxk/mvtvm_ml_dev.c (revision 8df71650e9fdc6346f09b7a57e86cded7b553152)
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