4 * Copyright(c) Broadcom Limited.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * * Neither the name of Broadcom Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 #include <rte_byteorder.h>
40 #include "bnxt_hwrm.h"
42 #include "bnxt_stats.h"
44 #include "hsi_struct_def_dpdk.h"
46 static const struct bnxt_xstats_name_off bnxt_rx_stats_strings[] = {
47 {"rx_64b_frames", offsetof(struct rx_port_stats,
49 {"rx_65b_127b_frames", offsetof(struct rx_port_stats,
51 {"rx_128b_255b_frames", offsetof(struct rx_port_stats,
52 rx_128b_255b_frames)},
53 {"rx_256b_511b_frames", offsetof(struct rx_port_stats,
54 rx_256b_511b_frames)},
55 {"rx_512b_1023b_frames", offsetof(struct rx_port_stats,
56 rx_512b_1023b_frames)},
57 {"rx_1024b_1518_frames", offsetof(struct rx_port_stats,
58 rx_1024b_1518_frames)},
59 {"rx_good_vlan_frames", offsetof(struct rx_port_stats,
60 rx_good_vlan_frames)},
61 {"rx_1519b_2047b_frames", offsetof(struct rx_port_stats,
62 rx_1519b_2047b_frames)},
63 {"rx_2048b_4095b_frames", offsetof(struct rx_port_stats,
64 rx_2048b_4095b_frames)},
65 {"rx_4096b_9216b_frames", offsetof(struct rx_port_stats,
66 rx_4096b_9216b_frames)},
67 {"rx_9217b_16383b_frames", offsetof(struct rx_port_stats,
68 rx_9217b_16383b_frames)},
69 {"rx_total_frames", offsetof(struct rx_port_stats,
71 {"rx_ucast_frames", offsetof(struct rx_port_stats,
73 {"rx_mcast_frames", offsetof(struct rx_port_stats,
75 {"rx_bcast_frames", offsetof(struct rx_port_stats,
77 {"rx_fcs_err_frames", offsetof(struct rx_port_stats,
79 {"rx_ctrl_frames", offsetof(struct rx_port_stats,
81 {"rx_pause_frames", offsetof(struct rx_port_stats,
83 {"rx_pfc_frames", offsetof(struct rx_port_stats,
85 {"rx_align_err_frames", offsetof(struct rx_port_stats,
86 rx_align_err_frames)},
87 {"rx_ovrsz_frames", offsetof(struct rx_port_stats,
89 {"rx_jbr_frames", offsetof(struct rx_port_stats,
91 {"rx_mtu_err_frames", offsetof(struct rx_port_stats,
93 {"rx_tagged_frames", offsetof(struct rx_port_stats,
95 {"rx_double_tagged_frames", offsetof(struct rx_port_stats,
96 rx_double_tagged_frames)},
97 {"rx_good_frames", offsetof(struct rx_port_stats,
99 {"rx_undrsz_frames", offsetof(struct rx_port_stats,
101 {"rx_eee_lpi_events", offsetof(struct rx_port_stats,
103 {"rx_eee_lpi_duration", offsetof(struct rx_port_stats,
104 rx_eee_lpi_duration)},
105 {"rx_bytes", offsetof(struct rx_port_stats,
107 {"rx_runt_bytes", offsetof(struct rx_port_stats,
109 {"rx_runt_frames", offsetof(struct rx_port_stats,
113 static const struct bnxt_xstats_name_off bnxt_tx_stats_strings[] = {
114 {"tx_64b_frames", offsetof(struct tx_port_stats,
116 {"tx_65b_127b_frames", offsetof(struct tx_port_stats,
117 tx_65b_127b_frames)},
118 {"tx_128b_255b_frames", offsetof(struct tx_port_stats,
119 tx_128b_255b_frames)},
120 {"tx_256b_511b_frames", offsetof(struct tx_port_stats,
121 tx_256b_511b_frames)},
122 {"tx_512b_1023b_frames", offsetof(struct tx_port_stats,
123 tx_512b_1023b_frames)},
124 {"tx_1024b_1518_frames", offsetof(struct tx_port_stats,
125 tx_1024b_1518_frames)},
126 {"tx_good_vlan_frames", offsetof(struct tx_port_stats,
127 tx_good_vlan_frames)},
128 {"tx_1519b_2047_frames", offsetof(struct tx_port_stats,
129 tx_1519b_2047_frames)},
130 {"tx_2048b_4095b_frames", offsetof(struct tx_port_stats,
131 tx_2048b_4095b_frames)},
132 {"tx_4096b_9216b_frames", offsetof(struct tx_port_stats,
133 tx_4096b_9216b_frames)},
134 {"tx_9217b_16383b_frames", offsetof(struct tx_port_stats,
135 tx_9217b_16383b_frames)},
136 {"tx_good_frames", offsetof(struct tx_port_stats,
138 {"tx_total_frames", offsetof(struct tx_port_stats,
140 {"tx_ucast_frames", offsetof(struct tx_port_stats,
142 {"tx_mcast_frames", offsetof(struct tx_port_stats,
144 {"tx_bcast_frames", offsetof(struct tx_port_stats,
146 {"tx_pause_frames", offsetof(struct tx_port_stats,
148 {"tx_pfc_frames", offsetof(struct tx_port_stats,
150 {"tx_jabber_frames", offsetof(struct tx_port_stats,
152 {"tx_fcs_err_frames", offsetof(struct tx_port_stats,
154 {"tx_err", offsetof(struct tx_port_stats,
156 {"tx_fifo_underruns", offsetof(struct tx_port_stats,
158 {"tx_eee_lpi_events", offsetof(struct tx_port_stats,
160 {"tx_eee_lpi_duration", offsetof(struct tx_port_stats,
161 tx_eee_lpi_duration)},
162 {"tx_total_collisions", offsetof(struct tx_port_stats,
163 tx_total_collisions)},
164 {"tx_bytes", offsetof(struct tx_port_stats,
168 static const struct bnxt_xstats_name_off bnxt_func_stats_strings[] = {
169 {"tx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
171 {"tx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
173 {"tx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
175 {"tx_err_pkts", offsetof(struct hwrm_func_qstats_output,
177 {"tx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
179 {"tx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
181 {"tx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
183 {"tx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
185 {"rx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
187 {"rx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
189 {"rx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
191 {"rx_err_pkts", offsetof(struct hwrm_func_qstats_output,
193 {"rx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
195 {"rx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
197 {"rx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
199 {"rx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
201 {"rx_agg_pkts", offsetof(struct hwrm_func_qstats_output,
203 {"rx_agg_bytes", offsetof(struct hwrm_func_qstats_output,
205 {"rx_agg_events", offsetof(struct hwrm_func_qstats_output,
207 {"rx_agg_aborts", offsetof(struct hwrm_func_qstats_output,
212 * Statistics functions
215 void bnxt_free_stats(struct bnxt *bp)
219 for (i = 0; i < (int)bp->tx_cp_nr_rings; i++) {
220 struct bnxt_tx_queue *txq = bp->tx_queues[i];
222 bnxt_free_txq_stats(txq);
224 for (i = 0; i < (int)bp->rx_cp_nr_rings; i++) {
225 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
227 bnxt_free_rxq_stats(rxq);
231 int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
232 struct rte_eth_stats *bnxt_stats)
236 struct bnxt *bp = eth_dev->data->dev_private;
238 memset(bnxt_stats, 0, sizeof(*bnxt_stats));
239 if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
240 RTE_LOG(ERR, PMD, "Device Initialization not complete!\n");
244 for (i = 0; i < bp->rx_cp_nr_rings; i++) {
245 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
246 struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
248 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
254 for (i = 0; i < bp->tx_cp_nr_rings; i++) {
255 struct bnxt_tx_queue *txq = bp->tx_queues[i];
256 struct bnxt_cp_ring_info *cpr = txq->cp_ring;
258 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
263 rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats);
266 bnxt_stats->rx_nombuf = rte_atomic64_read(&bp->rx_mbuf_alloc_fail);
270 void bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
272 struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
274 if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
275 RTE_LOG(ERR, PMD, "Device Initialization not complete!\n");
279 bnxt_clear_all_hwrm_stat_ctxs(bp);
280 rte_atomic64_clear(&bp->rx_mbuf_alloc_fail);
283 int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
284 struct rte_eth_xstat *xstats, unsigned int n)
286 struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
288 unsigned int count, i;
289 uint64_t tx_drop_pkts;
291 if (!(bp->flags & BNXT_FLAG_PORT_STATS)) {
292 RTE_LOG(ERR, PMD, "xstats not supported for VF\n");
296 bnxt_hwrm_port_qstats(bp);
297 bnxt_hwrm_func_qstats_tx_drop(bp, 0xffff, &tx_drop_pkts);
299 count = RTE_DIM(bnxt_rx_stats_strings) +
300 RTE_DIM(bnxt_tx_stats_strings) + 1; /* For tx_drop_pkts */
306 for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
307 uint64_t *rx_stats = (uint64_t *)bp->hw_rx_port_stats;
308 xstats[count].value = rte_le_to_cpu_64(
309 *(uint64_t *)((char *)rx_stats +
310 bnxt_rx_stats_strings[i].offset));
314 for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
315 uint64_t *tx_stats = (uint64_t *)bp->hw_tx_port_stats;
316 xstats[count].value = rte_le_to_cpu_64(
317 *(uint64_t *)((char *)tx_stats +
318 bnxt_tx_stats_strings[i].offset));
322 /* The Tx drop pkts aka the Anti spoof coounter */
323 xstats[count].value = rte_le_to_cpu_64(tx_drop_pkts);
329 int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev,
330 struct rte_eth_xstat_name *xstats_names,
331 __rte_unused unsigned int limit)
333 /* Account for the Tx drop pkts aka the Anti spoof counter */
334 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
335 RTE_DIM(bnxt_tx_stats_strings) + 1;
336 unsigned int i, count;
338 if (xstats_names != NULL) {
341 for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
342 snprintf(xstats_names[count].name,
343 sizeof(xstats_names[count].name),
345 bnxt_rx_stats_strings[i].name);
349 for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
350 snprintf(xstats_names[count].name,
351 sizeof(xstats_names[count].name),
353 bnxt_tx_stats_strings[i].name);
357 snprintf(xstats_names[count].name,
358 sizeof(xstats_names[count].name),
360 bnxt_func_stats_strings[4].name);
366 void bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
368 struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
370 if (bp->flags & BNXT_FLAG_PORT_STATS && BNXT_SINGLE_PF(bp))
371 bnxt_hwrm_port_clr_stats(bp);
374 RTE_LOG(ERR, PMD, "Operation not supported on a VF device\n");
375 if (!BNXT_SINGLE_PF(bp))
376 RTE_LOG(ERR, PMD, "Operation not supported on a MF device\n");
377 if (!(bp->flags & BNXT_FLAG_PORT_STATS))
378 RTE_LOG(ERR, PMD, "Operation not supported\n");
381 int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids,
382 uint64_t *values, unsigned int limit)
384 /* Account for the Tx drop pkts aka the Anti spoof counter */
385 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
386 RTE_DIM(bnxt_tx_stats_strings) + 1;
387 struct rte_eth_xstat xstats[stat_cnt];
388 uint64_t values_copy[stat_cnt];
392 return bnxt_dev_xstats_get_op(dev, xstats, stat_cnt);
394 bnxt_dev_xstats_get_by_id_op(dev, NULL, values_copy, stat_cnt);
395 for (i = 0; i < limit; i++) {
396 if (ids[i] >= stat_cnt) {
397 RTE_LOG(ERR, PMD, "id value isn't valid");
400 values[i] = values_copy[ids[i]];
405 int bnxt_dev_xstats_get_names_by_id_op(struct rte_eth_dev *dev,
406 struct rte_eth_xstat_name *xstats_names,
407 const uint64_t *ids, unsigned int limit)
409 /* Account for the Tx drop pkts aka the Anti spoof counter */
410 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
411 RTE_DIM(bnxt_tx_stats_strings) + 1;
412 struct rte_eth_xstat_name xstats_names_copy[stat_cnt];
416 return bnxt_dev_xstats_get_names_op(dev, xstats_names,
418 bnxt_dev_xstats_get_names_by_id_op(dev, xstats_names_copy, NULL,
421 for (i = 0; i < limit; i++) {
422 if (ids[i] >= stat_cnt) {
423 RTE_LOG(ERR, PMD, "id value isn't valid");
426 strcpy(xstats_names[i].name,
427 xstats_names_copy[ids[i]].name);