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