xref: /dpdk/drivers/event/opdl/opdl_evdev_xstats.c (revision 1bdfe4d76e98fa3ba595f49606038f0a04181a6e)
1e07a3ed7SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2e07a3ed7SBruce Richardson  * Copyright(c) 2017 Intel Corporation
33c7f3dcfSLiang Ma  */
43c7f3dcfSLiang Ma 
53c7f3dcfSLiang Ma #include "opdl_evdev.h"
63c7f3dcfSLiang Ma #include "opdl_log.h"
73c7f3dcfSLiang Ma 
83c7f3dcfSLiang Ma static const char * const port_xstat_str[] = {
93c7f3dcfSLiang Ma 
103c7f3dcfSLiang Ma 	"claim_pkts_requested",
113c7f3dcfSLiang Ma 	"claim_pkts_granted",
123c7f3dcfSLiang Ma 	"claim_non_empty",
133c7f3dcfSLiang Ma 	"claim_empty",
143c7f3dcfSLiang Ma 	"total_cycles",
153c7f3dcfSLiang Ma };
163c7f3dcfSLiang Ma 
173c7f3dcfSLiang Ma 
183c7f3dcfSLiang Ma void
opdl_xstats_init(struct rte_eventdev * dev)193c7f3dcfSLiang Ma opdl_xstats_init(struct rte_eventdev *dev)
203c7f3dcfSLiang Ma {
213c7f3dcfSLiang Ma 	uint32_t i, j;
223c7f3dcfSLiang Ma 
233c7f3dcfSLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
243c7f3dcfSLiang Ma 
253c7f3dcfSLiang Ma 	if (!device->do_validation)
263c7f3dcfSLiang Ma 		return;
273c7f3dcfSLiang Ma 
283c7f3dcfSLiang Ma 	for (i = 0; i < device->max_port_nb; i++) {
293c7f3dcfSLiang Ma 		struct opdl_port *port = &device->ports[i];
303c7f3dcfSLiang Ma 
313c7f3dcfSLiang Ma 		for (j = 0; j < max_num_port_xstat; j++) {
323c7f3dcfSLiang Ma 			uint32_t index = (i * max_num_port_xstat) + j;
333c7f3dcfSLiang Ma 
343c7f3dcfSLiang Ma 			/* Name */
3557362ddfSPallantla Poornima 			snprintf(device->port_xstat[index].stat.name,
3657362ddfSPallantla Poornima 				sizeof(device->port_xstat[index].stat.name),
3757362ddfSPallantla Poornima 				"port_%02u_%s", i, port_xstat_str[j]);
383c7f3dcfSLiang Ma 
393c7f3dcfSLiang Ma 			/* ID */
403c7f3dcfSLiang Ma 			device->port_xstat[index].id = index;
413c7f3dcfSLiang Ma 
423c7f3dcfSLiang Ma 			/* Stats ptr */
433c7f3dcfSLiang Ma 			device->port_xstat[index].value = &port->port_stat[j];
443c7f3dcfSLiang Ma 		}
453c7f3dcfSLiang Ma 	}
463c7f3dcfSLiang Ma }
473c7f3dcfSLiang Ma 
483c7f3dcfSLiang Ma int
opdl_xstats_uninit(struct rte_eventdev * dev)493c7f3dcfSLiang Ma opdl_xstats_uninit(struct rte_eventdev *dev)
503c7f3dcfSLiang Ma {
513c7f3dcfSLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
523c7f3dcfSLiang Ma 
533c7f3dcfSLiang Ma 	if (!device->do_validation)
543c7f3dcfSLiang Ma 		return 0;
553c7f3dcfSLiang Ma 
563c7f3dcfSLiang Ma 	memset(device->port_xstat,
573c7f3dcfSLiang Ma 	       0,
583c7f3dcfSLiang Ma 	       sizeof(device->port_xstat));
593c7f3dcfSLiang Ma 
603c7f3dcfSLiang Ma 	return 0;
613c7f3dcfSLiang Ma }
623c7f3dcfSLiang Ma 
633c7f3dcfSLiang Ma int
opdl_xstats_get_names(const struct rte_eventdev * dev,enum rte_event_dev_xstats_mode mode,uint8_t queue_port_id,struct rte_event_dev_xstats_name * xstats_names,uint64_t * ids,unsigned int size)643c7f3dcfSLiang Ma opdl_xstats_get_names(const struct rte_eventdev *dev,
653c7f3dcfSLiang Ma 		enum rte_event_dev_xstats_mode mode,
663c7f3dcfSLiang Ma 		uint8_t queue_port_id,
673c7f3dcfSLiang Ma 		struct rte_event_dev_xstats_name *xstats_names,
68*1bdfe4d7SPavan Nikhilesh 		uint64_t *ids, unsigned int size)
693c7f3dcfSLiang Ma {
703c7f3dcfSLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
713c7f3dcfSLiang Ma 
723c7f3dcfSLiang Ma 	if (!device->do_validation)
733c7f3dcfSLiang Ma 		return -ENOTSUP;
743c7f3dcfSLiang Ma 
753c7f3dcfSLiang Ma 	if (mode == RTE_EVENT_DEV_XSTATS_DEVICE ||
763c7f3dcfSLiang Ma 			mode == RTE_EVENT_DEV_XSTATS_QUEUE)
773c7f3dcfSLiang Ma 		return -EINVAL;
783c7f3dcfSLiang Ma 
793c7f3dcfSLiang Ma 	if (queue_port_id >= device->max_port_nb)
803c7f3dcfSLiang Ma 		return -EINVAL;
813c7f3dcfSLiang Ma 
823c7f3dcfSLiang Ma 	if (size < max_num_port_xstat)
833c7f3dcfSLiang Ma 		return max_num_port_xstat;
843c7f3dcfSLiang Ma 
853c7f3dcfSLiang Ma 	uint32_t port_idx = queue_port_id * max_num_port_xstat;
863c7f3dcfSLiang Ma 
87be455196SHarry van Haaren 	uint32_t j;
88be455196SHarry van Haaren 	for (j = 0; j < max_num_port_xstat; j++) {
893c7f3dcfSLiang Ma 
903c7f3dcfSLiang Ma 		strcpy(xstats_names[j].name,
913c7f3dcfSLiang Ma 				device->port_xstat[j + port_idx].stat.name);
923c7f3dcfSLiang Ma 		ids[j] = device->port_xstat[j + port_idx].id;
933c7f3dcfSLiang Ma 	}
943c7f3dcfSLiang Ma 
953c7f3dcfSLiang Ma 	return max_num_port_xstat;
963c7f3dcfSLiang Ma }
973c7f3dcfSLiang Ma 
983c7f3dcfSLiang Ma int
opdl_xstats_get(const struct rte_eventdev * dev,enum rte_event_dev_xstats_mode mode,uint8_t queue_port_id,const uint64_t ids[],uint64_t values[],unsigned int n)993c7f3dcfSLiang Ma opdl_xstats_get(const struct rte_eventdev *dev,
1003c7f3dcfSLiang Ma 		enum rte_event_dev_xstats_mode mode,
1013c7f3dcfSLiang Ma 		uint8_t queue_port_id,
102*1bdfe4d7SPavan Nikhilesh 		const uint64_t ids[],
1033c7f3dcfSLiang Ma 		uint64_t values[], unsigned int n)
1043c7f3dcfSLiang Ma {
1053c7f3dcfSLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
1063c7f3dcfSLiang Ma 
1073c7f3dcfSLiang Ma 	if (!device->do_validation)
1083c7f3dcfSLiang Ma 		return -ENOTSUP;
1093c7f3dcfSLiang Ma 
1103c7f3dcfSLiang Ma 	if (mode == RTE_EVENT_DEV_XSTATS_DEVICE ||
1113c7f3dcfSLiang Ma 			mode == RTE_EVENT_DEV_XSTATS_QUEUE)
1123c7f3dcfSLiang Ma 		return -EINVAL;
1133c7f3dcfSLiang Ma 
1143c7f3dcfSLiang Ma 	if (queue_port_id >= device->max_port_nb)
1153c7f3dcfSLiang Ma 		return -EINVAL;
1163c7f3dcfSLiang Ma 
1173c7f3dcfSLiang Ma 	if (n > max_num_port_xstat)
1183c7f3dcfSLiang Ma 		return -EINVAL;
1193c7f3dcfSLiang Ma 
1203c7f3dcfSLiang Ma 	uint32_t p_start = queue_port_id * max_num_port_xstat;
1213c7f3dcfSLiang Ma 	uint32_t p_finish = p_start + max_num_port_xstat;
1223c7f3dcfSLiang Ma 
123be455196SHarry van Haaren 	uint32_t i;
124be455196SHarry van Haaren 	for (i = 0; i < n; i++) {
1253c7f3dcfSLiang Ma 		if (ids[i] < p_start || ids[i] >= p_finish)
1263c7f3dcfSLiang Ma 			return -EINVAL;
1273c7f3dcfSLiang Ma 
1283c7f3dcfSLiang Ma 		values[i] = *(device->port_xstat[ids[i]].value);
1293c7f3dcfSLiang Ma 	}
1303c7f3dcfSLiang Ma 
1313c7f3dcfSLiang Ma 	return n;
1323c7f3dcfSLiang Ma }
1333c7f3dcfSLiang Ma 
1343c7f3dcfSLiang Ma uint64_t
opdl_xstats_get_by_name(const struct rte_eventdev * dev,const char * name,uint64_t * id)1353c7f3dcfSLiang Ma opdl_xstats_get_by_name(const struct rte_eventdev *dev,
136*1bdfe4d7SPavan Nikhilesh 		const char *name, uint64_t *id)
1373c7f3dcfSLiang Ma {
1383c7f3dcfSLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
1393c7f3dcfSLiang Ma 
1403c7f3dcfSLiang Ma 	if (!device->do_validation)
1413c7f3dcfSLiang Ma 		return -ENOTSUP;
1423c7f3dcfSLiang Ma 
1433c7f3dcfSLiang Ma 	uint32_t max_index = device->max_port_nb * max_num_port_xstat;
1443c7f3dcfSLiang Ma 
145be455196SHarry van Haaren 	uint32_t i;
146be455196SHarry van Haaren 	for (i = 0; i < max_index; i++) {
1473c7f3dcfSLiang Ma 
1483c7f3dcfSLiang Ma 		if (strncmp(name,
1493c7f3dcfSLiang Ma 			   device->port_xstat[i].stat.name,
1503c7f3dcfSLiang Ma 			   RTE_EVENT_DEV_XSTATS_NAME_SIZE) == 0) {
1513c7f3dcfSLiang Ma 			if (id != NULL)
1523c7f3dcfSLiang Ma 				*id = i;
1533c7f3dcfSLiang Ma 			if (device->port_xstat[i].value)
1543c7f3dcfSLiang Ma 				return *(device->port_xstat[i].value);
1553c7f3dcfSLiang Ma 			break;
1563c7f3dcfSLiang Ma 		}
1573c7f3dcfSLiang Ma 	}
1583c7f3dcfSLiang Ma 	return -EINVAL;
1593c7f3dcfSLiang Ma }
1603c7f3dcfSLiang Ma 
1613c7f3dcfSLiang Ma int
opdl_xstats_reset(struct rte_eventdev * dev,enum rte_event_dev_xstats_mode mode,int16_t queue_port_id,const uint64_t ids[],uint32_t nb_ids)1623c7f3dcfSLiang Ma opdl_xstats_reset(struct rte_eventdev *dev,
1633c7f3dcfSLiang Ma 		enum rte_event_dev_xstats_mode mode,
164*1bdfe4d7SPavan Nikhilesh 		int16_t queue_port_id, const uint64_t ids[],
1653c7f3dcfSLiang Ma 		uint32_t nb_ids)
1663c7f3dcfSLiang Ma {
1673c7f3dcfSLiang Ma 	struct opdl_evdev *device = opdl_pmd_priv(dev);
1683c7f3dcfSLiang Ma 
1693c7f3dcfSLiang Ma 	if (!device->do_validation)
1703c7f3dcfSLiang Ma 		return -ENOTSUP;
1713c7f3dcfSLiang Ma 
1723c7f3dcfSLiang Ma 	RTE_SET_USED(dev);
1733c7f3dcfSLiang Ma 	RTE_SET_USED(mode);
1743c7f3dcfSLiang Ma 	RTE_SET_USED(queue_port_id);
1753c7f3dcfSLiang Ma 	RTE_SET_USED(ids);
1763c7f3dcfSLiang Ma 	RTE_SET_USED(nb_ids);
1773c7f3dcfSLiang Ma 
1783c7f3dcfSLiang Ma 	return -ENOTSUP;
1793c7f3dcfSLiang Ma }
180