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 : : }
|