16 Star 3 Fork 50

src-openEuler/rdma-core

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0027-libhns-Add-the-parsing-of-mac-type-in-RoH-mode.patch 4.16 KB
一键复制 编辑 原始数据 按行查看 历史
Ke Chen 提交于 1年前 . Support hns ROH mode
From 928442c4184ceb115665da2040accc7e6c716b79 Mon Sep 17 00:00:00 2001
From: Yangyang Li <liyangyang20@huawei.com>
Date: Tue, 13 Sep 2022 20:09:27 +0800
Subject: [PATCH 2/2] libhns: Add the parsing of mac type in RoH mode
driver inclusion
category: feature
bugzilla: https://gitee.com/src-openeuler/rdma-core/issues/I9FFIU
------------------------------------------------------------------
After parsing the mac type as RoH mode, the user driver
needs to set the dmac field of ud wqe to 0xFF, the hardware
will recognize this field, and increase the recognition of
the IP field in RoH mode, which is used for the CM link
building function in user mode.
Signed-off-by: Yangyang Li <liyangyang20@huawei.com>
Signed-off-by: Guofeng Yue <yueguofeng@hisilicon.com>
---
providers/hns/hns_roce_u.c | 34 +++++++++++++++++++++++++++++++-
providers/hns/hns_roce_u.h | 6 ++++++
providers/hns/hns_roce_u_hw_v2.c | 4 ++++
3 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/providers/hns/hns_roce_u.c b/providers/hns/hns_roce_u.c
index f9abe2f..7a3d1a2 100644
--- a/providers/hns/hns_roce_u.c
+++ b/providers/hns/hns_roce_u.c
@@ -95,6 +95,38 @@ static const struct verbs_context_ops hns_common_ops = {
.alloc_parent_domain = hns_roce_u_alloc_pad,
};
+static struct {
+ uint32_t device_id;
+ enum hns_device_link_type link_type;
+} device_link_types[] = {
+ {0xA222, HNS_DEV_LINK_TYPE_ETH},
+ {0xA223, HNS_DEV_LINK_TYPE_ETH},
+ {0xA224, HNS_DEV_LINK_TYPE_ETH},
+ {0xA225, HNS_DEV_LINK_TYPE_ETH},
+ {0xA226, HNS_DEV_LINK_TYPE_ETH},
+ {0xA228, HNS_DEV_LINK_TYPE_ETH},
+ {0xA22F, HNS_DEV_LINK_TYPE_ETH},
+ {0xA227, HNS_DEV_LINK_TYPE_HCCS},
+ {0xA22C, HNS_DEV_LINK_TYPE_HCCS},
+ {0xA22D, HNS_DEV_LINK_TYPE_HCCS}
+};
+
+static int get_link_type(uint32_t device_id,
+ enum hns_device_link_type *link_type)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(device_link_types); i++) {
+ if (device_id == device_link_types[i].device_id) {
+ *link_type = device_link_types[i].link_type;
+ return 0;
+ }
+ }
+
+ return ENOENT;
+}
+
+
static uint32_t calc_table_shift(uint32_t entry_count, uint32_t size_shift)
{
uint32_t count_shift = hr_ilog32(entry_count);
@@ -303,7 +335,7 @@ static int set_context_attr(struct hns_roce_device *hr_dev,
context->max_srq_wr = dev_attrs.max_srq_wr;
context->max_srq_sge = dev_attrs.max_srq_sge;
- return 0;
+ return get_link_type(dev_attrs.vendor_part_id, &hr_dev->link_type);
}
static void ucontext_set_cmd(struct hns_roce_alloc_ucontext *cmd,
diff --git a/providers/hns/hns_roce_u.h b/providers/hns/hns_roce_u.h
index 691bf61..5eedb81 100644
--- a/providers/hns/hns_roce_u.h
+++ b/providers/hns/hns_roce_u.h
@@ -161,12 +161,18 @@ enum {
#define HNS_ROCE_SRQ_TABLE_BITS 8
#define HNS_ROCE_SRQ_TABLE_SIZE BIT(HNS_ROCE_SRQ_TABLE_BITS)
+enum hns_device_link_type {
+ HNS_DEV_LINK_TYPE_ETH,
+ HNS_DEV_LINK_TYPE_HCCS,
+};
+
struct hns_roce_device {
struct verbs_device ibv_dev;
int page_size;
const struct hns_roce_u_hw *u_hw;
int hw_version;
uint8_t congest_cap;
+ enum hns_device_link_type link_type;
};
struct hns_roce_buf {
diff --git a/providers/hns/hns_roce_u_hw_v2.c b/providers/hns/hns_roce_u_hw_v2.c
index 15d9108..b2d452b 100644
--- a/providers/hns/hns_roce_u_hw_v2.c
+++ b/providers/hns/hns_roce_u_hw_v2.c
@@ -1377,6 +1377,7 @@ static inline void enable_wqe(struct hns_roce_qp *qp, void *sq_wqe,
static int set_ud_wqe(void *wqe, struct hns_roce_qp *qp, struct ibv_send_wr *wr,
unsigned int nreq, struct hns_roce_sge_info *sge_info)
{
+ struct hns_roce_device *hr_dev = to_hr_dev(qp->verbs_qp.qp.context->device);
struct hns_roce_ah *ah = to_hr_ah(wr->wr.ud.ah);
struct hns_roce_ud_sq_wqe *ud_sq_wqe = wqe;
int ret = 0;
@@ -1401,6 +1402,9 @@ static int set_ud_wqe(void *wqe, struct hns_roce_qp *qp, struct ibv_send_wr *wr,
if (ret)
return ret;
+ if (hr_dev->link_type == HNS_DEV_LINK_TYPE_HCCS)
+ ud_sq_wqe->dmac[0] = 0xF0;
+
ret = fill_ud_data_seg(ud_sq_wqe, qp, wr, sge_info);
if (ret)
return ret;
--
2.33.0
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/src-openeuler/rdma-core.git
git@gitee.com:src-openeuler/rdma-core.git
src-openeuler
rdma-core
rdma-core
master

搜索帮助