Simply pass the extended query device verb to back to libiverbs, in
order to support it.

Also share some code with the legacy query device verb.

Signed-off-by: Haggai Eran <[email protected]>
---
 src/mlx5.c  |  1 +
 src/mlx5.h  |  3 +++
 src/verbs.c | 41 +++++++++++++++++++++++++++++++++++------
 3 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/src/mlx5.c b/src/mlx5.c
index d02328881992..f058ac498819 100644
--- a/src/mlx5.c
+++ b/src/mlx5.c
@@ -583,6 +583,7 @@ static int mlx5_init_context(struct verbs_device *vdev,
        verbs_set_ctx_op(v_ctx, close_xrcd, mlx5_close_xrcd);
        verbs_set_ctx_op(v_ctx, create_srq_ex, mlx5_create_srq_ex);
        verbs_set_ctx_op(v_ctx, get_srq_num, mlx5_get_srq_num);
+       verbs_set_ctx_op(v_ctx, query_device_ex, mlx5_query_device_ex);
 
        return 0;
 
diff --git a/src/mlx5.h b/src/mlx5.h
index 6ad79fe324d3..364afe12de68 100644
--- a/src/mlx5.h
+++ b/src/mlx5.h
@@ -537,6 +537,9 @@ void mlx5_free_db(struct mlx5_context *context, uint32_t 
*db);
 
 int mlx5_query_device(struct ibv_context *context,
                       struct ibv_device_attr *attr);
+int mlx5_query_device_ex(struct ibv_context *context,
+                        const struct ibv_query_device_ex_input *input,
+                        struct ibv_device_attr_ex *attr, size_t attr_size);
 struct ibv_qp *mlx5_create_qp_ex(struct ibv_context *context,
                                 struct ibv_qp_init_attr_ex *attr);
 int mlx5_query_port(struct ibv_context *context, uint8_t port,
diff --git a/src/verbs.c b/src/verbs.c
index 8ddf4e631c9f..f269c37ea266 100644
--- a/src/verbs.c
+++ b/src/verbs.c
@@ -53,23 +53,52 @@
 
 int mlx5_single_threaded = 0;
 
+static int raw_fw_ver_to_string(uint64_t raw_fw_ver, char *buf, size_t len)
+{
+       unsigned major, minor, sub_minor;
+
+       major     = (raw_fw_ver >> 32) & 0xffff;
+       minor     = (raw_fw_ver >> 16) & 0xffff;
+       sub_minor = raw_fw_ver & 0xffff;
+
+       return snprintf(buf, len, "%d.%d.%04d", major, minor, sub_minor);
+}
+
 int mlx5_query_device(struct ibv_context *context, struct ibv_device_attr 
*attr)
 {
        struct ibv_query_device cmd;
        uint64_t raw_fw_ver;
-       unsigned major, minor, sub_minor;
        int ret;
 
        ret = ibv_cmd_query_device(context, attr, &raw_fw_ver, &cmd, sizeof 
cmd);
        if (ret)
                return ret;
 
-       major     = (raw_fw_ver >> 32) & 0xffff;
-       minor     = (raw_fw_ver >> 16) & 0xffff;
-       sub_minor = raw_fw_ver & 0xffff;
+       raw_fw_ver_to_string(raw_fw_ver, attr->fw_ver, sizeof attr->fw_ver);
+
+       return 0;
+}
+
+int mlx5_query_device_ex(struct ibv_context *context,
+                        const struct ibv_query_device_ex_input *input,
+                        struct ibv_device_attr_ex *attr, size_t attr_size)
+{
+       struct ibv_query_device_ex cmd;
+       struct ibv_query_device_resp_ex resp;
+       uint64_t raw_fw_ver;
+       int ret;
+
+       cmd.comp_mask = 0;
+       ret = ibv_cmd_query_device_ex(context, input, attr, attr_size,
+                                     &raw_fw_ver, &cmd,
+                                     sizeof(struct ibv_query_device_ex),
+                                     sizeof(cmd), &resp,
+                                     sizeof(struct ibv_query_device_resp_ex),
+                                     sizeof(resp));
+       if (ret)
+               return ret;
 
-       snprintf(attr->fw_ver, sizeof attr->fw_ver,
-                "%d.%d.%04d", major, minor, sub_minor);
+       raw_fw_ver_to_string(raw_fw_ver, attr->orig_attr.fw_ver, sizeof 
attr->orig_attr.fw_ver);
 
        return 0;
 }
-- 
1.7.11.2

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to