net/cnxk: support basic port/queue statistics
[dpdk.git] / drivers / net / cnxk / cnxk_stats.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4
5 #include "cnxk_ethdev.h"
6
7 int
8 cnxk_nix_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)
9 {
10         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
11         struct roc_nix *nix = &dev->nix;
12         struct roc_nix_stats nix_stats;
13         int rc = 0, i;
14
15         rc = roc_nix_stats_get(nix, &nix_stats);
16         if (rc)
17                 goto exit;
18
19         stats->opackets = nix_stats.tx_ucast;
20         stats->opackets += nix_stats.tx_mcast;
21         stats->opackets += nix_stats.tx_bcast;
22         stats->oerrors = nix_stats.tx_drop;
23         stats->obytes = nix_stats.tx_octs;
24
25         stats->ipackets = nix_stats.rx_ucast;
26         stats->ipackets += nix_stats.rx_mcast;
27         stats->ipackets += nix_stats.rx_bcast;
28         stats->imissed = nix_stats.rx_drop;
29         stats->ibytes = nix_stats.rx_octs;
30         stats->ierrors = nix_stats.rx_err;
31
32         for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
33                 struct roc_nix_stats_queue qstats;
34                 uint16_t qidx;
35
36                 if (dev->txq_stat_map[i] & (1U << 31)) {
37                         qidx = dev->txq_stat_map[i] & 0xFFFF;
38                         rc = roc_nix_stats_queue_get(nix, qidx, 0, &qstats);
39                         if (rc)
40                                 goto exit;
41                         stats->q_opackets[i] = qstats.tx_pkts;
42                         stats->q_obytes[i] = qstats.tx_octs;
43                         stats->q_errors[i] = qstats.tx_drop_pkts;
44                 }
45
46                 if (dev->rxq_stat_map[i] & (1U << 31)) {
47                         qidx = dev->rxq_stat_map[i] & 0xFFFF;
48                         rc = roc_nix_stats_queue_get(nix, qidx, 1, &qstats);
49                         if (rc)
50                                 goto exit;
51                         stats->q_ipackets[i] = qstats.rx_pkts;
52                         stats->q_ibytes[i] = qstats.rx_octs;
53                         stats->q_errors[i] += qstats.rx_drop_pkts;
54                 }
55         }
56 exit:
57         return rc;
58 }
59
60 int
61 cnxk_nix_stats_reset(struct rte_eth_dev *eth_dev)
62 {
63         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
64
65         return roc_nix_stats_reset(&dev->nix);
66 }
67
68 int
69 cnxk_nix_queue_stats_mapping(struct rte_eth_dev *eth_dev, uint16_t queue_id,
70                              uint8_t stat_idx, uint8_t is_rx)
71 {
72         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
73
74         if (is_rx) {
75                 if (queue_id >= dev->nb_rxq)
76                         return -EINVAL;
77                 dev->rxq_stat_map[stat_idx] = ((1U << 31) | queue_id);
78         } else {
79                 if (queue_id >= dev->nb_txq)
80                         return -EINVAL;
81                 dev->txq_stat_map[stat_idx] = ((1U << 31) | queue_id);
82         }
83
84         return 0;
85 }