rdma-core/0063-libhns-Support-query-HW-ID-by-hnsdv_query_device.patch
Ran Zhou c350a79ab7 STARS is a HW scheduler. These patches support hns RoCE working in STARS mode which means RoCE will be scheduled by STARS.
Signed-off-by: Chengchang Tang <tangchengchang@huawei.com
Signed-off-by: Ran Zhou <zhouran10@h-partners.com>
(cherry picked from commit 6407ae1c796015fecebc9c82cfbc8f2988e23d43)
2023-11-03 11:54:55 +08:00

231 lines
7.4 KiB
Diff

From 26d1c2339d0cc633b3817a78303eff6635a5fe88 Mon Sep 17 00:00:00 2001
From: Chengchang Tang <tangchengchang@huawei.com>
Date: Mon, 30 Oct 2023 16:59:16 +0800
Subject: [PATCH 2/8] libhns: Support query HW ID by hnsdv_query_device()
driver inclusion
category: feature
bugzilla: https://gitee.com/src-openeuler/rdma-core/issues/I8C6X4
---------------------------------------------------------------
Supports obtaining hardware-related ID through hnsdv_query_device()
Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
---
providers/hns/hns_roce_u.c | 43 ++++++++++++++++++++++----------
providers/hns/hns_roce_u.h | 1 +
providers/hns/hns_roce_u_abi.h | 3 +++
providers/hns/hns_roce_u_verbs.c | 32 ++++++++++++++++++------
providers/hns/hnsdv.h | 11 ++++++++
5 files changed, 70 insertions(+), 20 deletions(-)
diff --git a/providers/hns/hns_roce_u.c b/providers/hns/hns_roce_u.c
index cef64ec..1085b85 100644
--- a/providers/hns/hns_roce_u.c
+++ b/providers/hns/hns_roce_u.c
@@ -313,6 +313,35 @@ static void ucontext_set_cmd(struct hns_roce_alloc_ucontext *cmd,
}
}
+static void set_default_hw_id(struct hns_roce_context *context)
+{
+ context->hw_id.chip_id = HNSDV_INVALID_HW_ID;
+ context->hw_id.die_id = HNSDV_INVALID_HW_ID;
+ context->hw_id.func_id = HNSDV_INVALID_HW_ID;
+}
+
+static int query_dev_attr(struct hns_roce_context *context,
+ struct hns_roce_device *hr_dev)
+{
+ struct ibv_device_attr_ex attrx = {};
+ struct ibv_device_attr *dev_attrs = &attrx.orig_attr;
+
+ set_default_hw_id(context);
+
+ if (hns_roce_u_query_device(&context->ibv_ctx.context, NULL, &attrx,
+ sizeof(attrx)))
+ return EINVAL;
+
+ hr_dev->hw_version = dev_attrs->hw_ver;
+ context->max_qp_wr = dev_attrs->max_qp_wr;
+ context->max_sge = dev_attrs->max_sge;
+ context->max_cqe = dev_attrs->max_cqe;
+ context->max_srq_wr = dev_attrs->max_srq_wr;
+ context->max_srq_sge = dev_attrs->max_srq_sge;
+
+ return 0;
+}
+
static struct verbs_context *hns_roce_alloc_context(struct ibv_device *ibdev,
int cmd_fd,
void *private_data)
@@ -321,7 +350,6 @@ static struct verbs_context *hns_roce_alloc_context(struct ibv_device *ibdev,
struct hns_roce_device *hr_dev = to_hr_dev(ibdev);
struct hns_roce_alloc_ucontext_resp resp = {};
struct hns_roce_alloc_ucontext cmd = {};
- struct ibv_device_attr dev_attrs;
struct hns_roce_context *context;
int i;
@@ -362,23 +390,12 @@ static struct verbs_context *hns_roce_alloc_context(struct ibv_device *ibdev,
for (i = 0; i < HNS_ROCE_SRQ_TABLE_SIZE; ++i)
context->srq_table[i].refcnt = 0;
- if (hns_roce_u_query_device(&context->ibv_ctx.context, NULL,
- container_of(&dev_attrs,
- struct ibv_device_attr_ex,
- orig_attr),
- sizeof(dev_attrs)))
+ if (query_dev_attr(context, hr_dev))
goto err_free;
- hr_dev->hw_version = dev_attrs.hw_ver;
if (get_link_type(dev_attrs.vendor_part_id, &hr_dev->link_type))
hr_dev->link_type = resp.mac_type;
- context->max_qp_wr = dev_attrs.max_qp_wr;
- context->max_sge = dev_attrs.max_sge;
- context->max_cqe = dev_attrs.max_cqe;
- context->max_srq_wr = dev_attrs.max_srq_wr;
- context->max_srq_sge = dev_attrs.max_srq_sge;
-
if (init_dca_context(context, cmd_fd,
&resp, ctx_attr, hr_dev->page_size))
goto err_free;
diff --git a/providers/hns/hns_roce_u.h b/providers/hns/hns_roce_u.h
index 662eb8a..323d2f9 100644
--- a/providers/hns/hns_roce_u.h
+++ b/providers/hns/hns_roce_u.h
@@ -280,6 +280,7 @@ struct hns_roce_context {
unsigned int max_inline_data;
struct hns_roce_dca_ctx dca_ctx;
+ struct hnsdv_hw_id hw_id;
bool use_new_reset_flag;
bool reseted;
diff --git a/providers/hns/hns_roce_u_abi.h b/providers/hns/hns_roce_u_abi.h
index 1eaf62d..c73a30d 100644
--- a/providers/hns/hns_roce_u_abi.h
+++ b/providers/hns/hns_roce_u_abi.h
@@ -68,4 +68,7 @@ DECLARE_DRV_CMD(hns_roce_create_srq_ex, IB_USER_VERBS_CMD_CREATE_XSRQ,
DECLARE_DRV_CMD(hns_roce_modify_qp_ex, IB_USER_VERBS_EX_CMD_MODIFY_QP,
empty, hns_roce_ib_modify_qp_resp);
+DECLARE_DRV_CMD(hns_roce_query_device_ex, IB_USER_VERBS_EX_CMD_QUERY_DEVICE,
+ empty, hns_roce_ib_query_device_resp);
+
#endif /* _HNS_ROCE_U_ABI_H */
diff --git a/providers/hns/hns_roce_u_verbs.c b/providers/hns/hns_roce_u_verbs.c
index c3b01a0..5b86077 100644
--- a/providers/hns/hns_roce_u_verbs.c
+++ b/providers/hns/hns_roce_u_verbs.c
@@ -84,22 +84,27 @@ void hns_roce_init_qp_indices(struct hns_roce_qp *qp)
qp->next_sge = 0;
}
+#define HNSDV_CONVERT_HW_ID(val) \
+ ((val) == HNS_IB_INVALID_ID ? HNSDV_INVALID_HW_ID : (val))
+
int hns_roce_u_query_device(struct ibv_context *context,
const struct ibv_query_device_ex_input *input,
struct ibv_device_attr_ex *attr, size_t attr_size)
{
- struct ib_uverbs_ex_query_device_resp resp;
+ struct hns_roce_context *ctx = to_hr_ctx(context);
+ struct hns_roce_query_device_ex_resp resp = {};
unsigned int major, minor, sub_minor;
size_t resp_size = sizeof(resp);
uint64_t raw_fw_ver;
int ret;
- ret = ibv_cmd_query_device_any(context, input, attr, attr_size, &resp,
- &resp_size);
+ ctx = container_of(context, struct hns_roce_context, ibv_ctx.context);
+ ret = ibv_cmd_query_device_any(context, input, attr, attr_size,
+ &resp.ibv_resp, &resp_size);
if (ret)
return ret;
- raw_fw_ver = resp.base.fw_ver;
+ raw_fw_ver = resp.ibv_resp.base.fw_ver;
major = (raw_fw_ver >> 32) & 0xffff;
minor = (raw_fw_ver >> 16) & 0xffff;
sub_minor = raw_fw_ver & 0xffff;
@@ -107,27 +112,40 @@ int hns_roce_u_query_device(struct ibv_context *context,
snprintf(attr->orig_attr.fw_ver, sizeof(attr->orig_attr.fw_ver),
"%u.%u.%03u", major, minor, sub_minor);
+ if (resp.len >= offsetofend(typeof(resp.drv_payload), hw_id)) {
+ ctx->hw_id.chip_id = HNSDV_CONVERT_HW_ID(resp.hw_id.chip_id);
+ ctx->hw_id.die_id = HNSDV_CONVERT_HW_ID(resp.hw_id.die_id);
+ ctx->hw_id.func_id = HNSDV_CONVERT_HW_ID(resp.hw_id.func_id);
+ }
+
return 0;
}
int hnsdv_query_device(struct ibv_context *context,
struct hnsdv_context *attrs_out)
{
+ struct hns_roce_context *ctx = context ? to_hr_ctx(context) : NULL;
struct hns_roce_device *hr_dev = to_hr_dev(context->device);
+ if (!ctx || !attrs_out)
+ return EINVAL;
+
if (!hr_dev) {
verbs_err(verbs_get_ctx(context), "not a HNS RoCE device!\n");
return EOPNOTSUPP;
}
- if (!attrs_out)
- return EINVAL;
-
memset(attrs_out, 0, sizeof(*attrs_out));
attrs_out->comp_mask |= HNSDV_CONTEXT_MASK_CONGEST_TYPE;
attrs_out->congest_type = hr_dev->congest_type;
+ if (ctx->hw_id.chip_id != HNSDV_INVALID_HW_ID) {
+ attrs_out->comp_mask |= HNSDV_CONTEXT_MASK_HW_ID;
+ memcpy(&attrs_out->hw_id, &ctx->hw_id,
+ sizeof(struct hnsdv_hw_id));
+ }
+
return 0;
}
diff --git a/providers/hns/hnsdv.h b/providers/hns/hnsdv.h
index 365c314..159edb8 100644
--- a/providers/hns/hnsdv.h
+++ b/providers/hns/hnsdv.h
@@ -70,12 +70,23 @@ struct ibv_qp *hnsdv_create_qp(struct ibv_context *context,
enum hnsdv_query_context_comp_mask {
HNSDV_CONTEXT_MASK_CONGEST_TYPE = 1 << 0,
+ HNSDV_CONTEXT_MASK_HW_ID = 1 << 1,
+};
+
+#define HNSDV_INVALID_HW_ID -1
+struct hnsdv_hw_id {
+ int32_t chip_id;
+ int32_t die_id;
+ int32_t func_id;
+ int32_t reserved;
};
struct hnsdv_context {
uint64_t comp_mask; /* use enum hnsdv_query_context_comp_mask */
uint64_t flags;
uint8_t congest_type; /* Use enum hnsdv_qp_congest_ctrl_type */
+ uint8_t rsv[7];
+ struct hnsdv_hw_id hw_id;
};
int hnsdv_query_device(struct ibv_context *ctx_in,
--
2.25.1