app/testpmd: enable DDP get info feature

This patch demonstrates how to get information about dynamic device
personalization (DDP) profile.

Command 'ddp get info (path_to_profile)' extracts and prints
information about the given profile.

Signed-off-by: Andrey Chilikin <andrey.chilikin@intel.com>
Acked-by: Beilei Xing <beilei.xing@intel.com>
This commit is contained in:
Andrey Chilikin 2017-06-16 10:25:15 +01:00 committed by Ferruh Yigit
parent edeab742ed
commit 37a56cce7b
2 changed files with 138 additions and 0 deletions

View File

@ -221,6 +221,9 @@ static void cmd_help_long_parsed(void *parsed_result,
"ddp get list (port_id)\n"
" Get ddp profile info list\n\n"
"ddp get info (profile_path)\n"
" Get ddp profile information.\n\n"
"show vf stats (port_id) (vf_id)\n"
" Display a VF's statistics.\n\n"
@ -12996,6 +12999,133 @@ cmdline_parse_inst_t cmd_ddp_add = {
},
};
/* Get dynamic device personalization profile info */
struct cmd_ddp_info_result {
cmdline_fixed_string_t ddp;
cmdline_fixed_string_t get;
cmdline_fixed_string_t info;
char filepath[];
};
cmdline_parse_token_string_t cmd_ddp_info_ddp =
TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, ddp, "ddp");
cmdline_parse_token_string_t cmd_ddp_info_get =
TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, get, "get");
cmdline_parse_token_string_t cmd_ddp_info_info =
TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, info, "info");
cmdline_parse_token_string_t cmd_ddp_info_filepath =
TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, filepath, NULL);
static void
cmd_ddp_info_parsed(
void *parsed_result,
__attribute__((unused)) struct cmdline *cl,
__attribute__((unused)) void *data)
{
struct cmd_ddp_info_result *res = parsed_result;
uint8_t *pkg;
uint32_t pkg_size;
int ret = -ENOTSUP;
#ifdef RTE_LIBRTE_I40E_PMD
uint32_t i;
uint8_t *buff;
uint32_t buff_size;
struct rte_pmd_i40e_profile_info info;
uint32_t dev_num;
struct rte_pmd_i40e_ddp_device_id *devs;
#endif
pkg = open_ddp_package_file(res->filepath, &pkg_size);
if (!pkg)
return;
#ifdef RTE_LIBRTE_I40E_PMD
ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
(uint8_t *)&info, sizeof(info),
RTE_PMD_I40E_PKG_INFO_GLOBAL_HEADER);
if (!ret) {
printf("Global Track id: 0x%x\n", info.track_id);
printf("Global Version: %d.%d.%d.%d\n",
info.version.major,
info.version.minor,
info.version.update,
info.version.draft);
printf("Global Package name: %s\n\n", info.name);
}
ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
(uint8_t *)&info, sizeof(info),
RTE_PMD_I40E_PKG_INFO_HEADER);
if (!ret) {
printf("i40e Profile Track id: 0x%x\n", info.track_id);
printf("i40e Profile Version: %d.%d.%d.%d\n",
info.version.major,
info.version.minor,
info.version.update,
info.version.draft);
printf("i40e Profile name: %s\n\n", info.name);
}
ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
(uint8_t *)&buff_size, sizeof(buff_size),
RTE_PMD_I40E_PKG_INFO_GLOBAL_NOTES_SIZE);
if (!ret && buff_size) {
buff = (uint8_t *)malloc(buff_size);
if (buff) {
ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
buff, buff_size,
RTE_PMD_I40E_PKG_INFO_GLOBAL_NOTES);
if (!ret)
printf("Package Notes:\n%s\n\n", buff);
free(buff);
}
}
ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
(uint8_t *)&dev_num, sizeof(dev_num),
RTE_PMD_I40E_PKG_INFO_DEVID_NUM);
if (!ret && dev_num) {
devs = (struct rte_pmd_i40e_ddp_device_id *)malloc(dev_num *
sizeof(struct rte_pmd_i40e_ddp_device_id));
if (devs) {
ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
(uint8_t *)devs, dev_num *
sizeof(struct rte_pmd_i40e_ddp_device_id),
RTE_PMD_I40E_PKG_INFO_DEVID_LIST);
if (!ret) {
printf("List of supported devices:\n");
for (i = 0; i < dev_num; i++) {
printf(" %04X:%04X %04X:%04X\n",
devs[i].vendor_dev_id >> 16,
devs[i].vendor_dev_id & 0xFFFF,
devs[i].sub_vendor_dev_id >> 16,
devs[i].sub_vendor_dev_id & 0xFFFF);
}
printf("\n");
}
free(devs);
}
}
ret = 0;
#endif
if (ret == -ENOTSUP)
printf("Function not supported in PMD driver\n");
close_ddp_package_file(pkg);
}
cmdline_parse_inst_t cmd_ddp_get_info = {
.f = cmd_ddp_info_parsed,
.data = NULL,
.help_str = "ddp get info <profile_path>",
.tokens = {
(void *)&cmd_ddp_info_ddp,
(void *)&cmd_ddp_info_get,
(void *)&cmd_ddp_info_info,
(void *)&cmd_ddp_info_filepath,
NULL,
},
};
/* Get dynamic device personalization profile info list*/
#define PROFILE_INFO_SIZE 48
#define MAX_PROFILE_NUM 16
@ -13849,6 +13979,7 @@ cmdline_parse_ctx_t main_ctx[] = {
(cmdline_parse_inst_t *)&cmd_tc_min_bw,
(cmdline_parse_inst_t *)&cmd_ddp_add,
(cmdline_parse_inst_t *)&cmd_ddp_get_list,
(cmdline_parse_inst_t *)&cmd_ddp_get_info,
(cmdline_parse_inst_t *)&cmd_show_vf_stats,
(cmdline_parse_inst_t *)&cmd_clear_vf_stats,
(cmdline_parse_inst_t *)&cmd_ptype_mapping_get,

View File

@ -387,6 +387,13 @@ Get loaded dynamic device personalization (DDP) package info list::
testpmd> ddp get list (port_id)
ddp get info
~~~~~~~~~~~~
Display information about dynamic device personalization (DDP) profile::
testpmd> ddp get info (profile_patch)
show vf stats
~~~~~~~~~~~~~