xref: /dpdk/lib/rawdev/rte_rawdev.c (revision 37ff33833b6b8932bfbc8e149d386ef23ccdc54e)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright 2017 NXP
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #include <ctype.h>
699a2dd95SBruce Richardson #include <stdio.h>
799a2dd95SBruce Richardson #include <stdlib.h>
899a2dd95SBruce Richardson #include <string.h>
999a2dd95SBruce Richardson #include <errno.h>
1099a2dd95SBruce Richardson #include <stdint.h>
1199a2dd95SBruce Richardson #include <inttypes.h>
1299a2dd95SBruce Richardson 
1399a2dd95SBruce Richardson #include <rte_string_fns.h>
1499a2dd95SBruce Richardson #include <rte_log.h>
151acb7f54SDavid Marchand #include <dev_driver.h>
1699a2dd95SBruce Richardson #include <rte_common.h>
1799a2dd95SBruce Richardson #include <rte_malloc.h>
1899a2dd95SBruce Richardson #include <rte_telemetry.h>
1999a2dd95SBruce Richardson 
2099a2dd95SBruce Richardson #include "rte_rawdev.h"
2199a2dd95SBruce Richardson #include "rte_rawdev_pmd.h"
2299a2dd95SBruce Richardson 
2399a2dd95SBruce Richardson static struct rte_rawdev rte_rawdevices[RTE_RAWDEV_MAX_DEVS];
2499a2dd95SBruce Richardson 
2599a2dd95SBruce Richardson struct rte_rawdev *rte_rawdevs = rte_rawdevices;
2699a2dd95SBruce Richardson 
2799a2dd95SBruce Richardson static struct rte_rawdev_global rawdev_globals = {
2899a2dd95SBruce Richardson 	.nb_devs		= 0
2999a2dd95SBruce Richardson };
3099a2dd95SBruce Richardson 
3199a2dd95SBruce Richardson /* Raw device, northbound API implementation */
3299a2dd95SBruce Richardson uint8_t
rte_rawdev_count(void)3399a2dd95SBruce Richardson rte_rawdev_count(void)
3499a2dd95SBruce Richardson {
3599a2dd95SBruce Richardson 	return rawdev_globals.nb_devs;
3699a2dd95SBruce Richardson }
3799a2dd95SBruce Richardson 
3899a2dd95SBruce Richardson uint16_t
rte_rawdev_get_dev_id(const char * name)3999a2dd95SBruce Richardson rte_rawdev_get_dev_id(const char *name)
4099a2dd95SBruce Richardson {
4199a2dd95SBruce Richardson 	uint16_t i;
4299a2dd95SBruce Richardson 
4399a2dd95SBruce Richardson 	if (!name)
4499a2dd95SBruce Richardson 		return -EINVAL;
4599a2dd95SBruce Richardson 
4699a2dd95SBruce Richardson 	for (i = 0; i < rawdev_globals.nb_devs; i++)
4799a2dd95SBruce Richardson 		if ((strcmp(rte_rawdevices[i].name, name)
4899a2dd95SBruce Richardson 				== 0) &&
4999a2dd95SBruce Richardson 				(rte_rawdevices[i].attached ==
5099a2dd95SBruce Richardson 						RTE_RAWDEV_ATTACHED))
5199a2dd95SBruce Richardson 			return i;
5299a2dd95SBruce Richardson 	return -ENODEV;
5399a2dd95SBruce Richardson }
5499a2dd95SBruce Richardson 
5599a2dd95SBruce Richardson int
rte_rawdev_socket_id(uint16_t dev_id)5699a2dd95SBruce Richardson rte_rawdev_socket_id(uint16_t dev_id)
5799a2dd95SBruce Richardson {
5899a2dd95SBruce Richardson 	struct rte_rawdev *dev;
5999a2dd95SBruce Richardson 
6099a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
6199a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
6299a2dd95SBruce Richardson 
6399a2dd95SBruce Richardson 	return dev->socket_id;
6499a2dd95SBruce Richardson }
6599a2dd95SBruce Richardson 
6699a2dd95SBruce Richardson int
rte_rawdev_info_get(uint16_t dev_id,struct rte_rawdev_info * dev_info,size_t dev_private_size)6799a2dd95SBruce Richardson rte_rawdev_info_get(uint16_t dev_id, struct rte_rawdev_info *dev_info,
6899a2dd95SBruce Richardson 		size_t dev_private_size)
6999a2dd95SBruce Richardson {
7099a2dd95SBruce Richardson 	struct rte_rawdev *rawdev;
7199a2dd95SBruce Richardson 	int ret = 0;
7299a2dd95SBruce Richardson 
7399a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
748f1d23ecSDavid Marchand 	if (dev_info == NULL)
758f1d23ecSDavid Marchand 		return -EINVAL;
7699a2dd95SBruce Richardson 
7799a2dd95SBruce Richardson 	rawdev = &rte_rawdevs[dev_id];
7899a2dd95SBruce Richardson 
7999a2dd95SBruce Richardson 	if (dev_info->dev_private != NULL) {
808f1d23ecSDavid Marchand 		if (*rawdev->dev_ops->dev_info_get == NULL)
818f1d23ecSDavid Marchand 			return -ENOTSUP;
8299a2dd95SBruce Richardson 		ret = (*rawdev->dev_ops->dev_info_get)(rawdev,
8399a2dd95SBruce Richardson 				dev_info->dev_private,
8499a2dd95SBruce Richardson 				dev_private_size);
8599a2dd95SBruce Richardson 	}
8699a2dd95SBruce Richardson 
8799a2dd95SBruce Richardson 	dev_info->driver_name = rawdev->driver_name;
8899a2dd95SBruce Richardson 	dev_info->device = rawdev->device;
8999a2dd95SBruce Richardson 	dev_info->socket_id = rawdev->socket_id;
9099a2dd95SBruce Richardson 
9199a2dd95SBruce Richardson 	return ret;
9299a2dd95SBruce Richardson }
9399a2dd95SBruce Richardson 
9499a2dd95SBruce Richardson int
rte_rawdev_configure(uint16_t dev_id,struct rte_rawdev_info * dev_conf,size_t dev_private_size)9599a2dd95SBruce Richardson rte_rawdev_configure(uint16_t dev_id, struct rte_rawdev_info *dev_conf,
9699a2dd95SBruce Richardson 		size_t dev_private_size)
9799a2dd95SBruce Richardson {
9899a2dd95SBruce Richardson 	struct rte_rawdev *dev;
9999a2dd95SBruce Richardson 	int diag;
10099a2dd95SBruce Richardson 
10199a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
1028f1d23ecSDavid Marchand 	if (dev_conf == NULL)
1038f1d23ecSDavid Marchand 		return -EINVAL;
10499a2dd95SBruce Richardson 
10599a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
10699a2dd95SBruce Richardson 
1078f1d23ecSDavid Marchand 	if (*dev->dev_ops->dev_configure == NULL)
1088f1d23ecSDavid Marchand 		return -ENOTSUP;
10999a2dd95SBruce Richardson 
11099a2dd95SBruce Richardson 	if (dev->started) {
11199a2dd95SBruce Richardson 		RTE_RDEV_ERR(
11299a2dd95SBruce Richardson 		   "device %d must be stopped to allow configuration", dev_id);
11399a2dd95SBruce Richardson 		return -EBUSY;
11499a2dd95SBruce Richardson 	}
11599a2dd95SBruce Richardson 
11699a2dd95SBruce Richardson 	/* Configure the device */
11799a2dd95SBruce Richardson 	diag = (*dev->dev_ops->dev_configure)(dev, dev_conf->dev_private,
11899a2dd95SBruce Richardson 			dev_private_size);
11999a2dd95SBruce Richardson 	if (diag != 0)
12099a2dd95SBruce Richardson 		RTE_RDEV_ERR("dev%d dev_configure = %d", dev_id, diag);
12199a2dd95SBruce Richardson 	else
12299a2dd95SBruce Richardson 		dev->attached = 1;
12399a2dd95SBruce Richardson 
12499a2dd95SBruce Richardson 	return diag;
12599a2dd95SBruce Richardson }
12699a2dd95SBruce Richardson 
12799a2dd95SBruce Richardson int
rte_rawdev_queue_conf_get(uint16_t dev_id,uint16_t queue_id,rte_rawdev_obj_t queue_conf,size_t queue_conf_size)12899a2dd95SBruce Richardson rte_rawdev_queue_conf_get(uint16_t dev_id,
12999a2dd95SBruce Richardson 			  uint16_t queue_id,
13099a2dd95SBruce Richardson 			  rte_rawdev_obj_t queue_conf,
13199a2dd95SBruce Richardson 			  size_t queue_conf_size)
13299a2dd95SBruce Richardson {
13399a2dd95SBruce Richardson 	struct rte_rawdev *dev;
13499a2dd95SBruce Richardson 
13599a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
13699a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
13799a2dd95SBruce Richardson 
1388f1d23ecSDavid Marchand 	if (*dev->dev_ops->queue_def_conf == NULL)
1398f1d23ecSDavid Marchand 		return -ENOTSUP;
14099a2dd95SBruce Richardson 	return (*dev->dev_ops->queue_def_conf)(dev, queue_id, queue_conf,
14199a2dd95SBruce Richardson 			queue_conf_size);
14299a2dd95SBruce Richardson }
14399a2dd95SBruce Richardson 
14499a2dd95SBruce Richardson int
rte_rawdev_queue_setup(uint16_t dev_id,uint16_t queue_id,rte_rawdev_obj_t queue_conf,size_t queue_conf_size)14599a2dd95SBruce Richardson rte_rawdev_queue_setup(uint16_t dev_id,
14699a2dd95SBruce Richardson 		       uint16_t queue_id,
14799a2dd95SBruce Richardson 		       rte_rawdev_obj_t queue_conf,
14899a2dd95SBruce Richardson 		       size_t queue_conf_size)
14999a2dd95SBruce Richardson {
15099a2dd95SBruce Richardson 	struct rte_rawdev *dev;
15199a2dd95SBruce Richardson 
15299a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
15399a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
15499a2dd95SBruce Richardson 
1558f1d23ecSDavid Marchand 	if (*dev->dev_ops->queue_setup == NULL)
1568f1d23ecSDavid Marchand 		return -ENOTSUP;
15799a2dd95SBruce Richardson 	return (*dev->dev_ops->queue_setup)(dev, queue_id, queue_conf,
15899a2dd95SBruce Richardson 			queue_conf_size);
15999a2dd95SBruce Richardson }
16099a2dd95SBruce Richardson 
16199a2dd95SBruce Richardson int
rte_rawdev_queue_release(uint16_t dev_id,uint16_t queue_id)16299a2dd95SBruce Richardson rte_rawdev_queue_release(uint16_t dev_id, uint16_t queue_id)
16399a2dd95SBruce Richardson {
16499a2dd95SBruce Richardson 	struct rte_rawdev *dev;
16599a2dd95SBruce Richardson 
16699a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
16799a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
16899a2dd95SBruce Richardson 
1698f1d23ecSDavid Marchand 	if (*dev->dev_ops->queue_release == NULL)
1708f1d23ecSDavid Marchand 		return -ENOTSUP;
17199a2dd95SBruce Richardson 	return (*dev->dev_ops->queue_release)(dev, queue_id);
17299a2dd95SBruce Richardson }
17399a2dd95SBruce Richardson 
17499a2dd95SBruce Richardson uint16_t
rte_rawdev_queue_count(uint16_t dev_id)17599a2dd95SBruce Richardson rte_rawdev_queue_count(uint16_t dev_id)
17699a2dd95SBruce Richardson {
17799a2dd95SBruce Richardson 	struct rte_rawdev *dev;
17899a2dd95SBruce Richardson 
17999a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
18099a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
18199a2dd95SBruce Richardson 
1828f1d23ecSDavid Marchand 	if (*dev->dev_ops->queue_count == NULL)
1838f1d23ecSDavid Marchand 		return -ENOTSUP;
18499a2dd95SBruce Richardson 	return (*dev->dev_ops->queue_count)(dev);
18599a2dd95SBruce Richardson }
18699a2dd95SBruce Richardson 
18799a2dd95SBruce Richardson int
rte_rawdev_get_attr(uint16_t dev_id,const char * attr_name,uint64_t * attr_value)18899a2dd95SBruce Richardson rte_rawdev_get_attr(uint16_t dev_id,
18999a2dd95SBruce Richardson 		    const char *attr_name,
19099a2dd95SBruce Richardson 		    uint64_t *attr_value)
19199a2dd95SBruce Richardson {
19299a2dd95SBruce Richardson 	struct rte_rawdev *dev;
19399a2dd95SBruce Richardson 
19499a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
19599a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
19699a2dd95SBruce Richardson 
1978f1d23ecSDavid Marchand 	if (*dev->dev_ops->attr_get == NULL)
1988f1d23ecSDavid Marchand 		return -ENOTSUP;
19999a2dd95SBruce Richardson 	return (*dev->dev_ops->attr_get)(dev, attr_name, attr_value);
20099a2dd95SBruce Richardson }
20199a2dd95SBruce Richardson 
20299a2dd95SBruce Richardson int
rte_rawdev_set_attr(uint16_t dev_id,const char * attr_name,const uint64_t attr_value)20399a2dd95SBruce Richardson rte_rawdev_set_attr(uint16_t dev_id,
20499a2dd95SBruce Richardson 		    const char *attr_name,
20599a2dd95SBruce Richardson 		    const uint64_t attr_value)
20699a2dd95SBruce Richardson {
20799a2dd95SBruce Richardson 	struct rte_rawdev *dev;
20899a2dd95SBruce Richardson 
20999a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
21099a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
21199a2dd95SBruce Richardson 
2128f1d23ecSDavid Marchand 	if (*dev->dev_ops->attr_set == NULL)
2138f1d23ecSDavid Marchand 		return -ENOTSUP;
21499a2dd95SBruce Richardson 	return (*dev->dev_ops->attr_set)(dev, attr_name, attr_value);
21599a2dd95SBruce Richardson }
21699a2dd95SBruce Richardson 
21799a2dd95SBruce Richardson int
rte_rawdev_enqueue_buffers(uint16_t dev_id,struct rte_rawdev_buf ** buffers,unsigned int count,rte_rawdev_obj_t context)21899a2dd95SBruce Richardson rte_rawdev_enqueue_buffers(uint16_t dev_id,
21999a2dd95SBruce Richardson 			   struct rte_rawdev_buf **buffers,
22099a2dd95SBruce Richardson 			   unsigned int count,
22199a2dd95SBruce Richardson 			   rte_rawdev_obj_t context)
22299a2dd95SBruce Richardson {
22399a2dd95SBruce Richardson 	struct rte_rawdev *dev;
22499a2dd95SBruce Richardson 
22599a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
22699a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
22799a2dd95SBruce Richardson 
2288f1d23ecSDavid Marchand 	if (*dev->dev_ops->enqueue_bufs == NULL)
2298f1d23ecSDavid Marchand 		return -ENOTSUP;
23099a2dd95SBruce Richardson 	return (*dev->dev_ops->enqueue_bufs)(dev, buffers, count, context);
23199a2dd95SBruce Richardson }
23299a2dd95SBruce Richardson 
23399a2dd95SBruce Richardson int
rte_rawdev_dequeue_buffers(uint16_t dev_id,struct rte_rawdev_buf ** buffers,unsigned int count,rte_rawdev_obj_t context)23499a2dd95SBruce Richardson rte_rawdev_dequeue_buffers(uint16_t dev_id,
23599a2dd95SBruce Richardson 			   struct rte_rawdev_buf **buffers,
23699a2dd95SBruce Richardson 			   unsigned int count,
23799a2dd95SBruce Richardson 			   rte_rawdev_obj_t context)
23899a2dd95SBruce Richardson {
23999a2dd95SBruce Richardson 	struct rte_rawdev *dev;
24099a2dd95SBruce Richardson 
24199a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
24299a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
24399a2dd95SBruce Richardson 
2448f1d23ecSDavid Marchand 	if (*dev->dev_ops->dequeue_bufs == NULL)
2458f1d23ecSDavid Marchand 		return -ENOTSUP;
24699a2dd95SBruce Richardson 	return (*dev->dev_ops->dequeue_bufs)(dev, buffers, count, context);
24799a2dd95SBruce Richardson }
24899a2dd95SBruce Richardson 
24999a2dd95SBruce Richardson int
rte_rawdev_dump(uint16_t dev_id,FILE * f)25099a2dd95SBruce Richardson rte_rawdev_dump(uint16_t dev_id, FILE *f)
25199a2dd95SBruce Richardson {
25299a2dd95SBruce Richardson 	struct rte_rawdev *dev;
25399a2dd95SBruce Richardson 
25499a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
25599a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
25699a2dd95SBruce Richardson 
2578f1d23ecSDavid Marchand 	if (*dev->dev_ops->dump == NULL)
2588f1d23ecSDavid Marchand 		return -ENOTSUP;
25999a2dd95SBruce Richardson 	return (*dev->dev_ops->dump)(dev, f);
26099a2dd95SBruce Richardson }
26199a2dd95SBruce Richardson 
26299a2dd95SBruce Richardson static int
xstats_get_count(uint16_t dev_id)26399a2dd95SBruce Richardson xstats_get_count(uint16_t dev_id)
26499a2dd95SBruce Richardson {
26599a2dd95SBruce Richardson 	struct rte_rawdev *dev = &rte_rawdevs[dev_id];
26699a2dd95SBruce Richardson 
2678f1d23ecSDavid Marchand 	if (*dev->dev_ops->xstats_get_names == NULL)
2688f1d23ecSDavid Marchand 		return -ENOTSUP;
26999a2dd95SBruce Richardson 	return (*dev->dev_ops->xstats_get_names)(dev, NULL, 0);
27099a2dd95SBruce Richardson }
27199a2dd95SBruce Richardson 
27299a2dd95SBruce Richardson int
rte_rawdev_xstats_names_get(uint16_t dev_id,struct rte_rawdev_xstats_name * xstats_names,unsigned int size)27399a2dd95SBruce Richardson rte_rawdev_xstats_names_get(uint16_t dev_id,
27499a2dd95SBruce Richardson 		struct rte_rawdev_xstats_name *xstats_names,
27599a2dd95SBruce Richardson 		unsigned int size)
27699a2dd95SBruce Richardson {
27799a2dd95SBruce Richardson 	const struct rte_rawdev *dev;
27899a2dd95SBruce Richardson 	int cnt_expected_entries;
27999a2dd95SBruce Richardson 
28099a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -ENODEV);
28199a2dd95SBruce Richardson 
28299a2dd95SBruce Richardson 	cnt_expected_entries = xstats_get_count(dev_id);
28399a2dd95SBruce Richardson 
28499a2dd95SBruce Richardson 	if (xstats_names == NULL || cnt_expected_entries < 0 ||
28599a2dd95SBruce Richardson 	    (int)size < cnt_expected_entries || size <= 0)
28699a2dd95SBruce Richardson 		return cnt_expected_entries;
28799a2dd95SBruce Richardson 
28899a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
28999a2dd95SBruce Richardson 
2908f1d23ecSDavid Marchand 	if (*dev->dev_ops->xstats_get_names == NULL)
2918f1d23ecSDavid Marchand 		return -ENOTSUP;
29299a2dd95SBruce Richardson 	return (*dev->dev_ops->xstats_get_names)(dev, xstats_names, size);
29399a2dd95SBruce Richardson }
29499a2dd95SBruce Richardson 
29599a2dd95SBruce Richardson /* retrieve rawdev extended statistics */
29699a2dd95SBruce Richardson int
rte_rawdev_xstats_get(uint16_t dev_id,const unsigned int ids[],uint64_t values[],unsigned int n)29799a2dd95SBruce Richardson rte_rawdev_xstats_get(uint16_t dev_id,
29899a2dd95SBruce Richardson 		      const unsigned int ids[],
29999a2dd95SBruce Richardson 		      uint64_t values[],
30099a2dd95SBruce Richardson 		      unsigned int n)
30199a2dd95SBruce Richardson {
30299a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -ENODEV);
30399a2dd95SBruce Richardson 	const struct rte_rawdev *dev = &rte_rawdevs[dev_id];
30499a2dd95SBruce Richardson 
3058f1d23ecSDavid Marchand 	if (*dev->dev_ops->xstats_get == NULL)
3068f1d23ecSDavid Marchand 		return -ENOTSUP;
30799a2dd95SBruce Richardson 	return (*dev->dev_ops->xstats_get)(dev, ids, values, n);
30899a2dd95SBruce Richardson }
30999a2dd95SBruce Richardson 
31099a2dd95SBruce Richardson uint64_t
rte_rawdev_xstats_by_name_get(uint16_t dev_id,const char * name,unsigned int * id)31199a2dd95SBruce Richardson rte_rawdev_xstats_by_name_get(uint16_t dev_id,
31299a2dd95SBruce Richardson 			      const char *name,
31399a2dd95SBruce Richardson 			      unsigned int *id)
31499a2dd95SBruce Richardson {
31599a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, 0);
31699a2dd95SBruce Richardson 	const struct rte_rawdev *dev = &rte_rawdevs[dev_id];
31799a2dd95SBruce Richardson 	unsigned int temp = -1;
31899a2dd95SBruce Richardson 
31999a2dd95SBruce Richardson 	if (id != NULL)
32099a2dd95SBruce Richardson 		*id = (unsigned int)-1;
32199a2dd95SBruce Richardson 	else
32299a2dd95SBruce Richardson 		id = &temp; /* driver never gets a NULL value */
32399a2dd95SBruce Richardson 
32499a2dd95SBruce Richardson 	/* implemented by driver */
3258f1d23ecSDavid Marchand 	if (*dev->dev_ops->xstats_get_by_name == NULL)
3268f1d23ecSDavid Marchand 		return -ENOTSUP;
32799a2dd95SBruce Richardson 	return (*dev->dev_ops->xstats_get_by_name)(dev, name, id);
32899a2dd95SBruce Richardson }
32999a2dd95SBruce Richardson 
33099a2dd95SBruce Richardson int
rte_rawdev_xstats_reset(uint16_t dev_id,const uint32_t ids[],uint32_t nb_ids)33199a2dd95SBruce Richardson rte_rawdev_xstats_reset(uint16_t dev_id,
33299a2dd95SBruce Richardson 			const uint32_t ids[], uint32_t nb_ids)
33399a2dd95SBruce Richardson {
33499a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
33599a2dd95SBruce Richardson 	struct rte_rawdev *dev = &rte_rawdevs[dev_id];
33699a2dd95SBruce Richardson 
3378f1d23ecSDavid Marchand 	if (*dev->dev_ops->xstats_reset == NULL)
3388f1d23ecSDavid Marchand 		return -ENOTSUP;
33999a2dd95SBruce Richardson 	return (*dev->dev_ops->xstats_reset)(dev, ids, nb_ids);
34099a2dd95SBruce Richardson }
34199a2dd95SBruce Richardson 
34299a2dd95SBruce Richardson int
rte_rawdev_firmware_status_get(uint16_t dev_id,rte_rawdev_obj_t status_info)34399a2dd95SBruce Richardson rte_rawdev_firmware_status_get(uint16_t dev_id, rte_rawdev_obj_t status_info)
34499a2dd95SBruce Richardson {
34599a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
34699a2dd95SBruce Richardson 	struct rte_rawdev *dev = &rte_rawdevs[dev_id];
34799a2dd95SBruce Richardson 
3488f1d23ecSDavid Marchand 	if (*dev->dev_ops->firmware_status_get == NULL)
3498f1d23ecSDavid Marchand 		return -ENOTSUP;
35099a2dd95SBruce Richardson 	return (*dev->dev_ops->firmware_status_get)(dev, status_info);
35199a2dd95SBruce Richardson }
35299a2dd95SBruce Richardson 
35399a2dd95SBruce Richardson int
rte_rawdev_firmware_version_get(uint16_t dev_id,rte_rawdev_obj_t version_info)35499a2dd95SBruce Richardson rte_rawdev_firmware_version_get(uint16_t dev_id, rte_rawdev_obj_t version_info)
35599a2dd95SBruce Richardson {
35699a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
35799a2dd95SBruce Richardson 	struct rte_rawdev *dev = &rte_rawdevs[dev_id];
35899a2dd95SBruce Richardson 
3598f1d23ecSDavid Marchand 	if (*dev->dev_ops->firmware_version_get == NULL)
3608f1d23ecSDavid Marchand 		return -ENOTSUP;
36199a2dd95SBruce Richardson 	return (*dev->dev_ops->firmware_version_get)(dev, version_info);
36299a2dd95SBruce Richardson }
36399a2dd95SBruce Richardson 
36499a2dd95SBruce Richardson int
rte_rawdev_firmware_load(uint16_t dev_id,rte_rawdev_obj_t firmware_image)36599a2dd95SBruce Richardson rte_rawdev_firmware_load(uint16_t dev_id, rte_rawdev_obj_t firmware_image)
36699a2dd95SBruce Richardson {
36799a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
36899a2dd95SBruce Richardson 	struct rte_rawdev *dev = &rte_rawdevs[dev_id];
36999a2dd95SBruce Richardson 
37099a2dd95SBruce Richardson 	if (!firmware_image)
37199a2dd95SBruce Richardson 		return -EINVAL;
37299a2dd95SBruce Richardson 
3738f1d23ecSDavid Marchand 	if (*dev->dev_ops->firmware_load == NULL)
3748f1d23ecSDavid Marchand 		return -ENOTSUP;
37599a2dd95SBruce Richardson 	return (*dev->dev_ops->firmware_load)(dev, firmware_image);
37699a2dd95SBruce Richardson }
37799a2dd95SBruce Richardson 
37899a2dd95SBruce Richardson int
rte_rawdev_firmware_unload(uint16_t dev_id)37999a2dd95SBruce Richardson rte_rawdev_firmware_unload(uint16_t dev_id)
38099a2dd95SBruce Richardson {
38199a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
38299a2dd95SBruce Richardson 	struct rte_rawdev *dev = &rte_rawdevs[dev_id];
38399a2dd95SBruce Richardson 
3848f1d23ecSDavid Marchand 	if (*dev->dev_ops->firmware_load == NULL)
3858f1d23ecSDavid Marchand 		return -ENOTSUP;
38699a2dd95SBruce Richardson 	return (*dev->dev_ops->firmware_unload)(dev);
38799a2dd95SBruce Richardson }
38899a2dd95SBruce Richardson 
38999a2dd95SBruce Richardson int
rte_rawdev_selftest(uint16_t dev_id)39099a2dd95SBruce Richardson rte_rawdev_selftest(uint16_t dev_id)
39199a2dd95SBruce Richardson {
39299a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
39399a2dd95SBruce Richardson 	struct rte_rawdev *dev = &rte_rawdevs[dev_id];
39499a2dd95SBruce Richardson 
3958f1d23ecSDavid Marchand 	if (*dev->dev_ops->dev_selftest == NULL)
3968f1d23ecSDavid Marchand 		return -ENOTSUP;
39799a2dd95SBruce Richardson 	return (*dev->dev_ops->dev_selftest)(dev_id);
39899a2dd95SBruce Richardson }
39999a2dd95SBruce Richardson 
40099a2dd95SBruce Richardson int
rte_rawdev_start(uint16_t dev_id)40199a2dd95SBruce Richardson rte_rawdev_start(uint16_t dev_id)
40299a2dd95SBruce Richardson {
40399a2dd95SBruce Richardson 	struct rte_rawdev *dev;
40499a2dd95SBruce Richardson 	int diag;
40599a2dd95SBruce Richardson 
40699a2dd95SBruce Richardson 	RTE_RDEV_DEBUG("Start dev_id=%" PRIu8, dev_id);
40799a2dd95SBruce Richardson 
40899a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
40999a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
41099a2dd95SBruce Richardson 	if (dev->started != 0) {
41199a2dd95SBruce Richardson 		RTE_RDEV_ERR("Device with dev_id=%" PRIu8 "already started",
41299a2dd95SBruce Richardson 			     dev_id);
41399a2dd95SBruce Richardson 		return 0;
41499a2dd95SBruce Richardson 	}
41599a2dd95SBruce Richardson 
41699a2dd95SBruce Richardson 	if (dev->dev_ops->dev_start == NULL)
41799a2dd95SBruce Richardson 		goto mark_started;
41899a2dd95SBruce Richardson 
41999a2dd95SBruce Richardson 	diag = (*dev->dev_ops->dev_start)(dev);
42099a2dd95SBruce Richardson 	if (diag != 0)
42199a2dd95SBruce Richardson 		return diag;
42299a2dd95SBruce Richardson 
42399a2dd95SBruce Richardson mark_started:
42499a2dd95SBruce Richardson 	dev->started = 1;
42599a2dd95SBruce Richardson 	return 0;
42699a2dd95SBruce Richardson }
42799a2dd95SBruce Richardson 
42899a2dd95SBruce Richardson void
rte_rawdev_stop(uint16_t dev_id)42999a2dd95SBruce Richardson rte_rawdev_stop(uint16_t dev_id)
43099a2dd95SBruce Richardson {
43199a2dd95SBruce Richardson 	struct rte_rawdev *dev;
43299a2dd95SBruce Richardson 
43399a2dd95SBruce Richardson 	RTE_RDEV_DEBUG("Stop dev_id=%" PRIu8, dev_id);
43499a2dd95SBruce Richardson 
43599a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_RET(dev_id);
43699a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
43799a2dd95SBruce Richardson 
43899a2dd95SBruce Richardson 	if (dev->started == 0) {
43999a2dd95SBruce Richardson 		RTE_RDEV_ERR("Device with dev_id=%" PRIu8 "already stopped",
44099a2dd95SBruce Richardson 			dev_id);
44199a2dd95SBruce Richardson 		return;
44299a2dd95SBruce Richardson 	}
44399a2dd95SBruce Richardson 
44499a2dd95SBruce Richardson 	if (dev->dev_ops->dev_stop == NULL)
44599a2dd95SBruce Richardson 		goto mark_stopped;
44699a2dd95SBruce Richardson 
44799a2dd95SBruce Richardson 	(*dev->dev_ops->dev_stop)(dev);
44899a2dd95SBruce Richardson 
44999a2dd95SBruce Richardson mark_stopped:
45099a2dd95SBruce Richardson 	dev->started = 0;
45199a2dd95SBruce Richardson }
45299a2dd95SBruce Richardson 
45399a2dd95SBruce Richardson int
rte_rawdev_close(uint16_t dev_id)45499a2dd95SBruce Richardson rte_rawdev_close(uint16_t dev_id)
45599a2dd95SBruce Richardson {
45699a2dd95SBruce Richardson 	struct rte_rawdev *dev;
45799a2dd95SBruce Richardson 
45899a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
45999a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
46099a2dd95SBruce Richardson 
4618f1d23ecSDavid Marchand 	if (*dev->dev_ops->dev_close == NULL)
4628f1d23ecSDavid Marchand 		return -ENOTSUP;
46399a2dd95SBruce Richardson 	/* Device must be stopped before it can be closed */
46499a2dd95SBruce Richardson 	if (dev->started == 1) {
46599a2dd95SBruce Richardson 		RTE_RDEV_ERR("Device %u must be stopped before closing",
46699a2dd95SBruce Richardson 			     dev_id);
46799a2dd95SBruce Richardson 		return -EBUSY;
46899a2dd95SBruce Richardson 	}
46999a2dd95SBruce Richardson 
47099a2dd95SBruce Richardson 	return (*dev->dev_ops->dev_close)(dev);
47199a2dd95SBruce Richardson }
47299a2dd95SBruce Richardson 
47399a2dd95SBruce Richardson int
rte_rawdev_reset(uint16_t dev_id)47499a2dd95SBruce Richardson rte_rawdev_reset(uint16_t dev_id)
47599a2dd95SBruce Richardson {
47699a2dd95SBruce Richardson 	struct rte_rawdev *dev;
47799a2dd95SBruce Richardson 
47899a2dd95SBruce Richardson 	RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
47999a2dd95SBruce Richardson 	dev = &rte_rawdevs[dev_id];
48099a2dd95SBruce Richardson 
4818f1d23ecSDavid Marchand 	if (*dev->dev_ops->dev_reset == NULL)
4828f1d23ecSDavid Marchand 		return -ENOTSUP;
48399a2dd95SBruce Richardson 	/* Reset is not dependent on state of the device */
48499a2dd95SBruce Richardson 	return (*dev->dev_ops->dev_reset)(dev);
48599a2dd95SBruce Richardson }
48699a2dd95SBruce Richardson 
48799a2dd95SBruce Richardson static inline uint8_t
rte_rawdev_find_free_device_index(void)48899a2dd95SBruce Richardson rte_rawdev_find_free_device_index(void)
48999a2dd95SBruce Richardson {
49099a2dd95SBruce Richardson 	uint16_t dev_id;
49199a2dd95SBruce Richardson 
49299a2dd95SBruce Richardson 	for (dev_id = 0; dev_id < RTE_RAWDEV_MAX_DEVS; dev_id++) {
49399a2dd95SBruce Richardson 		if (rte_rawdevs[dev_id].attached ==
49499a2dd95SBruce Richardson 				RTE_RAWDEV_DETACHED)
49599a2dd95SBruce Richardson 			return dev_id;
49699a2dd95SBruce Richardson 	}
49799a2dd95SBruce Richardson 
49899a2dd95SBruce Richardson 	return RTE_RAWDEV_MAX_DEVS;
49999a2dd95SBruce Richardson }
50099a2dd95SBruce Richardson 
50199a2dd95SBruce Richardson struct rte_rawdev *
rte_rawdev_pmd_allocate(const char * name,size_t dev_priv_size,int socket_id)50299a2dd95SBruce Richardson rte_rawdev_pmd_allocate(const char *name, size_t dev_priv_size, int socket_id)
50399a2dd95SBruce Richardson {
50499a2dd95SBruce Richardson 	struct rte_rawdev *rawdev;
50599a2dd95SBruce Richardson 	uint16_t dev_id;
50699a2dd95SBruce Richardson 
50799a2dd95SBruce Richardson 	if (rte_rawdev_pmd_get_named_dev(name) != NULL) {
508eab2364cSTomasz Duszynski 		RTE_RDEV_ERR("Raw device with name %s already allocated!", name);
50999a2dd95SBruce Richardson 		return NULL;
51099a2dd95SBruce Richardson 	}
51199a2dd95SBruce Richardson 
51299a2dd95SBruce Richardson 	dev_id = rte_rawdev_find_free_device_index();
51399a2dd95SBruce Richardson 	if (dev_id == RTE_RAWDEV_MAX_DEVS) {
51499a2dd95SBruce Richardson 		RTE_RDEV_ERR("Reached maximum number of raw devices");
51599a2dd95SBruce Richardson 		return NULL;
51699a2dd95SBruce Richardson 	}
51799a2dd95SBruce Richardson 
51899a2dd95SBruce Richardson 	rawdev = &rte_rawdevs[dev_id];
51999a2dd95SBruce Richardson 
52099a2dd95SBruce Richardson 	if (dev_priv_size > 0) {
52199a2dd95SBruce Richardson 		rawdev->dev_private = rte_zmalloc_socket("rawdev private",
52299a2dd95SBruce Richardson 				     dev_priv_size,
52399a2dd95SBruce Richardson 				     RTE_CACHE_LINE_SIZE,
52499a2dd95SBruce Richardson 				     socket_id);
52599a2dd95SBruce Richardson 		if (!rawdev->dev_private) {
52699a2dd95SBruce Richardson 			RTE_RDEV_ERR("Unable to allocate memory for rawdev");
52799a2dd95SBruce Richardson 			return NULL;
52899a2dd95SBruce Richardson 		}
52999a2dd95SBruce Richardson 	}
53099a2dd95SBruce Richardson 
53199a2dd95SBruce Richardson 	rawdev->dev_id = dev_id;
53299a2dd95SBruce Richardson 	rawdev->socket_id = socket_id;
53399a2dd95SBruce Richardson 	rawdev->started = 0;
53499a2dd95SBruce Richardson 	strlcpy(rawdev->name, name, RTE_RAWDEV_NAME_MAX_LEN);
53599a2dd95SBruce Richardson 
53699a2dd95SBruce Richardson 	rawdev->attached = RTE_RAWDEV_ATTACHED;
53799a2dd95SBruce Richardson 	rawdev_globals.nb_devs++;
53899a2dd95SBruce Richardson 
53999a2dd95SBruce Richardson 	return rawdev;
54099a2dd95SBruce Richardson }
54199a2dd95SBruce Richardson 
54299a2dd95SBruce Richardson int
rte_rawdev_pmd_release(struct rte_rawdev * rawdev)54399a2dd95SBruce Richardson rte_rawdev_pmd_release(struct rte_rawdev *rawdev)
54499a2dd95SBruce Richardson {
54599a2dd95SBruce Richardson 	int ret;
54699a2dd95SBruce Richardson 
54799a2dd95SBruce Richardson 	if (rawdev == NULL)
54899a2dd95SBruce Richardson 		return -EINVAL;
54999a2dd95SBruce Richardson 
55099a2dd95SBruce Richardson 	ret = rte_rawdev_close(rawdev->dev_id);
55199a2dd95SBruce Richardson 	if (ret < 0)
55299a2dd95SBruce Richardson 		return ret;
55399a2dd95SBruce Richardson 
55499a2dd95SBruce Richardson 	rawdev->attached = RTE_RAWDEV_DETACHED;
55599a2dd95SBruce Richardson 	rawdev_globals.nb_devs--;
55699a2dd95SBruce Richardson 
55799a2dd95SBruce Richardson 	rawdev->dev_id = 0;
55899a2dd95SBruce Richardson 	rawdev->socket_id = 0;
55999a2dd95SBruce Richardson 	rawdev->dev_ops = NULL;
56099a2dd95SBruce Richardson 	if (rawdev->dev_private) {
56199a2dd95SBruce Richardson 		rte_free(rawdev->dev_private);
56299a2dd95SBruce Richardson 		rawdev->dev_private = NULL;
56399a2dd95SBruce Richardson 	}
56499a2dd95SBruce Richardson 
56599a2dd95SBruce Richardson 	return 0;
56699a2dd95SBruce Richardson }
56799a2dd95SBruce Richardson 
56899a2dd95SBruce Richardson static int
handle_dev_list(const char * cmd __rte_unused,const char * params __rte_unused,struct rte_tel_data * d)56999a2dd95SBruce Richardson handle_dev_list(const char *cmd __rte_unused,
57099a2dd95SBruce Richardson 		const char *params __rte_unused,
57199a2dd95SBruce Richardson 		struct rte_tel_data *d)
57299a2dd95SBruce Richardson {
57399a2dd95SBruce Richardson 	int i;
57499a2dd95SBruce Richardson 
57599a2dd95SBruce Richardson 	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
57699a2dd95SBruce Richardson 	for (i = 0; i < rawdev_globals.nb_devs; i++)
57799a2dd95SBruce Richardson 		if (rte_rawdevices[i].attached == RTE_RAWDEV_ATTACHED)
57899a2dd95SBruce Richardson 			rte_tel_data_add_array_int(d, i);
57999a2dd95SBruce Richardson 	return 0;
58099a2dd95SBruce Richardson }
58199a2dd95SBruce Richardson 
58299a2dd95SBruce Richardson static int
handle_dev_xstats(const char * cmd __rte_unused,const char * params,struct rte_tel_data * d)58399a2dd95SBruce Richardson handle_dev_xstats(const char *cmd __rte_unused,
58499a2dd95SBruce Richardson 		const char *params,
58599a2dd95SBruce Richardson 		struct rte_tel_data *d)
58699a2dd95SBruce Richardson {
58799a2dd95SBruce Richardson 	uint64_t *rawdev_xstats;
58899a2dd95SBruce Richardson 	struct rte_rawdev_xstats_name *xstat_names;
58999a2dd95SBruce Richardson 	int dev_id, num_xstats, i, ret;
59099a2dd95SBruce Richardson 	unsigned int *ids;
59199a2dd95SBruce Richardson 	char *end_param;
59299a2dd95SBruce Richardson 
59399a2dd95SBruce Richardson 	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
59499a2dd95SBruce Richardson 		return -1;
59599a2dd95SBruce Richardson 
59699a2dd95SBruce Richardson 	dev_id = strtoul(params, &end_param, 0);
59799a2dd95SBruce Richardson 	if (*end_param != '\0')
59899a2dd95SBruce Richardson 		RTE_RDEV_LOG(NOTICE,
59999a2dd95SBruce Richardson 			"Extra parameters passed to rawdev telemetry command, ignoring");
60099a2dd95SBruce Richardson 	if (!rte_rawdev_pmd_is_valid_dev(dev_id))
60199a2dd95SBruce Richardson 		return -1;
60299a2dd95SBruce Richardson 
60399a2dd95SBruce Richardson 	num_xstats = xstats_get_count(dev_id);
60499a2dd95SBruce Richardson 	if (num_xstats < 0)
60599a2dd95SBruce Richardson 		return -1;
60699a2dd95SBruce Richardson 
60799a2dd95SBruce Richardson 	/* use one malloc for names, stats and ids */
60899a2dd95SBruce Richardson 	rawdev_xstats = malloc((sizeof(uint64_t) +
60999a2dd95SBruce Richardson 			sizeof(struct rte_rawdev_xstats_name) +
61099a2dd95SBruce Richardson 			sizeof(unsigned int)) * num_xstats);
61199a2dd95SBruce Richardson 	if (rawdev_xstats == NULL)
61299a2dd95SBruce Richardson 		return -1;
61399a2dd95SBruce Richardson 	xstat_names = (void *)&rawdev_xstats[num_xstats];
61499a2dd95SBruce Richardson 	ids = (void *)&xstat_names[num_xstats];
61599a2dd95SBruce Richardson 
61699a2dd95SBruce Richardson 	ret = rte_rawdev_xstats_names_get(dev_id, xstat_names, num_xstats);
61799a2dd95SBruce Richardson 	if (ret < 0 || ret > num_xstats) {
61899a2dd95SBruce Richardson 		free(rawdev_xstats);
61999a2dd95SBruce Richardson 		return -1;
62099a2dd95SBruce Richardson 	}
62199a2dd95SBruce Richardson 
62299a2dd95SBruce Richardson 	for (i = 0; i < num_xstats; i++)
62399a2dd95SBruce Richardson 		ids[i] = i;
62499a2dd95SBruce Richardson 
62599a2dd95SBruce Richardson 	ret = rte_rawdev_xstats_get(dev_id, ids, rawdev_xstats, num_xstats);
62699a2dd95SBruce Richardson 	if (ret < 0 || ret > num_xstats) {
62799a2dd95SBruce Richardson 		free(rawdev_xstats);
62899a2dd95SBruce Richardson 		return -1;
62999a2dd95SBruce Richardson 	}
63099a2dd95SBruce Richardson 
63199a2dd95SBruce Richardson 	rte_tel_data_start_dict(d);
63299a2dd95SBruce Richardson 	for (i = 0; i < num_xstats; i++)
633af0785a2SBruce Richardson 		rte_tel_data_add_dict_uint(d, xstat_names[i].name,
63499a2dd95SBruce Richardson 					   rawdev_xstats[i]);
63599a2dd95SBruce Richardson 
63699a2dd95SBruce Richardson 	free(rawdev_xstats);
63799a2dd95SBruce Richardson 	return 0;
63899a2dd95SBruce Richardson }
63999a2dd95SBruce Richardson 
640e915d404SChengwen Feng static int
handle_dev_dump(const char * cmd __rte_unused,const char * params,struct rte_tel_data * d)641e915d404SChengwen Feng handle_dev_dump(const char *cmd __rte_unused,
642e915d404SChengwen Feng 		const char *params,
643e915d404SChengwen Feng 		struct rte_tel_data *d)
644e915d404SChengwen Feng {
645e915d404SChengwen Feng 	char *buf, *end_param;
646e915d404SChengwen Feng 	int dev_id, ret;
647e915d404SChengwen Feng 	FILE *f;
648e915d404SChengwen Feng 
649e915d404SChengwen Feng 	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
650e915d404SChengwen Feng 		return -EINVAL;
651e915d404SChengwen Feng 
652e915d404SChengwen Feng 	dev_id = strtoul(params, &end_param, 0);
653e915d404SChengwen Feng 	if (*end_param != '\0')
654e915d404SChengwen Feng 		RTE_RDEV_LOG(NOTICE,
655e915d404SChengwen Feng 			"Extra parameters passed to rawdev telemetry command, ignoring");
656e915d404SChengwen Feng 	if (!rte_rawdev_pmd_is_valid_dev(dev_id))
657e915d404SChengwen Feng 		return -EINVAL;
658e915d404SChengwen Feng 
659*37ff3383SFerruh Yigit 	buf = calloc(RTE_TEL_MAX_SINGLE_STRING_LEN, sizeof(char));
660e915d404SChengwen Feng 	if (buf == NULL)
661e915d404SChengwen Feng 		return -ENOMEM;
662e915d404SChengwen Feng 
663e915d404SChengwen Feng 	f = fmemopen(buf, RTE_TEL_MAX_SINGLE_STRING_LEN - 1, "w+");
664e915d404SChengwen Feng 	if (f == NULL) {
665e915d404SChengwen Feng 		free(buf);
666e915d404SChengwen Feng 		return -EINVAL;
667e915d404SChengwen Feng 	}
668e915d404SChengwen Feng 
669e915d404SChengwen Feng 	ret = rte_rawdev_dump(dev_id, f);
670e915d404SChengwen Feng 	fclose(f);
671e915d404SChengwen Feng 	if (ret == 0) {
672e915d404SChengwen Feng 		rte_tel_data_start_dict(d);
673e915d404SChengwen Feng 		rte_tel_data_string(d, buf);
674e915d404SChengwen Feng 	}
675e915d404SChengwen Feng 
676e915d404SChengwen Feng 	free(buf);
677e915d404SChengwen Feng 	return 0;
678e915d404SChengwen Feng }
679e915d404SChengwen Feng 
680eeded204SDavid Marchand RTE_LOG_REGISTER_DEFAULT(librawdev_logtype, INFO);
68199a2dd95SBruce Richardson 
RTE_INIT(librawdev_init_telemetry)68299a2dd95SBruce Richardson RTE_INIT(librawdev_init_telemetry)
68399a2dd95SBruce Richardson {
68499a2dd95SBruce Richardson 	rte_telemetry_register_cmd("/rawdev/list", handle_dev_list,
68599a2dd95SBruce Richardson 			"Returns list of available rawdev ports. Takes no parameters");
68699a2dd95SBruce Richardson 	rte_telemetry_register_cmd("/rawdev/xstats", handle_dev_xstats,
68799a2dd95SBruce Richardson 			"Returns the xstats for a rawdev port. Parameters: int port_id");
688e915d404SChengwen Feng 	rte_telemetry_register_cmd("/rawdev/dump", handle_dev_dump,
689e915d404SChengwen Feng 			"Returns dump information for a rawdev port. Parameters: int port_id");
69099a2dd95SBruce Richardson }
691