LCOV - code coverage report
Current view: top level - drivers/net/cnxk - cnxk_stats.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 167 0.0 %
Date: 2025-11-01 17:50:34 Functions: 0 8 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 76 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 = 0, 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 :                 for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
      38                 :            :                         struct roc_nix_stats_queue qstats_data;
      39                 :            :                         uint16_t qidx;
      40                 :            : 
      41         [ #  # ]:          0 :                         if (dev->txq_stat_map[i] & (1U << 31)) {
      42                 :            :                                 qidx = dev->txq_stat_map[i] & 0xFFFF;
      43                 :          0 :                                 rc = roc_nix_stats_queue_get(nix, qidx, 0, &qstats_data);
      44         [ #  # ]:          0 :                                 if (rc)
      45                 :          0 :                                         goto exit;
      46                 :          0 :                                 qstats->q_opackets[i] = qstats_data.tx_pkts;
      47                 :          0 :                                 qstats->q_obytes[i] = qstats_data.tx_octs;
      48                 :          0 :                                 qstats->q_errors[i] = qstats_data.tx_drop_pkts;
      49                 :            :                         }
      50                 :            : 
      51         [ #  # ]:          0 :                         if (dev->rxq_stat_map[i] & (1U << 31)) {
      52                 :            :                                 qidx = dev->rxq_stat_map[i] & 0xFFFF;
      53                 :          0 :                                 rc = roc_nix_stats_queue_get(nix, qidx, 1, &qstats_data);
      54         [ #  # ]:          0 :                                 if (rc)
      55                 :          0 :                                         goto exit;
      56                 :          0 :                                 qstats->q_ipackets[i] = qstats_data.rx_pkts;
      57                 :          0 :                                 qstats->q_ibytes[i] = qstats_data.rx_octs;
      58                 :          0 :                                 qstats->q_errors[i] += qstats_data.rx_drop_pkts;
      59                 :            :                         }
      60                 :            :                 }
      61                 :            :         }
      62                 :          0 : exit:
      63                 :          0 :         return rc;
      64                 :            : }
      65                 :            : 
      66                 :            : int
      67                 :          0 : cnxk_nix_stats_reset(struct rte_eth_dev *eth_dev)
      68                 :            : {
      69                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
      70                 :            : 
      71                 :          0 :         return roc_nix_stats_reset(&dev->nix);
      72                 :            : }
      73                 :            : 
      74                 :            : int
      75         [ #  # ]:          0 : cnxk_nix_queue_stats_mapping(struct rte_eth_dev *eth_dev, uint16_t queue_id,
      76                 :            :                              uint8_t stat_idx, uint8_t is_rx)
      77                 :            : {
      78                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
      79                 :            : 
      80         [ #  # ]:          0 :         if (is_rx) {
      81         [ #  # ]:          0 :                 if (queue_id >= dev->nb_rxq)
      82                 :            :                         return -EINVAL;
      83                 :          0 :                 dev->rxq_stat_map[stat_idx] = ((1U << 31) | queue_id);
      84                 :            :         } else {
      85         [ #  # ]:          0 :                 if (queue_id >= dev->nb_txq)
      86                 :            :                         return -EINVAL;
      87                 :          0 :                 dev->txq_stat_map[stat_idx] = ((1U << 31) | queue_id);
      88                 :            :         }
      89                 :            : 
      90                 :            :         return 0;
      91                 :            : }
      92                 :            : 
      93                 :            : int
      94                 :          0 : cnxk_nix_xstats_get(struct rte_eth_dev *eth_dev, struct rte_eth_xstat *xstats,
      95                 :            :                     unsigned int n)
      96                 :          0 : {
      97                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
      98                 :          0 :         struct roc_nix_xstat roc_xstats[n];
      99                 :          0 :         struct roc_nix *nix = &dev->nix;
     100                 :            :         int roc_size, q, idx = 0, size;
     101                 :            : 
     102                 :          0 :         roc_size = roc_nix_xstats_get(nix, roc_xstats, n);
     103                 :            : 
     104         [ #  # ]:          0 :         if (roc_size < 0)
     105                 :            :                 return roc_size;
     106                 :            : 
     107                 :            :         /* Per Queue statistics also returned as part of xstats */
     108                 :          0 :         size = roc_size + (dev->nb_rxq * CNXK_NB_RXQ_STATS) +
     109                 :          0 :                (dev->nb_txq * CNXK_NB_TXQ_STATS);
     110                 :            : 
     111                 :            :         /* If requested array do not have space then return with count */
     112         [ #  # ]:          0 :         if (size > (int)n || xstats == NULL)
     113                 :            :                 return size;
     114                 :            : 
     115         [ #  # ]:          0 :         for (idx = 0; idx < roc_size; idx++) {
     116                 :          0 :                 xstats[idx].id = roc_xstats[idx].id;
     117                 :          0 :                 xstats[idx].value = roc_xstats[idx].value;
     118                 :            :         }
     119         [ #  # ]:          0 :         for (q = 0; q < dev->nb_rxq; q++) {
     120                 :            :                 struct roc_nix_stats_queue qstats;
     121                 :            :                 int rc;
     122                 :            : 
     123                 :          0 :                 rc = roc_nix_stats_queue_get(nix, q, 1, &qstats);
     124         [ #  # ]:          0 :                 if (rc)
     125                 :          0 :                         return rc;
     126                 :            : 
     127                 :          0 :                 xstats[idx].id = idx;
     128                 :          0 :                 xstats[idx].value = qstats.rx_pkts;
     129                 :          0 :                 idx++;
     130                 :          0 :                 xstats[idx].id = idx;
     131                 :          0 :                 xstats[idx].value = qstats.rx_octs;
     132                 :          0 :                 idx++;
     133                 :          0 :                 xstats[idx].id = idx;
     134                 :          0 :                 xstats[idx].value = qstats.rx_drop_pkts;
     135                 :          0 :                 idx++;
     136                 :          0 :                 xstats[idx].id = idx;
     137                 :          0 :                 xstats[idx].value = qstats.rx_drop_octs;
     138                 :          0 :                 idx++;
     139                 :          0 :                 xstats[idx].id = idx;
     140                 :          0 :                 xstats[idx].value = qstats.rx_error_pkts;
     141                 :          0 :                 idx++;
     142                 :            :         }
     143         [ #  # ]:          0 :         for (q = 0; q < dev->nb_txq; q++) {
     144                 :            :                 struct roc_nix_stats_queue qstats;
     145                 :            :                 int rc;
     146                 :            : 
     147                 :          0 :                 rc = roc_nix_stats_queue_get(nix, q, 0, &qstats);
     148         [ #  # ]:          0 :                 if (rc)
     149                 :          0 :                         return rc;
     150                 :            : 
     151                 :          0 :                 xstats[idx].id = idx;
     152                 :          0 :                 xstats[idx].value = qstats.tx_pkts;
     153                 :          0 :                 idx++;
     154                 :          0 :                 xstats[idx].id = idx;
     155                 :          0 :                 xstats[idx].value = qstats.tx_octs;
     156                 :          0 :                 idx++;
     157                 :          0 :                 xstats[idx].id = idx;
     158                 :          0 :                 xstats[idx].value = qstats.tx_drop_pkts;
     159                 :          0 :                 idx++;
     160                 :          0 :                 xstats[idx].id = idx;
     161                 :          0 :                 xstats[idx].value = qstats.tx_drop_octs;
     162                 :          0 :                 idx++;
     163                 :            :         }
     164                 :            : 
     165                 :            :         return size;
     166                 :            : }
     167                 :            : 
     168                 :            : int
     169                 :          0 : cnxk_nix_xstats_get_names(struct rte_eth_dev *eth_dev,
     170                 :            :                           struct rte_eth_xstat_name *xstats_names,
     171                 :            :                           unsigned int limit)
     172                 :          0 : {
     173                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
     174                 :          0 :         struct roc_nix_xstat_name roc_xstats_name[limit];
     175                 :          0 :         struct roc_nix *nix = &dev->nix;
     176                 :            :         int roc_size, size, i, q;
     177                 :            : 
     178                 :          0 :         roc_size = roc_nix_xstats_names_get(nix, NULL, 0);
     179                 :            :         /* Per Queue statistics also returned as part of xstats */
     180                 :          0 :         size = roc_size + (dev->nb_rxq * CNXK_NB_RXQ_STATS) +
     181                 :          0 :                (dev->nb_txq * CNXK_NB_TXQ_STATS);
     182                 :            : 
     183         [ #  # ]:          0 :         if (xstats_names == NULL)
     184                 :            :                 return size;
     185                 :            : 
     186         [ #  # ]:          0 :         if ((int)limit < size && xstats_names != NULL)
     187                 :            :                 return size;
     188                 :            : 
     189                 :          0 :         roc_size = roc_nix_xstats_names_get(nix, roc_xstats_name, limit);
     190                 :            : 
     191         [ #  # ]:          0 :         for (i = 0; i < roc_size; i++)
     192                 :          0 :                 rte_strscpy(xstats_names[i].name, roc_xstats_name[i].name,
     193                 :            :                             sizeof(xstats_names[i].name));
     194                 :            : 
     195         [ #  # ]:          0 :         for (q = 0; q < dev->nb_rxq; q++) {
     196                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     197                 :            :                          "rxq_%d_pkts", q);
     198                 :          0 :                 i++;
     199                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     200                 :            :                          "rxq_%d_octs", q);
     201                 :          0 :                 i++;
     202                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     203                 :            :                          "rxq_%d_drop_pkts", q);
     204                 :          0 :                 i++;
     205                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     206                 :            :                          "rxq_%d_drop_octs", q);
     207                 :          0 :                 i++;
     208                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     209                 :            :                          "rxq_%d_err_pkts", q);
     210                 :          0 :                 i++;
     211                 :            :         }
     212                 :            : 
     213         [ #  # ]:          0 :         for (q = 0; q < dev->nb_txq; q++) {
     214                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     215                 :            :                          "txq_%d_pkts", q);
     216                 :          0 :                 i++;
     217                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     218                 :            :                          "txq_%d_octs", q);
     219                 :          0 :                 i++;
     220                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     221                 :            :                          "txq_%d_drop_pkts", q);
     222                 :          0 :                 i++;
     223                 :          0 :                 snprintf(xstats_names[i].name, sizeof(xstats_names[i].name),
     224                 :            :                          "txq_%d_drop_octs", q);
     225                 :          0 :                 i++;
     226                 :            :         }
     227                 :            : 
     228                 :            :         return size;
     229                 :            : }
     230                 :            : 
     231                 :            : int
     232                 :          0 : cnxk_nix_xstats_get_names_by_id(struct rte_eth_dev *eth_dev,
     233                 :            :                                 const uint64_t *ids,
     234                 :            :                                 struct rte_eth_xstat_name *xstats_names,
     235                 :            :                                 unsigned int limit)
     236                 :          0 : {
     237                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
     238                 :          0 :         uint32_t nix_cnt = roc_nix_xstats_names_get(&dev->nix, NULL, 0);
     239                 :          0 :         uint32_t stat_cnt = nix_cnt + (dev->nb_rxq * CNXK_NB_RXQ_STATS) +
     240                 :          0 :                             (dev->nb_txq * CNXK_NB_TXQ_STATS);
     241                 :          0 :         struct rte_eth_xstat_name xnames[stat_cnt];
     242                 :            :         uint32_t i;
     243                 :            : 
     244         [ #  # ]:          0 :         if (limit < stat_cnt && ids == NULL)
     245                 :          0 :                 return stat_cnt;
     246                 :            : 
     247         [ #  # ]:          0 :         if (limit > stat_cnt)
     248                 :            :                 return -EINVAL;
     249                 :            : 
     250         [ #  # ]:          0 :         if (xstats_names == NULL)
     251                 :            :                 return -ENOMEM;
     252                 :            : 
     253                 :          0 :         cnxk_nix_xstats_get_names(eth_dev, xnames, stat_cnt);
     254                 :            : 
     255         [ #  # ]:          0 :         for (i = 0; i < limit; i++) {
     256         [ #  # ]:          0 :                 if (ids[i] >= stat_cnt)
     257                 :            :                         return -EINVAL;
     258                 :            : 
     259                 :          0 :                 rte_strscpy(xstats_names[i].name, xnames[ids[i]].name,
     260                 :            :                             sizeof(xstats_names[i].name));
     261                 :            :         }
     262                 :            : 
     263                 :          0 :         return limit;
     264                 :            : }
     265                 :            : 
     266                 :            : int
     267                 :          0 : cnxk_nix_xstats_get_by_id(struct rte_eth_dev *eth_dev, const uint64_t *ids,
     268                 :            :                           uint64_t *values, unsigned int n)
     269                 :          0 : {
     270                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
     271                 :          0 :         uint32_t nix_cnt = roc_nix_xstats_names_get(&dev->nix, NULL, 0);
     272                 :          0 :         uint32_t stat_cnt = nix_cnt + (dev->nb_rxq * CNXK_NB_RXQ_STATS) +
     273                 :          0 :                             (dev->nb_txq * CNXK_NB_TXQ_STATS);
     274                 :          0 :         struct rte_eth_xstat xstats[stat_cnt];
     275                 :            :         uint32_t i;
     276                 :            : 
     277         [ #  # ]:          0 :         if (n < stat_cnt && ids == NULL)
     278                 :          0 :                 return stat_cnt;
     279                 :            : 
     280         [ #  # ]:          0 :         if (n > stat_cnt)
     281                 :            :                 return -EINVAL;
     282                 :            : 
     283         [ #  # ]:          0 :         if (values == NULL)
     284                 :            :                 return -ENOMEM;
     285                 :            : 
     286                 :          0 :         cnxk_nix_xstats_get(eth_dev, xstats, stat_cnt);
     287                 :            : 
     288         [ #  # ]:          0 :         for (i = 0; i < n; i++) {
     289         [ #  # ]:          0 :                 if (ids[i] >= stat_cnt)
     290                 :            :                         return -EINVAL;
     291                 :          0 :                 values[i] = xstats[ids[i]].value;
     292                 :            :         }
     293                 :            : 
     294                 :          0 :         return n;
     295                 :            : }
     296                 :            : 
     297                 :            : int
     298                 :          0 : cnxk_nix_xstats_reset(struct rte_eth_dev *eth_dev)
     299                 :            : {
     300                 :            :         struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
     301                 :          0 :         struct roc_nix *nix = &dev->nix;
     302                 :            :         int rc = 0, i;
     303                 :            : 
     304                 :          0 :         rc = roc_nix_stats_reset(nix);
     305         [ #  # ]:          0 :         if (rc)
     306                 :          0 :                 goto exit;
     307                 :            : 
     308                 :            :         /* Reset Rx Queues */
     309         [ #  # ]:          0 :         for (i = 0; i < dev->nb_rxq; i++) {
     310                 :          0 :                 rc = roc_nix_stats_queue_reset(nix, i, 1);
     311         [ #  # ]:          0 :                 if (rc)
     312                 :          0 :                         goto exit;
     313                 :            :         }
     314                 :            : 
     315                 :            :         /* Reset Tx Queues */
     316         [ #  # ]:          0 :         for (i = 0; i < dev->nb_txq; i++) {
     317                 :          0 :                 rc = roc_nix_stats_queue_reset(nix, i, 0);
     318         [ #  # ]:          0 :                 if (rc)
     319                 :          0 :                         goto exit;
     320                 :            :         }
     321                 :            : 
     322                 :            :         /* Reset MAC stats */
     323                 :          0 :         rc = roc_nix_mac_stats_reset(nix);
     324                 :          0 : exit:
     325                 :          0 :         return rc;
     326                 :            : }

Generated by: LCOV version 1.14