11a0accadSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 21a0accadSBruce Richardson * Copyright(c) 2010-2017 Intel Corporation 31a0accadSBruce Richardson */ 41a0accadSBruce Richardson 51a0accadSBruce Richardson #include <stdio.h> 61a0accadSBruce Richardson #include <string.h> 71a0accadSBruce Richardson #include <stdint.h> 8026a546aSHemant Agrawal #include <stdbool.h> 91a0accadSBruce Richardson #include <errno.h> 101a0accadSBruce Richardson #include <stdarg.h> 111a0accadSBruce Richardson #include <inttypes.h> 121a0accadSBruce Richardson #include <sys/queue.h> 131a0accadSBruce Richardson #include <stdlib.h> 141a0accadSBruce Richardson #include <getopt.h> 151a0accadSBruce Richardson #include <unistd.h> 161dd6cffbSStephen Hemminger #include <strings.h> 171a0accadSBruce Richardson 181a0accadSBruce Richardson #include <rte_eal.h> 191a0accadSBruce Richardson #include <rte_common.h> 201a0accadSBruce Richardson #include <rte_debug.h> 211a0accadSBruce Richardson #include <rte_ethdev.h> 22c33717c6SGagandeep Singh #include <rte_malloc.h> 231a0accadSBruce Richardson #include <rte_memory.h> 241a0accadSBruce Richardson #include <rte_memzone.h> 251a0accadSBruce Richardson #include <rte_launch.h> 261a0accadSBruce Richardson #include <rte_tailq.h> 271a0accadSBruce Richardson #include <rte_per_lcore.h> 281a0accadSBruce Richardson #include <rte_lcore.h> 291a0accadSBruce Richardson #include <rte_log.h> 301a0accadSBruce Richardson #include <rte_branch_prediction.h> 311a0accadSBruce Richardson #include <rte_string_fns.h> 32bb9be9a4SDavid Marchand #ifdef RTE_LIB_METRICS 331a0accadSBruce Richardson #include <rte_metrics.h> 34bb9be9a4SDavid Marchand #endif 358a37f37fSVipin Varghese #include <rte_cycles.h> 36a8d0d473SBruce Richardson #ifdef RTE_LIB_SECURITY 378a37f37fSVipin Varghese #include <rte_security.h> 38b0b9116fSHemant Agrawal #endif 398a37f37fSVipin Varghese #include <rte_cryptodev.h> 40dbc72300SVipin Varghese #include <rte_tm.h> 413056d22aSVipin Varghese #include <rte_hexdump.h> 424778a8ecSMin Hu (Connor) #include <rte_version.h> 43674bb390SAbdullah Sevincer #include <rte_eventdev.h> 441a0accadSBruce Richardson 451a0accadSBruce Richardson /* Maximum long option length for option parsing. */ 461a0accadSBruce Richardson #define MAX_LONG_OPT_SZ 64 471a0accadSBruce Richardson #define MAX_STRING_LEN 256 481a0accadSBruce Richardson 4937ebf5abSDongdong Liu #define ETHDEV_FWVERS_LEN 32 500cc5126cSMin Hu (Connor) #define RTE_RETA_CONF_GROUP_NUM 32 510cc5126cSMin Hu (Connor) #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) 520084463eSMin Hu (Connor) #define EEPROM_DUMP_CHUNKSIZE 1024 5337ebf5abSDongdong Liu 548a37f37fSVipin Varghese #define STATS_BDR_FMT "========================================" 558a37f37fSVipin Varghese #define STATS_BDR_STR(w, s) printf("%.*s%s%.*s\n", w, \ 568a37f37fSVipin Varghese STATS_BDR_FMT, s, w, STATS_BDR_FMT) 578a37f37fSVipin Varghese 58797f2f51SDongdong Liu /* mask of enabled ports */ 591dd6cffbSStephen Hemminger static unsigned long enabled_port_mask; 60797f2f51SDongdong Liu /* Enable stats. */ 611a0accadSBruce Richardson static uint32_t enable_stats; 62797f2f51SDongdong Liu /* Enable xstats. */ 631a0accadSBruce Richardson static uint32_t enable_xstats; 64797f2f51SDongdong Liu /* Enable collectd format */ 651a0accadSBruce Richardson static uint32_t enable_collectd_format; 66797f2f51SDongdong Liu /* FD to send collectd format messages to STDOUT */ 671a0accadSBruce Richardson static int stdout_fd; 68797f2f51SDongdong Liu /* Host id process is running on */ 691a0accadSBruce Richardson static char host_id[MAX_LONG_OPT_SZ]; 70bb9be9a4SDavid Marchand #ifdef RTE_LIB_METRICS 71797f2f51SDongdong Liu /* Enable metrics. */ 721a0accadSBruce Richardson static uint32_t enable_metrics; 73bb9be9a4SDavid Marchand #endif 74797f2f51SDongdong Liu /* Enable stats reset. */ 751a0accadSBruce Richardson static uint32_t reset_stats; 76797f2f51SDongdong Liu /* Enable xstats reset. */ 771a0accadSBruce Richardson static uint32_t reset_xstats; 78797f2f51SDongdong Liu /* Enable memory info. */ 791a0accadSBruce Richardson static uint32_t mem_info; 80797f2f51SDongdong Liu /* Enable displaying xstat name. */ 811a0accadSBruce Richardson static uint32_t enable_xstats_name; 821a0accadSBruce Richardson static char *xstats_name; 831a0accadSBruce Richardson 84797f2f51SDongdong Liu /* Enable xstats by ids. */ 851a0accadSBruce Richardson #define MAX_NB_XSTATS_IDS 1024 861a0accadSBruce Richardson static uint32_t nb_xstats_ids; 871a0accadSBruce Richardson static uint64_t xstats_ids[MAX_NB_XSTATS_IDS]; 881a0accadSBruce Richardson 898a37f37fSVipin Varghese /* show border */ 908a37f37fSVipin Varghese static char bdr_str[MAX_STRING_LEN]; 918a37f37fSVipin Varghese 92797f2f51SDongdong Liu /* Enable show port. */ 938a37f37fSVipin Varghese static uint32_t enable_shw_port; 94bb947a72SMin Hu (Connor) /* Enable show port private info. */ 95bb947a72SMin Hu (Connor) static uint32_t enable_shw_port_priv; 96797f2f51SDongdong Liu /* Enable show tm. */ 97dbc72300SVipin Varghese static uint32_t enable_shw_tm; 98797f2f51SDongdong Liu /* Enable show crypto. */ 99fe773600SVipin Varghese static uint32_t enable_shw_crypto; 100797f2f51SDongdong Liu /* Enable show ring. */ 101c13e8984SVipin Varghese static uint32_t enable_shw_ring; 102c13e8984SVipin Varghese static char *ring_name; 103797f2f51SDongdong Liu /* Enable show mempool. */ 1040101a0ecSVipin Varghese static uint32_t enable_shw_mempool; 1050101a0ecSVipin Varghese static char *mempool_name; 106797f2f51SDongdong Liu /* Enable iter mempool. */ 1073056d22aSVipin Varghese static uint32_t enable_iter_mempool; 1083056d22aSVipin Varghese static char *mempool_iter_name; 109797f2f51SDongdong Liu /* Enable dump regs. */ 110d3319ef9SChengchang Tang static uint32_t enable_dump_regs; 111d3319ef9SChengchang Tang static char *dump_regs_file_prefix; 1124778a8ecSMin Hu (Connor) /* Enable show DPDK version. */ 1134778a8ecSMin Hu (Connor) static uint32_t enable_shw_version; 11437ebf5abSDongdong Liu /* Enable show ethdev firmware version. */ 11537ebf5abSDongdong Liu static uint32_t enable_shw_fw_version; 1160cc5126cSMin Hu (Connor) /* Enable show RSS reta. */ 1170cc5126cSMin Hu (Connor) static uint32_t enable_shw_rss_reta; 1180084463eSMin Hu (Connor) /* Enable show module eeprom information. */ 1190084463eSMin Hu (Connor) static uint32_t enable_shw_module_eeprom; 1208a37f37fSVipin Varghese 1216ff065b2SDongdong Liu /* Enable dump Rx/Tx descriptor. */ 1226ff065b2SDongdong Liu static uint32_t enable_shw_rx_desc_dump; 1236ff065b2SDongdong Liu static uint32_t enable_shw_tx_desc_dump; 1246ff065b2SDongdong Liu 125674bb390SAbdullah Sevincer /* Note: Port_queue_id in xstats APIs is 8 bits, so we have a maximum of 126674bb390SAbdullah Sevincer * 256 ports and queues for event_Dev 127674bb390SAbdullah Sevincer */ 128674bb390SAbdullah Sevincer #define MAX_PORTS_QUEUES 256 129674bb390SAbdullah Sevincer 130674bb390SAbdullah Sevincer struct eventdev_params { 131674bb390SAbdullah Sevincer uint16_t ports[MAX_PORTS_QUEUES]; 132674bb390SAbdullah Sevincer uint16_t queues[MAX_PORTS_QUEUES]; 133674bb390SAbdullah Sevincer uint16_t num_queues; 134674bb390SAbdullah Sevincer uint16_t num_ports; 135674bb390SAbdullah Sevincer uint8_t shw_all_queues:1, 136674bb390SAbdullah Sevincer shw_all_ports:1, 137674bb390SAbdullah Sevincer dump_xstats:1, 138674bb390SAbdullah Sevincer reset_xstats:1, 139674bb390SAbdullah Sevincer shw_device_xstats:1; 140674bb390SAbdullah Sevincer }; 141674bb390SAbdullah Sevincer 142674bb390SAbdullah Sevincer static struct eventdev_params eventdev_var[RTE_EVENT_MAX_DEVS]; 143674bb390SAbdullah Sevincer 1446ff065b2SDongdong Liu #define DESC_PARAM_NUM 3 1456ff065b2SDongdong Liu 1466ff065b2SDongdong Liu struct desc_param { 1476ff065b2SDongdong Liu uint16_t queue_id; /* A queue identifier on this port. */ 1486ff065b2SDongdong Liu uint16_t offset; /* The offset of the descriptor starting from tail. */ 1496ff065b2SDongdong Liu uint16_t num; /* The number of the descriptors to dump. */ 1506ff065b2SDongdong Liu }; 1516ff065b2SDongdong Liu 1526ff065b2SDongdong Liu static struct desc_param rx_desc_param; 1536ff065b2SDongdong Liu static struct desc_param tx_desc_param; 1546ff065b2SDongdong Liu 15533079eccSJie Hai #define RSS_HASH_KEY_SIZE 64 15633079eccSJie Hai 157797f2f51SDongdong Liu /* display usage */ 1581a0accadSBruce Richardson static void 1591a0accadSBruce Richardson proc_info_usage(const char *prgname) 1601a0accadSBruce Richardson { 1611a0accadSBruce Richardson printf("%s [EAL options] -- -p PORTMASK\n" 1621a0accadSBruce Richardson " -m to display DPDK memory zones, segments and TAILQ information\n" 1631a0accadSBruce Richardson " -p PORTMASK: hexadecimal bitmask of ports to retrieve stats for\n" 1641a0accadSBruce Richardson " --stats: to display port statistics, enabled by default\n" 1651a0accadSBruce Richardson " --xstats: to display extended port statistics, disabled by " 1661a0accadSBruce Richardson "default\n" 167bb9be9a4SDavid Marchand #ifdef RTE_LIB_METRICS 1681a0accadSBruce Richardson " --metrics: to display derived metrics of the ports, disabled by " 1691a0accadSBruce Richardson "default\n" 170bb9be9a4SDavid Marchand #endif 1711a0accadSBruce Richardson " --xstats-name NAME: to display single xstat id by NAME\n" 1721a0accadSBruce Richardson " --xstats-ids IDLIST: to display xstat values by id. " 1731a0accadSBruce Richardson "The argument is comma-separated list of xstat ids to print out.\n" 1741a0accadSBruce Richardson " --stats-reset: to reset port statistics\n" 1751a0accadSBruce Richardson " --xstats-reset: to reset port extended statistics\n" 1761a0accadSBruce Richardson " --collectd-format: to print statistics to STDOUT in expected by collectd format\n" 1778a37f37fSVipin Varghese " --host-id STRING: host id used to identify the system process is running on\n" 178dbc72300SVipin Varghese " --show-port: to display ports information\n" 179bb947a72SMin Hu (Connor) " --show-port-private: to display ports private information\n" 180fe773600SVipin Varghese " --show-tm: to display traffic manager information for ports\n" 181c13e8984SVipin Varghese " --show-crypto: to display crypto information\n" 1820101a0ecSVipin Varghese " --show-ring[=name]: to display ring information\n" 1833056d22aSVipin Varghese " --show-mempool[=name]: to display mempool information\n" 1844778a8ecSMin Hu (Connor) " --version: to display DPDK version\n" 18537ebf5abSDongdong Liu " --firmware-version: to display ethdev firmware version\n" 1860cc5126cSMin Hu (Connor) " --show-rss-reta: to display ports redirection table\n" 1870084463eSMin Hu (Connor) " --show-module-eeprom: to display ports module eeprom information\n" 1886ff065b2SDongdong Liu " --show-rx-descriptor queue_id:offset:num to display ports Rx descriptor information. " 1896ff065b2SDongdong Liu "queue_id: A Rx queue identifier on this port. " 1906ff065b2SDongdong Liu "offset: The offset of the descriptor starting from tail. " 1916ff065b2SDongdong Liu "num: The number of the descriptors to dump.\n" 1926ff065b2SDongdong Liu " --show-tx-descriptor queue_id:offset:num to display ports Tx descriptor information. " 1936ff065b2SDongdong Liu "queue_id: A Tx queue identifier on this port. " 1946ff065b2SDongdong Liu "offset: The offset of the descriptor starting from tail. " 1956ff065b2SDongdong Liu "num: The number of the descriptors to dump.\n" 196d3319ef9SChengchang Tang " --iter-mempool=name: iterate mempool elements to display content\n" 197674bb390SAbdullah Sevincer " --dump-regs=file-prefix: dump registers to file with the file-prefix\n" 198674bb390SAbdullah Sevincer " --show-edev-queue-xstats=queue_num:evdev_id or *:evdev_id to get queue xstats for specified queue or all queues;\n" 199674bb390SAbdullah Sevincer " --show-edev-port-xstats=port_num:evdev_id or *:evdev_id to get queue xstats for specified port or all ports;\n" 200674bb390SAbdullah Sevincer " --edev-dump-xstats=evdev_id to dump all event_dev xstats for specified eventdev device;\n" 201674bb390SAbdullah Sevincer " --edev-reset-xstats=evdev_id to reset event_dev xstats after reading;\n" 202674bb390SAbdullah Sevincer " --show-edev-device-xstats=evdev_id to get event_dev device xstats for specified eventdev device;\n", 2031a0accadSBruce Richardson prgname); 2041a0accadSBruce Richardson } 2051a0accadSBruce Richardson 2061a0accadSBruce Richardson /* 2071a0accadSBruce Richardson * Parse the portmask provided at run time. 2081a0accadSBruce Richardson */ 2091a0accadSBruce Richardson static int 2101a0accadSBruce Richardson parse_portmask(const char *portmask) 2111a0accadSBruce Richardson { 2121a0accadSBruce Richardson char *end = NULL; 2131a0accadSBruce Richardson 2141a0accadSBruce Richardson errno = 0; 2151a0accadSBruce Richardson 2161a0accadSBruce Richardson /* parse hexadecimal string */ 2171dd6cffbSStephen Hemminger enabled_port_mask = strtoul(portmask, &end, 16); 2181dd6cffbSStephen Hemminger if (portmask[0] == '\0' || end == NULL || *end != '\0' || errno != 0) { 2191dd6cffbSStephen Hemminger fprintf(stderr, "Invalid portmask '%s'\n", portmask); 2201a0accadSBruce Richardson return -1; 2211a0accadSBruce Richardson } 2221a0accadSBruce Richardson 2231dd6cffbSStephen Hemminger return 0; 2241a0accadSBruce Richardson } 2251a0accadSBruce Richardson 2261a0accadSBruce Richardson /* 2271a0accadSBruce Richardson * Parse ids value list into array 2281a0accadSBruce Richardson */ 2291a0accadSBruce Richardson static int 2301a0accadSBruce Richardson parse_xstats_ids(char *list, uint64_t *ids, int limit) { 2311a0accadSBruce Richardson int length; 2321a0accadSBruce Richardson char *token; 2331a0accadSBruce Richardson char *ctx = NULL; 2341a0accadSBruce Richardson char *endptr; 2351a0accadSBruce Richardson 2361a0accadSBruce Richardson length = 0; 2371a0accadSBruce Richardson token = strtok_r(list, ",", &ctx); 2381a0accadSBruce Richardson while (token != NULL) { 2391a0accadSBruce Richardson ids[length] = strtoull(token, &endptr, 10); 2401a0accadSBruce Richardson if (*endptr != '\0') 2411a0accadSBruce Richardson return -EINVAL; 2421a0accadSBruce Richardson 2431a0accadSBruce Richardson length++; 2441a0accadSBruce Richardson if (length >= limit) 2451a0accadSBruce Richardson return -E2BIG; 2461a0accadSBruce Richardson 2471a0accadSBruce Richardson token = strtok_r(NULL, ",", &ctx); 2481a0accadSBruce Richardson } 2491a0accadSBruce Richardson 2501a0accadSBruce Richardson return length; 2511a0accadSBruce Richardson } 2521a0accadSBruce Richardson 2531a0accadSBruce Richardson static int 2546ff065b2SDongdong Liu parse_descriptor_param(char *list, struct desc_param *desc) 2556ff065b2SDongdong Liu { 2566ff065b2SDongdong Liu int ret; 2576ff065b2SDongdong Liu 2586ff065b2SDongdong Liu ret = sscanf(list, "%hu:%hu:%hu", &desc->queue_id, &desc->offset, 2596ff065b2SDongdong Liu &desc->num); 2606ff065b2SDongdong Liu if (ret != DESC_PARAM_NUM) 2616ff065b2SDongdong Liu return -EINVAL; 2626ff065b2SDongdong Liu 2636ff065b2SDongdong Liu return 0; 2646ff065b2SDongdong Liu } 2656ff065b2SDongdong Liu 2666ff065b2SDongdong Liu static int 267674bb390SAbdullah Sevincer parse_eventdev_id(const char *str) 268674bb390SAbdullah Sevincer { 269674bb390SAbdullah Sevincer unsigned long evdev_id; 270674bb390SAbdullah Sevincer char *endp; 271674bb390SAbdullah Sevincer 272674bb390SAbdullah Sevincer evdev_id = strtoul(str, &endp, 0); 273674bb390SAbdullah Sevincer 274674bb390SAbdullah Sevincer if (*str == '\0' || *endp != '\0' || evdev_id >= rte_event_dev_count()) { 275674bb390SAbdullah Sevincer fprintf(stderr, "Invalid eventdev id: %s\n", str); 276674bb390SAbdullah Sevincer return -1; 277674bb390SAbdullah Sevincer } 278674bb390SAbdullah Sevincer 279674bb390SAbdullah Sevincer return evdev_id; 280674bb390SAbdullah Sevincer } 281674bb390SAbdullah Sevincer 282674bb390SAbdullah Sevincer static int 283674bb390SAbdullah Sevincer parse_eventdev_dump_xstats_params(const char *list) 284674bb390SAbdullah Sevincer { 285674bb390SAbdullah Sevincer int evdev_id = parse_eventdev_id(list); 286674bb390SAbdullah Sevincer 287674bb390SAbdullah Sevincer if (evdev_id < 0) 288674bb390SAbdullah Sevincer return -EINVAL; 289674bb390SAbdullah Sevincer 290674bb390SAbdullah Sevincer eventdev_var[evdev_id].dump_xstats = 1; 291674bb390SAbdullah Sevincer 292674bb390SAbdullah Sevincer return 0; 293674bb390SAbdullah Sevincer } 294674bb390SAbdullah Sevincer 295674bb390SAbdullah Sevincer static int 296674bb390SAbdullah Sevincer parse_eventdev_reset_xstats_params(const char *list) 297674bb390SAbdullah Sevincer { 298674bb390SAbdullah Sevincer int evdev_id = parse_eventdev_id(list); 299674bb390SAbdullah Sevincer 300674bb390SAbdullah Sevincer if (evdev_id < 0) 301674bb390SAbdullah Sevincer return -EINVAL; 302674bb390SAbdullah Sevincer 303674bb390SAbdullah Sevincer eventdev_var[evdev_id].reset_xstats = 1; 304674bb390SAbdullah Sevincer 305674bb390SAbdullah Sevincer return 0; 306674bb390SAbdullah Sevincer } 307674bb390SAbdullah Sevincer 308674bb390SAbdullah Sevincer static int 309674bb390SAbdullah Sevincer parse_eventdev_device_xstats_params(const char *list) 310674bb390SAbdullah Sevincer { 311674bb390SAbdullah Sevincer int evdev_id = parse_eventdev_id(list); 312674bb390SAbdullah Sevincer 313674bb390SAbdullah Sevincer if (evdev_id < 0) 314674bb390SAbdullah Sevincer return -EINVAL; 315674bb390SAbdullah Sevincer 316674bb390SAbdullah Sevincer eventdev_var[evdev_id].shw_device_xstats = 1; 317674bb390SAbdullah Sevincer 318674bb390SAbdullah Sevincer return 0; 319674bb390SAbdullah Sevincer } 320674bb390SAbdullah Sevincer 321674bb390SAbdullah Sevincer static int 322674bb390SAbdullah Sevincer parse_eventdev_queue_xstats_params(const char *list) 323674bb390SAbdullah Sevincer { 324674bb390SAbdullah Sevincer uint16_t queue_id; 325674bb390SAbdullah Sevincer uint16_t evdev_id; 326674bb390SAbdullah Sevincer 327674bb390SAbdullah Sevincer if (sscanf(list, "*:%hu", &evdev_id) == 1) { 328674bb390SAbdullah Sevincer if (evdev_id >= rte_event_dev_count()) { 329674bb390SAbdullah Sevincer printf("Invalid eventdev id: %hu\n", evdev_id); 330674bb390SAbdullah Sevincer return -EINVAL; 331674bb390SAbdullah Sevincer } 332674bb390SAbdullah Sevincer eventdev_var[evdev_id].shw_all_queues = 1; 333674bb390SAbdullah Sevincer } else if (sscanf(list, "%hu:%hu", &queue_id, &evdev_id) == 2) { 334674bb390SAbdullah Sevincer if (evdev_id >= rte_event_dev_count()) { 335674bb390SAbdullah Sevincer printf("Invalid eventdev id: %hu\n", evdev_id); 336674bb390SAbdullah Sevincer return -EINVAL; 337674bb390SAbdullah Sevincer } 338674bb390SAbdullah Sevincer 339674bb390SAbdullah Sevincer if (queue_id >= MAX_PORTS_QUEUES) { 340674bb390SAbdullah Sevincer printf("Invalid queue_id: %hu\n", queue_id); 341674bb390SAbdullah Sevincer return -EINVAL; 342674bb390SAbdullah Sevincer } 343674bb390SAbdullah Sevincer 344674bb390SAbdullah Sevincer eventdev_var[evdev_id].queues[eventdev_var[evdev_id].num_queues] = queue_id; 345674bb390SAbdullah Sevincer eventdev_var[evdev_id].num_queues++; 346674bb390SAbdullah Sevincer } else { 347674bb390SAbdullah Sevincer return -EINVAL; 348674bb390SAbdullah Sevincer } 349674bb390SAbdullah Sevincer 350674bb390SAbdullah Sevincer return 0; 351674bb390SAbdullah Sevincer } 352674bb390SAbdullah Sevincer 353674bb390SAbdullah Sevincer static int 354674bb390SAbdullah Sevincer parse_eventdev_port_xstats_params(const char *list) 355674bb390SAbdullah Sevincer { 356674bb390SAbdullah Sevincer uint16_t port_id; 357674bb390SAbdullah Sevincer uint16_t evdev_id; 358674bb390SAbdullah Sevincer 359674bb390SAbdullah Sevincer if (sscanf(list, "*:%hu", &evdev_id) == 1) { 360674bb390SAbdullah Sevincer if (evdev_id >= rte_event_dev_count()) { 361674bb390SAbdullah Sevincer printf("Invalid eventdev id: %hu\n", evdev_id); 362674bb390SAbdullah Sevincer return -EINVAL; 363674bb390SAbdullah Sevincer } 364674bb390SAbdullah Sevincer eventdev_var[evdev_id].shw_all_ports = 1; 365674bb390SAbdullah Sevincer } else if (sscanf(list, "%hu:%hu", &port_id, &evdev_id) == 2) { 366674bb390SAbdullah Sevincer if (evdev_id >= rte_event_dev_count()) { 367674bb390SAbdullah Sevincer printf("Invalid eventdev id: %hu\n", evdev_id); 368674bb390SAbdullah Sevincer return -EINVAL; 369674bb390SAbdullah Sevincer } 370674bb390SAbdullah Sevincer 371674bb390SAbdullah Sevincer if (port_id >= MAX_PORTS_QUEUES) { 372674bb390SAbdullah Sevincer printf("Invalid port_id: %hu\n", port_id); 373674bb390SAbdullah Sevincer return -EINVAL; 374674bb390SAbdullah Sevincer } 375674bb390SAbdullah Sevincer 376674bb390SAbdullah Sevincer eventdev_var[evdev_id].ports[eventdev_var[evdev_id].num_ports] = port_id; 377674bb390SAbdullah Sevincer eventdev_var[evdev_id].num_ports++; 378674bb390SAbdullah Sevincer } else { 379674bb390SAbdullah Sevincer return -EINVAL; 380674bb390SAbdullah Sevincer } 381674bb390SAbdullah Sevincer 382674bb390SAbdullah Sevincer return 0; 383674bb390SAbdullah Sevincer } 384674bb390SAbdullah Sevincer 385674bb390SAbdullah Sevincer static int 3861a0accadSBruce Richardson proc_info_preparse_args(int argc, char **argv) 3871a0accadSBruce Richardson { 3881a0accadSBruce Richardson char *prgname = argv[0]; 3891a0accadSBruce Richardson int i; 3901a0accadSBruce Richardson 3911a0accadSBruce Richardson for (i = 0; i < argc; i++) { 3921a0accadSBruce Richardson /* Print stats or xstats to STDOUT in collectd format */ 3931a0accadSBruce Richardson if (!strncmp(argv[i], "--collectd-format", MAX_LONG_OPT_SZ)) { 3941a0accadSBruce Richardson enable_collectd_format = 1; 3951a0accadSBruce Richardson stdout_fd = dup(STDOUT_FILENO); 3961a0accadSBruce Richardson close(STDOUT_FILENO); 3971a0accadSBruce Richardson } 3981a0accadSBruce Richardson if (!strncmp(argv[i], "--host-id", MAX_LONG_OPT_SZ)) { 3991a0accadSBruce Richardson if ((i + 1) == argc) { 4001a0accadSBruce Richardson printf("Invalid host id or not specified\n"); 4011a0accadSBruce Richardson proc_info_usage(prgname); 4021a0accadSBruce Richardson return -1; 4031a0accadSBruce Richardson } 404f9acaf84SBruce Richardson strlcpy(host_id, argv[i + 1], sizeof(host_id)); 4051a0accadSBruce Richardson } 4061a0accadSBruce Richardson } 4071a0accadSBruce Richardson 4081a0accadSBruce Richardson if (!strlen(host_id)) { 4091a0accadSBruce Richardson int err = gethostname(host_id, MAX_LONG_OPT_SZ-1); 4101a0accadSBruce Richardson 4111a0accadSBruce Richardson if (err) 4127edbf7ddSCiara Power strlcpy(host_id, "unknown", sizeof(host_id)); 4131a0accadSBruce Richardson } 4141a0accadSBruce Richardson 4151a0accadSBruce Richardson return 0; 4161a0accadSBruce Richardson } 4171a0accadSBruce Richardson 4181a0accadSBruce Richardson /* Parse the argument given in the command line of the application */ 4191a0accadSBruce Richardson static int 4201a0accadSBruce Richardson proc_info_parse_args(int argc, char **argv) 4211a0accadSBruce Richardson { 4221a0accadSBruce Richardson int opt; 4231a0accadSBruce Richardson int option_index; 4241a0accadSBruce Richardson char *prgname = argv[0]; 4251a0accadSBruce Richardson static struct option long_option[] = { 4261a0accadSBruce Richardson {"stats", 0, NULL, 0}, 4271a0accadSBruce Richardson {"stats-reset", 0, NULL, 0}, 4281a0accadSBruce Richardson {"xstats", 0, NULL, 0}, 429bb9be9a4SDavid Marchand #ifdef RTE_LIB_METRICS 4301a0accadSBruce Richardson {"metrics", 0, NULL, 0}, 431bb9be9a4SDavid Marchand #endif 4321a0accadSBruce Richardson {"xstats-reset", 0, NULL, 0}, 4331a0accadSBruce Richardson {"xstats-name", required_argument, NULL, 1}, 4341a0accadSBruce Richardson {"collectd-format", 0, NULL, 0}, 4351a0accadSBruce Richardson {"xstats-ids", 1, NULL, 1}, 4361a0accadSBruce Richardson {"host-id", 0, NULL, 0}, 4378a37f37fSVipin Varghese {"show-port", 0, NULL, 0}, 438bb947a72SMin Hu (Connor) {"show-port-private", 0, NULL, 0}, 439dbc72300SVipin Varghese {"show-tm", 0, NULL, 0}, 440fe773600SVipin Varghese {"show-crypto", 0, NULL, 0}, 441c13e8984SVipin Varghese {"show-ring", optional_argument, NULL, 0}, 4420101a0ecSVipin Varghese {"show-mempool", optional_argument, NULL, 0}, 4433056d22aSVipin Varghese {"iter-mempool", required_argument, NULL, 0}, 444d3319ef9SChengchang Tang {"dump-regs", required_argument, NULL, 0}, 4454778a8ecSMin Hu (Connor) {"version", 0, NULL, 0}, 44637ebf5abSDongdong Liu {"firmware-version", 0, NULL, 0}, 4470cc5126cSMin Hu (Connor) {"show-rss-reta", 0, NULL, 0}, 4480084463eSMin Hu (Connor) {"show-module-eeprom", 0, NULL, 0}, 4496ff065b2SDongdong Liu {"show-rx-descriptor", required_argument, NULL, 1}, 4506ff065b2SDongdong Liu {"show-tx-descriptor", required_argument, NULL, 1}, 451674bb390SAbdullah Sevincer {"show-edev-queue-xstats", required_argument, NULL, 0}, 452674bb390SAbdullah Sevincer {"show-edev-port-xstats", required_argument, NULL, 0}, 453674bb390SAbdullah Sevincer {"edev-dump-xstats", required_argument, NULL, 0}, 454674bb390SAbdullah Sevincer {"edev-reset-xstats", required_argument, NULL, 0}, 455674bb390SAbdullah Sevincer {"show-edev-device-xstats", required_argument, NULL, 0}, 4561a0accadSBruce Richardson {NULL, 0, 0, 0} 4571a0accadSBruce Richardson }; 4581a0accadSBruce Richardson 4591a0accadSBruce Richardson if (argc == 1) 4601a0accadSBruce Richardson proc_info_usage(prgname); 4611a0accadSBruce Richardson 4621a0accadSBruce Richardson /* Parse command line */ 4631a0accadSBruce Richardson while ((opt = getopt_long(argc, argv, "p:m", 4641a0accadSBruce Richardson long_option, &option_index)) != EOF) { 4651a0accadSBruce Richardson switch (opt) { 4661a0accadSBruce Richardson /* portmask */ 4671a0accadSBruce Richardson case 'p': 4681dd6cffbSStephen Hemminger if (parse_portmask(optarg) < 0) { 4691a0accadSBruce Richardson proc_info_usage(prgname); 4701a0accadSBruce Richardson return -1; 4711a0accadSBruce Richardson } 4721a0accadSBruce Richardson break; 4731a0accadSBruce Richardson case 'm': 4741a0accadSBruce Richardson mem_info = 1; 4751a0accadSBruce Richardson break; 4761a0accadSBruce Richardson case 0: 4771a0accadSBruce Richardson /* Print stats */ 4781a0accadSBruce Richardson if (!strncmp(long_option[option_index].name, "stats", 4791a0accadSBruce Richardson MAX_LONG_OPT_SZ)) 4801a0accadSBruce Richardson enable_stats = 1; 4811a0accadSBruce Richardson /* Print xstats */ 4821a0accadSBruce Richardson else if (!strncmp(long_option[option_index].name, "xstats", 4831a0accadSBruce Richardson MAX_LONG_OPT_SZ)) 4841a0accadSBruce Richardson enable_xstats = 1; 485bb9be9a4SDavid Marchand #ifdef RTE_LIB_METRICS 4861a0accadSBruce Richardson else if (!strncmp(long_option[option_index].name, 4871a0accadSBruce Richardson "metrics", 4881a0accadSBruce Richardson MAX_LONG_OPT_SZ)) 4891a0accadSBruce Richardson enable_metrics = 1; 490bb9be9a4SDavid Marchand #endif 4911a0accadSBruce Richardson /* Reset stats */ 4921a0accadSBruce Richardson if (!strncmp(long_option[option_index].name, "stats-reset", 4931a0accadSBruce Richardson MAX_LONG_OPT_SZ)) 4941a0accadSBruce Richardson reset_stats = 1; 4951a0accadSBruce Richardson /* Reset xstats */ 4961a0accadSBruce Richardson else if (!strncmp(long_option[option_index].name, "xstats-reset", 4971a0accadSBruce Richardson MAX_LONG_OPT_SZ)) 4981a0accadSBruce Richardson reset_xstats = 1; 4998a37f37fSVipin Varghese else if (!strncmp(long_option[option_index].name, 5008a37f37fSVipin Varghese "show-port", MAX_LONG_OPT_SZ)) 5018a37f37fSVipin Varghese enable_shw_port = 1; 502dbc72300SVipin Varghese else if (!strncmp(long_option[option_index].name, 503bb947a72SMin Hu (Connor) "show-port-private", MAX_LONG_OPT_SZ)) 504bb947a72SMin Hu (Connor) enable_shw_port_priv = 1; 505bb947a72SMin Hu (Connor) else if (!strncmp(long_option[option_index].name, 506dbc72300SVipin Varghese "show-tm", MAX_LONG_OPT_SZ)) 507dbc72300SVipin Varghese enable_shw_tm = 1; 508fe773600SVipin Varghese else if (!strncmp(long_option[option_index].name, 509fe773600SVipin Varghese "show-crypto", MAX_LONG_OPT_SZ)) 510fe773600SVipin Varghese enable_shw_crypto = 1; 511c13e8984SVipin Varghese else if (!strncmp(long_option[option_index].name, 512c13e8984SVipin Varghese "show-ring", MAX_LONG_OPT_SZ)) { 513c13e8984SVipin Varghese enable_shw_ring = 1; 514c13e8984SVipin Varghese ring_name = optarg; 5150101a0ecSVipin Varghese } else if (!strncmp(long_option[option_index].name, 5160101a0ecSVipin Varghese "show-mempool", MAX_LONG_OPT_SZ)) { 5170101a0ecSVipin Varghese enable_shw_mempool = 1; 5180101a0ecSVipin Varghese mempool_name = optarg; 5193056d22aSVipin Varghese } else if (!strncmp(long_option[option_index].name, 5203056d22aSVipin Varghese "iter-mempool", MAX_LONG_OPT_SZ)) { 5213056d22aSVipin Varghese enable_iter_mempool = 1; 5223056d22aSVipin Varghese mempool_iter_name = optarg; 523d3319ef9SChengchang Tang } else if (!strncmp(long_option[option_index].name, 524d3319ef9SChengchang Tang "dump-regs", MAX_LONG_OPT_SZ)) { 525d3319ef9SChengchang Tang enable_dump_regs = 1; 526d3319ef9SChengchang Tang dump_regs_file_prefix = optarg; 5274778a8ecSMin Hu (Connor) } else if (!strncmp(long_option[option_index].name, 5284778a8ecSMin Hu (Connor) "version", MAX_LONG_OPT_SZ)) 5294778a8ecSMin Hu (Connor) enable_shw_version = 1; 53037ebf5abSDongdong Liu else if (!strncmp(long_option[option_index].name, 53137ebf5abSDongdong Liu "firmware-version", MAX_LONG_OPT_SZ)) 53237ebf5abSDongdong Liu enable_shw_fw_version = 1; 5330cc5126cSMin Hu (Connor) else if (!strncmp(long_option[option_index].name, 5340cc5126cSMin Hu (Connor) "show-rss-reta", MAX_LONG_OPT_SZ)) 5350cc5126cSMin Hu (Connor) enable_shw_rss_reta = 1; 5360084463eSMin Hu (Connor) else if (!strncmp(long_option[option_index].name, 5370084463eSMin Hu (Connor) "show-module-eeprom", MAX_LONG_OPT_SZ)) 5380084463eSMin Hu (Connor) enable_shw_module_eeprom = 1; 539674bb390SAbdullah Sevincer else if (!strncmp(long_option[option_index].name, 540674bb390SAbdullah Sevincer "edev-dump-xstats", MAX_LONG_OPT_SZ)) { 541674bb390SAbdullah Sevincer int ret = parse_eventdev_dump_xstats_params(optarg); 542674bb390SAbdullah Sevincer if (ret < 0) { 543674bb390SAbdullah Sevincer fprintf(stderr, "Error parsing eventdev dump xstats params: %s\n", 544674bb390SAbdullah Sevincer strerror(-ret)); 545674bb390SAbdullah Sevincer return -1; 546674bb390SAbdullah Sevincer } 547674bb390SAbdullah Sevincer } else if (!strncmp(long_option[option_index].name, 548674bb390SAbdullah Sevincer "edev-reset-xstats", MAX_LONG_OPT_SZ)) { 549674bb390SAbdullah Sevincer int ret = parse_eventdev_reset_xstats_params(optarg); 550674bb390SAbdullah Sevincer if (ret < 0) { 551674bb390SAbdullah Sevincer fprintf(stderr, "Error parsing eventdev reset xstats params: %s\n", 552674bb390SAbdullah Sevincer strerror(-ret)); 553674bb390SAbdullah Sevincer return -1; 554674bb390SAbdullah Sevincer } 555674bb390SAbdullah Sevincer } else if (!strncmp(long_option[option_index].name, 556674bb390SAbdullah Sevincer "show-edev-device-xstats", MAX_LONG_OPT_SZ)) { 557674bb390SAbdullah Sevincer int ret = parse_eventdev_device_xstats_params(optarg); 558674bb390SAbdullah Sevincer if (ret < 0) { 559674bb390SAbdullah Sevincer fprintf(stderr, "Error parsing eventdev reset xstats params: %s\n", 560674bb390SAbdullah Sevincer strerror(-ret)); 561674bb390SAbdullah Sevincer return -1; 562674bb390SAbdullah Sevincer } 563674bb390SAbdullah Sevincer } else if (!strncmp(long_option[option_index].name, 564674bb390SAbdullah Sevincer "show-edev-queue-xstats", MAX_LONG_OPT_SZ)) { 565674bb390SAbdullah Sevincer int ret = parse_eventdev_queue_xstats_params(optarg); 566674bb390SAbdullah Sevincer if (ret < 0) { 567674bb390SAbdullah Sevincer fprintf(stderr, "Error parsing eventdev queue xstats params: %s\n", 568674bb390SAbdullah Sevincer strerror(-ret)); 569674bb390SAbdullah Sevincer return -1; 570674bb390SAbdullah Sevincer } 571674bb390SAbdullah Sevincer } else if (!strncmp(long_option[option_index].name, 572674bb390SAbdullah Sevincer "show-edev-port-xstats", MAX_LONG_OPT_SZ)) { 573674bb390SAbdullah Sevincer int ret = parse_eventdev_port_xstats_params(optarg); 574674bb390SAbdullah Sevincer if (ret < 0) { 575674bb390SAbdullah Sevincer fprintf(stderr, "Error parsing eventdev port xstats params: %s\n", 576674bb390SAbdullah Sevincer strerror(-ret)); 577674bb390SAbdullah Sevincer return -1; 578674bb390SAbdullah Sevincer } 579674bb390SAbdullah Sevincer } 5801a0accadSBruce Richardson break; 5811a0accadSBruce Richardson case 1: 5821a0accadSBruce Richardson /* Print xstat single value given by name*/ 5831a0accadSBruce Richardson if (!strncmp(long_option[option_index].name, 5841a0accadSBruce Richardson "xstats-name", MAX_LONG_OPT_SZ)) { 5851a0accadSBruce Richardson enable_xstats_name = 1; 5861a0accadSBruce Richardson xstats_name = optarg; 5871a0accadSBruce Richardson printf("name:%s:%s\n", 5881a0accadSBruce Richardson long_option[option_index].name, 5891a0accadSBruce Richardson optarg); 5901a0accadSBruce Richardson } else if (!strncmp(long_option[option_index].name, 5911a0accadSBruce Richardson "xstats-ids", 5921a0accadSBruce Richardson MAX_LONG_OPT_SZ)) { 59359b981c6SFerruh Yigit int ret = parse_xstats_ids(optarg, 5941a0accadSBruce Richardson xstats_ids, MAX_NB_XSTATS_IDS); 59559b981c6SFerruh Yigit if (ret <= 0) { 5961a0accadSBruce Richardson printf("xstats-id list parse error.\n"); 5971a0accadSBruce Richardson return -1; 5981a0accadSBruce Richardson } 59959b981c6SFerruh Yigit nb_xstats_ids = ret; 6006ff065b2SDongdong Liu } else if (!strncmp(long_option[option_index].name, 6016ff065b2SDongdong Liu "show-rx-descriptor", MAX_LONG_OPT_SZ)) { 6026ff065b2SDongdong Liu int ret = parse_descriptor_param(optarg, 6036ff065b2SDongdong Liu &rx_desc_param); 6046ff065b2SDongdong Liu if (ret < 0) { 6056ff065b2SDongdong Liu fprintf(stderr, "Error parsing Rx descriptor param: %s\n", 6066ff065b2SDongdong Liu strerror(-ret)); 6076ff065b2SDongdong Liu return -1; 6086ff065b2SDongdong Liu } 6096ff065b2SDongdong Liu enable_shw_rx_desc_dump = 1; 6106ff065b2SDongdong Liu } else if (!strncmp(long_option[option_index].name, 6116ff065b2SDongdong Liu "show-tx-descriptor", MAX_LONG_OPT_SZ)) { 6126ff065b2SDongdong Liu int ret = parse_descriptor_param(optarg, 6136ff065b2SDongdong Liu &tx_desc_param); 6146ff065b2SDongdong Liu if (ret < 0) { 6156ff065b2SDongdong Liu fprintf(stderr, "Error parsing Tx descriptor param: %s\n", 6166ff065b2SDongdong Liu strerror(-ret)); 6176ff065b2SDongdong Liu return -1; 6186ff065b2SDongdong Liu } 6196ff065b2SDongdong Liu enable_shw_tx_desc_dump = 1; 6201a0accadSBruce Richardson } 6211a0accadSBruce Richardson break; 6221a0accadSBruce Richardson default: 6231a0accadSBruce Richardson proc_info_usage(prgname); 6241a0accadSBruce Richardson return -1; 6251a0accadSBruce Richardson } 6261a0accadSBruce Richardson } 6271a0accadSBruce Richardson return 0; 6281a0accadSBruce Richardson } 6291a0accadSBruce Richardson 6301a0accadSBruce Richardson static void 6311a0accadSBruce Richardson meminfo_display(void) 6321a0accadSBruce Richardson { 6331a0accadSBruce Richardson printf("----------- MEMORY_SEGMENTS -----------\n"); 6341a0accadSBruce Richardson rte_dump_physmem_layout(stdout); 6351a0accadSBruce Richardson printf("--------- END_MEMORY_SEGMENTS ---------\n"); 6361a0accadSBruce Richardson 6371a0accadSBruce Richardson printf("------------ MEMORY_ZONES -------------\n"); 6381a0accadSBruce Richardson rte_memzone_dump(stdout); 6391a0accadSBruce Richardson printf("---------- END_MEMORY_ZONES -----------\n"); 6401a0accadSBruce Richardson 641c33717c6SGagandeep Singh printf("---------- MALLOC_HEAP_DUMP -----------\n"); 642c33717c6SGagandeep Singh rte_malloc_dump_heaps(stdout); 643c33717c6SGagandeep Singh printf("-------- END_MALLOC_HEAP_DUMP ---------\n"); 644c33717c6SGagandeep Singh 6451a0accadSBruce Richardson printf("------------- TAIL_QUEUES -------------\n"); 6461a0accadSBruce Richardson rte_dump_tailq(stdout); 6471a0accadSBruce Richardson printf("---------- END_TAIL_QUEUES ------------\n"); 6481a0accadSBruce Richardson } 6491a0accadSBruce Richardson 6501a0accadSBruce Richardson static void 6511a0accadSBruce Richardson nic_stats_display(uint16_t port_id) 6521a0accadSBruce Richardson { 6531a0accadSBruce Richardson struct rte_eth_stats stats; 6541a0accadSBruce Richardson uint8_t i; 6551a0accadSBruce Richardson 6561a0accadSBruce Richardson static const char *nic_stats_border = "########################"; 6571a0accadSBruce Richardson 6581a0accadSBruce Richardson rte_eth_stats_get(port_id, &stats); 6591a0accadSBruce Richardson printf("\n %s NIC statistics for port %-2d %s\n", 6601a0accadSBruce Richardson nic_stats_border, port_id, nic_stats_border); 6611a0accadSBruce Richardson 6621a0accadSBruce Richardson printf(" RX-packets: %-10"PRIu64" RX-errors: %-10"PRIu64 6631a0accadSBruce Richardson " RX-bytes: %-10"PRIu64"\n", stats.ipackets, stats.ierrors, 6641a0accadSBruce Richardson stats.ibytes); 6651a0accadSBruce Richardson printf(" RX-nombuf: %-10"PRIu64"\n", stats.rx_nombuf); 6661a0accadSBruce Richardson printf(" TX-packets: %-10"PRIu64" TX-errors: %-10"PRIu64 6671a0accadSBruce Richardson " TX-bytes: %-10"PRIu64"\n", stats.opackets, stats.oerrors, 6681a0accadSBruce Richardson stats.obytes); 6691a0accadSBruce Richardson 6701a0accadSBruce Richardson printf("\n"); 6711a0accadSBruce Richardson for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) { 6721a0accadSBruce Richardson printf(" Stats reg %2d RX-packets: %-10"PRIu64 6731a0accadSBruce Richardson " RX-errors: %-10"PRIu64 6741a0accadSBruce Richardson " RX-bytes: %-10"PRIu64"\n", 6751a0accadSBruce Richardson i, stats.q_ipackets[i], stats.q_errors[i], stats.q_ibytes[i]); 6761a0accadSBruce Richardson } 6771a0accadSBruce Richardson 6781a0accadSBruce Richardson printf("\n"); 6791a0accadSBruce Richardson for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) { 6801a0accadSBruce Richardson printf(" Stats reg %2d TX-packets: %-10"PRIu64 6811a0accadSBruce Richardson " TX-bytes: %-10"PRIu64"\n", 6821a0accadSBruce Richardson i, stats.q_opackets[i], stats.q_obytes[i]); 6831a0accadSBruce Richardson } 6841a0accadSBruce Richardson 6851a0accadSBruce Richardson printf(" %s############################%s\n", 6861a0accadSBruce Richardson nic_stats_border, nic_stats_border); 6871a0accadSBruce Richardson } 6881a0accadSBruce Richardson 6891a0accadSBruce Richardson static void 6901a0accadSBruce Richardson nic_stats_clear(uint16_t port_id) 6911a0accadSBruce Richardson { 6921a0accadSBruce Richardson printf("\n Clearing NIC stats for port %d\n", port_id); 6931a0accadSBruce Richardson rte_eth_stats_reset(port_id); 6941a0accadSBruce Richardson printf("\n NIC statistics for port %d cleared\n", port_id); 6951a0accadSBruce Richardson } 6961a0accadSBruce Richardson 6971a0accadSBruce Richardson static void collectd_resolve_cnt_type(char *cnt_type, size_t cnt_type_len, 6981a0accadSBruce Richardson const char *cnt_name) { 6991a0accadSBruce Richardson char *type_end = strrchr(cnt_name, '_'); 7001a0accadSBruce Richardson 7011a0accadSBruce Richardson if ((type_end != NULL) && 7021a0accadSBruce Richardson (strncmp(cnt_name, "rx_", strlen("rx_")) == 0)) { 7031a0accadSBruce Richardson if (strncmp(type_end, "_errors", strlen("_errors")) == 0) 7047edbf7ddSCiara Power strlcpy(cnt_type, "if_rx_errors", cnt_type_len); 7051a0accadSBruce Richardson else if (strncmp(type_end, "_dropped", strlen("_dropped")) == 0) 7067edbf7ddSCiara Power strlcpy(cnt_type, "if_rx_dropped", cnt_type_len); 7071a0accadSBruce Richardson else if (strncmp(type_end, "_bytes", strlen("_bytes")) == 0) 7087edbf7ddSCiara Power strlcpy(cnt_type, "if_rx_octets", cnt_type_len); 7091a0accadSBruce Richardson else if (strncmp(type_end, "_packets", strlen("_packets")) == 0) 7107edbf7ddSCiara Power strlcpy(cnt_type, "if_rx_packets", cnt_type_len); 7111a0accadSBruce Richardson else if (strncmp(type_end, "_placement", 7121a0accadSBruce Richardson strlen("_placement")) == 0) 7137edbf7ddSCiara Power strlcpy(cnt_type, "if_rx_errors", cnt_type_len); 7141a0accadSBruce Richardson else if (strncmp(type_end, "_buff", strlen("_buff")) == 0) 7157edbf7ddSCiara Power strlcpy(cnt_type, "if_rx_errors", cnt_type_len); 7161a0accadSBruce Richardson else 7171a0accadSBruce Richardson /* Does not fit obvious type: use a more generic one */ 7187edbf7ddSCiara Power strlcpy(cnt_type, "derive", cnt_type_len); 7191a0accadSBruce Richardson } else if ((type_end != NULL) && 7201a0accadSBruce Richardson (strncmp(cnt_name, "tx_", strlen("tx_"))) == 0) { 7211a0accadSBruce Richardson if (strncmp(type_end, "_errors", strlen("_errors")) == 0) 7227edbf7ddSCiara Power strlcpy(cnt_type, "if_tx_errors", cnt_type_len); 7231a0accadSBruce Richardson else if (strncmp(type_end, "_dropped", strlen("_dropped")) == 0) 7247edbf7ddSCiara Power strlcpy(cnt_type, "if_tx_dropped", cnt_type_len); 7251a0accadSBruce Richardson else if (strncmp(type_end, "_bytes", strlen("_bytes")) == 0) 7267edbf7ddSCiara Power strlcpy(cnt_type, "if_tx_octets", cnt_type_len); 7271a0accadSBruce Richardson else if (strncmp(type_end, "_packets", strlen("_packets")) == 0) 7287edbf7ddSCiara Power strlcpy(cnt_type, "if_tx_packets", cnt_type_len); 7291a0accadSBruce Richardson else 7301a0accadSBruce Richardson /* Does not fit obvious type: use a more generic one */ 7317edbf7ddSCiara Power strlcpy(cnt_type, "derive", cnt_type_len); 7321a0accadSBruce Richardson } else if ((type_end != NULL) && 7331a0accadSBruce Richardson (strncmp(cnt_name, "flow_", strlen("flow_"))) == 0) { 7341a0accadSBruce Richardson if (strncmp(type_end, "_filters", strlen("_filters")) == 0) 735f7605e24SFerruh Yigit strlcpy(cnt_type, "filter_result", cnt_type_len); 7361a0accadSBruce Richardson else if (strncmp(type_end, "_errors", strlen("_errors")) == 0) 7377edbf7ddSCiara Power strlcpy(cnt_type, "errors", cnt_type_len); 7381a0accadSBruce Richardson } else if ((type_end != NULL) && 7391a0accadSBruce Richardson (strncmp(cnt_name, "mac_", strlen("mac_"))) == 0) { 7401a0accadSBruce Richardson if (strncmp(type_end, "_errors", strlen("_errors")) == 0) 7417edbf7ddSCiara Power strlcpy(cnt_type, "errors", cnt_type_len); 7421a0accadSBruce Richardson } else { 7431a0accadSBruce Richardson /* Does not fit obvious type, or strrchr error: */ 7441a0accadSBruce Richardson /* use a more generic type */ 7457edbf7ddSCiara Power strlcpy(cnt_type, "derive", cnt_type_len); 7461a0accadSBruce Richardson } 7471a0accadSBruce Richardson } 7481a0accadSBruce Richardson 7491a0accadSBruce Richardson static void 7501a0accadSBruce Richardson nic_xstats_by_name_display(uint16_t port_id, char *name) 7511a0accadSBruce Richardson { 7521a0accadSBruce Richardson uint64_t id; 7531a0accadSBruce Richardson 7541a0accadSBruce Richardson printf("###### NIC statistics for port %-2d, statistic name '%s':\n", 7551a0accadSBruce Richardson port_id, name); 7561a0accadSBruce Richardson 7571a0accadSBruce Richardson if (rte_eth_xstats_get_id_by_name(port_id, name, &id) == 0) 7581a0accadSBruce Richardson printf("%s: %"PRIu64"\n", name, id); 7591a0accadSBruce Richardson else 7601a0accadSBruce Richardson printf("Statistic not found...\n"); 7611a0accadSBruce Richardson 7621a0accadSBruce Richardson } 7631a0accadSBruce Richardson 7641a0accadSBruce Richardson static void 7651a0accadSBruce Richardson nic_xstats_by_ids_display(uint16_t port_id, uint64_t *ids, int len) 7661a0accadSBruce Richardson { 7671a0accadSBruce Richardson struct rte_eth_xstat_name *xstats_names; 7681a0accadSBruce Richardson uint64_t *values; 7691a0accadSBruce Richardson int ret, i; 7701a0accadSBruce Richardson static const char *nic_stats_border = "########################"; 7711a0accadSBruce Richardson 7721a0accadSBruce Richardson values = malloc(sizeof(*values) * len); 7731a0accadSBruce Richardson if (values == NULL) { 7741a0accadSBruce Richardson printf("Cannot allocate memory for xstats\n"); 7751a0accadSBruce Richardson return; 7761a0accadSBruce Richardson } 7771a0accadSBruce Richardson 7781a0accadSBruce Richardson xstats_names = malloc(sizeof(struct rte_eth_xstat_name) * len); 7791a0accadSBruce Richardson if (xstats_names == NULL) { 7801a0accadSBruce Richardson printf("Cannot allocate memory for xstat names\n"); 7811a0accadSBruce Richardson free(values); 7821a0accadSBruce Richardson return; 7831a0accadSBruce Richardson } 7841a0accadSBruce Richardson 7851a0accadSBruce Richardson if (len != rte_eth_xstats_get_names_by_id( 7861a0accadSBruce Richardson port_id, xstats_names, len, ids)) { 7871a0accadSBruce Richardson printf("Cannot get xstat names\n"); 7881a0accadSBruce Richardson goto err; 7891a0accadSBruce Richardson } 7901a0accadSBruce Richardson 7911a0accadSBruce Richardson printf("###### NIC extended statistics for port %-2d #########\n", 7921a0accadSBruce Richardson port_id); 7931a0accadSBruce Richardson printf("%s############################\n", nic_stats_border); 7941a0accadSBruce Richardson ret = rte_eth_xstats_get_by_id(port_id, ids, values, len); 7951a0accadSBruce Richardson if (ret < 0 || ret > len) { 7961a0accadSBruce Richardson printf("Cannot get xstats\n"); 7971a0accadSBruce Richardson goto err; 7981a0accadSBruce Richardson } 7991a0accadSBruce Richardson 8001a0accadSBruce Richardson for (i = 0; i < len; i++) 8011a0accadSBruce Richardson printf("%s: %"PRIu64"\n", 8021a0accadSBruce Richardson xstats_names[i].name, 8031a0accadSBruce Richardson values[i]); 8041a0accadSBruce Richardson 8051a0accadSBruce Richardson printf("%s############################\n", nic_stats_border); 8061a0accadSBruce Richardson err: 8071a0accadSBruce Richardson free(values); 8081a0accadSBruce Richardson free(xstats_names); 8091a0accadSBruce Richardson } 8101a0accadSBruce Richardson 8111a0accadSBruce Richardson static void 8121a0accadSBruce Richardson nic_xstats_display(uint16_t port_id) 8131a0accadSBruce Richardson { 8141a0accadSBruce Richardson struct rte_eth_xstat_name *xstats_names; 8151a0accadSBruce Richardson uint64_t *values; 8161a0accadSBruce Richardson int len, ret, i; 8171a0accadSBruce Richardson static const char *nic_stats_border = "########################"; 8181a0accadSBruce Richardson 8191a0accadSBruce Richardson len = rte_eth_xstats_get_names_by_id(port_id, NULL, 0, NULL); 8201a0accadSBruce Richardson if (len < 0) { 8211a0accadSBruce Richardson printf("Cannot get xstats count\n"); 8221a0accadSBruce Richardson return; 8231a0accadSBruce Richardson } 8241a0accadSBruce Richardson values = malloc(sizeof(*values) * len); 8251a0accadSBruce Richardson if (values == NULL) { 8261a0accadSBruce Richardson printf("Cannot allocate memory for xstats\n"); 8271a0accadSBruce Richardson return; 8281a0accadSBruce Richardson } 8291a0accadSBruce Richardson 8301a0accadSBruce Richardson xstats_names = malloc(sizeof(struct rte_eth_xstat_name) * len); 8311a0accadSBruce Richardson if (xstats_names == NULL) { 8321a0accadSBruce Richardson printf("Cannot allocate memory for xstat names\n"); 8331a0accadSBruce Richardson free(values); 8341a0accadSBruce Richardson return; 8351a0accadSBruce Richardson } 8361a0accadSBruce Richardson if (len != rte_eth_xstats_get_names_by_id( 8371a0accadSBruce Richardson port_id, xstats_names, len, NULL)) { 8381a0accadSBruce Richardson printf("Cannot get xstat names\n"); 8391a0accadSBruce Richardson goto err; 8401a0accadSBruce Richardson } 8411a0accadSBruce Richardson 8421a0accadSBruce Richardson printf("###### NIC extended statistics for port %-2d #########\n", 8431a0accadSBruce Richardson port_id); 8441a0accadSBruce Richardson printf("%s############################\n", 8451a0accadSBruce Richardson nic_stats_border); 8461a0accadSBruce Richardson ret = rte_eth_xstats_get_by_id(port_id, NULL, values, len); 8471a0accadSBruce Richardson if (ret < 0 || ret > len) { 8481a0accadSBruce Richardson printf("Cannot get xstats\n"); 8491a0accadSBruce Richardson goto err; 8501a0accadSBruce Richardson } 8511a0accadSBruce Richardson 8521a0accadSBruce Richardson for (i = 0; i < len; i++) { 8531a0accadSBruce Richardson if (enable_collectd_format) { 8541a0accadSBruce Richardson char counter_type[MAX_STRING_LEN]; 8551a0accadSBruce Richardson char buf[MAX_STRING_LEN]; 8563cef37ebSAndy Green size_t n; 8571a0accadSBruce Richardson 8581a0accadSBruce Richardson collectd_resolve_cnt_type(counter_type, 8591a0accadSBruce Richardson sizeof(counter_type), 8601a0accadSBruce Richardson xstats_names[i].name); 8613cef37ebSAndy Green n = snprintf(buf, MAX_STRING_LEN, 8623cef37ebSAndy Green "PUTVAL %s/dpdkstat-port.%u/%s-%s N:%" 8631a0accadSBruce Richardson PRIu64"\n", host_id, port_id, counter_type, 8641a0accadSBruce Richardson xstats_names[i].name, values[i]); 8653cef37ebSAndy Green if (n > sizeof(buf) - 1) 8663cef37ebSAndy Green n = sizeof(buf) - 1; 8673cef37ebSAndy Green ret = write(stdout_fd, buf, n); 8681a0accadSBruce Richardson if (ret < 0) 8691a0accadSBruce Richardson goto err; 8701a0accadSBruce Richardson } else { 8711a0accadSBruce Richardson printf("%s: %"PRIu64"\n", xstats_names[i].name, 8721a0accadSBruce Richardson values[i]); 8731a0accadSBruce Richardson } 8741a0accadSBruce Richardson } 8751a0accadSBruce Richardson 8761a0accadSBruce Richardson printf("%s############################\n", 8771a0accadSBruce Richardson nic_stats_border); 8781a0accadSBruce Richardson err: 8791a0accadSBruce Richardson free(values); 8801a0accadSBruce Richardson free(xstats_names); 8811a0accadSBruce Richardson } 8821a0accadSBruce Richardson 8831a0accadSBruce Richardson static void 8841a0accadSBruce Richardson nic_xstats_clear(uint16_t port_id) 8851a0accadSBruce Richardson { 886da328f7fSIgor Romanov int ret; 887da328f7fSIgor Romanov 8881a0accadSBruce Richardson printf("\n Clearing NIC xstats for port %d\n", port_id); 889da328f7fSIgor Romanov ret = rte_eth_xstats_reset(port_id); 890da328f7fSIgor Romanov if (ret != 0) { 891da328f7fSIgor Romanov printf("\n Error clearing xstats for port %d: %s\n", port_id, 892da328f7fSIgor Romanov strerror(-ret)); 893da328f7fSIgor Romanov return; 894da328f7fSIgor Romanov } 895da328f7fSIgor Romanov 8961a0accadSBruce Richardson printf("\n NIC extended statistics for port %d cleared\n", port_id); 8971a0accadSBruce Richardson } 8981a0accadSBruce Richardson 899bb9be9a4SDavid Marchand #ifdef RTE_LIB_METRICS 9001a0accadSBruce Richardson static void 9011a0accadSBruce Richardson metrics_display(int port_id) 9021a0accadSBruce Richardson { 9031a0accadSBruce Richardson struct rte_metric_value *metrics; 9041a0accadSBruce Richardson struct rte_metric_name *names; 9051a0accadSBruce Richardson int len, ret; 9061a0accadSBruce Richardson static const char *nic_stats_border = "########################"; 9071a0accadSBruce Richardson 9081a0accadSBruce Richardson len = rte_metrics_get_names(NULL, 0); 9091a0accadSBruce Richardson if (len < 0) { 9101a0accadSBruce Richardson printf("Cannot get metrics count\n"); 9111a0accadSBruce Richardson return; 9121a0accadSBruce Richardson } 9131a0accadSBruce Richardson if (len == 0) { 9141a0accadSBruce Richardson printf("No metrics to display (none have been registered)\n"); 9151a0accadSBruce Richardson return; 9161a0accadSBruce Richardson } 9171a0accadSBruce Richardson 918cfe29906SStephen Hemminger metrics = malloc(sizeof(struct rte_metric_value) * len); 9191a0accadSBruce Richardson if (metrics == NULL) { 9201a0accadSBruce Richardson printf("Cannot allocate memory for metrics\n"); 9211a0accadSBruce Richardson return; 9221a0accadSBruce Richardson } 9231a0accadSBruce Richardson 924cfe29906SStephen Hemminger names = malloc(sizeof(struct rte_metric_name) * len); 9251a0accadSBruce Richardson if (names == NULL) { 9267be78d02SJosh Soref printf("Cannot allocate memory for metrics names\n"); 927cfe29906SStephen Hemminger free(metrics); 9281a0accadSBruce Richardson return; 9291a0accadSBruce Richardson } 9301a0accadSBruce Richardson 9311a0accadSBruce Richardson if (len != rte_metrics_get_names(names, len)) { 9321a0accadSBruce Richardson printf("Cannot get metrics names\n"); 933cfe29906SStephen Hemminger free(metrics); 934cfe29906SStephen Hemminger free(names); 9351a0accadSBruce Richardson return; 9361a0accadSBruce Richardson } 9371a0accadSBruce Richardson 9381a0accadSBruce Richardson if (port_id == RTE_METRICS_GLOBAL) 9391a0accadSBruce Richardson printf("###### Non port specific metrics #########\n"); 9401a0accadSBruce Richardson else 9411a0accadSBruce Richardson printf("###### metrics for port %-2d #########\n", port_id); 9421a0accadSBruce Richardson printf("%s############################\n", nic_stats_border); 9431a0accadSBruce Richardson ret = rte_metrics_get_values(port_id, metrics, len); 9441a0accadSBruce Richardson if (ret < 0 || ret > len) { 9451a0accadSBruce Richardson printf("Cannot get metrics values\n"); 946cfe29906SStephen Hemminger free(metrics); 947cfe29906SStephen Hemminger free(names); 9481a0accadSBruce Richardson return; 9491a0accadSBruce Richardson } 9501a0accadSBruce Richardson 9511a0accadSBruce Richardson int i; 9521a0accadSBruce Richardson for (i = 0; i < len; i++) 9531a0accadSBruce Richardson printf("%s: %"PRIu64"\n", names[i].name, metrics[i].value); 9541a0accadSBruce Richardson 9551a0accadSBruce Richardson printf("%s############################\n", nic_stats_border); 956cfe29906SStephen Hemminger free(metrics); 957cfe29906SStephen Hemminger free(names); 9581a0accadSBruce Richardson } 959bb9be9a4SDavid Marchand #endif 9601a0accadSBruce Richardson 9618a37f37fSVipin Varghese static void 962026a546aSHemant Agrawal show_security_context(uint16_t portid, bool inline_offload) 963d82d6ac6SHemant Agrawal { 964026a546aSHemant Agrawal void *p_ctx; 965d82d6ac6SHemant Agrawal const struct rte_security_capability *s_cap; 966d82d6ac6SHemant Agrawal 967026a546aSHemant Agrawal if (inline_offload) 968026a546aSHemant Agrawal p_ctx = rte_eth_dev_get_sec_ctx(portid); 969026a546aSHemant Agrawal else 970026a546aSHemant Agrawal p_ctx = rte_cryptodev_get_sec_ctx(portid); 971026a546aSHemant Agrawal 972d82d6ac6SHemant Agrawal if (p_ctx == NULL) 973d82d6ac6SHemant Agrawal return; 974d82d6ac6SHemant Agrawal 975d82d6ac6SHemant Agrawal printf(" - crypto context\n"); 976d82d6ac6SHemant Agrawal printf("\t -- security context - %p\n", p_ctx); 977d82d6ac6SHemant Agrawal printf("\t -- size %u\n", 978d82d6ac6SHemant Agrawal rte_security_session_get_size(p_ctx)); 979d82d6ac6SHemant Agrawal 980d82d6ac6SHemant Agrawal s_cap = rte_security_capabilities_get(p_ctx); 981d82d6ac6SHemant Agrawal if (s_cap) { 982d82d6ac6SHemant Agrawal printf("\t -- action (0x%x), protocol (0x%x)," 983d82d6ac6SHemant Agrawal " offload flags (0x%x)\n", 984d82d6ac6SHemant Agrawal s_cap->action, 985d82d6ac6SHemant Agrawal s_cap->protocol, 986d82d6ac6SHemant Agrawal s_cap->ol_flags); 987d82d6ac6SHemant Agrawal printf("\t -- capabilities - oper type %x\n", 988d82d6ac6SHemant Agrawal s_cap->crypto_capabilities->op); 989d82d6ac6SHemant Agrawal } 990d82d6ac6SHemant Agrawal } 991d82d6ac6SHemant Agrawal 992d82d6ac6SHemant Agrawal static void 993acc97611SStephen Hemminger show_offloads(uint64_t offloads, 994acc97611SStephen Hemminger const char *(show_offload)(uint64_t)) 995acc97611SStephen Hemminger { 996acc97611SStephen Hemminger printf(" offloads :"); 997acc97611SStephen Hemminger while (offloads != 0) { 9983d4e27fdSDavid Marchand uint64_t offload_flag = 1ULL << rte_ctz64(offloads); 999acc97611SStephen Hemminger printf(" %s", show_offload(offload_flag)); 1000acc97611SStephen Hemminger offloads &= ~offload_flag; 1001acc97611SStephen Hemminger } 1002acc97611SStephen Hemminger } 1003acc97611SStephen Hemminger 1004acc97611SStephen Hemminger static void 10058a37f37fSVipin Varghese show_port(void) 10068a37f37fSVipin Varghese { 10071dd6cffbSStephen Hemminger int i, ret, j, k; 10088a37f37fSVipin Varghese 100992a500e1SStephen Hemminger snprintf(bdr_str, MAX_STRING_LEN, " show - Port PMD "); 10108a37f37fSVipin Varghese STATS_BDR_STR(10, bdr_str); 10118a37f37fSVipin Varghese 10121dd6cffbSStephen Hemminger for (i = 0; i < RTE_MAX_ETHPORTS; i++) { 10138a37f37fSVipin Varghese uint16_t mtu = 0; 10148a37f37fSVipin Varghese struct rte_eth_link link; 10158a37f37fSVipin Varghese struct rte_eth_dev_info dev_info; 10168a37f37fSVipin Varghese struct rte_eth_rss_conf rss_conf; 1017ba5509a6SIvan Dyukov char link_status_text[RTE_ETH_LINK_MAX_STR_LEN]; 10182cff94b6SStephen Hemminger struct rte_eth_fc_conf fc_conf; 10192cff94b6SStephen Hemminger struct rte_ether_addr mac; 10201dd6cffbSStephen Hemminger struct rte_eth_dev_owner owner; 102133079eccSJie Hai uint8_t rss_key[RSS_HASH_KEY_SIZE]; 10221dd6cffbSStephen Hemminger 10231dd6cffbSStephen Hemminger /* Skip if port is not in mask */ 10241dd6cffbSStephen Hemminger if ((enabled_port_mask & (1ul << i)) == 0) 10251dd6cffbSStephen Hemminger continue; 10261dd6cffbSStephen Hemminger 10271dd6cffbSStephen Hemminger /* Skip if port is unused */ 10281dd6cffbSStephen Hemminger if (!rte_eth_dev_is_valid_port(i)) 10291dd6cffbSStephen Hemminger continue; 10308a37f37fSVipin Varghese 10318a37f37fSVipin Varghese memset(&rss_conf, 0, sizeof(rss_conf)); 10328a37f37fSVipin Varghese 103392a500e1SStephen Hemminger snprintf(bdr_str, MAX_STRING_LEN, " Port %u ", i); 10348a37f37fSVipin Varghese STATS_BDR_STR(5, bdr_str); 10358a37f37fSVipin Varghese printf(" - generic config\n"); 10368a37f37fSVipin Varghese 10372cff94b6SStephen Hemminger ret = rte_eth_dev_info_get(i, &dev_info); 10382cff94b6SStephen Hemminger if (ret != 0) { 10392cff94b6SStephen Hemminger printf("Error during getting device info: %s\n", 10402cff94b6SStephen Hemminger strerror(-ret)); 10412cff94b6SStephen Hemminger return; 10422cff94b6SStephen Hemminger } 10432cff94b6SStephen Hemminger 10442cff94b6SStephen Hemminger printf("\t -- driver %s device %s socket %d\n", 1045ec5ecd7eSDavid Marchand dev_info.driver_name, rte_dev_name(dev_info.device), 10462cff94b6SStephen Hemminger rte_eth_dev_socket_id(i)); 10472cff94b6SStephen Hemminger 10481dd6cffbSStephen Hemminger ret = rte_eth_dev_owner_get(i, &owner); 10491dd6cffbSStephen Hemminger if (ret == 0 && owner.id != RTE_ETH_DEV_NO_OWNER) 10501dd6cffbSStephen Hemminger printf("\t -- owner %#"PRIx64":%s\n", 10511dd6cffbSStephen Hemminger owner.id, owner.name); 10521dd6cffbSStephen Hemminger 1053844949ecSIgor Romanov ret = rte_eth_link_get(i, &link); 1054844949ecSIgor Romanov if (ret < 0) { 1055844949ecSIgor Romanov printf("Link get failed (port %u): %s\n", 1056844949ecSIgor Romanov i, rte_strerror(-ret)); 1057844949ecSIgor Romanov } else { 1058ba5509a6SIvan Dyukov rte_eth_link_to_str(link_status_text, 1059ba5509a6SIvan Dyukov sizeof(link_status_text), 1060ba5509a6SIvan Dyukov &link); 1061ba5509a6SIvan Dyukov printf("\t%s\n", link_status_text); 1062844949ecSIgor Romanov } 10632cff94b6SStephen Hemminger 10642cff94b6SStephen Hemminger ret = rte_eth_dev_flow_ctrl_get(i, &fc_conf); 1065295968d1SFerruh Yigit if (ret == 0 && fc_conf.mode != RTE_ETH_FC_NONE) { 10662cff94b6SStephen Hemminger printf("\t -- flow control mode %s%s high %u low %u pause %u%s%s\n", 1067295968d1SFerruh Yigit fc_conf.mode == RTE_ETH_FC_RX_PAUSE ? "rx " : 1068295968d1SFerruh Yigit fc_conf.mode == RTE_ETH_FC_TX_PAUSE ? "tx " : 1069295968d1SFerruh Yigit fc_conf.mode == RTE_ETH_FC_FULL ? "full" : "???", 10702cff94b6SStephen Hemminger fc_conf.autoneg ? " auto" : "", 10712cff94b6SStephen Hemminger fc_conf.high_water, 10722cff94b6SStephen Hemminger fc_conf.low_water, 10732cff94b6SStephen Hemminger fc_conf.pause_time, 10742cff94b6SStephen Hemminger fc_conf.send_xon ? " xon" : "", 10752cff94b6SStephen Hemminger fc_conf.mac_ctrl_frame_fwd ? " mac_ctrl" : ""); 10762cff94b6SStephen Hemminger } 10772cff94b6SStephen Hemminger 10782cff94b6SStephen Hemminger ret = rte_eth_macaddr_get(i, &mac); 10792cff94b6SStephen Hemminger if (ret == 0) { 10802cff94b6SStephen Hemminger char ebuf[RTE_ETHER_ADDR_FMT_SIZE]; 1081acc97611SStephen Hemminger 10822cff94b6SStephen Hemminger rte_ether_format_addr(ebuf, sizeof(ebuf), &mac); 10832cff94b6SStephen Hemminger printf("\t -- mac %s\n", ebuf); 10842cff94b6SStephen Hemminger } 10852cff94b6SStephen Hemminger 10862cff94b6SStephen Hemminger ret = rte_eth_promiscuous_get(i); 10872cff94b6SStephen Hemminger if (ret >= 0) 10882cff94b6SStephen Hemminger printf("\t -- promiscuous mode %s\n", 10892cff94b6SStephen Hemminger ret > 0 ? "enabled" : "disabled"); 10902cff94b6SStephen Hemminger 10912cff94b6SStephen Hemminger ret = rte_eth_allmulticast_get(i); 10922cff94b6SStephen Hemminger if (ret >= 0) 10932cff94b6SStephen Hemminger printf("\t -- all multicast mode %s\n", 10942cff94b6SStephen Hemminger ret > 0 ? "enabled" : "disabled"); 10952cff94b6SStephen Hemminger 10968a37f37fSVipin Varghese ret = rte_eth_dev_get_mtu(i, &mtu); 10978a37f37fSVipin Varghese if (ret == 0) 10988a37f37fSVipin Varghese printf("\t -- mtu (%d)\n", mtu); 10998a37f37fSVipin Varghese 11008a37f37fSVipin Varghese for (j = 0; j < dev_info.nb_rx_queues; j++) { 1101acc97611SStephen Hemminger struct rte_eth_rxq_info queue_info; 1102a6d81dc0SJie Hai struct rte_eth_burst_mode mode; 1103acc97611SStephen Hemminger int count; 1104acc97611SStephen Hemminger 11058a37f37fSVipin Varghese ret = rte_eth_rx_queue_info_get(i, j, &queue_info); 1106acc97611SStephen Hemminger if (ret != 0) 1107acc97611SStephen Hemminger break; 1108acc97611SStephen Hemminger 1109acc97611SStephen Hemminger if (j == 0) 1110acc97611SStephen Hemminger printf(" - rx queue\n"); 1111acc97611SStephen Hemminger 1112acc97611SStephen Hemminger printf("\t -- %d descriptors ", j); 1113acc97611SStephen Hemminger count = rte_eth_rx_queue_count(i, j); 1114acc97611SStephen Hemminger if (count >= 0) 1115acc97611SStephen Hemminger printf("%d/", count); 1116acc97611SStephen Hemminger printf("%u", queue_info.nb_desc); 1117acc97611SStephen Hemminger 1118acc97611SStephen Hemminger if (queue_info.scattered_rx) 1119acc97611SStephen Hemminger printf(" scattered"); 1120acc97611SStephen Hemminger 1121acc97611SStephen Hemminger if (queue_info.conf.rx_drop_en) 1122acc97611SStephen Hemminger printf(" drop_en"); 1123acc97611SStephen Hemminger 1124acc97611SStephen Hemminger if (queue_info.conf.rx_deferred_start) 1125acc97611SStephen Hemminger printf(" deferred_start"); 112661efaf5bSChengchang Tang 112761efaf5bSChengchang Tang if (queue_info.rx_buf_size != 0) 112861efaf5bSChengchang Tang printf(" rx buffer size %u", 112961efaf5bSChengchang Tang queue_info.rx_buf_size); 1130acc97611SStephen Hemminger 1131acc97611SStephen Hemminger printf(" mempool %s socket %d", 1132acc97611SStephen Hemminger queue_info.mp->name, 1133acc97611SStephen Hemminger queue_info.mp->socket_id); 1134acc97611SStephen Hemminger 1135acc97611SStephen Hemminger if (queue_info.conf.offloads != 0) 1136acc97611SStephen Hemminger show_offloads(queue_info.conf.offloads, rte_eth_dev_rx_offload_name); 1137acc97611SStephen Hemminger 1138a6d81dc0SJie Hai if (rte_eth_rx_burst_mode_get(i, j, &mode) == 0) 1139a6d81dc0SJie Hai printf(" burst mode : %s%s", 1140a6d81dc0SJie Hai mode.info, 1141a6d81dc0SJie Hai mode.flags & RTE_ETH_BURST_FLAG_PER_QUEUE ? 1142a6d81dc0SJie Hai " (per queue)" : ""); 1143a6d81dc0SJie Hai 114461efaf5bSChengchang Tang printf("\n"); 11458a37f37fSVipin Varghese } 1146acc97611SStephen Hemminger 1147acc97611SStephen Hemminger for (j = 0; j < dev_info.nb_tx_queues; j++) { 1148acc97611SStephen Hemminger struct rte_eth_txq_info queue_info; 1149a6d81dc0SJie Hai struct rte_eth_burst_mode mode; 1150acc97611SStephen Hemminger 1151acc97611SStephen Hemminger ret = rte_eth_tx_queue_info_get(i, j, &queue_info); 1152acc97611SStephen Hemminger if (ret != 0) 1153acc97611SStephen Hemminger break; 1154acc97611SStephen Hemminger 1155acc97611SStephen Hemminger if (j == 0) 1156acc97611SStephen Hemminger printf(" - tx queue\n"); 1157acc97611SStephen Hemminger 1158acc97611SStephen Hemminger printf("\t -- %d descriptors %d", 1159acc97611SStephen Hemminger j, queue_info.nb_desc); 1160acc97611SStephen Hemminger 1161acc97611SStephen Hemminger printf(" thresh %u/%u", 1162acc97611SStephen Hemminger queue_info.conf.tx_rs_thresh, 1163acc97611SStephen Hemminger queue_info.conf.tx_free_thresh); 1164acc97611SStephen Hemminger 1165acc97611SStephen Hemminger if (queue_info.conf.tx_deferred_start) 1166acc97611SStephen Hemminger printf(" deferred_start"); 1167acc97611SStephen Hemminger 1168acc97611SStephen Hemminger if (queue_info.conf.offloads != 0) 1169acc97611SStephen Hemminger show_offloads(queue_info.conf.offloads, rte_eth_dev_tx_offload_name); 1170a6d81dc0SJie Hai 1171a6d81dc0SJie Hai if (rte_eth_tx_burst_mode_get(i, j, &mode) == 0) 1172a6d81dc0SJie Hai printf(" burst mode : %s%s", 1173a6d81dc0SJie Hai mode.info, 1174a6d81dc0SJie Hai mode.flags & RTE_ETH_BURST_FLAG_PER_QUEUE ? 1175a6d81dc0SJie Hai " (per queue)" : ""); 1176a6d81dc0SJie Hai 1177acc97611SStephen Hemminger printf("\n"); 11788a37f37fSVipin Varghese } 11798a37f37fSVipin Varghese 118033079eccSJie Hai rss_conf.rss_key = rss_key; 118133079eccSJie Hai rss_conf.rss_key_len = dev_info.hash_key_size; 11828a37f37fSVipin Varghese ret = rte_eth_dev_rss_hash_conf_get(i, &rss_conf); 11838a37f37fSVipin Varghese if (ret == 0) { 118466d4baccSJie Hai printf(" - RSS info\n"); 118566d4baccSJie Hai printf("\t -- key len : %u\n", 11868a37f37fSVipin Varghese rss_conf.rss_key_len); 118766d4baccSJie Hai printf("\t -- key (hex) : "); 11888a37f37fSVipin Varghese for (k = 0; k < rss_conf.rss_key_len; k++) 118966d4baccSJie Hai printf("%02x", rss_conf.rss_key[k]); 119066d4baccSJie Hai printf("\n\t -- hash function : 0x%"PRIx64"\n", 11918a37f37fSVipin Varghese rss_conf.rss_hf); 1192130c5a4bSJie Hai printf("\t -- hash algorithm : %s\n", 1193130c5a4bSJie Hai rte_eth_dev_rss_algo_name(rss_conf.algorithm)); 11948a37f37fSVipin Varghese } 11958a37f37fSVipin Varghese 1196a8d0d473SBruce Richardson #ifdef RTE_LIB_SECURITY 1197026a546aSHemant Agrawal show_security_context(i, true); 1198b0b9116fSHemant Agrawal #endif 11998a37f37fSVipin Varghese } 12008a37f37fSVipin Varghese } 12018a37f37fSVipin Varghese 1202dbc72300SVipin Varghese static void 1203bb947a72SMin Hu (Connor) show_port_private_info(void) 1204bb947a72SMin Hu (Connor) { 1205bb947a72SMin Hu (Connor) int i; 1206bb947a72SMin Hu (Connor) 1207bb947a72SMin Hu (Connor) snprintf(bdr_str, MAX_STRING_LEN, " Dump - Ports private information"); 1208bb947a72SMin Hu (Connor) STATS_BDR_STR(10, bdr_str); 1209bb947a72SMin Hu (Connor) 1210bb947a72SMin Hu (Connor) RTE_ETH_FOREACH_DEV(i) { 1211bb947a72SMin Hu (Connor) /* Skip if port is not in mask */ 1212bb947a72SMin Hu (Connor) if ((enabled_port_mask & (1ul << i)) == 0) 1213bb947a72SMin Hu (Connor) continue; 1214bb947a72SMin Hu (Connor) 1215bb947a72SMin Hu (Connor) snprintf(bdr_str, MAX_STRING_LEN, " Port %u ", i); 1216bb947a72SMin Hu (Connor) STATS_BDR_STR(5, bdr_str); 1217bb947a72SMin Hu (Connor) rte_eth_dev_priv_dump(i, stdout); 1218bb947a72SMin Hu (Connor) } 1219bb947a72SMin Hu (Connor) } 1220bb947a72SMin Hu (Connor) 1221bb947a72SMin Hu (Connor) static void 1222dbc72300SVipin Varghese display_nodecap_info(int is_leaf, struct rte_tm_node_capabilities *cap) 1223dbc72300SVipin Varghese { 1224dbc72300SVipin Varghese if (cap == NULL) 1225dbc72300SVipin Varghese return; 1226dbc72300SVipin Varghese 1227dbc72300SVipin Varghese if (!is_leaf) { 1228dbc72300SVipin Varghese printf("\t -- nonleaf sched max:\n" 1229dbc72300SVipin Varghese "\t\t + children (%u)\n" 1230dbc72300SVipin Varghese "\t\t + sp priorities (%u)\n" 1231dbc72300SVipin Varghese "\t\t + wfq children per group (%u)\n" 1232dbc72300SVipin Varghese "\t\t + wfq groups (%u)\n" 1233dbc72300SVipin Varghese "\t\t + wfq weight (%u)\n", 1234dbc72300SVipin Varghese cap->nonleaf.sched_n_children_max, 1235dbc72300SVipin Varghese cap->nonleaf.sched_sp_n_priorities_max, 1236dbc72300SVipin Varghese cap->nonleaf.sched_wfq_n_children_per_group_max, 1237dbc72300SVipin Varghese cap->nonleaf.sched_wfq_n_groups_max, 1238dbc72300SVipin Varghese cap->nonleaf.sched_wfq_weight_max); 1239dbc72300SVipin Varghese } else { 1240dbc72300SVipin Varghese printf("\t -- leaf cman support:\n" 1241dbc72300SVipin Varghese "\t\t + wred pkt mode (%d)\n" 1242dbc72300SVipin Varghese "\t\t + wred byte mode (%d)\n" 1243dbc72300SVipin Varghese "\t\t + head drop (%d)\n" 1244dbc72300SVipin Varghese "\t\t + wred context private (%d)\n" 1245dbc72300SVipin Varghese "\t\t + wred context shared (%u)\n", 1246dbc72300SVipin Varghese cap->leaf.cman_wred_packet_mode_supported, 1247dbc72300SVipin Varghese cap->leaf.cman_wred_byte_mode_supported, 1248dbc72300SVipin Varghese cap->leaf.cman_head_drop_supported, 1249dbc72300SVipin Varghese cap->leaf.cman_wred_context_private_supported, 1250dbc72300SVipin Varghese cap->leaf.cman_wred_context_shared_n_max); 1251dbc72300SVipin Varghese } 1252dbc72300SVipin Varghese } 1253dbc72300SVipin Varghese 1254dbc72300SVipin Varghese static void 1255dbc72300SVipin Varghese display_levelcap_info(int is_leaf, struct rte_tm_level_capabilities *cap) 1256dbc72300SVipin Varghese { 1257dbc72300SVipin Varghese if (cap == NULL) 1258dbc72300SVipin Varghese return; 1259dbc72300SVipin Varghese 1260dbc72300SVipin Varghese if (!is_leaf) { 1261dbc72300SVipin Varghese printf("\t -- shaper private: (%d) dual rate (%d)\n", 1262dbc72300SVipin Varghese cap->nonleaf.shaper_private_supported, 1263dbc72300SVipin Varghese cap->nonleaf.shaper_private_dual_rate_supported); 1264dbc72300SVipin Varghese printf("\t -- shaper share: (%u)\n", 1265dbc72300SVipin Varghese cap->nonleaf.shaper_shared_n_max); 1266dbc72300SVipin Varghese printf("\t -- non leaf sched MAX:\n" 1267dbc72300SVipin Varghese "\t\t + children (%u)\n" 1268dbc72300SVipin Varghese "\t\t + sp (%u)\n" 1269dbc72300SVipin Varghese "\t\t + wfq children per group (%u)\n" 1270dbc72300SVipin Varghese "\t\t + wfq groups (%u)\n" 1271dbc72300SVipin Varghese "\t\t + wfq weight (%u)\n", 1272dbc72300SVipin Varghese cap->nonleaf.sched_n_children_max, 1273dbc72300SVipin Varghese cap->nonleaf.sched_sp_n_priorities_max, 1274dbc72300SVipin Varghese cap->nonleaf.sched_wfq_n_children_per_group_max, 1275dbc72300SVipin Varghese cap->nonleaf.sched_wfq_n_groups_max, 1276dbc72300SVipin Varghese cap->nonleaf.sched_wfq_weight_max); 1277dbc72300SVipin Varghese } else { 1278dbc72300SVipin Varghese printf("\t -- shaper private: (%d) dual rate (%d)\n", 1279dbc72300SVipin Varghese cap->leaf.shaper_private_supported, 1280dbc72300SVipin Varghese cap->leaf.shaper_private_dual_rate_supported); 1281dbc72300SVipin Varghese printf("\t -- shaper share: (%u)\n", 1282dbc72300SVipin Varghese cap->leaf.shaper_shared_n_max); 1283dbc72300SVipin Varghese printf(" -- leaf cman support:\n" 1284dbc72300SVipin Varghese "\t\t + wred pkt mode (%d)\n" 1285dbc72300SVipin Varghese "\t\t + wred byte mode (%d)\n" 1286dbc72300SVipin Varghese "\t\t + head drop (%d)\n" 1287dbc72300SVipin Varghese "\t\t + wred context private (%d)\n" 1288dbc72300SVipin Varghese "\t\t + wred context shared (%u)\n", 1289dbc72300SVipin Varghese cap->leaf.cman_wred_packet_mode_supported, 1290dbc72300SVipin Varghese cap->leaf.cman_wred_byte_mode_supported, 1291dbc72300SVipin Varghese cap->leaf.cman_head_drop_supported, 1292dbc72300SVipin Varghese cap->leaf.cman_wred_context_private_supported, 1293dbc72300SVipin Varghese cap->leaf.cman_wred_context_shared_n_max); 1294dbc72300SVipin Varghese } 1295dbc72300SVipin Varghese } 1296dbc72300SVipin Varghese 1297dbc72300SVipin Varghese static void 1298dbc72300SVipin Varghese show_tm(void) 1299dbc72300SVipin Varghese { 1300dbc72300SVipin Varghese int ret = 0, check_for_leaf = 0, is_leaf = 0; 1301dbc72300SVipin Varghese unsigned int j, k; 1302dbc72300SVipin Varghese uint16_t i = 0; 1303dbc72300SVipin Varghese 130492a500e1SStephen Hemminger snprintf(bdr_str, MAX_STRING_LEN, " show - TM PMD "); 1305dbc72300SVipin Varghese STATS_BDR_STR(10, bdr_str); 1306dbc72300SVipin Varghese 1307dbc72300SVipin Varghese RTE_ETH_FOREACH_DEV(i) { 1308dbc72300SVipin Varghese struct rte_eth_dev_info dev_info; 1309dbc72300SVipin Varghese struct rte_tm_capabilities cap; 1310dbc72300SVipin Varghese struct rte_tm_error error; 1311dbc72300SVipin Varghese struct rte_tm_node_capabilities capnode; 1312dbc72300SVipin Varghese struct rte_tm_level_capabilities caplevel; 1313dbc72300SVipin Varghese uint32_t n_leaf_nodes = 0; 1314dbc72300SVipin Varghese 1315dbc72300SVipin Varghese memset(&cap, 0, sizeof(cap)); 1316dbc72300SVipin Varghese memset(&error, 0, sizeof(error)); 1317dbc72300SVipin Varghese 131877339255SIvan Ilchenko ret = rte_eth_dev_info_get(i, &dev_info); 131977339255SIvan Ilchenko if (ret != 0) { 132077339255SIvan Ilchenko printf("Error during getting device (port %u) info: %s\n", 132177339255SIvan Ilchenko i, strerror(-ret)); 132277339255SIvan Ilchenko return; 132377339255SIvan Ilchenko } 132477339255SIvan Ilchenko 1325dbc72300SVipin Varghese printf(" - Generic for port (%u)\n" 1326dbc72300SVipin Varghese "\t -- driver name %s\n" 1327dbc72300SVipin Varghese "\t -- max vf (%u)\n" 1328dbc72300SVipin Varghese "\t -- max tx queues (%u)\n" 1329dbc72300SVipin Varghese "\t -- number of tx queues (%u)\n", 1330dbc72300SVipin Varghese i, 1331dbc72300SVipin Varghese dev_info.driver_name, 1332dbc72300SVipin Varghese dev_info.max_vfs, 1333dbc72300SVipin Varghese dev_info.max_tx_queues, 1334dbc72300SVipin Varghese dev_info.nb_tx_queues); 1335dbc72300SVipin Varghese 1336dbc72300SVipin Varghese ret = rte_tm_capabilities_get(i, &cap, &error); 1337dbc72300SVipin Varghese if (ret) 1338dbc72300SVipin Varghese continue; 1339dbc72300SVipin Varghese 1340dbc72300SVipin Varghese printf(" - MAX: nodes (%u) levels (%u) children (%u)\n", 1341dbc72300SVipin Varghese cap.n_nodes_max, 1342dbc72300SVipin Varghese cap.n_levels_max, 1343dbc72300SVipin Varghese cap.sched_n_children_max); 1344dbc72300SVipin Varghese 1345dbc72300SVipin Varghese printf(" - identical nodes: non leaf (%d) leaf (%d)\n", 1346dbc72300SVipin Varghese cap.non_leaf_nodes_identical, 1347dbc72300SVipin Varghese cap.leaf_nodes_identical); 1348dbc72300SVipin Varghese 1349dbc72300SVipin Varghese printf(" - Shaper MAX:\n" 1350dbc72300SVipin Varghese "\t -- total (%u)\n" 1351dbc72300SVipin Varghese "\t -- private (%u) private dual (%d)\n" 1352dbc72300SVipin Varghese "\t -- shared (%u) shared dual (%u)\n", 1353dbc72300SVipin Varghese cap.shaper_n_max, 1354dbc72300SVipin Varghese cap.shaper_private_n_max, 1355dbc72300SVipin Varghese cap.shaper_private_dual_rate_n_max, 1356dbc72300SVipin Varghese cap.shaper_shared_n_max, 1357dbc72300SVipin Varghese cap.shaper_shared_dual_rate_n_max); 1358dbc72300SVipin Varghese 1359dbc72300SVipin Varghese printf(" - mark support:\n"); 1360dbc72300SVipin Varghese printf("\t -- vlan dei: GREEN (%d) YELLOW (%d) RED (%d)\n", 1361c1656328SJasvinder Singh cap.mark_vlan_dei_supported[RTE_COLOR_GREEN], 1362c1656328SJasvinder Singh cap.mark_vlan_dei_supported[RTE_COLOR_YELLOW], 1363c1656328SJasvinder Singh cap.mark_vlan_dei_supported[RTE_COLOR_RED]); 1364dbc72300SVipin Varghese printf("\t -- ip ecn tcp: GREEN (%d) YELLOW (%d) RED (%d)\n", 1365c1656328SJasvinder Singh cap.mark_ip_ecn_tcp_supported[RTE_COLOR_GREEN], 1366c1656328SJasvinder Singh cap.mark_ip_ecn_tcp_supported[RTE_COLOR_YELLOW], 1367c1656328SJasvinder Singh cap.mark_ip_ecn_tcp_supported[RTE_COLOR_RED]); 1368dbc72300SVipin Varghese printf("\t -- ip ecn sctp: GREEN (%d) YELLOW (%d) RED (%d)\n", 1369c1656328SJasvinder Singh cap.mark_ip_ecn_sctp_supported[RTE_COLOR_GREEN], 1370c1656328SJasvinder Singh cap.mark_ip_ecn_sctp_supported[RTE_COLOR_YELLOW], 1371c1656328SJasvinder Singh cap.mark_ip_ecn_sctp_supported[RTE_COLOR_RED]); 1372dbc72300SVipin Varghese printf("\t -- ip dscp: GREEN (%d) YELLOW (%d) RED (%d)\n", 1373c1656328SJasvinder Singh cap.mark_ip_dscp_supported[RTE_COLOR_GREEN], 1374c1656328SJasvinder Singh cap.mark_ip_dscp_supported[RTE_COLOR_YELLOW], 1375c1656328SJasvinder Singh cap.mark_ip_dscp_supported[RTE_COLOR_RED]); 1376dbc72300SVipin Varghese 1377dbc72300SVipin Varghese printf(" - mask stats (0x%"PRIx64")" 1378dbc72300SVipin Varghese " dynamic update (0x%"PRIx64")\n", 1379dbc72300SVipin Varghese cap.stats_mask, 1380dbc72300SVipin Varghese cap.dynamic_update_mask); 1381dbc72300SVipin Varghese 1382dbc72300SVipin Varghese printf(" - sched MAX:\n" 1383dbc72300SVipin Varghese "\t -- total (%u)\n" 1384dbc72300SVipin Varghese "\t -- sp levels (%u)\n" 1385dbc72300SVipin Varghese "\t -- wfq children per group (%u)\n" 1386dbc72300SVipin Varghese "\t -- wfq groups (%u)\n" 1387dbc72300SVipin Varghese "\t -- wfq weight (%u)\n", 1388dbc72300SVipin Varghese cap.sched_sp_n_priorities_max, 1389dbc72300SVipin Varghese cap.sched_sp_n_priorities_max, 1390dbc72300SVipin Varghese cap.sched_wfq_n_children_per_group_max, 1391dbc72300SVipin Varghese cap.sched_wfq_n_groups_max, 1392dbc72300SVipin Varghese cap.sched_wfq_weight_max); 1393dbc72300SVipin Varghese 1394dbc72300SVipin Varghese printf(" - CMAN support:\n" 1395dbc72300SVipin Varghese "\t -- WRED mode: pkt (%d) byte (%d)\n" 1396dbc72300SVipin Varghese "\t -- head drop (%d)\n", 1397dbc72300SVipin Varghese cap.cman_wred_packet_mode_supported, 1398dbc72300SVipin Varghese cap.cman_wred_byte_mode_supported, 1399dbc72300SVipin Varghese cap.cman_head_drop_supported); 1400dbc72300SVipin Varghese printf("\t -- MAX WRED CONTEXT:" 1401dbc72300SVipin Varghese " total (%u) private (%u) shared (%u)\n", 1402dbc72300SVipin Varghese cap.cman_wred_context_n_max, 1403dbc72300SVipin Varghese cap.cman_wred_context_private_n_max, 1404dbc72300SVipin Varghese cap.cman_wred_context_shared_n_max); 1405dbc72300SVipin Varghese 1406dbc72300SVipin Varghese for (j = 0; j < cap.n_nodes_max; j++) { 1407dbc72300SVipin Varghese memset(&capnode, 0, sizeof(capnode)); 1408dbc72300SVipin Varghese ret = rte_tm_node_capabilities_get(i, j, 1409dbc72300SVipin Varghese &capnode, &error); 1410dbc72300SVipin Varghese if (ret) 1411dbc72300SVipin Varghese continue; 1412dbc72300SVipin Varghese 1413dbc72300SVipin Varghese check_for_leaf = 1; 1414dbc72300SVipin Varghese 1415dbc72300SVipin Varghese printf(" NODE %u\n", j); 1416dbc72300SVipin Varghese printf("\t - shaper private: (%d) dual rate (%d)\n", 1417dbc72300SVipin Varghese capnode.shaper_private_supported, 1418dbc72300SVipin Varghese capnode.shaper_private_dual_rate_supported); 1419dbc72300SVipin Varghese printf("\t - shaper shared max: (%u)\n", 1420dbc72300SVipin Varghese capnode.shaper_shared_n_max); 1421dbc72300SVipin Varghese printf("\t - stats mask %"PRIx64"\n", 1422dbc72300SVipin Varghese capnode.stats_mask); 1423dbc72300SVipin Varghese 1424dbc72300SVipin Varghese ret = rte_tm_node_type_get(i, j, &is_leaf, &error); 1425dbc72300SVipin Varghese if (ret) 1426dbc72300SVipin Varghese continue; 1427dbc72300SVipin Varghese 1428dbc72300SVipin Varghese display_nodecap_info(is_leaf, &capnode); 1429dbc72300SVipin Varghese } 1430dbc72300SVipin Varghese 1431dbc72300SVipin Varghese for (j = 0; j < cap.n_levels_max; j++) { 1432dbc72300SVipin Varghese memset(&caplevel, 0, sizeof(caplevel)); 1433dbc72300SVipin Varghese ret = rte_tm_level_capabilities_get(i, j, 1434dbc72300SVipin Varghese &caplevel, &error); 1435dbc72300SVipin Varghese if (ret) 1436dbc72300SVipin Varghese continue; 1437dbc72300SVipin Varghese 1438dbc72300SVipin Varghese printf(" - Level %u\n", j); 1439dbc72300SVipin Varghese printf("\t -- node MAX: %u non leaf %u leaf %u\n", 1440dbc72300SVipin Varghese caplevel.n_nodes_max, 1441dbc72300SVipin Varghese caplevel.n_nodes_nonleaf_max, 1442dbc72300SVipin Varghese caplevel.n_nodes_leaf_max); 14437be78d02SJosh Soref printf("\t -- identical: non leaf %u leaf %u\n", 1444dbc72300SVipin Varghese caplevel.non_leaf_nodes_identical, 1445dbc72300SVipin Varghese caplevel.leaf_nodes_identical); 1446dbc72300SVipin Varghese 1447dbc72300SVipin Varghese for (k = 0; k < caplevel.n_nodes_max; k++) { 1448dbc72300SVipin Varghese ret = rte_tm_node_type_get(i, k, 1449dbc72300SVipin Varghese &is_leaf, &error); 1450dbc72300SVipin Varghese if (ret) 1451dbc72300SVipin Varghese continue; 1452dbc72300SVipin Varghese 1453dbc72300SVipin Varghese display_levelcap_info(is_leaf, &caplevel); 1454dbc72300SVipin Varghese } 1455dbc72300SVipin Varghese } 1456dbc72300SVipin Varghese 1457dbc72300SVipin Varghese if (check_for_leaf) { 1458dbc72300SVipin Varghese ret = rte_tm_get_number_of_leaf_nodes(i, 1459dbc72300SVipin Varghese &n_leaf_nodes, &error); 1460dbc72300SVipin Varghese if (ret == 0) 1461dbc72300SVipin Varghese printf(" - leaf nodes (%u)\n", n_leaf_nodes); 1462dbc72300SVipin Varghese } 1463dbc72300SVipin Varghese 1464dbc72300SVipin Varghese for (j = 0; j < n_leaf_nodes; j++) { 1465dbc72300SVipin Varghese struct rte_tm_node_stats stats; 1466dbc72300SVipin Varghese memset(&stats, 0, sizeof(stats)); 1467dbc72300SVipin Varghese 1468dbc72300SVipin Varghese ret = rte_tm_node_stats_read(i, j, 1469dbc72300SVipin Varghese &stats, &cap.stats_mask, 0, &error); 1470dbc72300SVipin Varghese if (ret) 1471dbc72300SVipin Varghese continue; 1472dbc72300SVipin Varghese 1473dbc72300SVipin Varghese printf(" - STATS for node (%u)\n", j); 1474dbc72300SVipin Varghese printf(" -- pkts (%"PRIu64") bytes (%"PRIu64")\n", 1475dbc72300SVipin Varghese stats.n_pkts, stats.n_bytes); 1476dbc72300SVipin Varghese 1477dbc72300SVipin Varghese ret = rte_tm_node_type_get(i, j, &is_leaf, &error); 1478dbc72300SVipin Varghese if (ret || (!is_leaf)) 1479dbc72300SVipin Varghese continue; 1480dbc72300SVipin Varghese 1481dbc72300SVipin Varghese printf(" -- leaf queued:" 1482dbc72300SVipin Varghese " pkts (%"PRIu64") bytes (%"PRIu64")\n", 1483dbc72300SVipin Varghese stats.leaf.n_pkts_queued, 1484dbc72300SVipin Varghese stats.leaf.n_bytes_queued); 1485dbc72300SVipin Varghese printf(" - dropped:\n" 1486dbc72300SVipin Varghese "\t -- GREEN:" 1487dbc72300SVipin Varghese " pkts (%"PRIu64") bytes (%"PRIu64")\n" 1488dbc72300SVipin Varghese "\t -- YELLOW:" 1489dbc72300SVipin Varghese " pkts (%"PRIu64") bytes (%"PRIu64")\n" 1490dbc72300SVipin Varghese "\t -- RED:" 1491dbc72300SVipin Varghese " pkts (%"PRIu64") bytes (%"PRIu64")\n", 1492c1656328SJasvinder Singh stats.leaf.n_pkts_dropped[RTE_COLOR_GREEN], 1493c1656328SJasvinder Singh stats.leaf.n_bytes_dropped[RTE_COLOR_GREEN], 1494c1656328SJasvinder Singh stats.leaf.n_pkts_dropped[RTE_COLOR_YELLOW], 1495c1656328SJasvinder Singh stats.leaf.n_bytes_dropped[RTE_COLOR_YELLOW], 1496c1656328SJasvinder Singh stats.leaf.n_pkts_dropped[RTE_COLOR_RED], 1497c1656328SJasvinder Singh stats.leaf.n_bytes_dropped[RTE_COLOR_RED]); 1498dbc72300SVipin Varghese } 1499dbc72300SVipin Varghese } 1500dbc72300SVipin Varghese } 1501dbc72300SVipin Varghese 1502fe773600SVipin Varghese static void 1503fe773600SVipin Varghese display_crypto_feature_info(uint64_t x) 1504fe773600SVipin Varghese { 1505fe773600SVipin Varghese if (x == 0) 1506fe773600SVipin Varghese return; 1507fe773600SVipin Varghese 1508fe773600SVipin Varghese printf("\t -- feature flags\n"); 1509fe773600SVipin Varghese printf("\t\t + symmetric (%c), asymmetric (%c)\n" 1510fe773600SVipin Varghese "\t\t + symmetric operation chaining (%c)\n", 1511fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ? 'y' : 'n', 1512fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO) ? 'y' : 'n', 1513fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING) ? 'y' : 'n'); 1514fe773600SVipin Varghese printf("\t\t + CPU: SSE (%c), AVX (%c), AVX2 (%c), AVX512 (%c)\n", 1515fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_CPU_SSE) ? 'y' : 'n', 1516fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_CPU_AVX) ? 'y' : 'n', 1517fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_CPU_AVX2) ? 'y' : 'n', 1518fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_CPU_AVX512) ? 'y' : 'n'); 1519fe773600SVipin Varghese printf("\t\t + AESNI: CPU (%c), HW (%c)\n", 1520fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_CPU_AESNI) ? 'y' : 'n', 1521fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_HW_ACCELERATED) ? 'y' : 'n'); 1522d82d6ac6SHemant Agrawal printf("\t\t + SECURITY OFFLOAD (%c)\n", 1523fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_SECURITY) ? 'y' : 'n'); 1524fe773600SVipin Varghese printf("\t\t + ARM: NEON (%c), CE (%c)\n", 1525fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_CPU_NEON) ? 'y' : 'n', 1526fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_CPU_ARM_CE) ? 'y' : 'n'); 1527fe773600SVipin Varghese printf("\t -- buffer offload\n"); 1528fe773600SVipin Varghese printf("\t\t + IN_PLACE_SGL (%c)\n", 1529fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_IN_PLACE_SGL) ? 'y' : 'n'); 1530fe773600SVipin Varghese printf("\t\t + OOP_SGL_IN_SGL_OUT (%c)\n", 1531fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT) ? 'y' : 'n'); 1532fe773600SVipin Varghese printf("\t\t + OOP_SGL_IN_LB_OUT (%c)\n", 1533fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT) ? 'y' : 'n'); 1534fe773600SVipin Varghese printf("\t\t + OOP_LB_IN_SGL_OUT (%c)\n", 1535fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT) ? 'y' : 'n'); 1536fe773600SVipin Varghese printf("\t\t + OOP_LB_IN_LB_OUT (%c)\n", 1537fe773600SVipin Varghese (x & RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT) ? 'y' : 'n'); 1538fe773600SVipin Varghese } 1539fe773600SVipin Varghese 1540fe773600SVipin Varghese static void 1541fe773600SVipin Varghese show_crypto(void) 1542fe773600SVipin Varghese { 1543fe773600SVipin Varghese uint8_t crypto_dev_count = rte_cryptodev_count(), i; 1544fe773600SVipin Varghese 154592a500e1SStephen Hemminger snprintf(bdr_str, MAX_STRING_LEN, " show - CRYPTO PMD "); 1546fe773600SVipin Varghese STATS_BDR_STR(10, bdr_str); 1547fe773600SVipin Varghese 1548fe773600SVipin Varghese for (i = 0; i < crypto_dev_count; i++) { 1549fe773600SVipin Varghese struct rte_cryptodev_info dev_info; 1550fe773600SVipin Varghese struct rte_cryptodev_stats stats; 1551fe773600SVipin Varghese 1552fe773600SVipin Varghese rte_cryptodev_info_get(i, &dev_info); 1553fe773600SVipin Varghese 1554fe773600SVipin Varghese printf(" - device (%u)\n", i); 1555fe773600SVipin Varghese printf("\t -- name (%s)\n" 1556fe773600SVipin Varghese "\t -- driver (%s)\n" 1557fe773600SVipin Varghese "\t -- id (%u) on socket (%d)\n" 1558fe773600SVipin Varghese "\t -- queue pairs (%d)\n", 1559fe773600SVipin Varghese rte_cryptodev_name_get(i), 1560fe773600SVipin Varghese dev_info.driver_name, 1561fe773600SVipin Varghese dev_info.driver_id, 1562ec5ecd7eSDavid Marchand rte_dev_numa_node(dev_info.device), 1563fe773600SVipin Varghese rte_cryptodev_queue_pair_count(i)); 1564fe773600SVipin Varghese 1565fe773600SVipin Varghese display_crypto_feature_info(dev_info.feature_flags); 1566fe773600SVipin Varghese 1567fe773600SVipin Varghese if (rte_cryptodev_stats_get(i, &stats) == 0) { 1568fe773600SVipin Varghese printf("\t -- stats\n"); 1569fe773600SVipin Varghese printf("\t\t + enqueue count (%"PRIu64")" 1570fe773600SVipin Varghese " error (%"PRIu64")\n", 1571fe773600SVipin Varghese stats.enqueued_count, 1572fe773600SVipin Varghese stats.enqueue_err_count); 1573fe773600SVipin Varghese printf("\t\t + dequeue count (%"PRIu64")" 1574fe773600SVipin Varghese " error (%"PRIu64")\n", 1575fe773600SVipin Varghese stats.dequeued_count, 1576fe773600SVipin Varghese stats.dequeue_err_count); 1577fe773600SVipin Varghese } 1578d82d6ac6SHemant Agrawal 15795d736637SDavid Marchand #ifdef RTE_LIB_SECURITY 1580026a546aSHemant Agrawal show_security_context(i, false); 1581d82d6ac6SHemant Agrawal #endif 1582fe773600SVipin Varghese } 1583fe773600SVipin Varghese } 1584fe773600SVipin Varghese 1585c13e8984SVipin Varghese static void 1586c13e8984SVipin Varghese show_ring(char *name) 1587c13e8984SVipin Varghese { 158892a500e1SStephen Hemminger snprintf(bdr_str, MAX_STRING_LEN, " show - RING "); 1589c13e8984SVipin Varghese STATS_BDR_STR(10, bdr_str); 1590c13e8984SVipin Varghese 1591c13e8984SVipin Varghese if (name != NULL) { 1592c13e8984SVipin Varghese struct rte_ring *ptr = rte_ring_lookup(name); 1593c13e8984SVipin Varghese if (ptr != NULL) { 1594c13e8984SVipin Varghese printf(" - Name (%s) on socket (%d)\n" 1595c13e8984SVipin Varghese " - flags:\n" 1596c13e8984SVipin Varghese "\t -- Single Producer Enqueue (%u)\n" 15977be78d02SJosh Soref "\t -- Single Consumer Dequeue (%u)\n", 1598c13e8984SVipin Varghese ptr->name, 1599c13e8984SVipin Varghese ptr->memzone->socket_id, 1600c13e8984SVipin Varghese ptr->flags & RING_F_SP_ENQ, 1601c13e8984SVipin Varghese ptr->flags & RING_F_SC_DEQ); 1602c13e8984SVipin Varghese printf(" - size (%u) mask (0x%x) capacity (%u)\n", 1603c13e8984SVipin Varghese ptr->size, 1604c13e8984SVipin Varghese ptr->mask, 1605c13e8984SVipin Varghese ptr->capacity); 1606c13e8984SVipin Varghese printf(" - count (%u) free count (%u)\n", 1607c13e8984SVipin Varghese rte_ring_count(ptr), 1608c13e8984SVipin Varghese rte_ring_free_count(ptr)); 1609c13e8984SVipin Varghese printf(" - full (%d) empty (%d)\n", 1610c13e8984SVipin Varghese rte_ring_full(ptr), 1611c13e8984SVipin Varghese rte_ring_empty(ptr)); 1612c13e8984SVipin Varghese 1613c13e8984SVipin Varghese STATS_BDR_STR(50, ""); 1614c13e8984SVipin Varghese return; 1615c13e8984SVipin Varghese } 1616c13e8984SVipin Varghese } 1617c13e8984SVipin Varghese 1618c13e8984SVipin Varghese rte_ring_list_dump(stdout); 1619c13e8984SVipin Varghese } 1620c13e8984SVipin Varghese 16210101a0ecSVipin Varghese static void 16220101a0ecSVipin Varghese show_mempool(char *name) 16230101a0ecSVipin Varghese { 162492a500e1SStephen Hemminger snprintf(bdr_str, MAX_STRING_LEN, " show - MEMPOOL "); 16250101a0ecSVipin Varghese STATS_BDR_STR(10, bdr_str); 16260101a0ecSVipin Varghese 16270101a0ecSVipin Varghese if (name != NULL) { 16280101a0ecSVipin Varghese struct rte_mempool *ptr = rte_mempool_lookup(name); 16290101a0ecSVipin Varghese if (ptr != NULL) { 16302cff94b6SStephen Hemminger struct rte_mempool_ops *ops; 1631ff1047baSFerruh Yigit uint64_t flags = ptr->flags; 16322cff94b6SStephen Hemminger 16332cff94b6SStephen Hemminger ops = rte_mempool_get_ops(ptr->ops_index); 16340101a0ecSVipin Varghese printf(" - Name: %s on socket %d\n" 16350101a0ecSVipin Varghese " - flags:\n" 16360101a0ecSVipin Varghese "\t -- No spread (%c)\n" 16370101a0ecSVipin Varghese "\t -- No cache align (%c)\n" 16380101a0ecSVipin Varghese "\t -- SP put (%c), SC get (%c)\n" 16390101a0ecSVipin Varghese "\t -- Pool created (%c)\n" 164011541c5cSDmitry Kozlyuk "\t -- No IOVA config (%c)\n" 164111541c5cSDmitry Kozlyuk "\t -- Not used for IO (%c)\n", 16420101a0ecSVipin Varghese ptr->name, 16430101a0ecSVipin Varghese ptr->socket_id, 1644c47d7b90SAndrew Rybchenko (flags & RTE_MEMPOOL_F_NO_SPREAD) ? 'y' : 'n', 1645c47d7b90SAndrew Rybchenko (flags & RTE_MEMPOOL_F_NO_CACHE_ALIGN) ? 'y' : 'n', 1646c47d7b90SAndrew Rybchenko (flags & RTE_MEMPOOL_F_SP_PUT) ? 'y' : 'n', 1647c47d7b90SAndrew Rybchenko (flags & RTE_MEMPOOL_F_SC_GET) ? 'y' : 'n', 1648c47d7b90SAndrew Rybchenko (flags & RTE_MEMPOOL_F_POOL_CREATED) ? 'y' : 'n', 1649c47d7b90SAndrew Rybchenko (flags & RTE_MEMPOOL_F_NO_IOVA_CONTIG) ? 'y' : 'n', 1650c47d7b90SAndrew Rybchenko (flags & RTE_MEMPOOL_F_NON_IO) ? 'y' : 'n'); 16510101a0ecSVipin Varghese printf(" - Size %u Cache %u element %u\n" 16520101a0ecSVipin Varghese " - header %u trailer %u\n" 16530101a0ecSVipin Varghese " - private data size %u\n", 16540101a0ecSVipin Varghese ptr->size, 16550101a0ecSVipin Varghese ptr->cache_size, 16560101a0ecSVipin Varghese ptr->elt_size, 16570101a0ecSVipin Varghese ptr->header_size, 16580101a0ecSVipin Varghese ptr->trailer_size, 16590101a0ecSVipin Varghese ptr->private_data_size); 16600101a0ecSVipin Varghese printf(" - memezone - socket %d\n", 16610101a0ecSVipin Varghese ptr->mz->socket_id); 16620101a0ecSVipin Varghese printf(" - Count: avail (%u), in use (%u)\n", 16630101a0ecSVipin Varghese rte_mempool_avail_count(ptr), 16640101a0ecSVipin Varghese rte_mempool_in_use_count(ptr)); 16652cff94b6SStephen Hemminger printf(" - ops_index %d ops_name %s\n", 16662cff94b6SStephen Hemminger ptr->ops_index, ops ? ops->name : "NA"); 16670101a0ecSVipin Varghese 16680101a0ecSVipin Varghese return; 16690101a0ecSVipin Varghese } 16700101a0ecSVipin Varghese } 16710101a0ecSVipin Varghese 16720101a0ecSVipin Varghese rte_mempool_list_dump(stdout); 16730101a0ecSVipin Varghese } 16740101a0ecSVipin Varghese 16753056d22aSVipin Varghese static void 16763056d22aSVipin Varghese mempool_itr_obj(struct rte_mempool *mp, void *opaque, 16773056d22aSVipin Varghese void *obj, unsigned int obj_idx) 16783056d22aSVipin Varghese { 16793056d22aSVipin Varghese printf(" - obj_idx %u opaque %p obj %p\n", 16803056d22aSVipin Varghese obj_idx, opaque, obj); 16813056d22aSVipin Varghese 16823056d22aSVipin Varghese if (obj) 16833056d22aSVipin Varghese rte_hexdump(stdout, " Obj Content", 16843056d22aSVipin Varghese obj, (mp->elt_size > 256)?256:mp->elt_size); 16853056d22aSVipin Varghese } 16863056d22aSVipin Varghese 16873056d22aSVipin Varghese static void 16883056d22aSVipin Varghese iter_mempool(char *name) 16893056d22aSVipin Varghese { 169092a500e1SStephen Hemminger snprintf(bdr_str, MAX_STRING_LEN, " iter - MEMPOOL "); 16913056d22aSVipin Varghese STATS_BDR_STR(10, bdr_str); 16923056d22aSVipin Varghese 16933056d22aSVipin Varghese if (name != NULL) { 16943056d22aSVipin Varghese struct rte_mempool *ptr = rte_mempool_lookup(name); 16953056d22aSVipin Varghese if (ptr != NULL) { 16963056d22aSVipin Varghese /* iterate each object */ 16973056d22aSVipin Varghese uint32_t ret = rte_mempool_obj_iter(ptr, 16983056d22aSVipin Varghese mempool_itr_obj, NULL); 16993056d22aSVipin Varghese printf("\n - iterated %u objects\n", ret); 17003056d22aSVipin Varghese return; 17013056d22aSVipin Varghese } 17023056d22aSVipin Varghese } 17033056d22aSVipin Varghese } 17043056d22aSVipin Varghese 1705d3319ef9SChengchang Tang static void 1706d3319ef9SChengchang Tang dump_regs(char *file_prefix) 1707d3319ef9SChengchang Tang { 1708d3319ef9SChengchang Tang #define MAX_FILE_NAME_SZ (MAX_LONG_OPT_SZ + 10) 1709d3319ef9SChengchang Tang char file_name[MAX_FILE_NAME_SZ]; 1710d3319ef9SChengchang Tang struct rte_dev_reg_info reg_info; 1711d3319ef9SChengchang Tang struct rte_eth_dev_info dev_info; 1712d3319ef9SChengchang Tang unsigned char *buf_data; 1713d3319ef9SChengchang Tang size_t buf_size; 1714d3319ef9SChengchang Tang FILE *fp_regs; 1715d3319ef9SChengchang Tang uint16_t i; 1716d3319ef9SChengchang Tang int ret; 1717d3319ef9SChengchang Tang 1718d3319ef9SChengchang Tang snprintf(bdr_str, MAX_STRING_LEN, " dump - Port REG"); 1719d3319ef9SChengchang Tang STATS_BDR_STR(10, bdr_str); 1720d3319ef9SChengchang Tang 1721d3319ef9SChengchang Tang RTE_ETH_FOREACH_DEV(i) { 1722d3319ef9SChengchang Tang /* Skip if port is not in mask */ 1723d3319ef9SChengchang Tang if ((enabled_port_mask & (1ul << i)) == 0) 1724d3319ef9SChengchang Tang continue; 1725d3319ef9SChengchang Tang 1726d3319ef9SChengchang Tang snprintf(bdr_str, MAX_STRING_LEN, " Port (%u)", i); 1727d3319ef9SChengchang Tang STATS_BDR_STR(5, bdr_str); 1728d3319ef9SChengchang Tang 1729d3319ef9SChengchang Tang ret = rte_eth_dev_info_get(i, &dev_info); 1730d3319ef9SChengchang Tang if (ret) { 1731d3319ef9SChengchang Tang printf("Error getting device info: %d\n", ret); 1732d3319ef9SChengchang Tang continue; 1733d3319ef9SChengchang Tang } 1734d3319ef9SChengchang Tang 1735d3319ef9SChengchang Tang memset(®_info, 0, sizeof(reg_info)); 1736d3319ef9SChengchang Tang ret = rte_eth_dev_get_reg_info(i, ®_info); 1737d3319ef9SChengchang Tang if (ret) { 1738d3319ef9SChengchang Tang printf("Error getting device reg info: %d\n", ret); 1739d3319ef9SChengchang Tang continue; 1740d3319ef9SChengchang Tang } 1741d3319ef9SChengchang Tang 1742d3319ef9SChengchang Tang buf_size = reg_info.length * reg_info.width; 1743d3319ef9SChengchang Tang buf_data = malloc(buf_size); 1744d3319ef9SChengchang Tang if (buf_data == NULL) { 1745d3319ef9SChengchang Tang printf("Error allocating %zu bytes buffer\n", buf_size); 1746d3319ef9SChengchang Tang continue; 1747d3319ef9SChengchang Tang } 1748d3319ef9SChengchang Tang 1749d3319ef9SChengchang Tang reg_info.data = buf_data; 1750d3319ef9SChengchang Tang reg_info.length = 0; 1751d3319ef9SChengchang Tang ret = rte_eth_dev_get_reg_info(i, ®_info); 1752d3319ef9SChengchang Tang if (ret) { 1753d3319ef9SChengchang Tang printf("Error getting regs from device: %d\n", ret); 1754d3319ef9SChengchang Tang free(buf_data); 1755d3319ef9SChengchang Tang continue; 1756d3319ef9SChengchang Tang } 1757d3319ef9SChengchang Tang 1758d3319ef9SChengchang Tang snprintf(file_name, MAX_FILE_NAME_SZ, "%s-port%u", 1759d3319ef9SChengchang Tang file_prefix, i); 1760d3319ef9SChengchang Tang fp_regs = fopen(file_name, "wb"); 1761d3319ef9SChengchang Tang if (fp_regs == NULL) { 1762d3319ef9SChengchang Tang printf("Error during opening '%s' for writing: %s\n", 1763d3319ef9SChengchang Tang file_name, strerror(errno)); 1764d3319ef9SChengchang Tang } else { 1765d3319ef9SChengchang Tang size_t nr_written; 1766d3319ef9SChengchang Tang 1767d3319ef9SChengchang Tang nr_written = fwrite(buf_data, 1, buf_size, fp_regs); 1768d3319ef9SChengchang Tang if (nr_written != buf_size) 1769d3319ef9SChengchang Tang printf("Error during writing %s: %s\n", 1770d3319ef9SChengchang Tang file_prefix, strerror(errno)); 1771d3319ef9SChengchang Tang else 1772d3319ef9SChengchang Tang printf("Device (%s) regs dumped successfully, " 1773d3319ef9SChengchang Tang "driver:%s version:0X%08X\n", 1774ec5ecd7eSDavid Marchand rte_dev_name(dev_info.device), 1775d3319ef9SChengchang Tang dev_info.driver_name, reg_info.version); 1776d3319ef9SChengchang Tang 1777d3319ef9SChengchang Tang fclose(fp_regs); 1778d3319ef9SChengchang Tang } 1779d3319ef9SChengchang Tang 1780d3319ef9SChengchang Tang free(buf_data); 1781d3319ef9SChengchang Tang } 1782d3319ef9SChengchang Tang } 1783d3319ef9SChengchang Tang 17844778a8ecSMin Hu (Connor) static void 17854778a8ecSMin Hu (Connor) show_version(void) 17864778a8ecSMin Hu (Connor) { 17874778a8ecSMin Hu (Connor) snprintf(bdr_str, MAX_STRING_LEN, " show - DPDK version "); 17884778a8ecSMin Hu (Connor) STATS_BDR_STR(10, bdr_str); 17894778a8ecSMin Hu (Connor) printf("DPDK version: %s\n", rte_version()); 17904778a8ecSMin Hu (Connor) } 17914778a8ecSMin Hu (Connor) 179237ebf5abSDongdong Liu static void 179337ebf5abSDongdong Liu show_firmware_version(void) 179437ebf5abSDongdong Liu { 179537ebf5abSDongdong Liu char fw_version[ETHDEV_FWVERS_LEN]; 179637ebf5abSDongdong Liu uint16_t i; 179737ebf5abSDongdong Liu 179837ebf5abSDongdong Liu snprintf(bdr_str, MAX_STRING_LEN, " show - firmware version "); 179937ebf5abSDongdong Liu STATS_BDR_STR(10, bdr_str); 180037ebf5abSDongdong Liu 180137ebf5abSDongdong Liu RTE_ETH_FOREACH_DEV(i) { 180237ebf5abSDongdong Liu /* Skip if port is not in mask */ 180337ebf5abSDongdong Liu if ((enabled_port_mask & (1ul << i)) == 0) 180437ebf5abSDongdong Liu continue; 180537ebf5abSDongdong Liu 180637ebf5abSDongdong Liu if (rte_eth_dev_fw_version_get(i, fw_version, 180737ebf5abSDongdong Liu ETHDEV_FWVERS_LEN) == 0) 180837ebf5abSDongdong Liu printf("Ethdev port %u firmware version: %s\n", i, 180937ebf5abSDongdong Liu fw_version); 181037ebf5abSDongdong Liu else 181137ebf5abSDongdong Liu printf("Ethdev port %u firmware version: %s\n", i, 181237ebf5abSDongdong Liu "not available"); 181337ebf5abSDongdong Liu } 181437ebf5abSDongdong Liu } 181537ebf5abSDongdong Liu 18160cc5126cSMin Hu (Connor) static void 18170cc5126cSMin Hu (Connor) show_port_rss_reta_info(void) 18180cc5126cSMin Hu (Connor) { 18190cc5126cSMin Hu (Connor) struct rte_eth_rss_reta_entry64 reta_conf[RTE_RETA_CONF_GROUP_NUM + 1]; 18200cc5126cSMin Hu (Connor) struct rte_eth_dev_info dev_info; 18210cc5126cSMin Hu (Connor) uint16_t i, idx, shift; 18220cc5126cSMin Hu (Connor) uint16_t num; 18230cc5126cSMin Hu (Connor) uint16_t id; 18240cc5126cSMin Hu (Connor) int ret; 18250cc5126cSMin Hu (Connor) 18260cc5126cSMin Hu (Connor) RTE_ETH_FOREACH_DEV(id) { 18270cc5126cSMin Hu (Connor) /* Skip if port is not in mask */ 18280cc5126cSMin Hu (Connor) if ((enabled_port_mask & (1ul << id)) == 0) 18290cc5126cSMin Hu (Connor) continue; 18300cc5126cSMin Hu (Connor) 18310cc5126cSMin Hu (Connor) snprintf(bdr_str, MAX_STRING_LEN, " Port %u ", id); 18320cc5126cSMin Hu (Connor) STATS_BDR_STR(5, bdr_str); 18330cc5126cSMin Hu (Connor) 18340cc5126cSMin Hu (Connor) ret = rte_eth_dev_info_get(id, &dev_info); 18350cc5126cSMin Hu (Connor) if (ret != 0) { 18360cc5126cSMin Hu (Connor) fprintf(stderr, "Error getting device info: %s\n", 18370cc5126cSMin Hu (Connor) strerror(-ret)); 18380cc5126cSMin Hu (Connor) return; 18390cc5126cSMin Hu (Connor) } 18400cc5126cSMin Hu (Connor) 18410cc5126cSMin Hu (Connor) num = DIV_ROUND_UP(dev_info.reta_size, RTE_ETH_RETA_GROUP_SIZE); 18420cc5126cSMin Hu (Connor) memset(reta_conf, 0, sizeof(reta_conf)); 18430cc5126cSMin Hu (Connor) for (i = 0; i < num; i++) 18440cc5126cSMin Hu (Connor) reta_conf[i].mask = ~0ULL; 18450cc5126cSMin Hu (Connor) 18460cc5126cSMin Hu (Connor) ret = rte_eth_dev_rss_reta_query(id, reta_conf, dev_info.reta_size); 18470cc5126cSMin Hu (Connor) if (ret != 0) { 18480cc5126cSMin Hu (Connor) fprintf(stderr, "Error getting RSS RETA info: %s\n", 18490cc5126cSMin Hu (Connor) strerror(-ret)); 18500cc5126cSMin Hu (Connor) return; 18510cc5126cSMin Hu (Connor) } 18520cc5126cSMin Hu (Connor) 18530cc5126cSMin Hu (Connor) for (i = 0; i < dev_info.reta_size; i++) { 18540cc5126cSMin Hu (Connor) idx = i / RTE_ETH_RETA_GROUP_SIZE; 18550cc5126cSMin Hu (Connor) shift = i % RTE_ETH_RETA_GROUP_SIZE; 18560cc5126cSMin Hu (Connor) printf("RSS RETA configuration: hash index=%u, queue=%u\n", 18570cc5126cSMin Hu (Connor) i, reta_conf[idx].reta[shift]); 18580cc5126cSMin Hu (Connor) } 18590cc5126cSMin Hu (Connor) } 18600cc5126cSMin Hu (Connor) } 18610cc5126cSMin Hu (Connor) 18620084463eSMin Hu (Connor) static void 18630084463eSMin Hu (Connor) show_module_eeprom_info(void) 18640084463eSMin Hu (Connor) { 18650084463eSMin Hu (Connor) unsigned char bytes_eeprom[EEPROM_DUMP_CHUNKSIZE]; 18660084463eSMin Hu (Connor) struct rte_eth_dev_module_info module_info; 18670084463eSMin Hu (Connor) struct rte_dev_eeprom_info eeprom_info; 18680084463eSMin Hu (Connor) uint16_t i; 18690084463eSMin Hu (Connor) int ret; 18700084463eSMin Hu (Connor) 18710084463eSMin Hu (Connor) RTE_ETH_FOREACH_DEV(i) { 18720084463eSMin Hu (Connor) /* Skip if port is not in mask */ 18730084463eSMin Hu (Connor) if ((enabled_port_mask & (1ul << i)) == 0) 18740084463eSMin Hu (Connor) continue; 18750084463eSMin Hu (Connor) 18760084463eSMin Hu (Connor) snprintf(bdr_str, MAX_STRING_LEN, " Port %u ", i); 18770084463eSMin Hu (Connor) STATS_BDR_STR(5, bdr_str); 18780084463eSMin Hu (Connor) 18790084463eSMin Hu (Connor) ret = rte_eth_dev_get_module_info(i, &module_info); 18800084463eSMin Hu (Connor) if (ret != 0) { 18810084463eSMin Hu (Connor) fprintf(stderr, "Module EEPROM information read error: %s\n", 18820084463eSMin Hu (Connor) strerror(-ret)); 18830084463eSMin Hu (Connor) return; 18840084463eSMin Hu (Connor) } 18850084463eSMin Hu (Connor) 18860084463eSMin Hu (Connor) eeprom_info.offset = 0; 18870084463eSMin Hu (Connor) eeprom_info.length = module_info.eeprom_len; 18880084463eSMin Hu (Connor) eeprom_info.data = bytes_eeprom; 18890084463eSMin Hu (Connor) 18900084463eSMin Hu (Connor) ret = rte_eth_dev_get_module_eeprom(i, &eeprom_info); 18910084463eSMin Hu (Connor) if (ret != 0) { 18920084463eSMin Hu (Connor) fprintf(stderr, "Module EEPROM read error: %s\n", 18930084463eSMin Hu (Connor) strerror(-ret)); 18940084463eSMin Hu (Connor) return; 18950084463eSMin Hu (Connor) } 18960084463eSMin Hu (Connor) 18970084463eSMin Hu (Connor) rte_hexdump(stdout, "hexdump", eeprom_info.data, 18980084463eSMin Hu (Connor) eeprom_info.length); 18990084463eSMin Hu (Connor) printf("Finish -- Port: %u MODULE EEPROM length: %d bytes\n", 19000084463eSMin Hu (Connor) i, eeprom_info.length); 19010084463eSMin Hu (Connor) } 19020084463eSMin Hu (Connor) } 19030084463eSMin Hu (Connor) 19046ff065b2SDongdong Liu static void 19056ff065b2SDongdong Liu nic_rx_descriptor_display(uint16_t port_id, struct desc_param *desc) 19066ff065b2SDongdong Liu { 19076ff065b2SDongdong Liu uint16_t queue_id = desc->queue_id; 19086ff065b2SDongdong Liu uint16_t offset = desc->offset; 19096ff065b2SDongdong Liu uint16_t num = desc->num; 19106ff065b2SDongdong Liu int ret; 19116ff065b2SDongdong Liu 19126ff065b2SDongdong Liu snprintf(bdr_str, MAX_STRING_LEN, " show - Rx descriptor "); 19136ff065b2SDongdong Liu STATS_BDR_STR(10, bdr_str); 19146ff065b2SDongdong Liu 19156ff065b2SDongdong Liu printf("Dump ethdev Rx descriptor for port %u, queue %u, offset %u, num %u\n", 19166ff065b2SDongdong Liu port_id, queue_id, offset, num); 19176ff065b2SDongdong Liu 19186ff065b2SDongdong Liu ret = rte_eth_rx_descriptor_dump(port_id, queue_id, offset, num, 19196ff065b2SDongdong Liu stdout); 19206ff065b2SDongdong Liu if (ret < 0) 19216ff065b2SDongdong Liu fprintf(stderr, "Error dumping ethdev Rx descriptor: %s\n", 19226ff065b2SDongdong Liu strerror(-ret)); 19236ff065b2SDongdong Liu } 19246ff065b2SDongdong Liu 19256ff065b2SDongdong Liu static void 19266ff065b2SDongdong Liu nic_tx_descriptor_display(uint16_t port_id, struct desc_param *desc) 19276ff065b2SDongdong Liu { 19286ff065b2SDongdong Liu uint16_t queue_id = desc->queue_id; 19296ff065b2SDongdong Liu uint16_t offset = desc->offset; 19306ff065b2SDongdong Liu uint16_t num = desc->num; 19316ff065b2SDongdong Liu int ret; 19326ff065b2SDongdong Liu 19336ff065b2SDongdong Liu snprintf(bdr_str, MAX_STRING_LEN, " show - Tx descriptor "); 19346ff065b2SDongdong Liu STATS_BDR_STR(10, bdr_str); 19356ff065b2SDongdong Liu 19366ff065b2SDongdong Liu printf("Dump ethdev Tx descriptor for port %u, queue %u, offset %u, num %u\n", 19376ff065b2SDongdong Liu port_id, queue_id, offset, num); 19386ff065b2SDongdong Liu 19396ff065b2SDongdong Liu ret = rte_eth_tx_descriptor_dump(port_id, queue_id, offset, num, 19406ff065b2SDongdong Liu stdout); 19416ff065b2SDongdong Liu if (ret < 0) 19426ff065b2SDongdong Liu fprintf(stderr, "Error dumping ethdev Tx descriptor: %s\n", 19436ff065b2SDongdong Liu strerror(-ret)); 19446ff065b2SDongdong Liu } 19456ff065b2SDongdong Liu 1946674bb390SAbdullah Sevincer static void 1947674bb390SAbdullah Sevincer xstats_display(uint8_t dev_id, 1948674bb390SAbdullah Sevincer enum rte_event_dev_xstats_mode mode, 1949674bb390SAbdullah Sevincer uint8_t queue_port_id) 1950674bb390SAbdullah Sevincer { 1951674bb390SAbdullah Sevincer int ret; 1952674bb390SAbdullah Sevincer struct rte_event_dev_xstats_name *xstats_names; 1953674bb390SAbdullah Sevincer uint64_t *ids; 1954674bb390SAbdullah Sevincer uint64_t *values; 1955674bb390SAbdullah Sevincer int size; 1956674bb390SAbdullah Sevincer int i; 1957674bb390SAbdullah Sevincer 1958674bb390SAbdullah Sevincer size = rte_event_dev_xstats_names_get(dev_id, 1959674bb390SAbdullah Sevincer mode, 1960674bb390SAbdullah Sevincer queue_port_id, 1961674bb390SAbdullah Sevincer NULL, /* names */ 1962674bb390SAbdullah Sevincer NULL, /* ids */ 1963674bb390SAbdullah Sevincer 0); /* num */ 1964674bb390SAbdullah Sevincer 1965674bb390SAbdullah Sevincer if (size < 0) 1966674bb390SAbdullah Sevincer rte_panic("rte_event_dev_xstats_names_get err %d\n", size); 1967674bb390SAbdullah Sevincer 1968674bb390SAbdullah Sevincer if (size == 0) { 1969674bb390SAbdullah Sevincer printf( 1970674bb390SAbdullah Sevincer "No stats available for this item, mode=%d, queue_port_id=%d\n", 1971674bb390SAbdullah Sevincer mode, queue_port_id); 1972674bb390SAbdullah Sevincer return; 1973674bb390SAbdullah Sevincer } 1974674bb390SAbdullah Sevincer 1975674bb390SAbdullah Sevincer /* Get memory to hold stat names, IDs, and values */ 1976674bb390SAbdullah Sevincer xstats_names = malloc(sizeof(struct rte_event_dev_xstats_name) * (unsigned int)size); 1977674bb390SAbdullah Sevincer ids = malloc(sizeof(unsigned int) * size); 1978674bb390SAbdullah Sevincer 1979674bb390SAbdullah Sevincer if (!xstats_names || !ids) 1980674bb390SAbdullah Sevincer rte_panic("unable to alloc memory for stats retrieval\n"); 1981674bb390SAbdullah Sevincer 1982674bb390SAbdullah Sevincer ret = rte_event_dev_xstats_names_get(dev_id, mode, queue_port_id, 1983674bb390SAbdullah Sevincer xstats_names, ids, 1984674bb390SAbdullah Sevincer (unsigned int)size); 1985674bb390SAbdullah Sevincer if (ret != size) 1986674bb390SAbdullah Sevincer rte_panic("rte_event_dev_xstats_names_get err %d\n", ret); 1987674bb390SAbdullah Sevincer 1988674bb390SAbdullah Sevincer values = malloc(sizeof(uint64_t) * size); 1989674bb390SAbdullah Sevincer if (!values) 1990674bb390SAbdullah Sevincer rte_panic("unable to alloc memory for stats retrieval\n"); 1991674bb390SAbdullah Sevincer 1992674bb390SAbdullah Sevincer ret = rte_event_dev_xstats_get(dev_id, mode, queue_port_id, 1993674bb390SAbdullah Sevincer ids, values, size); 1994674bb390SAbdullah Sevincer 1995674bb390SAbdullah Sevincer if (ret != size) 1996674bb390SAbdullah Sevincer rte_panic("rte_event_dev_xstats_get err %d\n", ret); 1997674bb390SAbdullah Sevincer 1998674bb390SAbdullah Sevincer for (i = 0; i < size; i++) { 1999674bb390SAbdullah Sevincer printf("id %"PRIu64" %s = %"PRIu64"\n", 2000674bb390SAbdullah Sevincer ids[i], &xstats_names[i].name[0], values[i]); 2001674bb390SAbdullah Sevincer } 2002674bb390SAbdullah Sevincer 2003674bb390SAbdullah Sevincer free(values); 2004674bb390SAbdullah Sevincer free(xstats_names); 2005674bb390SAbdullah Sevincer free(ids); 2006674bb390SAbdullah Sevincer 2007674bb390SAbdullah Sevincer } 2008674bb390SAbdullah Sevincer 2009674bb390SAbdullah Sevincer static void 2010674bb390SAbdullah Sevincer xstats_reset(uint8_t dev_id, 2011674bb390SAbdullah Sevincer enum rte_event_dev_xstats_mode mode, 2012674bb390SAbdullah Sevincer uint8_t queue_port_id) 2013674bb390SAbdullah Sevincer { 2014674bb390SAbdullah Sevincer int ret; 2015674bb390SAbdullah Sevincer struct rte_event_dev_xstats_name *xstats_names; 2016674bb390SAbdullah Sevincer uint64_t *ids; 2017674bb390SAbdullah Sevincer int size; 2018674bb390SAbdullah Sevincer 2019674bb390SAbdullah Sevincer size = rte_event_dev_xstats_names_get(dev_id, 2020674bb390SAbdullah Sevincer mode, 2021674bb390SAbdullah Sevincer queue_port_id, 2022674bb390SAbdullah Sevincer NULL, /* names */ 2023674bb390SAbdullah Sevincer NULL, /* ids */ 2024674bb390SAbdullah Sevincer 0); /* num */ 2025674bb390SAbdullah Sevincer 2026674bb390SAbdullah Sevincer if (size < 0) 2027674bb390SAbdullah Sevincer rte_panic("rte_event_dev_xstats_names_get err %d\n", size); 2028674bb390SAbdullah Sevincer 2029674bb390SAbdullah Sevincer if (size == 0) { 2030674bb390SAbdullah Sevincer printf( 2031674bb390SAbdullah Sevincer "No stats available for this item, mode=%d, queue_port_id=%d\n", 2032674bb390SAbdullah Sevincer mode, queue_port_id); 2033674bb390SAbdullah Sevincer return; 2034674bb390SAbdullah Sevincer } 2035674bb390SAbdullah Sevincer 2036674bb390SAbdullah Sevincer /* Get memory to hold stat names, IDs, and values */ 2037674bb390SAbdullah Sevincer xstats_names = malloc(sizeof(struct rte_event_dev_xstats_name) * (unsigned int)size); 2038674bb390SAbdullah Sevincer ids = malloc(sizeof(unsigned int) * size); 2039674bb390SAbdullah Sevincer 2040674bb390SAbdullah Sevincer if (!xstats_names || !ids) 2041674bb390SAbdullah Sevincer rte_panic("unable to alloc memory for stats retrieval\n"); 2042674bb390SAbdullah Sevincer 2043674bb390SAbdullah Sevincer ret = rte_event_dev_xstats_names_get(dev_id, mode, queue_port_id, 2044674bb390SAbdullah Sevincer xstats_names, ids, 2045674bb390SAbdullah Sevincer (unsigned int)size); 2046674bb390SAbdullah Sevincer if (ret != size) 2047674bb390SAbdullah Sevincer rte_panic("rte_event_dev_xstats_names_get err %d\n", ret); 2048674bb390SAbdullah Sevincer 2049674bb390SAbdullah Sevincer rte_event_dev_xstats_reset(dev_id, mode, queue_port_id, 2050674bb390SAbdullah Sevincer ids, size); 2051674bb390SAbdullah Sevincer 2052674bb390SAbdullah Sevincer free(xstats_names); 2053674bb390SAbdullah Sevincer free(ids); 2054674bb390SAbdullah Sevincer 2055674bb390SAbdullah Sevincer } 2056674bb390SAbdullah Sevincer 2057e45f45beSAbdullah Sevincer static unsigned int 2058e45f45beSAbdullah Sevincer eventdev_xstats(void) 2059674bb390SAbdullah Sevincer { 2060e45f45beSAbdullah Sevincer unsigned int count = 0; 2061e45f45beSAbdullah Sevincer int i, j; 2062674bb390SAbdullah Sevincer 2063e45f45beSAbdullah Sevincer for (i = 0; i < rte_event_dev_count(); i++) { 2064674bb390SAbdullah Sevincer 2065674bb390SAbdullah Sevincer if (eventdev_var[i].dump_xstats) { 2066e45f45beSAbdullah Sevincer ++count; 2067674bb390SAbdullah Sevincer int ret = rte_event_dev_dump(i, stdout); 2068674bb390SAbdullah Sevincer 2069674bb390SAbdullah Sevincer if (ret) 2070674bb390SAbdullah Sevincer rte_panic("dump failed with err=%d\n", ret); 2071674bb390SAbdullah Sevincer } 2072674bb390SAbdullah Sevincer 2073674bb390SAbdullah Sevincer if (eventdev_var[i].shw_device_xstats == 1) { 2074e45f45beSAbdullah Sevincer ++count; 2075674bb390SAbdullah Sevincer xstats_display(i, RTE_EVENT_DEV_XSTATS_DEVICE, 0); 2076674bb390SAbdullah Sevincer 2077674bb390SAbdullah Sevincer if (eventdev_var[i].reset_xstats == 1) 2078674bb390SAbdullah Sevincer xstats_reset(i, RTE_EVENT_DEV_XSTATS_DEVICE, 0); 2079674bb390SAbdullah Sevincer } 2080674bb390SAbdullah Sevincer 2081674bb390SAbdullah Sevincer if (eventdev_var[i].shw_all_ports == 1) { 2082e45f45beSAbdullah Sevincer ++count; 2083674bb390SAbdullah Sevincer for (j = 0; j < MAX_PORTS_QUEUES; j++) { 2084674bb390SAbdullah Sevincer xstats_display(i, RTE_EVENT_DEV_XSTATS_PORT, j); 2085674bb390SAbdullah Sevincer 2086674bb390SAbdullah Sevincer if (eventdev_var[i].reset_xstats == 1) 2087674bb390SAbdullah Sevincer xstats_reset(i, RTE_EVENT_DEV_XSTATS_PORT, j); 2088674bb390SAbdullah Sevincer } 2089674bb390SAbdullah Sevincer } else { 2090e45f45beSAbdullah Sevincer if (eventdev_var[i].num_ports > 0) 2091e45f45beSAbdullah Sevincer ++count; 2092674bb390SAbdullah Sevincer for (j = 0; j < eventdev_var[i].num_ports; j++) { 2093674bb390SAbdullah Sevincer xstats_display(i, RTE_EVENT_DEV_XSTATS_PORT, 2094674bb390SAbdullah Sevincer eventdev_var[i].ports[j]); 2095674bb390SAbdullah Sevincer 2096674bb390SAbdullah Sevincer if (eventdev_var[i].reset_xstats == 1) 2097674bb390SAbdullah Sevincer xstats_reset(i, RTE_EVENT_DEV_XSTATS_PORT, 2098674bb390SAbdullah Sevincer eventdev_var[i].ports[j]); 2099674bb390SAbdullah Sevincer } 2100674bb390SAbdullah Sevincer } 2101674bb390SAbdullah Sevincer 2102674bb390SAbdullah Sevincer if (eventdev_var[i].shw_all_queues == 1) { 2103e45f45beSAbdullah Sevincer ++count; 2104674bb390SAbdullah Sevincer for (j = 0; j < MAX_PORTS_QUEUES; j++) { 2105674bb390SAbdullah Sevincer xstats_display(i, RTE_EVENT_DEV_XSTATS_QUEUE, j); 2106674bb390SAbdullah Sevincer 2107674bb390SAbdullah Sevincer if (eventdev_var[i].reset_xstats == 1) 2108674bb390SAbdullah Sevincer xstats_reset(i, RTE_EVENT_DEV_XSTATS_QUEUE, j); 2109674bb390SAbdullah Sevincer } 2110674bb390SAbdullah Sevincer } else { 2111e45f45beSAbdullah Sevincer if (eventdev_var[i].num_queues > 0) 2112e45f45beSAbdullah Sevincer ++count; 2113674bb390SAbdullah Sevincer for (j = 0; j < eventdev_var[i].num_queues; j++) { 2114674bb390SAbdullah Sevincer xstats_display(i, RTE_EVENT_DEV_XSTATS_QUEUE, 2115674bb390SAbdullah Sevincer eventdev_var[i].queues[j]); 2116674bb390SAbdullah Sevincer 2117674bb390SAbdullah Sevincer if (eventdev_var[i].reset_xstats == 1) 2118674bb390SAbdullah Sevincer xstats_reset(i, RTE_EVENT_DEV_XSTATS_QUEUE, 2119674bb390SAbdullah Sevincer eventdev_var[i].queues[j]); 2120674bb390SAbdullah Sevincer } 2121674bb390SAbdullah Sevincer } 2122674bb390SAbdullah Sevincer } 2123674bb390SAbdullah Sevincer 2124e45f45beSAbdullah Sevincer return count; 2125674bb390SAbdullah Sevincer } 2126674bb390SAbdullah Sevincer 21271a0accadSBruce Richardson int 21281a0accadSBruce Richardson main(int argc, char **argv) 21291a0accadSBruce Richardson { 21301a0accadSBruce Richardson int ret; 21311a0accadSBruce Richardson int i; 21321a0accadSBruce Richardson char c_flag[] = "-c1"; 21331a0accadSBruce Richardson char n_flag[] = "-n4"; 21341a0accadSBruce Richardson char mp_flag[] = "--proc-type=secondary"; 213594c4199dSStephen Hemminger char log_flag[] = "--log-level=6"; 213694c4199dSStephen Hemminger char *argp[argc + 4]; 21371a0accadSBruce Richardson uint16_t nb_ports; 21381a0accadSBruce Richardson 21391a0accadSBruce Richardson /* preparse app arguments */ 21401a0accadSBruce Richardson ret = proc_info_preparse_args(argc, argv); 21411a0accadSBruce Richardson if (ret < 0) { 21421a0accadSBruce Richardson printf("Failed to parse arguments\n"); 21431a0accadSBruce Richardson return -1; 21441a0accadSBruce Richardson } 21451a0accadSBruce Richardson 21461a0accadSBruce Richardson argp[0] = argv[0]; 21471a0accadSBruce Richardson argp[1] = c_flag; 21481a0accadSBruce Richardson argp[2] = n_flag; 21491a0accadSBruce Richardson argp[3] = mp_flag; 215094c4199dSStephen Hemminger argp[4] = log_flag; 21511a0accadSBruce Richardson 21521a0accadSBruce Richardson for (i = 1; i < argc; i++) 215394c4199dSStephen Hemminger argp[i + 4] = argv[i]; 21541a0accadSBruce Richardson 215594c4199dSStephen Hemminger argc += 4; 21561a0accadSBruce Richardson 21571a0accadSBruce Richardson ret = rte_eal_init(argc, argp); 21581a0accadSBruce Richardson if (ret < 0) 21591a0accadSBruce Richardson rte_panic("Cannot init EAL\n"); 21601a0accadSBruce Richardson 21611a0accadSBruce Richardson argc -= ret; 216294c4199dSStephen Hemminger argv += ret - 4; 21631a0accadSBruce Richardson 21641a0accadSBruce Richardson if (!rte_eal_primary_proc_alive(NULL)) 21651a0accadSBruce Richardson rte_exit(EXIT_FAILURE, "No primary DPDK process is running.\n"); 21661a0accadSBruce Richardson 21671a0accadSBruce Richardson /* parse app arguments */ 21681a0accadSBruce Richardson ret = proc_info_parse_args(argc, argv); 21691a0accadSBruce Richardson if (ret < 0) 21701a0accadSBruce Richardson rte_exit(EXIT_FAILURE, "Invalid argument\n"); 21711a0accadSBruce Richardson 21721a0accadSBruce Richardson if (mem_info) { 21731a0accadSBruce Richardson meminfo_display(); 2174*8a171e52SFidaullah Noonari goto cleanup; 21751a0accadSBruce Richardson } 21761a0accadSBruce Richardson 2177e45f45beSAbdullah Sevincer if (eventdev_xstats() > 0) 2178*8a171e52SFidaullah Noonari goto cleanup; 2179674bb390SAbdullah Sevincer 2180d9a42a69SThomas Monjalon nb_ports = rte_eth_dev_count_avail(); 21811a0accadSBruce Richardson if (nb_ports == 0) 21821a0accadSBruce Richardson rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n"); 21831a0accadSBruce Richardson 2184379e1d62SSubendu Santra /* If no port mask was specified, then show all non-owned ports */ 21851dd6cffbSStephen Hemminger if (enabled_port_mask == 0) { 21861dd6cffbSStephen Hemminger RTE_ETH_FOREACH_DEV(i) 2187379e1d62SSubendu Santra enabled_port_mask |= 1ul << i; 21881dd6cffbSStephen Hemminger } 21891a0accadSBruce Richardson 21901dd6cffbSStephen Hemminger for (i = 0; i < RTE_MAX_ETHPORTS; i++) { 21911dd6cffbSStephen Hemminger 21921dd6cffbSStephen Hemminger /* Skip if port is not in mask */ 21931dd6cffbSStephen Hemminger if ((enabled_port_mask & (1ul << i)) == 0) 21941dd6cffbSStephen Hemminger continue; 21951dd6cffbSStephen Hemminger 21961dd6cffbSStephen Hemminger /* Skip if port is unused */ 21971dd6cffbSStephen Hemminger if (!rte_eth_dev_is_valid_port(i)) 21981dd6cffbSStephen Hemminger continue; 21991dd6cffbSStephen Hemminger 22001a0accadSBruce Richardson if (enable_stats) 22011a0accadSBruce Richardson nic_stats_display(i); 22021a0accadSBruce Richardson else if (enable_xstats) 22031a0accadSBruce Richardson nic_xstats_display(i); 22041a0accadSBruce Richardson else if (reset_stats) 22051a0accadSBruce Richardson nic_stats_clear(i); 22061a0accadSBruce Richardson else if (reset_xstats) 22071a0accadSBruce Richardson nic_xstats_clear(i); 22081a0accadSBruce Richardson else if (enable_xstats_name) 22091a0accadSBruce Richardson nic_xstats_by_name_display(i, xstats_name); 22101a0accadSBruce Richardson else if (nb_xstats_ids > 0) 22111a0accadSBruce Richardson nic_xstats_by_ids_display(i, xstats_ids, 22121a0accadSBruce Richardson nb_xstats_ids); 2213bb9be9a4SDavid Marchand #ifdef RTE_LIB_METRICS 22141a0accadSBruce Richardson else if (enable_metrics) 22151a0accadSBruce Richardson metrics_display(i); 2216bb9be9a4SDavid Marchand #endif 22171dd6cffbSStephen Hemminger 22186ff065b2SDongdong Liu if (enable_shw_rx_desc_dump) 22196ff065b2SDongdong Liu nic_rx_descriptor_display(i, &rx_desc_param); 22206ff065b2SDongdong Liu if (enable_shw_tx_desc_dump) 22216ff065b2SDongdong Liu nic_tx_descriptor_display(i, &tx_desc_param); 22221a0accadSBruce Richardson } 22231a0accadSBruce Richardson 2224bb9be9a4SDavid Marchand #ifdef RTE_LIB_METRICS 22251a0accadSBruce Richardson /* print port independent stats */ 22261a0accadSBruce Richardson if (enable_metrics) 22271a0accadSBruce Richardson metrics_display(RTE_METRICS_GLOBAL); 2228bb9be9a4SDavid Marchand #endif 22291a0accadSBruce Richardson 22308a37f37fSVipin Varghese /* show information for PMD */ 22318a37f37fSVipin Varghese if (enable_shw_port) 22328a37f37fSVipin Varghese show_port(); 2233bb947a72SMin Hu (Connor) if (enable_shw_port_priv) 2234bb947a72SMin Hu (Connor) show_port_private_info(); 2235dbc72300SVipin Varghese if (enable_shw_tm) 2236dbc72300SVipin Varghese show_tm(); 2237fe773600SVipin Varghese if (enable_shw_crypto) 2238fe773600SVipin Varghese show_crypto(); 2239c13e8984SVipin Varghese if (enable_shw_ring) 2240c13e8984SVipin Varghese show_ring(ring_name); 22410101a0ecSVipin Varghese if (enable_shw_mempool) 22420101a0ecSVipin Varghese show_mempool(mempool_name); 22433056d22aSVipin Varghese if (enable_iter_mempool) 22443056d22aSVipin Varghese iter_mempool(mempool_iter_name); 2245d3319ef9SChengchang Tang if (enable_dump_regs) 2246d3319ef9SChengchang Tang dump_regs(dump_regs_file_prefix); 22474778a8ecSMin Hu (Connor) if (enable_shw_version) 22484778a8ecSMin Hu (Connor) show_version(); 224937ebf5abSDongdong Liu if (enable_shw_fw_version) 225037ebf5abSDongdong Liu show_firmware_version(); 22510cc5126cSMin Hu (Connor) if (enable_shw_rss_reta) 22520cc5126cSMin Hu (Connor) show_port_rss_reta_info(); 22530084463eSMin Hu (Connor) if (enable_shw_module_eeprom) 22540084463eSMin Hu (Connor) show_module_eeprom_info(); 22558a37f37fSVipin Varghese 225640d64b33SFerruh Yigit RTE_ETH_FOREACH_DEV(i) 225740d64b33SFerruh Yigit rte_eth_dev_close(i); 225840d64b33SFerruh Yigit 2259*8a171e52SFidaullah Noonari cleanup: 22601a0accadSBruce Richardson ret = rte_eal_cleanup(); 22611a0accadSBruce Richardson if (ret) 22621a0accadSBruce Richardson printf("Error from rte_eal_cleanup(), %d\n", ret); 22631a0accadSBruce Richardson 22641a0accadSBruce Richardson return 0; 22651a0accadSBruce Richardson } 2266