xref: /dpdk/app/proc-info/main.c (revision 8a171e52ed8b26f768ced79a22286914ebd30180)
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(&reg_info, 0, sizeof(reg_info));
1736d3319ef9SChengchang Tang 		ret = rte_eth_dev_get_reg_info(i, &reg_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, &reg_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