xref: /dpdk/drivers/net/intel/ice/ice_testpmd.c (revision c1d145834f287aa8cf53de914618a7312f2c360e)
1*c1d14583SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2*c1d14583SBruce Richardson  * Copyright(c) 2022 Intel Corporation.
3*c1d14583SBruce Richardson  */
4*c1d14583SBruce Richardson 
5*c1d14583SBruce Richardson #include <stdlib.h>
6*c1d14583SBruce Richardson #include <stdio.h>
7*c1d14583SBruce Richardson 
8*c1d14583SBruce Richardson #include <cmdline_parse_num.h>
9*c1d14583SBruce Richardson #include <cmdline_parse_string.h>
10*c1d14583SBruce Richardson 
11*c1d14583SBruce Richardson #include "testpmd.h"
12*c1d14583SBruce Richardson #include "ice_ethdev.h"
13*c1d14583SBruce Richardson 
14*c1d14583SBruce Richardson /* Fixed size for ICE ddp runtime configure */
15*c1d14583SBruce Richardson #define ICE_BUFF_SIZE	0x000c9000
16*c1d14583SBruce Richardson #define ICE_SWITCH_BUFF_SIZE	(4 * 1024 * 1024)
17*c1d14583SBruce Richardson 
18*c1d14583SBruce Richardson /* Dump device ddp package, only for ice PF */
19*c1d14583SBruce Richardson struct cmd_ddp_dump_result {
20*c1d14583SBruce Richardson 	cmdline_fixed_string_t ddp;
21*c1d14583SBruce Richardson 	cmdline_fixed_string_t dump;
22*c1d14583SBruce Richardson 	portid_t port_id;
23*c1d14583SBruce Richardson 	char filepath[];
24*c1d14583SBruce Richardson };
25*c1d14583SBruce Richardson 
26*c1d14583SBruce Richardson cmdline_parse_token_string_t cmd_ddp_dump_ddp =
27*c1d14583SBruce Richardson 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_result, ddp, "ddp");
28*c1d14583SBruce Richardson cmdline_parse_token_string_t cmd_ddp_dump_dump =
29*c1d14583SBruce Richardson 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_result, dump, "dump");
30*c1d14583SBruce Richardson cmdline_parse_token_num_t cmd_ddp_dump_port_id =
31*c1d14583SBruce Richardson 	TOKEN_NUM_INITIALIZER(struct cmd_ddp_dump_result, port_id, RTE_UINT16);
32*c1d14583SBruce Richardson cmdline_parse_token_string_t cmd_ddp_dump_filepath =
33*c1d14583SBruce Richardson 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_result, filepath, NULL);
34*c1d14583SBruce Richardson 
35*c1d14583SBruce Richardson static void
36*c1d14583SBruce Richardson cmd_ddp_dump_parsed(void *parsed_result,
37*c1d14583SBruce Richardson 		    __rte_unused struct cmdline *cl,
38*c1d14583SBruce Richardson 		    __rte_unused void *data)
39*c1d14583SBruce Richardson {
40*c1d14583SBruce Richardson 	struct cmd_ddp_dump_result *res = parsed_result;
41*c1d14583SBruce Richardson 	uint8_t *buff;
42*c1d14583SBruce Richardson 	uint32_t size;
43*c1d14583SBruce Richardson 	int ret = -ENOTSUP;
44*c1d14583SBruce Richardson 
45*c1d14583SBruce Richardson 	size = ICE_BUFF_SIZE;
46*c1d14583SBruce Richardson 	buff = (uint8_t *)malloc(ICE_BUFF_SIZE);
47*c1d14583SBruce Richardson 	if (buff) {
48*c1d14583SBruce Richardson 		ret = rte_pmd_ice_dump_package(res->port_id, &buff, &size);
49*c1d14583SBruce Richardson 		switch (ret) {
50*c1d14583SBruce Richardson 		case 0:
51*c1d14583SBruce Richardson 			save_file(res->filepath, buff, size);
52*c1d14583SBruce Richardson 			break;
53*c1d14583SBruce Richardson 		case -EINVAL:
54*c1d14583SBruce Richardson 			fprintf(stderr, "Invalid buffer size\n");
55*c1d14583SBruce Richardson 			break;
56*c1d14583SBruce Richardson 		case -ENOTSUP:
57*c1d14583SBruce Richardson 			fprintf(stderr,
58*c1d14583SBruce Richardson 				"Device doesn't support "
59*c1d14583SBruce Richardson 				"dump DDP runtime configure.\n");
60*c1d14583SBruce Richardson 			break;
61*c1d14583SBruce Richardson 		default:
62*c1d14583SBruce Richardson 			fprintf(stderr,
63*c1d14583SBruce Richardson 				"Failed to dump DDP runtime configure,"
64*c1d14583SBruce Richardson 				" error: (%s)\n", strerror(-ret));
65*c1d14583SBruce Richardson 		}
66*c1d14583SBruce Richardson 	}
67*c1d14583SBruce Richardson 	free(buff);
68*c1d14583SBruce Richardson }
69*c1d14583SBruce Richardson 
70*c1d14583SBruce Richardson cmdline_parse_inst_t cmd_ddp_dump = {
71*c1d14583SBruce Richardson 	.f = cmd_ddp_dump_parsed,
72*c1d14583SBruce Richardson 	.data = NULL,
73*c1d14583SBruce Richardson 	.help_str = "ddp dump <port_id> <config_path>",
74*c1d14583SBruce Richardson 	.tokens = {
75*c1d14583SBruce Richardson 		(void *)&cmd_ddp_dump_ddp,
76*c1d14583SBruce Richardson 		(void *)&cmd_ddp_dump_dump,
77*c1d14583SBruce Richardson 		(void *)&cmd_ddp_dump_port_id,
78*c1d14583SBruce Richardson 		(void *)&cmd_ddp_dump_filepath,
79*c1d14583SBruce Richardson 		NULL,
80*c1d14583SBruce Richardson 	},
81*c1d14583SBruce Richardson };
82*c1d14583SBruce Richardson 
83*c1d14583SBruce Richardson struct cmd_ddp_dump_switch_result {
84*c1d14583SBruce Richardson 	cmdline_fixed_string_t ddp;
85*c1d14583SBruce Richardson 	cmdline_fixed_string_t dump;
86*c1d14583SBruce Richardson 	cmdline_fixed_string_t swt;
87*c1d14583SBruce Richardson 	portid_t port_id;
88*c1d14583SBruce Richardson 	char filepath[];
89*c1d14583SBruce Richardson };
90*c1d14583SBruce Richardson 
91*c1d14583SBruce Richardson cmdline_parse_token_string_t cmd_ddp_dump_swt_ddp =
92*c1d14583SBruce Richardson 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_switch_result, ddp, "ddp");
93*c1d14583SBruce Richardson cmdline_parse_token_string_t cmd_ddp_dump_swt_dump =
94*c1d14583SBruce Richardson 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_switch_result, dump, "dump");
95*c1d14583SBruce Richardson cmdline_parse_token_string_t cmd_ddp_dump_swt_switch =
96*c1d14583SBruce Richardson 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_switch_result, swt, "switch");
97*c1d14583SBruce Richardson cmdline_parse_token_num_t cmd_ddp_dump_swt_port_id =
98*c1d14583SBruce Richardson 	TOKEN_NUM_INITIALIZER(struct cmd_ddp_dump_switch_result, port_id, RTE_UINT16);
99*c1d14583SBruce Richardson cmdline_parse_token_string_t cmd_ddp_dump_swt_filepath =
100*c1d14583SBruce Richardson 	TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_switch_result, filepath, NULL);
101*c1d14583SBruce Richardson 
102*c1d14583SBruce Richardson static void
103*c1d14583SBruce Richardson cmd_ddp_dump_switch_parsed(void *parsed_result,
104*c1d14583SBruce Richardson 			   __rte_unused struct cmdline *cl,
105*c1d14583SBruce Richardson 			   __rte_unused void *data)
106*c1d14583SBruce Richardson {
107*c1d14583SBruce Richardson 	struct cmd_ddp_dump_switch_result *res = parsed_result;
108*c1d14583SBruce Richardson 	uint8_t *buff;
109*c1d14583SBruce Richardson 	uint32_t size;
110*c1d14583SBruce Richardson 	int ret = -ENOTSUP;
111*c1d14583SBruce Richardson 
112*c1d14583SBruce Richardson 	size = ICE_SWITCH_BUFF_SIZE;
113*c1d14583SBruce Richardson 	buff = malloc(size);
114*c1d14583SBruce Richardson 	if (buff) {
115*c1d14583SBruce Richardson 		ret = rte_pmd_ice_dump_switch(res->port_id, &buff, &size);
116*c1d14583SBruce Richardson 		switch (ret) {
117*c1d14583SBruce Richardson 		case 0:
118*c1d14583SBruce Richardson 			save_file(res->filepath, buff, size);
119*c1d14583SBruce Richardson 			break;
120*c1d14583SBruce Richardson 		case -EINVAL:
121*c1d14583SBruce Richardson 			fprintf(stderr, "Invalid buffer size\n");
122*c1d14583SBruce Richardson 			break;
123*c1d14583SBruce Richardson 		case -ENOTSUP:
124*c1d14583SBruce Richardson 			fprintf(stderr,
125*c1d14583SBruce Richardson 				"Device doesn't support "
126*c1d14583SBruce Richardson 				"dump DDP switch runtime configure.\n");
127*c1d14583SBruce Richardson 			break;
128*c1d14583SBruce Richardson 		default:
129*c1d14583SBruce Richardson 			fprintf(stderr,
130*c1d14583SBruce Richardson 				"Failed to dump DDP switch runtime configure,"
131*c1d14583SBruce Richardson 				" error: (%s)\n", strerror(-ret));
132*c1d14583SBruce Richardson 		}
133*c1d14583SBruce Richardson 	}
134*c1d14583SBruce Richardson 	free(buff);
135*c1d14583SBruce Richardson }
136*c1d14583SBruce Richardson 
137*c1d14583SBruce Richardson 
138*c1d14583SBruce Richardson cmdline_parse_inst_t cmd_ddp_dump_switch = {
139*c1d14583SBruce Richardson 	.f = cmd_ddp_dump_switch_parsed,
140*c1d14583SBruce Richardson 	.data = NULL,
141*c1d14583SBruce Richardson 	.help_str = "ddp dump switch <port_id> <config_path>",
142*c1d14583SBruce Richardson 	.tokens = {
143*c1d14583SBruce Richardson 		(void *)&cmd_ddp_dump_swt_ddp,
144*c1d14583SBruce Richardson 		(void *)&cmd_ddp_dump_swt_dump,
145*c1d14583SBruce Richardson 		(void *)&cmd_ddp_dump_swt_switch,
146*c1d14583SBruce Richardson 		(void *)&cmd_ddp_dump_swt_port_id,
147*c1d14583SBruce Richardson 		(void *)&cmd_ddp_dump_swt_filepath,
148*c1d14583SBruce Richardson 		NULL,
149*c1d14583SBruce Richardson 	},
150*c1d14583SBruce Richardson };
151*c1d14583SBruce Richardson 
152*c1d14583SBruce Richardson /* Dump Tx Scheduling Tree configuration, only for ice PF */
153*c1d14583SBruce Richardson struct cmd_txsched_dump_result {
154*c1d14583SBruce Richardson 	cmdline_fixed_string_t txsched;
155*c1d14583SBruce Richardson 	cmdline_fixed_string_t dump;
156*c1d14583SBruce Richardson 	portid_t port_id;
157*c1d14583SBruce Richardson 	cmdline_fixed_string_t mode;
158*c1d14583SBruce Richardson 	char filepath[];
159*c1d14583SBruce Richardson };
160*c1d14583SBruce Richardson 
161*c1d14583SBruce Richardson cmdline_parse_token_string_t cmd_txsched_dump_txsched =
162*c1d14583SBruce Richardson 	TOKEN_STRING_INITIALIZER(struct cmd_txsched_dump_result, txsched, "txsched");
163*c1d14583SBruce Richardson cmdline_parse_token_string_t cmd_txsched_dump_dump =
164*c1d14583SBruce Richardson 	TOKEN_STRING_INITIALIZER(struct cmd_txsched_dump_result, dump, "dump");
165*c1d14583SBruce Richardson cmdline_parse_token_num_t cmd_txsched_dump_port_id =
166*c1d14583SBruce Richardson 	TOKEN_NUM_INITIALIZER(struct cmd_txsched_dump_result, port_id, RTE_UINT16);
167*c1d14583SBruce Richardson cmdline_parse_token_string_t cmd_txsched_dump_mode =
168*c1d14583SBruce Richardson 	TOKEN_STRING_INITIALIZER(struct cmd_txsched_dump_result, mode, "brief#detail");
169*c1d14583SBruce Richardson cmdline_parse_token_string_t cmd_txsched_dump_filepath =
170*c1d14583SBruce Richardson 	TOKEN_STRING_INITIALIZER(struct cmd_txsched_dump_result, filepath, NULL);
171*c1d14583SBruce Richardson 
172*c1d14583SBruce Richardson static void
173*c1d14583SBruce Richardson cmd_txsched_dump_parsed(void *parsed_result,
174*c1d14583SBruce Richardson 			__rte_unused struct cmdline *cl,
175*c1d14583SBruce Richardson 			__rte_unused void *data)
176*c1d14583SBruce Richardson {
177*c1d14583SBruce Richardson 	struct cmd_txsched_dump_result *res = parsed_result;
178*c1d14583SBruce Richardson 	bool detail = false;
179*c1d14583SBruce Richardson 	FILE *fp;
180*c1d14583SBruce Richardson 
181*c1d14583SBruce Richardson 	if (!strcmp(res->mode, "detail"))
182*c1d14583SBruce Richardson 		detail = true;
183*c1d14583SBruce Richardson 
184*c1d14583SBruce Richardson 	fp = fopen(res->filepath, "w");
185*c1d14583SBruce Richardson 	if (fp == NULL) {
186*c1d14583SBruce Richardson 		fprintf(stderr, "Failed to open file\n");
187*c1d14583SBruce Richardson 		return;
188*c1d14583SBruce Richardson 	}
189*c1d14583SBruce Richardson 
190*c1d14583SBruce Richardson 	if (rte_pmd_ice_dump_txsched(res->port_id, detail, fp))
191*c1d14583SBruce Richardson 		fprintf(stderr, "Failed to dump Tx scheduring runtime configure.\n");
192*c1d14583SBruce Richardson 	fclose(fp);
193*c1d14583SBruce Richardson }
194*c1d14583SBruce Richardson 
195*c1d14583SBruce Richardson cmdline_parse_inst_t cmd_txsched_dump = {
196*c1d14583SBruce Richardson 	.f = cmd_txsched_dump_parsed,
197*c1d14583SBruce Richardson 	.data = NULL,
198*c1d14583SBruce Richardson 	.help_str = "txsched dump <port_id> <brief|detail> <config_path>",
199*c1d14583SBruce Richardson 	.tokens = {
200*c1d14583SBruce Richardson 		(void *)&cmd_txsched_dump_txsched,
201*c1d14583SBruce Richardson 		(void *)&cmd_txsched_dump_dump,
202*c1d14583SBruce Richardson 		(void *)&cmd_txsched_dump_port_id,
203*c1d14583SBruce Richardson 		(void *)&cmd_txsched_dump_mode,
204*c1d14583SBruce Richardson 		(void *)&cmd_txsched_dump_filepath,
205*c1d14583SBruce Richardson 		NULL,
206*c1d14583SBruce Richardson 	},
207*c1d14583SBruce Richardson };
208*c1d14583SBruce Richardson 
209*c1d14583SBruce Richardson static struct testpmd_driver_commands ice_cmds = {
210*c1d14583SBruce Richardson 	.commands = {
211*c1d14583SBruce Richardson 	{
212*c1d14583SBruce Richardson 		&cmd_ddp_dump,
213*c1d14583SBruce Richardson 		"ddp dump (port_id) (config_path)\n"
214*c1d14583SBruce Richardson 		"    Dump a runtime configure on a port\n\n",
215*c1d14583SBruce Richardson 
216*c1d14583SBruce Richardson 	},
217*c1d14583SBruce Richardson 	{
218*c1d14583SBruce Richardson 		&cmd_ddp_dump_switch,
219*c1d14583SBruce Richardson 		"ddp dump switch (port_id) (config_path)\n"
220*c1d14583SBruce Richardson 		"    Dump a runtime switch configure on a port\n\n",
221*c1d14583SBruce Richardson 
222*c1d14583SBruce Richardson 	},
223*c1d14583SBruce Richardson 	{
224*c1d14583SBruce Richardson 		&cmd_txsched_dump,
225*c1d14583SBruce Richardson 		"txsched dump (port_id) <brief|detail> (config_path)\n"
226*c1d14583SBruce Richardson 		"    Dump tx scheduling runtime configure on a port\n\n",
227*c1d14583SBruce Richardson 
228*c1d14583SBruce Richardson 	},
229*c1d14583SBruce Richardson 	{ NULL, NULL },
230*c1d14583SBruce Richardson 	},
231*c1d14583SBruce Richardson };
232*c1d14583SBruce Richardson 
233*c1d14583SBruce Richardson TESTPMD_ADD_DRIVER_COMMANDS(ice_cmds)
234