net/mlx: support firmware version query
The API function rte_eth_dev_fw_version_get() is querying drivers via the operation callback fw_version_get(). The implementation of this operation is added for mlx4 and mlx5. Both functions are copying the same ibverbs field fw_ver which is retrieved when calling ibv_query_device[_ex]() during the port probing. It is tested with command "drvinfo" of examples/ethtool/. Signed-off-by: Thomas Monjalon <thomas@monjalon.net> Acked-by: Shahaf Shuler <shahafs@mellanox.com>
This commit is contained in:
parent
7f4019d370
commit
714bf46ebb
@ -28,6 +28,7 @@ Inner L4 checksum = Y
|
||||
Packet type parsing = Y
|
||||
Basic stats = Y
|
||||
Stats per queue = Y
|
||||
FW version = Y
|
||||
Other kdrv = Y
|
||||
Power8 = Y
|
||||
x86-32 = Y
|
||||
|
@ -39,6 +39,7 @@ Tx descriptor status = Y
|
||||
Basic stats = Y
|
||||
Extended stats = Y
|
||||
Stats per queue = Y
|
||||
FW version = Y
|
||||
Multiprocess aware = Y
|
||||
Other kdrv = Y
|
||||
ARMv8 = Y
|
||||
|
@ -65,6 +65,12 @@ New Features
|
||||
process.
|
||||
* Added support for Rx packet types list in a secondary process.
|
||||
|
||||
* **Updated Mellanox drivers.**
|
||||
|
||||
New features and improvements were done in mlx4 and mlx5 PMDs:
|
||||
|
||||
* Added firmware version reading.
|
||||
|
||||
|
||||
Removed Items
|
||||
-------------
|
||||
|
@ -237,6 +237,7 @@ static const struct eth_dev_ops mlx4_dev_ops = {
|
||||
.mac_addr_set = mlx4_mac_addr_set,
|
||||
.stats_get = mlx4_stats_get,
|
||||
.stats_reset = mlx4_stats_reset,
|
||||
.fw_version_get = mlx4_fw_version_get,
|
||||
.dev_infos_get = mlx4_dev_infos_get,
|
||||
.dev_supported_ptypes_get = mlx4_dev_supported_ptypes_get,
|
||||
.vlan_filter_set = mlx4_vlan_filter_set,
|
||||
|
@ -131,6 +131,7 @@ int mlx4_mac_addr_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr);
|
||||
int mlx4_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on);
|
||||
int mlx4_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);
|
||||
void mlx4_stats_reset(struct rte_eth_dev *dev);
|
||||
int mlx4_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size);
|
||||
void mlx4_dev_infos_get(struct rte_eth_dev *dev,
|
||||
struct rte_eth_dev_info *info);
|
||||
int mlx4_link_update(struct rte_eth_dev *dev, int wait_to_complete);
|
||||
|
@ -592,6 +592,32 @@ mlx4_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
|
||||
info->flow_type_rss_offloads = mlx4_conv_rss_types(priv, 0, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get firmware version of a device.
|
||||
*
|
||||
* @param dev
|
||||
* Ethernet device port.
|
||||
* @param fw_ver
|
||||
* String output allocated by caller.
|
||||
* @param fw_size
|
||||
* Size of the output string, including terminating null byte.
|
||||
*
|
||||
* @return
|
||||
* 0 on success, or the size of the non truncated string if too big.
|
||||
*/
|
||||
int mlx4_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)
|
||||
{
|
||||
struct priv *priv = dev->data->dev_private;
|
||||
struct ibv_device_attr *attr = &priv->device_attr;
|
||||
size_t size = strnlen(attr->fw_ver, sizeof(attr->fw_ver)) + 1;
|
||||
|
||||
if (fw_size < size)
|
||||
return size;
|
||||
if (fw_ver != NULL)
|
||||
strlcpy(fw_ver, attr->fw_ver, fw_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* DPDK callback to get device statistics.
|
||||
*
|
||||
|
@ -374,6 +374,7 @@ const struct eth_dev_ops mlx5_dev_ops = {
|
||||
.xstats_get = mlx5_xstats_get,
|
||||
.xstats_reset = mlx5_xstats_reset,
|
||||
.xstats_get_names = mlx5_xstats_get_names,
|
||||
.fw_version_get = mlx5_fw_version_get,
|
||||
.dev_infos_get = mlx5_dev_infos_get,
|
||||
.dev_supported_ptypes_get = mlx5_dev_supported_ptypes_get,
|
||||
.vlan_filter_set = mlx5_vlan_filter_set,
|
||||
@ -403,18 +404,20 @@ const struct eth_dev_ops mlx5_dev_ops = {
|
||||
.is_removed = mlx5_is_removed,
|
||||
};
|
||||
|
||||
/* Available operations from secondary process. */
|
||||
static const struct eth_dev_ops mlx5_dev_sec_ops = {
|
||||
.stats_get = mlx5_stats_get,
|
||||
.stats_reset = mlx5_stats_reset,
|
||||
.xstats_get = mlx5_xstats_get,
|
||||
.xstats_reset = mlx5_xstats_reset,
|
||||
.xstats_get_names = mlx5_xstats_get_names,
|
||||
.fw_version_get = mlx5_fw_version_get,
|
||||
.dev_infos_get = mlx5_dev_infos_get,
|
||||
.rx_descriptor_status = mlx5_rx_descriptor_status,
|
||||
.tx_descriptor_status = mlx5_tx_descriptor_status,
|
||||
};
|
||||
|
||||
/* Available operators in flow isolated mode. */
|
||||
/* Available operations in flow isolated mode. */
|
||||
const struct eth_dev_ops mlx5_dev_ops_isolate = {
|
||||
.dev_configure = mlx5_dev_configure,
|
||||
.dev_start = mlx5_dev_start,
|
||||
@ -432,6 +435,7 @@ const struct eth_dev_ops mlx5_dev_ops_isolate = {
|
||||
.xstats_get = mlx5_xstats_get,
|
||||
.xstats_reset = mlx5_xstats_reset,
|
||||
.xstats_get_names = mlx5_xstats_get_names,
|
||||
.fw_version_get = mlx5_fw_version_get,
|
||||
.dev_infos_get = mlx5_dev_infos_get,
|
||||
.dev_supported_ptypes_get = mlx5_dev_supported_ptypes_get,
|
||||
.vlan_filter_set = mlx5_vlan_filter_set,
|
||||
|
@ -274,6 +274,7 @@ int mlx5_set_flags(struct rte_eth_dev *dev, unsigned int keep,
|
||||
unsigned int flags);
|
||||
int mlx5_dev_configure(struct rte_eth_dev *dev);
|
||||
void mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info);
|
||||
int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size);
|
||||
const uint32_t *mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev);
|
||||
int mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete);
|
||||
int mlx5_force_link_status_change(struct rte_eth_dev *dev, int status);
|
||||
|
@ -557,6 +557,32 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get firmware version of a device.
|
||||
*
|
||||
* @param dev
|
||||
* Ethernet device port.
|
||||
* @param fw_ver
|
||||
* String output allocated by caller.
|
||||
* @param fw_size
|
||||
* Size of the output string, including terminating null byte.
|
||||
*
|
||||
* @return
|
||||
* 0 on success, or the size of the non truncated string if too big.
|
||||
*/
|
||||
int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)
|
||||
{
|
||||
struct priv *priv = dev->data->dev_private;
|
||||
struct ibv_device_attr *attr = &priv->device_attr.orig_attr;
|
||||
size_t size = strnlen(attr->fw_ver, sizeof(attr->fw_ver)) + 1;
|
||||
|
||||
if (fw_size < size)
|
||||
return size;
|
||||
if (fw_ver != NULL)
|
||||
strlcpy(fw_ver, attr->fw_ver, fw_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get supported packet types.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user