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