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