net/cnxk: support basic port/queue statistics
authorSatha Rao <skoteshwar@marvell.com>
Wed, 23 Jun 2021 04:46:43 +0000 (10:16 +0530)
committerJerin Jacob <jerinj@marvell.com>
Tue, 29 Jun 2021 23:22:49 +0000 (01:22 +0200)
This patch implements regular port statistics and queue mapping set
api to get queue statistics

Signed-off-by: Satha Rao <skoteshwar@marvell.com>
doc/guides/nics/cnxk.rst
doc/guides/nics/features/cnxk.ini
doc/guides/nics/features/cnxk_vec.ini
doc/guides/nics/features/cnxk_vf.ini
drivers/net/cnxk/cnxk_ethdev.c
drivers/net/cnxk/cnxk_ethdev.h
drivers/net/cnxk/cnxk_stats.c [new file with mode: 0644]
drivers/net/cnxk/meson.build

index 14b6cb9..4ee6eb6 100644 (file)
@@ -25,6 +25,7 @@ Features of the CNXK Ethdev PMD are:
 - Receiver Side Scaling (RSS)
 - MAC filtering
 - Inner and Outer Checksum offload
+- Port hardware statistics
 - Link state information
 - Link flow control
 - MTU update
index e5669f5..40952a9 100644 (file)
@@ -32,6 +32,8 @@ L4 checksum offload  = Y
 Inner L3 checksum    = Y
 Inner L4 checksum    = Y
 Packet type parsing  = Y
+Basic stats          = Y
+Stats per queue      = Y
 Module EEPROM dump   = Y
 Linux                = Y
 ARMv8                = Y
index dff0c9b..32035bb 100644 (file)
@@ -30,6 +30,8 @@ L4 checksum offload  = Y
 Inner L3 checksum    = Y
 Inner L4 checksum    = Y
 Packet type parsing  = Y
+Basic stats          = Y
+Stats per queue      = Y
 Module EEPROM dump   = Y
 Linux                = Y
 ARMv8                = Y
index b950d2f..8060a68 100644 (file)
@@ -27,6 +27,8 @@ L4 checksum offload  = Y
 Inner L3 checksum    = Y
 Inner L4 checksum    = Y
 Packet type parsing  = Y
+Basic stats          = Y
+Stats per queue      = Y
 Module EEPROM dump   = Y
 Linux                = Y
 ARMv8                = Y
index 77bbab6..32b6f6c 100644 (file)
@@ -1196,6 +1196,9 @@ struct eth_dev_ops cnxk_eth_dev_ops = {
        .rx_queue_intr_enable = cnxk_nix_rx_queue_intr_enable,
        .rx_queue_intr_disable = cnxk_nix_rx_queue_intr_disable,
        .pool_ops_supported = cnxk_nix_pool_ops_supported,
+       .queue_stats_mapping_set = cnxk_nix_queue_stats_mapping,
+       .stats_get = cnxk_nix_stats_get,
+       .stats_reset = cnxk_nix_stats_reset,
 };
 
 static int
index e6dac95..860cfe1 100644 (file)
@@ -191,6 +191,10 @@ struct cnxk_eth_dev {
 
        /* LSO Tunnel format indices */
        uint64_t lso_tun_fmt;
+
+       /* Per queue statistics counters */
+       uint32_t txq_stat_map[RTE_ETHDEV_QUEUE_STAT_CNTRS];
+       uint32_t rxq_stat_map[RTE_ETHDEV_QUEUE_STAT_CNTRS];
 };
 
 struct cnxk_eth_rxq_sp {
@@ -286,6 +290,10 @@ void cnxk_nix_toggle_flag_link_cfg(struct cnxk_eth_dev *dev, bool set);
 void cnxk_eth_dev_link_status_cb(struct roc_nix *nix,
                                 struct roc_nix_link_info *link);
 int cnxk_nix_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete);
