LCOV - code coverage report
Current view: top level - drivers/net/cnxk - cnxk_stats.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 159 0.0 %
Date: 2026-10-01 18:19:24 Functions: 0 7 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 66 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright(C) 2021 Marvell.
       3                 :            :  */
       4                 :            : 
       5                 :            : #include "cnxk_ethdev.h"
       6                 :            : 
       7                 :            : #define CNXK_NB_RXQ_STATS 5
       8                 :            : #define CNXK_NB_TXQ_STATS 4
       9                 :            : 
      10                 :            : int
      11                 :          0 : cnxk_nix_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats,
      12                 :            :                    struct eth_queue_stats *qstats)
      13                 :            : {
      14                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
      15                 :          0 :         struct roc_nix *nix = &dev->nix;
      16                 :            :         struct roc_nix_stats nix_stats;
      17                 :            :         int rc, i;
      18                 :            : 
      19                 :          0 :         rc = roc_nix_stats_get(nix, &nix_stats);
      20         [ #  # ]:          0 :         if (rc)
      21                 :          0 :                 goto exit;
      22                 :            : 
      23                 :          0 :         stats->opackets = nix_stats.tx_ucast;
      24                 :          0 :         stats->opackets += nix_stats.tx_mcast;
      25                 :          0 :         stats->opackets += nix_stats.tx_bcast;
      26                 :          0 :         stats->oerrors = nix_stats.tx_drop;
      27                 :          0 :         stats->obytes = nix_stats.tx_octs;
      28                 :            : 
      29                 :          0 :         stats->ipackets = nix_stats.rx_ucast;
      30                 :          0 :         stats->ipackets += nix_stats.rx_mcast;
      31                 :          0 :         stats->ipackets += nix_stats.rx_bcast;
      32                 :          0 :         stats->imissed = nix_stats.rx_drop;
      33                 :          0 :         stats->ibytes = nix_stats.rx_octs;
      34                 :          0 :         stats->ierrors = nix_stats.rx_err;
      35                 :            : 
      36         [ #  # ]:          0 :         if (qstats == NULL)
      37                 :          0 :                 goto exit;
      38                 :            : 
      39         [ #  # ]:          0 :         for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
      40                 :            :                 struct roc_nix_stats_queue qstats_data;
      41                 :            : 
      42                 :          0 :                 rc = roc_nix_stats_queue_get(nix, i, 0, &qstats_data);
      43         [ #  # ]:          0 :                 if (rc)
      44                 :          0 :                         goto exit;
      45                 :          0 :                 qstats[i].q_opackets = qstats_data.tx_pkts;
      46                 :          0 :                 qstats[i].q_obytes = qstats_data.tx_octs;
      47                 :            :         }
      48                 :            : 
      49         [ #  # ]:          0 :         for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
      50                 :            :                 struct roc_nix_stats_queue qstats_data;
      51                 :            : 
      52                 :          0 :                 rc = roc_nix_stats_queue_get(nix, i, 1, &qstats_data);
      53         [ #  # ]:          0 :                 if (rc)
      54                 :          0 :                         goto exit;
      55                 :          0 :                 qstats[i].q_ipackets = qstats_data.rx_pkts;
      56                 :          0 :                 qstats[i].q_ibytes = qstats_data.rx_octs;
      57                 :            :         }
      58                 :          0 : exit:
      59                 :          0 :         return rc;
      60                 :            : }
      61                 :            : 
      62                 :            : int
      63                 :          0 : cnxk_nix_stats_reset(struct rte_eth_dev *eth_dev)
      64                 :            : {
      65                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
      66                 :            : 
      67                 :          0 :         return roc_nix_stats_reset(&dev->nix);
      68                 :            : }
      69                 :            : 
      70                 :            : int
      71                 :          0 : cnxk_nix_xstats_get(struct rte_eth_dev *eth_dev, struct rte_eth_xstat *xstats,
      72                 :            :                     unsigned int n)
      73                 :          0 : {
      74                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
      75                 :          0 :         struct roc_nix_xstat roc_xstats[n];
      76                 :          0 :         struct roc_nix *nix = &dev->nix;
      77                 :            :         int roc_size, q, idx = 0, size;
      78                 :            : 
      79                 :          0 :         roc_size = roc_nix_xstats_get(nix, roc_xstats, n);
      80                 :            : 
      81         [ #  # ]:          0 :         if (roc_size < 0)
      82                 :            :                 return roc_size;
      83                 :            : 
      84                 :            :         /* Per Queue statistics also returned as part of xstats */
      85                 :          0 :         size = roc_size + (dev->nb_rxq * CNXK_NB_RXQ_STATS) +
      86                 :          0 :                (dev->nb_txq * CNXK_NB_TXQ_STATS);
      87                 :            : 
      88                 :            :         /* If requested array do not have space then return with count */
      89         [ #  # ]:          0 :         if (size > (int)n || xstats == NULL)
      90                 :            :                 return size;
      91                 :            : 
      92         [ #  # ]:          0 :         for (idx = 0; idx < roc_size; idx++) {
      93                 :          0 :                 xstats[idx].id = roc_xstats[idx].id;
      94                 :          0 :                 xstats[idx].value = roc_xstats[idx].value;
      95                 :            :         }
      96         [ #  # ]:          0 :         for (q = 0; q < dev->nb_rxq; q++) {
      97                 :            :                 struct roc_nix_stats_queue qstats;
      98                 :            :                 int rc;
      99                 :            : 
     100                 :          0 :                 rc = roc_nix_stats_queue_get(nix, q, 1, &qstats);
     101         [ #  # ]:          0 :                 if (rc)
     102                 :          0 :                         return rc;
     103                 :            : 
     104                 :          0 :                 xstats[idx].id = idx;
     105                 :          0 :                 xstats[idx].value = qstats.rx_pkts;
     106                 :          0 :                 idx++;
     107                 :          0 :                 xstats[idx].id = idx;
     108                 :          0 :                 xstats[idx].value = qstats.rx_octs;
     109                 :          0 :                 idx++;
     110                 :          0 :                 xstats[idx].id = idx;
     111                 :          0 :                 xstats[idx].value = qstats.rx_drop_pkts;
     112                 :          0 :                 idx++;
     113                 :          0 :                 xstats[idx].id = idx;
     114                 :          0 :                 xstats[idx].value = qstats.rx_drop_octs;
     115                 :          0 :                 idx++;
     116                 :          0 :                 xstats[idx].id = idx;
     117                 :          0 :                 xstats[idx].value = qstats.rx_error_pkts;
     118                 :          0 :                 idx++;
     119                 :            :         }
     120         [ #  # ]:          0 :         for (q = 0; q < dev->nb_txq; q++) {
     121                 :            :                 struct roc_nix_stats_queue qstats;
     122                 :            :                 int rc;
     123                 :            : 
     124                 :          0 :                 rc = roc_nix_stats_queue_get(nix, q, 0, &qstats);
     125         [ #  # ]:          0 :                 if (rc)
     126                 :          0 :                         return rc;
     127                 :            : 
     128                 :          0 :                 xstats[idx].id = idx;
     129                 :          0 :                 xstats[idx].value = qstats.tx_pkts;
     130                 :          0 :                 idx++;
     131                 :          0 :                 xstats[idx].id = idx;
     132                 :          0 :                 xstats[idx].value = qstats.tx_octs;
     133                 :          0 :                 idx++;
     134                 :          0 :                 xstats[idx].id = idx;
     135                 :          0 :                 xstats[idx].value = qstats.tx_drop_pkts;
     136                 :          0 :                 idx++;
     137                 :          0 :                 xstats[idx].id = idx;
     138                 :          0 :                 xstats[idx].value = qstats.tx_drop_octs;
     139                 :          0 :                 idx++;
     140                 :            :         }
     141                 :            : 
     142                 :            :         return size;
     143                 :            : }
     144                 :            : 
     145                 :            : int
     146                 :          0 : cnxk_nix_xstats_get_names(struct rte_eth_dev *eth_dev,
     147                 :            :                           struct rte_eth_xstat_name *xstats_names,
     148                 :            :                           unsigned int limit)
     149                 :          0 : {
     150                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
     151                 :          0 :         struct roc_nix_xstat_name roc_xstats_name[limit];
     152                 :          0 :         struct roc_nix *nix = &dev->nix;
     153                 :            :         int roc_size, size, i, q;
     154                 :            : 
     155                 :          0 :         roc_size = roc_nix_xstats_names_get(nix, NULL, 0);
     156                 :            :         /* Per Queue statistics also returned as part of xstats */
     157                 :          0 :         size = roc_size + (dev->nb_rxq * CNXK_NB_RXQ_STATS) +
     158                 :          0 :                (dev->nb_txq * CNXK_NB_TXQ_STATS);
     159                 :            : 
     160         [ #  # ]:          0 :         if (xstats_names == NULL)
     161                 :            :                 return size;
     162                 :            : 
     163         [ #  # ]:          0 :         if ((int)limit < size && xstats_names != NULL)
     164                 :            :                 return size;
     165                 :            : 
     166                 :          0 :         roc_size = roc_nix_xstats_names_get(nix, roc_xstats_name, limit);
     167                 :            : 
     168         [ #  # ]:          0 :         for (i = 0; i < roc_size; i++)
     169                 :          0 :                 rte_strscpy(xstats_names[i].name, roc_xstats_name[i].name,
     170                 :            :                             sizeof(xstats_names[i].name));
     171                 :            : 
     172         [ #  # ]:          0 :         for (q = 0; q < dev->nb_rxq; q++) {
     173                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     174                 :            :                          "rxq_%d_pkts", q);
     175                 :          0 :                 i++;
     176                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     177                 :            :                          "rxq_%d_octs", q);
     178                 :          0 :                 i++;
     179                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     180                 :            :                          "rxq_%d_drop_pkts", q);
     181                 :          0 :                 i++;
     182                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     183                 :            :                          "rxq_%d_drop_octs", q);
     184                 :          0 :                 i++;
     185                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     186                 :            :                          "rxq_%d_err_pkts", q);
     187                 :          0 :                 i++;
     188                 :            :         }
     189                 :            : 
     190         [ #  # ]:          0 :         for (q = 0; q < dev->nb_txq; q++) {
     191                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     192                 :            :                          "txq_%d_pkts", q);
     193                 :          0 :                 i++;
     194                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     195                 :            :                          "txq_%d_octs", q);
     196                 :          0 :                 i++;
     197                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     198                 :            :                          "txq_%d_drop_pkts", q);
     199                 :          0 :                 i++;
     200                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     201                 :            :                          "txq_%d_drop_octs", q);
     202                 :          0 :                 i++;
     203                 :            :         }
     204                 :            : 
     205                 :            :         return size;
     206                 :            : }
     207                 :            : 
     208                 :            : int
     209                 :          0 : cnxk_nix_xstats_get_names_by_id(struct rte_eth_dev *eth_dev,
     210                 :            :                                 const uint64_t *ids,
     211                 :            :                                 struct rte_eth_xstat_name *xstats_names,
     212                 :            :                                 unsigned int limit)
     213                 :          0 : {
     214                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
     215                 :          0 :         uint32_t nix_cnt = roc_nix_xstats_names_get(&dev->nix, NULL, 0);
     216                 :          0 :         uint32_t stat_cnt = nix_cnt + (dev->nb_rxq * CNXK_NB_RXQ_STATS) +
     217                 :          0 :                             (dev->nb_txq * CNXK_NB_TXQ_STATS);
     218                 :          0 :         struct rte_eth_xstat_name xnames[stat_cnt];
     219                 :            :         uint32_t i;
     220                 :            : 
     221         [ #  # ]:          0 :         if (limit < stat_cnt && ids == NULL)
     222                 :          0 :                 return stat_cnt;
     223                 :            : 
     224         [ #  # ]:          0 :         if (limit > stat_cnt)
     225                 :            :                 return -EINVAL;
     226                 :            : 
     227         [ #  # ]:          0 :         if (xstats_names == NULL)
     228                 :            :                 return -ENOMEM;
     229                 :            : 
     230                 :          0 :         cnxk_nix_xstats_get_names(eth_dev, xnames, stat_cnt);
     231                 :            : 
     232         [ #  # ]:          0 :         for (i = 0; i < limit; i++) {
     233         [ #  # ]:          0 :                 if (ids[i] >= stat_cnt)
     234                 :            :                         return -EINVAL;
     235                 :            : 
     236                 :          0 :                 rte_strscpy(xstats_names[i].name, xnames[ids[i]].name,
     237                 :            :                             sizeof(xstats_names[i].name));
     238                 :            :         }
     239                 :            : 
     240                 :          0 :         return limit;
     241                 :            : }
     242                 :            : 
     243                 :            : int
     244                 :          0 : cnxk_nix_xstats_get_by_id(struct rte_eth_dev *eth_dev, const uint64_t *ids,
     245                 :            :                           uint64_t *values, unsigned int n)
     246                 :          0 : {
     247                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
     248                 :          0 :         uint32_t nix_cnt = roc_nix_xstats_names_get(&dev->nix, NULL, 0);
     249                 :          0 :         uint32_t stat_cnt = nix_cnt + (dev->nb_rxq * CNXK_NB_RXQ_STATS) +
     250                 :          0 :                             (dev->nb_txq * CNXK_NB_TXQ_STATS);
     251                 :          0 :         struct rte_eth_xstat xstats[stat_cnt];
     252                 :            :         uint32_t i;
     253                 :            : 
     254         [ #  # ]:          0 :         if (n < stat_cnt && ids == NULL)
     255                 :          0 :                 return stat_cnt;
     256                 :            : 
     257         [ #  # ]:          0 :         if (n > stat_cnt)
     258                 :            :                 return -EINVAL;
     259                 :            : 
     260         [ #  # ]:          0 :         if (values == NULL)
     261                 :            :                 return -ENOMEM;
     262                 :            : 
     263                 :          0 :         cnxk_nix_xstats_get(eth_dev, xstats, stat_cnt);
     264                 :            : 
     265         [ #  # ]:          0 :         for (i = 0; i < n; i++) {
     266         [ #  # ]:          0 :                 if (ids[i] >= stat_cnt)
     267                 :            :                         return -EINVAL;
     268                 :          0 :                 values[i] = xstats[ids[i]].value;
     269                 :            :         }
     270                 :            : 
     271                 :          0 :         return n;
     272                 :            : }
     273                 :            : 
     274                 :            : int
     275                 :          0 : cnxk_nix_xstats_reset(struct rte_eth_dev *eth_dev)
     276                 :            : {
     277                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
     278                 :          0 :         struct roc_nix *nix = &dev->nix;
     279                 :            :         int rc = 0, i;
     280                 :            : 
     281                 :          0 :         rc = roc_nix_stats_reset(nix);
     282         [ #  # ]:          0 :         if (rc)
     283                 :          0 :                 goto exit;
     284                 :            : 
     285                 :            :         /* Reset Rx Queues */
     286         [ #  # ]:          0 :         for (i = 0; i < dev->nb_rxq; i++) {
     287                 :          0 :                 rc = roc_nix_stats_queue_reset(nix, i, 1);
     288         [ #  # ]:          0 :                 if (rc)
     289                 :          0 :                         goto exit;
     290                 :            :         }
     291                 :            : 
     292                 :            :         /* Reset Tx Queues */
     293         [ #  # ]:          0 :         for (i = 0; i < dev->nb_txq; i++) {
     294                 :          0 :                 rc = roc_nix_stats_queue_reset(nix, i, 0);
     295         [ #  # ]:          0 :                 if (rc)
     296                 :          0 :                         goto exit;
     297                 :            :         }
     298                 :            : 
     299                 :            :         /* Reset MAC stats */
     300                 :          0 :         rc = roc_nix_mac_stats_reset(nix);
     301                 :          0 : exit:
     302                 :          0 :         return rc;
     303                 :            : }

Generated by: LCOV version 1.14