]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx: support firmware version query
authorThomas Monjalon <thomas@monjalon.net>
Wed, 6 Feb 2019 22:25:19 +0000 (23:25 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 13 Feb 2019 11:55:38 +0000 (12:55 +0100)
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>
doc/guides/nics/features/mlx4.ini
doc/guides/nics/features/mlx5.ini
doc/guides/rel_notes/release_19_05.rst
drivers/net/mlx4/mlx4.c
drivers/net/mlx4/mlx4.h
drivers/net/mlx4/mlx4_ethdev.c
drivers/net/mlx5/mlx5.c
drivers/net/mlx5/mlx5.h
drivers/net/mlx5/mlx5_ethdev.c

index 98a3f611941df2db823af4ed0f7e0ea217ddc6d8..a211aef33261cc2f43783569d535e38f66037130 100644 (file)
@@ -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
index b28b43e5c462c7af647bc3029173b627af51e50a..f7e73587b7c64e049210c82baffa737a88a33f14 100644 (file)
@@ -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
index 2b0f60d3d829c8083524d5ed7202104c3257420b..c0390ca1650c3bc0a331c3286699aa3d115fa1cb 100644 (file)
@@ -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
 -------------
index 070cf7111556188c9fb9415a4db6845cee2322d6..6f29e5a6240a8eaa39f541f4f0e6e78d0a71a79b 100644 (file)
@@ -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,
index e6fb934faa21326a9abf307b6035d71f88802725..6f411158263acdb4abe017d88037ee19168b4914 100644 (file)
@@ -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);
index 195a1b6dfb584cc6a53885adf097f927bd6775c7..d0efa7d0624aa504d0f39c518bf5cfa637b44202 100644 (file)
@@ -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.
  *
index a913a5955f4aeb310e5b5cf559f36c569459e3b3..df71707ccb769004681e626ca1b2e65943f71092 100644 (file)
@@ -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,
index 45f03982161747f8d83c6ade1cf2905ed0308d7f..3193ed9ca1c9ceb5cfce7962e30a4893bec87538 100644 (file)
@@ -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);
index d178ed6a18323cd4a7a90d2c6dbd93375fdd5964..8158b4a9fc39138206b1a11a5e38189c328493ea 100644 (file)
@@ -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.
  *