+int cnxk_nix_queue_stats_mapping(struct rte_eth_dev *dev, uint16_t queue_id,
+                                uint8_t stat_idx, uint8_t is_rx);
+int cnxk_nix_stats_reset(struct rte_eth_dev *dev);
+int cnxk_nix_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);
 
 /* Lookup configuration */
 const uint32_t *cnxk_nix_supported_ptypes_get(struct rte_eth_dev *eth_dev);
diff --git a/drivers/net/cnxk/cnxk_stats.c b/drivers/net/cnxk/cnxk_stats.c
new file mode 100644 (file)
index 0000000..24bff0b
--- /dev/null
@@ -0,0 +1,85 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "cnxk_ethdev.h"
+
+int
+cnxk_nix_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats)
+{
+       struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+       struct roc_nix *nix = &dev->nix;
+       struct roc_nix_stats nix_stats;
+       int rc = 0, i;
+
+       rc = roc_nix_stats_get(nix, &nix_stats);
+       if (rc)
+               goto exit;
+
+       stats->opackets = nix_stats.tx_ucast;
+       stats->opackets += nix_stats.tx_mcast;
+       stats->opackets += nix_stats.tx_bcast;
+       stats->oerrors = nix_stats.tx_drop;
+       stats->obytes = nix_stats.tx_octs;
+
+       stats->ipackets = nix_stats.rx_ucast;
+       stats->ipackets += nix_stats.rx_mcast;
+       stats->ipackets += nix_stats.rx_bcast;
+       stats->imissed = nix_stats.rx_drop;
+       stats->ibytes = nix_stats.rx_octs;
+       stats->ierrors = nix_stats.rx_err;
+
+       for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
+               struct roc_nix_stats_queue qstats;
+               uint16_t qidx;
+
+               if (dev->txq_stat_map[i] & (1U << 31)) {
+                       qidx = dev->txq_stat_map[i] & 0xFFFF;
+                       rc = roc_nix_stats_queue_get(nix, qidx, 0, &qstats);
+                       if (rc)
+                               goto exit;
+                       stats->q_opackets[i] = qstats.tx_pkts;
+                       stats->q_obytes[i] = qstats.tx_octs;
+                       stats->q_errors[i] = qstats.tx_drop_pkts;
+               }
+
+               if (dev->rxq_stat_map[i] & (1U << 31)) {
+                       qidx = dev->rxq_stat_map[i] & 0xFFFF;
+                       rc = roc_nix_stats_queue_get(nix, qidx, 1, &qstats);
+                       if (rc)
+                               goto exit;
+                       stats->q_ipackets[i] = qstats.rx_pkts;
+                       stats->q_ibytes[i] = qstats.rx_octs;
+                       stats->q_errors[i] += qstats.rx_drop_pkts;
+               }
+       }
+exit:
+       return rc;
+}
+
+int
+cnxk_nix_stats_reset(struct rte_eth_dev *eth_dev)
+{
+       struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+
+       return roc_nix_stats_reset(&dev->nix);
+}
+
+int
+cnxk_nix_queue_stats_mapping(struct rte_eth_dev *eth_dev, uint16_t queue_id,
+                            uint8_t stat_idx, uint8_t is_rx)
+{
+       struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+
+       if (is_rx) {
+               if (queue_id >= dev->nb_rxq)
+                       return -EINVAL;
+               dev->rxq_stat_map[stat_idx] = ((1U << 31) | queue_id);
+       } else {
+               if (queue_id >= dev->nb_txq)
+                       return -EINVAL;
+               dev->txq_stat_map[stat_idx] = ((1U << 31) | queue_id);
+       }
+
+       return 0;
+}
index 6e0820b..47c1ce1 100644 (file)
@@ -14,6 +14,7 @@ sources = files(
         'cnxk_ethdev_ops.c',
         'cnxk_link.c',
         'cnxk_lookup.c',
+        'cnxk_stats.c',
 )
 
 # CN9K