1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2014-2018 Broadcom 3 * All rights reserved. 4 */ 5 6 #include <inttypes.h> 7 8 #include <rte_string_fns.h> 9 #include <rte_byteorder.h> 10 11 #include "bnxt.h" 12 #include "bnxt_cpr.h" 13 #include "bnxt_hwrm.h" 14 #include "bnxt_rxq.h" 15 #include "bnxt_stats.h" 16 #include "bnxt_txq.h" 17 #include "hsi_struct_def_dpdk.h" 18 19 static const struct bnxt_xstats_name_off bnxt_rx_stats_strings[] = { 20 {"rx_64b_frames", offsetof(struct rx_port_stats, 21 rx_64b_frames)}, 22 {"rx_65b_127b_frames", offsetof(struct rx_port_stats, 23 rx_65b_127b_frames)}, 24 {"rx_128b_255b_frames", offsetof(struct rx_port_stats, 25 rx_128b_255b_frames)}, 26 {"rx_256b_511b_frames", offsetof(struct rx_port_stats, 27 rx_256b_511b_frames)}, 28 {"rx_512b_1023b_frames", offsetof(struct rx_port_stats, 29 rx_512b_1023b_frames)}, 30 {"rx_1024b_1518b_frames", offsetof(struct rx_port_stats, 31 rx_1024b_1518b_frames)}, 32 {"rx_good_vlan_frames", offsetof(struct rx_port_stats, 33 rx_good_vlan_frames)}, 34 {"rx_1519b_2047b_frames", offsetof(struct rx_port_stats, 35 rx_1519b_2047b_frames)}, 36 {"rx_2048b_4095b_frames", offsetof(struct rx_port_stats, 37 rx_2048b_4095b_frames)}, 38 {"rx_4096b_9216b_frames", offsetof(struct rx_port_stats, 39 rx_4096b_9216b_frames)}, 40 {"rx_9217b_16383b_frames", offsetof(struct rx_port_stats, 41 rx_9217b_16383b_frames)}, 42 {"rx_total_frames", offsetof(struct rx_port_stats, 43 rx_total_frames)}, 44 {"rx_ucast_frames", offsetof(struct rx_port_stats, 45 rx_ucast_frames)}, 46 {"rx_mcast_frames", offsetof(struct rx_port_stats, 47 rx_mcast_frames)}, 48 {"rx_bcast_frames", offsetof(struct rx_port_stats, 49 rx_bcast_frames)}, 50 {"rx_fcs_err_frames", offsetof(struct rx_port_stats, 51 rx_fcs_err_frames)}, 52 {"rx_ctrl_frames", offsetof(struct rx_port_stats, 53 rx_ctrl_frames)}, 54 {"rx_pause_frames", offsetof(struct rx_port_stats, 55 rx_pause_frames)}, 56 {"rx_pfc_frames", offsetof(struct rx_port_stats, 57 rx_pfc_frames)}, 58 {"rx_align_err_frames", offsetof(struct rx_port_stats, 59 rx_align_err_frames)}, 60 {"rx_ovrsz_frames", offsetof(struct rx_port_stats, 61 rx_ovrsz_frames)}, 62 {"rx_jbr_frames", offsetof(struct rx_port_stats, 63 rx_jbr_frames)}, 64 {"rx_mtu_err_frames", offsetof(struct rx_port_stats, 65 rx_mtu_err_frames)}, 66 {"rx_tagged_frames", offsetof(struct rx_port_stats, 67 rx_tagged_frames)}, 68 {"rx_double_tagged_frames", offsetof(struct rx_port_stats, 69 rx_double_tagged_frames)}, 70 {"rx_good_frames", offsetof(struct rx_port_stats, 71 rx_good_frames)}, 72 {"rx_undrsz_frames", offsetof(struct rx_port_stats, 73 rx_undrsz_frames)}, 74 {"rx_eee_lpi_events", offsetof(struct rx_port_stats, 75 rx_eee_lpi_events)}, 76 {"rx_eee_lpi_duration", offsetof(struct rx_port_stats, 77 rx_eee_lpi_duration)}, 78 {"rx_bytes", offsetof(struct rx_port_stats, 79 rx_bytes)}, 80 {"rx_runt_bytes", offsetof(struct rx_port_stats, 81 rx_runt_bytes)}, 82 {"rx_runt_frames", offsetof(struct rx_port_stats, 83 rx_runt_frames)}, 84 }; 85 86 static const struct bnxt_xstats_name_off bnxt_tx_stats_strings[] = { 87 {"tx_64b_frames", offsetof(struct tx_port_stats, 88 tx_64b_frames)}, 89 {"tx_65b_127b_frames", offsetof(struct tx_port_stats, 90 tx_65b_127b_frames)}, 91 {"tx_128b_255b_frames", offsetof(struct tx_port_stats, 92 tx_128b_255b_frames)}, 93 {"tx_256b_511b_frames", offsetof(struct tx_port_stats, 94 tx_256b_511b_frames)}, 95 {"tx_512b_1023b_frames", offsetof(struct tx_port_stats, 96 tx_512b_1023b_frames)}, 97 {"tx_1024b_1518b_frames", offsetof(struct tx_port_stats, 98 tx_1024b_1518b_frames)}, 99 {"tx_good_vlan_frames", offsetof(struct tx_port_stats, 100 tx_good_vlan_frames)}, 101 {"tx_1519b_2047b_frames", offsetof(struct tx_port_stats, 102 tx_1519b_2047b_frames)}, 103 {"tx_2048b_4095b_frames", offsetof(struct tx_port_stats, 104 tx_2048b_4095b_frames)}, 105 {"tx_4096b_9216b_frames", offsetof(struct tx_port_stats, 106 tx_4096b_9216b_frames)}, 107 {"tx_9217b_16383b_frames", offsetof(struct tx_port_stats, 108 tx_9217b_16383b_frames)}, 109 {"tx_good_frames", offsetof(struct tx_port_stats, 110 tx_good_frames)}, 111 {"tx_total_frames", offsetof(struct tx_port_stats, 112 tx_total_frames)}, 113 {"tx_ucast_frames", offsetof(struct tx_port_stats, 114 tx_ucast_frames)}, 115 {"tx_mcast_frames", offsetof(struct tx_port_stats, 116 tx_mcast_frames)}, 117 {"tx_bcast_frames", offsetof(struct tx_port_stats, 118 tx_bcast_frames)}, 119 {"tx_pause_frames", offsetof(struct tx_port_stats, 120 tx_pause_frames)}, 121 {"tx_pfc_frames", offsetof(struct tx_port_stats, 122 tx_pfc_frames)}, 123 {"tx_jabber_frames", offsetof(struct tx_port_stats, 124 tx_jabber_frames)}, 125 {"tx_fcs_err_frames", offsetof(struct tx_port_stats, 126 tx_fcs_err_frames)}, 127 {"tx_err", offsetof(struct tx_port_stats, 128 tx_err)}, 129 {"tx_fifo_underruns", offsetof(struct tx_port_stats, 130 tx_fifo_underruns)}, 131 {"tx_eee_lpi_events", offsetof(struct tx_port_stats, 132 tx_eee_lpi_events)}, 133 {"tx_eee_lpi_duration", offsetof(struct tx_port_stats, 134 tx_eee_lpi_duration)}, 135 {"tx_total_collisions", offsetof(struct tx_port_stats, 136 tx_total_collisions)}, 137 {"tx_bytes", offsetof(struct tx_port_stats, 138 tx_bytes)}, 139 }; 140 141 static const struct bnxt_xstats_name_off bnxt_func_stats_strings[] = { 142 {"tx_ucast_pkts", offsetof(struct hwrm_func_qstats_output, 143 tx_ucast_pkts)}, 144 {"tx_mcast_pkts", offsetof(struct hwrm_func_qstats_output, 145 tx_mcast_pkts)}, 146 {"tx_bcast_pkts", offsetof(struct hwrm_func_qstats_output, 147 tx_bcast_pkts)}, 148 {"tx_discard_pkts", offsetof(struct hwrm_func_qstats_output, 149 tx_discard_pkts)}, 150 {"tx_drop_pkts", offsetof(struct hwrm_func_qstats_output, 151 tx_drop_pkts)}, 152 {"tx_ucast_bytes", offsetof(struct hwrm_func_qstats_output, 153 tx_ucast_bytes)}, 154 {"tx_mcast_bytes", offsetof(struct hwrm_func_qstats_output, 155 tx_mcast_bytes)}, 156 {"tx_bcast_bytes", offsetof(struct hwrm_func_qstats_output, 157 tx_bcast_bytes)}, 158 {"rx_ucast_pkts", offsetof(struct hwrm_func_qstats_output, 159 rx_ucast_pkts)}, 160 {"rx_mcast_pkts", offsetof(struct hwrm_func_qstats_output, 161 rx_mcast_pkts)}, 162 {"rx_bcast_pkts", offsetof(struct hwrm_func_qstats_output, 163 rx_bcast_pkts)}, 164 {"rx_discard_pkts", offsetof(struct hwrm_func_qstats_output, 165 rx_discard_pkts)}, 166 {"rx_drop_pkts", offsetof(struct hwrm_func_qstats_output, 167 rx_drop_pkts)}, 168 {"rx_ucast_bytes", offsetof(struct hwrm_func_qstats_output, 169 rx_ucast_bytes)}, 170 {"rx_mcast_bytes", offsetof(struct hwrm_func_qstats_output, 171 rx_mcast_bytes)}, 172 {"rx_bcast_bytes", offsetof(struct hwrm_func_qstats_output, 173 rx_bcast_bytes)}, 174 {"rx_agg_pkts", offsetof(struct hwrm_func_qstats_output, 175 rx_agg_pkts)}, 176 {"rx_agg_bytes", offsetof(struct hwrm_func_qstats_output, 177 rx_agg_bytes)}, 178 {"rx_agg_events", offsetof(struct hwrm_func_qstats_output, 179 rx_agg_events)}, 180 {"rx_agg_aborts", offsetof(struct hwrm_func_qstats_output, 181 rx_agg_aborts)}, 182 }; 183 184 static const struct bnxt_xstats_name_off bnxt_rx_ext_stats_strings[] = { 185 {"link_down_events", offsetof(struct rx_port_stats_ext, 186 link_down_events)}, 187 {"continuous_pause_events", offsetof(struct rx_port_stats_ext, 188 continuous_pause_events)}, 189 {"resume_pause_events", offsetof(struct rx_port_stats_ext, 190 resume_pause_events)}, 191 {"continuous_roce_pause_events", offsetof(struct rx_port_stats_ext, 192 continuous_roce_pause_events)}, 193 {"resume_roce_pause_events", offsetof(struct rx_port_stats_ext, 194 resume_roce_pause_events)}, 195 {"rx_bytes_cos0", offsetof(struct rx_port_stats_ext, 196 rx_bytes_cos0)}, 197 {"rx_bytes_cos1", offsetof(struct rx_port_stats_ext, 198 rx_bytes_cos1)}, 199 {"rx_bytes_cos2", offsetof(struct rx_port_stats_ext, 200 rx_bytes_cos2)}, 201 {"rx_bytes_cos3", offsetof(struct rx_port_stats_ext, 202 rx_bytes_cos3)}, 203 {"rx_bytes_cos4", offsetof(struct rx_port_stats_ext, 204 rx_bytes_cos4)}, 205 {"rx_bytes_cos5", offsetof(struct rx_port_stats_ext, 206 rx_bytes_cos5)}, 207 {"rx_bytes_cos6", offsetof(struct rx_port_stats_ext, 208 rx_bytes_cos6)}, 209 {"rx_bytes_cos7", offsetof(struct rx_port_stats_ext, 210 rx_bytes_cos7)}, 211 {"rx_packets_cos0", offsetof(struct rx_port_stats_ext, 212 rx_packets_cos0)}, 213 {"rx_packets_cos1", offsetof(struct rx_port_stats_ext, 214 rx_packets_cos1)}, 215 {"rx_packets_cos2", offsetof(struct rx_port_stats_ext, 216 rx_packets_cos2)}, 217 {"rx_packets_cos3", offsetof(struct rx_port_stats_ext, 218 rx_packets_cos3)}, 219 {"rx_packets_cos4", offsetof(struct rx_port_stats_ext, 220 rx_packets_cos4)}, 221 {"rx_packets_cos5", offsetof(struct rx_port_stats_ext, 222 rx_packets_cos5)}, 223 {"rx_packets_cos6", offsetof(struct rx_port_stats_ext, 224 rx_packets_cos6)}, 225 {"rx_packets_cos7", offsetof(struct rx_port_stats_ext, 226 rx_packets_cos7)}, 227 {"pfc_pri0_rx_duration_us", offsetof(struct rx_port_stats_ext, 228 pfc_pri0_rx_duration_us)}, 229 {"pfc_pri0_rx_transitions", offsetof(struct rx_port_stats_ext, 230 pfc_pri0_rx_transitions)}, 231 {"pfc_pri1_rx_duration_us", offsetof(struct rx_port_stats_ext, 232 pfc_pri1_rx_duration_us)}, 233 {"pfc_pri1_rx_transitions", offsetof(struct rx_port_stats_ext, 234 pfc_pri1_rx_transitions)}, 235 {"pfc_pri2_rx_duration_us", offsetof(struct rx_port_stats_ext, 236 pfc_pri2_rx_duration_us)}, 237 {"pfc_pri2_rx_transitions", offsetof(struct rx_port_stats_ext, 238 pfc_pri2_rx_transitions)}, 239 {"pfc_pri3_rx_duration_us", offsetof(struct rx_port_stats_ext, 240 pfc_pri3_rx_duration_us)}, 241 {"pfc_pri3_rx_transitions", offsetof(struct rx_port_stats_ext, 242 pfc_pri3_rx_transitions)}, 243 {"pfc_pri4_rx_duration_us", offsetof(struct rx_port_stats_ext, 244 pfc_pri4_rx_duration_us)}, 245 {"pfc_pri4_rx_transitions", offsetof(struct rx_port_stats_ext, 246 pfc_pri4_rx_transitions)}, 247 {"pfc_pri5_rx_duration_us", offsetof(struct rx_port_stats_ext, 248 pfc_pri5_rx_duration_us)}, 249 {"pfc_pri5_rx_transitions", offsetof(struct rx_port_stats_ext, 250 pfc_pri5_rx_transitions)}, 251 {"pfc_pri6_rx_duration_us", offsetof(struct rx_port_stats_ext, 252 pfc_pri6_rx_duration_us)}, 253 {"pfc_pri6_rx_transitions", offsetof(struct rx_port_stats_ext, 254 pfc_pri6_rx_transitions)}, 255 {"pfc_pri7_rx_duration_us", offsetof(struct rx_port_stats_ext, 256 pfc_pri7_rx_duration_us)}, 257 {"pfc_pri7_rx_transitions", offsetof(struct rx_port_stats_ext, 258 pfc_pri7_rx_transitions)}, 259 }; 260 261 static const struct bnxt_xstats_name_off bnxt_tx_ext_stats_strings[] = { 262 {"tx_bytes_cos0", offsetof(struct tx_port_stats_ext, 263 tx_bytes_cos0)}, 264 {"tx_bytes_cos1", offsetof(struct tx_port_stats_ext, 265 tx_bytes_cos1)}, 266 {"tx_bytes_cos2", offsetof(struct tx_port_stats_ext, 267 tx_bytes_cos2)}, 268 {"tx_bytes_cos3", offsetof(struct tx_port_stats_ext, 269 tx_bytes_cos3)}, 270 {"tx_bytes_cos4", offsetof(struct tx_port_stats_ext, 271 tx_bytes_cos4)}, 272 {"tx_bytes_cos5", offsetof(struct tx_port_stats_ext, 273 tx_bytes_cos5)}, 274 {"tx_bytes_cos6", offsetof(struct tx_port_stats_ext, 275 tx_bytes_cos6)}, 276 {"tx_bytes_cos7", offsetof(struct tx_port_stats_ext, 277 tx_bytes_cos7)}, 278 {"tx_packets_cos0", offsetof(struct tx_port_stats_ext, 279 tx_packets_cos0)}, 280 {"tx_packets_cos1", offsetof(struct tx_port_stats_ext, 281 tx_packets_cos1)}, 282 {"tx_packets_cos2", offsetof(struct tx_port_stats_ext, 283 tx_packets_cos2)}, 284 {"tx_packets_cos3", offsetof(struct tx_port_stats_ext, 285 tx_packets_cos3)}, 286 {"tx_packets_cos4", offsetof(struct tx_port_stats_ext, 287 tx_packets_cos4)}, 288 {"tx_packets_cos5", offsetof(struct tx_port_stats_ext, 289 tx_packets_cos5)}, 290 {"tx_packets_cos6", offsetof(struct tx_port_stats_ext, 291 tx_packets_cos6)}, 292 {"tx_packets_cos7", offsetof(struct tx_port_stats_ext, 293 tx_packets_cos7)}, 294 {"pfc_pri0_tx_duration_us", offsetof(struct tx_port_stats_ext, 295 pfc_pri0_tx_duration_us)}, 296 {"pfc_pri0_tx_transitions", offsetof(struct tx_port_stats_ext, 297 pfc_pri0_tx_transitions)}, 298 {"pfc_pri1_tx_duration_us", offsetof(struct tx_port_stats_ext, 299 pfc_pri1_tx_duration_us)}, 300 {"pfc_pri1_tx_transitions", offsetof(struct tx_port_stats_ext, 301 pfc_pri1_tx_transitions)}, 302 {"pfc_pri2_tx_duration_us", offsetof(struct tx_port_stats_ext, 303 pfc_pri2_tx_duration_us)}, 304 {"pfc_pri2_tx_transitions", offsetof(struct tx_port_stats_ext, 305 pfc_pri2_tx_transitions)}, 306 {"pfc_pri3_tx_duration_us", offsetof(struct tx_port_stats_ext, 307 pfc_pri3_tx_duration_us)}, 308 {"pfc_pri3_tx_transitions", offsetof(struct tx_port_stats_ext, 309 pfc_pri3_tx_transitions)}, 310 {"pfc_pri4_tx_duration_us", offsetof(struct tx_port_stats_ext, 311 pfc_pri4_tx_duration_us)}, 312 {"pfc_pri4_tx_transitions", offsetof(struct tx_port_stats_ext, 313 pfc_pri4_tx_transitions)}, 314 {"pfc_pri5_tx_duration_us", offsetof(struct tx_port_stats_ext, 315 pfc_pri5_tx_duration_us)}, 316 {"pfc_pri5_tx_transitions", offsetof(struct tx_port_stats_ext, 317 pfc_pri5_tx_transitions)}, 318 {"pfc_pri6_tx_duration_us", offsetof(struct tx_port_stats_ext, 319 pfc_pri6_tx_duration_us)}, 320 {"pfc_pri6_tx_transitions", offsetof(struct tx_port_stats_ext, 321 pfc_pri6_tx_transitions)}, 322 {"pfc_pri7_tx_duration_us", offsetof(struct tx_port_stats_ext, 323 pfc_pri7_tx_duration_us)}, 324 {"pfc_pri7_tx_transitions", offsetof(struct tx_port_stats_ext, 325 pfc_pri7_tx_transitions)}, 326 }; 327 328 /* 329 * Statistics functions 330 */ 331 332 void bnxt_free_stats(struct bnxt *bp) 333 { 334 int i; 335 336 for (i = 0; i < (int)bp->tx_cp_nr_rings; i++) { 337 struct bnxt_tx_queue *txq = bp->tx_queues[i]; 338 339 bnxt_free_txq_stats(txq); 340 } 341 for (i = 0; i < (int)bp->rx_cp_nr_rings; i++) { 342 struct bnxt_rx_queue *rxq = bp->rx_queues[i]; 343 344 bnxt_free_rxq_stats(rxq); 345 } 346 } 347 348 int bnxt_stats_get_op(struct rte_eth_dev *eth_dev, 349 struct rte_eth_stats *bnxt_stats) 350 { 351 int rc = 0; 352 unsigned int i; 353 struct bnxt *bp = eth_dev->data->dev_private; 354 unsigned int num_q_stats; 355 356 memset(bnxt_stats, 0, sizeof(*bnxt_stats)); 357 if (!(bp->flags & BNXT_FLAG_INIT_DONE)) { 358 PMD_DRV_LOG(ERR, "Device Initialization not complete!\n"); 359 return -1; 360 } 361 362 num_q_stats = RTE_MIN(bp->rx_cp_nr_rings, 363 (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS); 364 365 for (i = 0; i < num_q_stats; i++) { 366 struct bnxt_rx_queue *rxq = bp->rx_queues[i]; 367 struct bnxt_cp_ring_info *cpr = rxq->cp_ring; 368 369 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i, 370 bnxt_stats, 1); 371 if (unlikely(rc)) 372 return rc; 373 bnxt_stats->rx_nombuf += 374 rte_atomic64_read(&rxq->rx_mbuf_alloc_fail); 375 } 376 377 num_q_stats = RTE_MIN(bp->tx_cp_nr_rings, 378 (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS); 379 380 for (i = 0; i < num_q_stats; i++) { 381 struct bnxt_tx_queue *txq = bp->tx_queues[i]; 382 struct bnxt_cp_ring_info *cpr = txq->cp_ring; 383 384 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i, 385 bnxt_stats, 0); 386 if (unlikely(rc)) 387 return rc; 388 } 389 rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats); 390 if (unlikely(rc)) 391 return rc; 392 return rc; 393 } 394 395 void bnxt_stats_reset_op(struct rte_eth_dev *eth_dev) 396 { 397 struct bnxt *bp = eth_dev->data->dev_private; 398 unsigned int i; 399 400 if (!(bp->flags & BNXT_FLAG_INIT_DONE)) { 401 PMD_DRV_LOG(ERR, "Device Initialization not complete!\n"); 402 return; 403 } 404 405 bnxt_clear_all_hwrm_stat_ctxs(bp); 406 for (i = 0; i < bp->rx_cp_nr_rings; i++) { 407 struct bnxt_rx_queue *rxq = bp->rx_queues[i]; 408 409 rte_atomic64_clear(&rxq->rx_mbuf_alloc_fail); 410 } 411 } 412 413 int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev, 414 struct rte_eth_xstat *xstats, unsigned int n) 415 { 416 struct bnxt *bp = eth_dev->data->dev_private; 417 418 unsigned int count, i; 419 uint64_t tx_drop_pkts; 420 unsigned int rx_port_stats_ext_cnt; 421 unsigned int tx_port_stats_ext_cnt; 422 unsigned int stat_size = sizeof(uint64_t); 423 unsigned int stat_count; 424 425 memset(xstats, 0, sizeof(*xstats)); 426 427 bnxt_hwrm_port_qstats(bp); 428 bnxt_hwrm_func_qstats_tx_drop(bp, 0xffff, &tx_drop_pkts); 429 bnxt_hwrm_ext_port_qstats(bp); 430 rx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_rx_ext_stats_strings), 431 (bp->fw_rx_port_stats_ext_size / 432 stat_size)); 433 tx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_tx_ext_stats_strings), 434 (bp->fw_tx_port_stats_ext_size / 435 stat_size)); 436 437 count = RTE_DIM(bnxt_rx_stats_strings) + 438 RTE_DIM(bnxt_tx_stats_strings) + 1/* For tx_drop_pkts */ + 439 RTE_DIM(bnxt_rx_ext_stats_strings) + 440 RTE_DIM(bnxt_tx_ext_stats_strings); 441 stat_count = count; 442 443 if (n < count) 444 return count; 445 446 count = 0; 447 for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) { 448 uint64_t *rx_stats = (uint64_t *)bp->hw_rx_port_stats; 449 xstats[count].id = count; 450 xstats[count].value = rte_le_to_cpu_64( 451 *(uint64_t *)((char *)rx_stats + 452 bnxt_rx_stats_strings[i].offset)); 453 count++; 454 } 455 456 for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) { 457 uint64_t *tx_stats = (uint64_t *)bp->hw_tx_port_stats; 458 xstats[count].id = count; 459 xstats[count].value = rte_le_to_cpu_64( 460 *(uint64_t *)((char *)tx_stats + 461 bnxt_tx_stats_strings[i].offset)); 462 count++; 463 } 464 465 /* The Tx drop pkts aka the Anti spoof coounter */ 466 xstats[count].id = count; 467 xstats[count].value = rte_le_to_cpu_64(tx_drop_pkts); 468 count++; 469 470 for (i = 0; i < rx_port_stats_ext_cnt; i++) { 471 uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext; 472 473 xstats[count].value = rte_le_to_cpu_64 474 (*(uint64_t *)((char *)rx_stats_ext + 475 bnxt_rx_ext_stats_strings[i].offset)); 476 477 count++; 478 } 479 480 for (i = 0; i < tx_port_stats_ext_cnt; i++) { 481 uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext; 482 483 xstats[count].value = rte_le_to_cpu_64 484 (*(uint64_t *)((char *)tx_stats_ext + 485 bnxt_tx_ext_stats_strings[i].offset)); 486 487 count++; 488 } 489 490 return stat_count; 491 } 492 493 int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev, 494 struct rte_eth_xstat_name *xstats_names, 495 __rte_unused unsigned int limit) 496 { 497 /* Account for the Tx drop pkts aka the Anti spoof counter */ 498 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) + 499 RTE_DIM(bnxt_tx_stats_strings) + 1 + 500 RTE_DIM(bnxt_rx_ext_stats_strings) + 501 RTE_DIM(bnxt_tx_ext_stats_strings); 502 unsigned int i, count; 503 504 if (xstats_names != NULL) { 505 count = 0; 506 507 for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) { 508 strlcpy(xstats_names[count].name, 509 bnxt_rx_stats_strings[i].name, 510 sizeof(xstats_names[count].name)); 511 count++; 512 } 513 514 for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) { 515 strlcpy(xstats_names[count].name, 516 bnxt_tx_stats_strings[i].name, 517 sizeof(xstats_names[count].name)); 518 count++; 519 } 520 521 strlcpy(xstats_names[count].name, 522 bnxt_func_stats_strings[4].name, 523 sizeof(xstats_names[count].name)); 524 count++; 525 526 for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) { 527 strlcpy(xstats_names[count].name, 528 bnxt_rx_ext_stats_strings[i].name, 529 sizeof(xstats_names[count].name)); 530 531 count++; 532 } 533 534 for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) { 535 strlcpy(xstats_names[count].name, 536 bnxt_tx_ext_stats_strings[i].name, 537 sizeof(xstats_names[count].name)); 538 539 count++; 540 } 541 542 } 543 return stat_cnt; 544 } 545 546 void bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev) 547 { 548 struct bnxt *bp = eth_dev->data->dev_private; 549 550 if (bp->flags & BNXT_FLAG_PORT_STATS && BNXT_SINGLE_PF(bp)) 551 bnxt_hwrm_port_clr_stats(bp); 552 553 if (BNXT_VF(bp)) 554 PMD_DRV_LOG(ERR, "Operation not supported on a VF device\n"); 555 if (!BNXT_SINGLE_PF(bp)) 556 PMD_DRV_LOG(ERR, "Operation not supported on a MF device\n"); 557 if (!(bp->flags & BNXT_FLAG_PORT_STATS)) 558 PMD_DRV_LOG(ERR, "Operation not supported\n"); 559 } 560 561 int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids, 562 uint64_t *values, unsigned int limit) 563 { 564 /* Account for the Tx drop pkts aka the Anti spoof counter */ 565 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) + 566 RTE_DIM(bnxt_tx_stats_strings) + 1 + 567 RTE_DIM(bnxt_rx_ext_stats_strings) + 568 RTE_DIM(bnxt_tx_ext_stats_strings); 569 struct rte_eth_xstat xstats[stat_cnt]; 570 uint64_t values_copy[stat_cnt]; 571 uint16_t i; 572 573 if (!ids) 574 return bnxt_dev_xstats_get_op(dev, xstats, stat_cnt); 575 576 bnxt_dev_xstats_get_by_id_op(dev, NULL, values_copy, stat_cnt); 577 for (i = 0; i < limit; i++) { 578 if (ids[i] >= stat_cnt) { 579 PMD_DRV_LOG(ERR, "id value isn't valid"); 580 return -1; 581 } 582 values[i] = values_copy[ids[i]]; 583 } 584 return stat_cnt; 585 } 586 587 int bnxt_dev_xstats_get_names_by_id_op(struct rte_eth_dev *dev, 588 struct rte_eth_xstat_name *xstats_names, 589 const uint64_t *ids, unsigned int limit) 590 { 591 /* Account for the Tx drop pkts aka the Anti spoof counter */ 592 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) + 593 RTE_DIM(bnxt_tx_stats_strings) + 1 + 594 RTE_DIM(bnxt_rx_ext_stats_strings) + 595 RTE_DIM(bnxt_tx_ext_stats_strings); 596 struct rte_eth_xstat_name xstats_names_copy[stat_cnt]; 597 uint16_t i; 598 599 if (!ids) 600 return bnxt_dev_xstats_get_names_op(dev, xstats_names, 601 stat_cnt); 602 bnxt_dev_xstats_get_names_by_id_op(dev, xstats_names_copy, NULL, 603 stat_cnt); 604 605 for (i = 0; i < limit; i++) { 606 if (ids[i] >= stat_cnt) { 607 PMD_DRV_LOG(ERR, "id value isn't valid"); 608 return -1; 609 } 610 strcpy(xstats_names[i].name, 611 xstats_names_copy[ids[i]].name); 612 } 613 return stat_cnt; 614 } 615