Add support of showing firmware version. When using the flower firmware, the firmware version output of common port is '0.0.5.5 0.31 AOTC-2.14.A.54 flo', while the firmware version output of representor port is '* 0.31 AOTC-2.14.A.54 flower'.
Signed-off-by: Chaoyong He <chaoyong...@corigine.com> Reviewed-by: Niklas Söderlund <niklas.soderl...@corigine.com> --- .../net/nfp/flower/nfp_flower_representor.c | 2 + drivers/net/nfp/nfp_common.c | 106 ++++++++++++++++++ drivers/net/nfp/nfp_common.h | 2 + drivers/net/nfp/nfp_ethdev.c | 1 + drivers/net/nfp/nfp_ethdev_vf.c | 1 + 5 files changed, 112 insertions(+) diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c index c3764b4de7..607625d204 100644 --- a/drivers/net/nfp/flower/nfp_flower_representor.c +++ b/drivers/net/nfp/flower/nfp_flower_representor.c @@ -525,6 +525,7 @@ static const struct eth_dev_ops nfp_flower_pf_repr_dev_ops = { .promiscuous_disable = nfp_net_promisc_enable, .mac_addr_set = nfp_flower_repr_mac_addr_set, + .fw_version_get = nfp_repr_firmware_version_get, }; static const struct eth_dev_ops nfp_flower_repr_dev_ops = { @@ -546,6 +547,7 @@ static const struct eth_dev_ops nfp_flower_repr_dev_ops = { .promiscuous_disable = nfp_net_promisc_enable, .mac_addr_set = nfp_flower_repr_mac_addr_set, + .fw_version_get = nfp_repr_firmware_version_get, .flow_ops_get = nfp_net_flow_ops_get, .mtr_ops_get = nfp_net_mtr_ops_get, diff --git a/drivers/net/nfp/nfp_common.c b/drivers/net/nfp/nfp_common.c index a9af215626..88fc50c6d6 100644 --- a/drivers/net/nfp/nfp_common.c +++ b/drivers/net/nfp/nfp_common.c @@ -214,6 +214,9 @@ nfp_net_notify_port_speed(struct rte_eth_dev *dev) nfp_net_link_speed_rte2nfp(eth_table->ports[hw->idx].speed)); } +/* The length of firmware version string */ +#define FW_VER_LEN 32 + static int __nfp_net_reconfig(struct nfp_net_hw *hw, uint32_t update) { @@ -1954,3 +1957,106 @@ nfp_net_cfg_read_version(struct nfp_net_hw *hw) version.whole = nn_cfg_readl(hw, NFP_NET_CFG_VERSION); hw->ver = version.split; } + +static void +nfp_net_get_nsp_info(struct nfp_net_hw *hw, char *nsp_version) +{ + struct nfp_nsp *nsp; + + nsp = nfp_nsp_open(hw->cpp); + if (nsp == NULL) + return; + + snprintf(nsp_version, FW_VER_LEN, "%hu.%hu", + nfp_nsp_get_abi_ver_major(nsp), + nfp_nsp_get_abi_ver_minor(nsp)); + + nfp_nsp_close(nsp); +} + +static void +nfp_net_get_mip_name(struct nfp_net_hw *hw, char *mip_name) +{ + struct nfp_mip *mip; + + mip = nfp_mip_open(hw->cpp); + if (mip == NULL) + return; + + snprintf(mip_name, FW_VER_LEN, "%s", nfp_mip_name(mip)); + + nfp_mip_close(mip); +} + +static void +nfp_net_get_app_name(struct nfp_net_hw *hw, char *app_name) +{ + switch (hw->pf_dev->app_fw_id) { + case NFP_APP_FW_CORE_NIC: + snprintf(app_name, FW_VER_LEN, "%s", "nic"); + break; + case NFP_APP_FW_FLOWER_NIC: + snprintf(app_name, FW_VER_LEN, "%s", "flower"); + break; + default: + snprintf(app_name, FW_VER_LEN, "%s", "unknown"); + break; + } +} + +int +nfp_net_firmware_version_get(struct rte_eth_dev *dev, + char *fw_version, + size_t fw_size) +{ + struct nfp_net_hw *hw; + char mip_name[FW_VER_LEN]; + char app_name[FW_VER_LEN]; + char nsp_version[FW_VER_LEN]; + char vnic_version[FW_VER_LEN]; + + if (fw_size < FW_VER_LEN) + return FW_VER_LEN; + + hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + snprintf(vnic_version, FW_VER_LEN, "%d.%d.%d.%d", + hw->ver.extend, hw->ver.class, + hw->ver.major, hw->ver.minor); + + nfp_net_get_nsp_info(hw, nsp_version); + nfp_net_get_mip_name(hw, mip_name); + nfp_net_get_app_name(hw, app_name); + + snprintf(fw_version, FW_VER_LEN, "%s %s %s %s", + vnic_version, nsp_version, mip_name, app_name); + + return 0; +} + +int +nfp_repr_firmware_version_get(struct rte_eth_dev *dev, + char *fw_version, + size_t fw_size) +{ + struct nfp_net_hw *hw; + char mip_name[FW_VER_LEN]; + char app_name[FW_VER_LEN]; + char nsp_version[FW_VER_LEN]; + struct nfp_flower_representor *repr; + + if (fw_size < FW_VER_LEN) + return FW_VER_LEN; + + repr = dev->data->dev_private; + hw = repr->app_fw_flower->pf_hw; + + nfp_net_get_nsp_info(hw, nsp_version); + nfp_net_get_mip_name(hw, mip_name); + nfp_net_get_app_name(hw, app_name); + + snprintf(fw_version, FW_VER_LEN, "* %s %s %s", + nsp_version, mip_name, app_name); + + return 0; +} diff --git a/drivers/net/nfp/nfp_common.h b/drivers/net/nfp/nfp_common.h index 424b18b0ad..4b588b2948 100644 --- a/drivers/net/nfp/nfp_common.h +++ b/drivers/net/nfp/nfp_common.h @@ -473,6 +473,8 @@ int nfp_net_tx_desc_limits(struct nfp_net_hw *hw, int nfp_net_check_dma_mask(struct nfp_net_hw *hw, char *name); void nfp_net_init_metadata_format(struct nfp_net_hw *hw); void nfp_net_cfg_read_version(struct nfp_net_hw *hw); +int nfp_net_firmware_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size); +int nfp_repr_firmware_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size); #define NFP_NET_DEV_PRIVATE_TO_HW(adapter)\ (&((struct nfp_net_adapter *)adapter)->hw) diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c index 0b2dd7801b..10c66cd027 100644 --- a/drivers/net/nfp/nfp_ethdev.c +++ b/drivers/net/nfp/nfp_ethdev.c @@ -461,6 +461,7 @@ static const struct eth_dev_ops nfp_net_eth_dev_ops = { .rx_queue_intr_disable = nfp_rx_queue_intr_disable, .udp_tunnel_port_add = nfp_udp_tunnel_port_add, .udp_tunnel_port_del = nfp_udp_tunnel_port_del, + .fw_version_get = nfp_net_firmware_version_get, }; static inline int diff --git a/drivers/net/nfp/nfp_ethdev_vf.c b/drivers/net/nfp/nfp_ethdev_vf.c index cf3548e63a..d4357ad115 100644 --- a/drivers/net/nfp/nfp_ethdev_vf.c +++ b/drivers/net/nfp/nfp_ethdev_vf.c @@ -241,6 +241,7 @@ static const struct eth_dev_ops nfp_netvf_eth_dev_ops = { .tx_queue_release = nfp_net_tx_queue_release, .rx_queue_intr_enable = nfp_rx_queue_intr_enable, .rx_queue_intr_disable = nfp_rx_queue_intr_disable, + .fw_version_get = nfp_net_firmware_version_get, }; static inline int -- 2.39.1