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