Line data Source code
1 : /**
2 : * Copyright (c) 2026 Huawei Technologies Co., Ltd.
3 : * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4 : * CANN Open Software License Agreement Version 2.0 (the "License").
5 : * Please refer to the License for details. You may not use this file except in compliance with the License.
6 : * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7 : * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8 : * See LICENSE in the root of the software repository for the full text of the License.
9 : */
10 : #include "./dev_rdma_connection_v2.h"
11 : #include "log.h"
12 : #include "acl/acl_rt.h"
13 : #include "hccp.h"
14 :
15 : namespace hcomm {
16 : static constexpr uint32_t DEFAULT_CQN = 0;
17 : // DbVendorSpecified bitfield layout, matching Roce3DbEntry.dw0.bs:
18 : // cos at bits 24-26 (3 bits)
19 : // mtuShift at bits 50-52 (3 bits)
20 : static constexpr uint32_t UB_DB_VENDOR_COS_SHIFT = 24;
21 : static constexpr uint32_t UB_DB_VENDOR_MTUSHIFT_SHIFT = 50;
22 : static constexpr uint32_t UB_DB_VENDOR_FIELD_MASK = 0x7;
23 :
24 44 : DevRdmaConnectionV2::DevRdmaConnectionV2(Hccl::Socket* socket, RdmaHandle rdmaHandle, uint32_t cqAttrFlags)
25 44 : : socket_(socket),
26 44 : rdmaHandle_(rdmaHandle),
27 44 : cqAttrFlags_(cqAttrFlags)
28 44 : {}
29 :
30 44 : HcclResult DevRdmaConnectionV2::Init()
31 : {
32 44 : if (rdmaConnStatus_ != RdmaConnStatus::CLOSED) {
33 0 : HCCL_INFO(
34 : "[DevRdmaConnectionV2][%s] status[%s] is not need init.", __func__, rdmaConnStatus_.Describe().c_str());
35 0 : return HCCL_SUCCESS;
36 : }
37 :
38 44 : GetNdaOps();
39 44 : CHK_RET(GetDirectFlag());
40 44 : CHK_RET(GetDmaMode());
41 :
42 44 : rdmaConnStatus_ = RdmaConnStatus::INIT;
43 44 : return HCCL_SUCCESS;
44 : }
45 :
46 48 : DevRdmaConnectionV2::~DevRdmaConnectionV2()
47 : {
48 44 : if (rdmaConnStatus_ == RdmaConnStatus::CLOSED || rdmaConnStatus_ == RdmaConnStatus::INIT) {
49 40 : return;
50 : }
51 4 : HcclResult ret = DestroyQp();
52 4 : if (ret != HCCL_SUCCESS) {
53 0 : HCCL_ERROR("[%s]call DestroyQp failed: hcclRet -> %d", __func__, ret);
54 : }
55 164 : }
56 :
57 5 : std::string DevRdmaConnectionV2::Describe() const
58 : {
59 5 : return Hccl::StringFormat("DevRdmaConnectionV2[status=%s]", rdmaConnStatus_.Describe().c_str());
60 : }
61 :
62 2 : static void* NdaAlloc(size_t size)
63 : {
64 2 : void* ptr = nullptr;
65 2 : aclError ret = aclrtMalloc(&ptr, size, static_cast<aclrtMemMallocPolicy>(ACL_MEM_TYPE_HIGH_BAND_WIDTH));
66 2 : if (ret != ACL_SUCCESS) {
67 1 : HCCL_ERROR("[NdaAlloc] aclrtMalloc failed, ret[%d], size[%zu]", ret, size);
68 1 : return nullptr;
69 : }
70 1 : return ptr;
71 : }
72 :
73 3 : static void NdaFree(void* ptr)
74 : {
75 3 : if (ptr == nullptr) {
76 1 : return;
77 : }
78 2 : aclError ret = aclrtFree(ptr);
79 2 : if (ret != ACL_SUCCESS) {
80 1 : HCCL_ERROR("[NdaFree] aclrtFree failed, ret[%d], ptr[%p]", ret, ptr);
81 : }
82 : }
83 :
84 2 : static void NdaMemset(void* dst, int value, size_t count)
85 : {
86 2 : aclError ret = aclrtMemset(dst, count, value, count);
87 2 : if (ret != ACL_SUCCESS) {
88 1 : HCCL_ERROR("[NdaMemset] aclrtMemset failed, ret[%d], dst[%p], value[%d], count[%zu]", ret, dst, value, count);
89 : }
90 2 : }
91 :
92 6 : static int NdaMemcpy(void* dst, size_t dstSize, void* src, size_t srcSize, uint32_t direct)
93 : {
94 6 : aclrtMemcpyKind kind = ACL_MEMCPY_DEFAULT;
95 6 : switch (direct) {
96 1 : case MEMCPY_DIRECT_HOST_TO_HOST: {
97 1 : kind = ACL_MEMCPY_HOST_TO_HOST;
98 1 : break;
99 : }
100 2 : case MEMCPY_DIRECT_HOST_TO_DEVICE: {
101 2 : kind = ACL_MEMCPY_HOST_TO_DEVICE;
102 2 : break;
103 : }
104 1 : case MEMCPY_DIRECT_DEVICE_TO_HOST: {
105 1 : kind = ACL_MEMCPY_DEVICE_TO_HOST;
106 1 : break;
107 : }
108 1 : case MEMCPY_DIRECT_DEVICE_TO_DEVICE: {
109 1 : kind = ACL_MEMCPY_DEVICE_TO_DEVICE;
110 1 : break;
111 : }
112 1 : default: {
113 1 : HCCL_ERROR("[MemcpyKindTranslate]Not support the memory copy type[%d].", direct);
114 1 : return -1;
115 : }
116 : }
117 5 : aclError ret = aclrtMemcpy(dst, dstSize, src, srcSize, kind);
118 5 : if (ret != ACL_SUCCESS) {
119 1 : HCCL_ERROR(
120 : "[NdaMemcpy] aclrtMemcpy failed, ret[%d], dst[%p], src[%p], dstSize[%zu], srcSize[%zu]", ret, dst, src,
121 : dstSize, srcSize);
122 1 : return -1;
123 : }
124 4 : return 0;
125 : }
126 :
127 44 : void DevRdmaConnectionV2::GetNdaOps()
128 : {
129 44 : ndaOps_ = {.alloc = NdaAlloc, .free = NdaFree, .memset_s = NdaMemset, .memcpy_s = NdaMemcpy};
130 44 : }
131 :
132 44 : HcclResult DevRdmaConnectionV2::GetDirectFlag()
133 : {
134 44 : s32 ret = RaNdaGetDirectFlag(rdmaHandle_, &directFlag_);
135 44 : if (ret != 0) {
136 0 : HCCL_ERROR(
137 : "[DevRdmaConnectionV2][GetDirectFlag]errNo[0x%016llx] get directFlag fail. "
138 : "return[%d], params: rdmaHandle[%p], directFlag[%d]",
139 : HCCL_ERROR_CODE(HCCL_E_INTERNAL), ret, rdmaHandle_, directFlag_);
140 0 : return HCCL_E_INTERNAL;
141 : }
142 44 : return HCCL_SUCCESS;
143 : }
144 :
145 44 : HcclResult DevRdmaConnectionV2::GetDmaMode()
146 : {
147 44 : switch (directFlag_) {
148 44 : case DIRECT_FLAG_PCIE: {
149 44 : dmaMode_ = QBUF_DMA_MODE_DEFAULT;
150 44 : break;
151 : }
152 0 : case DIRECT_FLAG_UB: {
153 0 : dmaMode_ = QBUF_DMA_MODE_INDEP_UB;
154 0 : break;
155 : }
156 0 : default: {
157 0 : HCCL_ERROR("[GetDmaMode]Not support the directFlag [%d].", directFlag_);
158 0 : dmaMode_ = QBUF_DMA_MODE_MAX;
159 0 : return HCCL_E_INTERNAL;
160 : }
161 : }
162 44 : HCCL_INFO("[GetDmaMode] directFlag[%d], dmaMode[%d]", directFlag_, dmaMode_);
163 44 : return HCCL_SUCCESS;
164 : }
165 :
166 4 : HcclResult DevRdmaConnectionV2::CreateQp()
167 : {
168 4 : if (socket_->GetStatus() != Hccl::SocketStatus::OK) {
169 0 : HCCL_WARNING("[DevRdmaConnectionV2::CreateQp] socket status is not ok, please");
170 0 : return HCCL_E_AGAIN;
171 : }
172 :
173 : // cqAttrFlags不为默认值0时,仅QBUF_DMA_MODE_DEFAULT(云脉网卡)支持配置,NPU网卡(INDEP_UB)不支持
174 4 : uint32_t cqAttrFlags = 0;
175 4 : if (cqAttrFlags_ != 0) {
176 0 : if (dmaMode_ == QBUF_DMA_MODE_INDEP_UB) {
177 0 : HCCL_ERROR(
178 : "[DevRdmaConnectionV2::CreateQp] NPU NIC does not support configuring cqAttrFlags[%u].", cqAttrFlags_);
179 0 : return HCCL_E_NOT_SUPPORT;
180 : }
181 0 : cqAttrFlags = cqAttrFlags_;
182 0 : HCCL_WARNING("[DevRdmaConnectionV2::CreateQp] CqAttrFlags is configured to [%u].", cqAttrFlags);
183 : }
184 :
185 4 : CHK_RET(Hccl::HrtRaNdaCqCreate(rdmaHandle_, &ndaOps_, dmaMode_, cqAttrFlags, &ndaCqInfo_, &cqHandle_));
186 :
187 4 : CHK_RET(Hccl::HrtRaNdaQpCreate(rdmaHandle_, &ndaOps_, dmaMode_, &ndaCqInfo_, &ndaQpInfo_, &qpHandle_));
188 :
189 4 : SqPiMem_ = hccl::DeviceMem::alloc(sizeof(void*));
190 4 : SqCiMem_ = hccl::DeviceMem::alloc(sizeof(void*));
191 4 : CqPiMem_ = hccl::DeviceMem::alloc(sizeof(void*));
192 4 : CqCiMem_ = hccl::DeviceMem::alloc(sizeof(void*));
193 4 : CHK_PRT_RET(
194 : !SqPiMem_ || !SqCiMem_ || !CqPiMem_ || !CqCiMem_,
195 : HCCL_ERROR(
196 : "%s DeviceMem::alloc for SqPi_ or SqCi_ or CqPi_ or CqCi_ failed, size=%zu", __func__, sizeof(void*)),
197 : HCCL_E_MEMORY);
198 :
199 4 : rdmaConnStatus_ = RdmaConnStatus::QP_CREATED;
200 4 : return HCCL_SUCCESS;
201 : }
202 :
203 4 : HcclResult DevRdmaConnectionV2::DestroyQp()
204 : {
205 4 : if (rdmaConnStatus_ == RdmaConnStatus::CLOSED || rdmaConnStatus_ == RdmaConnStatus::INIT) {
206 0 : return HCCL_SUCCESS;
207 : }
208 :
209 4 : HcclResult ret = HCCL_SUCCESS;
210 :
211 4 : if (qpHandle_ != nullptr) {
212 4 : Hccl::HrtRaQpDestroy(qpHandle_);
213 4 : qpHandle_ = nullptr;
214 : }
215 :
216 4 : if (cqHandle_ != nullptr) {
217 4 : ret = Hccl::HrtRaNdaCqDestroy(rdmaHandle_, cqHandle_);
218 4 : if (ret != HCCL_SUCCESS) {
219 0 : HCCL_ERROR("[DevRdmaConnectionV2::%s] HrtRaNdaCqDestroy failed, ret[%d]", __func__, ret);
220 : }
221 4 : cqHandle_ = nullptr;
222 : }
223 :
224 4 : SqPiMem_ = hccl::DeviceMem();
225 4 : SqCiMem_ = hccl::DeviceMem();
226 4 : CqPiMem_ = hccl::DeviceMem();
227 4 : CqCiMem_ = hccl::DeviceMem();
228 :
229 4 : rdmaConnStatus_ = RdmaConnStatus::CLOSED;
230 4 : return ret;
231 : }
232 :
233 4 : HcclResult DevRdmaConnectionV2::GetExchangeDto(std::unique_ptr<Hccl::Serializable>& locQpAttrserial)
234 : {
235 4 : if (rdmaConnStatus_ != RdmaConnStatus::QP_CREATED && rdmaConnStatus_ != RdmaConnStatus::QP_MODIFIED) {
236 0 : HCCL_ERROR(
237 : "[DevRdmaConnectionV2][%s] status[%s] is not expected.", __func__, rdmaConnStatus_.Describe().c_str());
238 0 : return HCCL_E_AGAIN;
239 : }
240 :
241 : struct QpAttr localQpAttr;
242 4 : s32 ret = RaGetQpAttr(qpHandle_, &localQpAttr);
243 4 : if (ret != 0) {
244 0 : HCCL_ERROR("[DevRdmaConnectionV2::%s]RaGetQpAttr failed, ret[%d]", __func__, ret);
245 0 : return HCCL_E_ROCE_CONNECT;
246 : }
247 4 : std::unique_ptr<ExchangeRdmaConnDto> dto = nullptr;
248 4 : EXCEPTION_CATCH(
249 : dto = std::make_unique<ExchangeRdmaConnDto>(localQpAttr.qpn, localQpAttr.psn, localQpAttr.gidIdx),
250 : return HCCL_E_PTR);
251 4 : CHK_SAFETY_FUNC_RET(memcpy_s(dto->gid_, HCCP_GID_RAW_LEN, localQpAttr.gid, HCCP_GID_RAW_LEN));
252 4 : locQpAttrserial = std::unique_ptr<Hccl::Serializable>(std::move(dto));
253 4 : return HCCL_SUCCESS;
254 4 : }
255 :
256 5 : HcclResult DevRdmaConnectionV2::ParseRmtExchangeDto(const Hccl::Serializable& rmtDto)
257 : {
258 5 : auto dto = dynamic_cast<const ExchangeRdmaConnDto&>(rmtDto);
259 5 : HCCL_INFO("[DevRdmaConnectionV2][%s] remoteConnDto[%s]", __func__, dto.Describe().c_str());
260 5 : rmtQpAttr_.psn = dto.psn_;
261 5 : rmtQpAttr_.qpn = dto.qpn_;
262 5 : rmtQpAttr_.gid_idx = dto.gid_idx_;
263 5 : CHK_SAFETY_FUNC_RET(memcpy_s(rmtQpAttr_.gid, HCCP_GID_RAW_LEN, dto.gid_, HCCP_GID_RAW_LEN));
264 5 : return HCCL_SUCCESS;
265 5 : }
266 :
267 1 : HcclResult DevRdmaConnectionV2::ModifyQp()
268 : {
269 1 : if (rdmaConnStatus_ == RdmaConnStatus::QP_MODIFIED) {
270 0 : HCCL_WARNING(
271 : "[DevRdmaConnectionV2][%s] modify qp already, status[%s].", __func__, rdmaConnStatus_.Describe().c_str());
272 0 : return HCCL_SUCCESS;
273 : }
274 1 : if (rdmaConnStatus_ != RdmaConnStatus::QP_CREATED) {
275 0 : HCCL_ERROR(
276 : "[DevRdmaConnectionV2][%s] status[%s] is not expected.", __func__, rdmaConnStatus_.Describe().c_str());
277 0 : return HCCL_E_AGAIN;
278 : }
279 :
280 1 : if (!rmtQpAttr_.IsValid()) {
281 0 : HCCL_ERROR("[DevRdmaConnectionV2][%s] romate Qp Attr is empty, exchange qp attr first", __func__);
282 0 : return HCCL_E_INTERNAL;
283 : }
284 :
285 : struct QpAttr localQpAttr;
286 1 : s32 ret = RaGetQpAttr(qpHandle_, &localQpAttr);
287 1 : if (ret != 0) {
288 0 : HCCL_ERROR("[DevRdmaConnectionV2::%s]RaGetQpAttr failed, ret[%d]", __func__, ret);
289 0 : return HCCL_E_ROCE_CONNECT;
290 : }
291 :
292 : struct TypicalQp localQp;
293 : struct TypicalQp rmtQp;
294 1 : localQp.sl = qpInfo_.serviceLevel;
295 1 : localQp.tc = qpInfo_.trafficClass;
296 1 : localQp.retryCnt = qpInfo_.retryCnt;
297 1 : localQp.retryTime = qpInfo_.retryInterval;
298 1 : localQp.qpn = localQpAttr.qpn;
299 1 : localQp.psn = localQpAttr.psn;
300 1 : localQp.gidIdx = localQpAttr.gidIdx;
301 1 : (void)memcpy_s(localQp.gid, HCCP_GID_RAW_LEN, localQpAttr.gid, HCCP_GID_RAW_LEN);
302 1 : rmtQp.sl = qpInfo_.serviceLevel;
303 1 : rmtQp.tc = qpInfo_.trafficClass;
304 1 : rmtQp.retryCnt = qpInfo_.retryCnt;
305 1 : rmtQp.retryTime = qpInfo_.retryInterval;
306 1 : rmtQp.qpn = rmtQpAttr_.qpn;
307 1 : rmtQp.psn = rmtQpAttr_.psn;
308 1 : rmtQp.gidIdx = rmtQpAttr_.gid_idx;
309 1 : (void)memcpy_s(rmtQp.gid, HCCP_GID_RAW_LEN, rmtQpAttr_.gid, HCCP_GID_RAW_LEN);
310 1 : ret = RaTypicalQpModify(qpHandle_, &localQp, &rmtQp);
311 1 : if (ret != 0) {
312 0 : HCCL_ERROR("[modify][ra_qp]modify qp failed, ret(%d)", ret);
313 0 : return HCCL_E_ROCE_CONNECT;
314 : }
315 1 : rdmaConnStatus_ = RdmaConnStatus::QP_MODIFIED;
316 1 : return HCCL_SUCCESS;
317 : }
318 :
319 9 : HcclResult DevRdmaConnectionV2::BuildSqContext(SqContext* context)
320 : {
321 9 : if (context == nullptr) {
322 0 : HCCL_ERROR("[GetSqContext] Invalid null pointer for context.");
323 0 : return HCCL_E_PTR;
324 : }
325 :
326 : // 零初始化roceSq, 确保不同dmaMode下未使用字段有确定值
327 9 : (void)memset_s(
328 9 : &context->contextInfo.roceSq, sizeof(context->contextInfo.roceSq), 0, sizeof(context->contextInfo.roceSq));
329 :
330 : struct QpAttr localQpAttr;
331 9 : s32 ret = RaGetQpAttr(qpHandle_, &localQpAttr);
332 9 : if (ret != 0) {
333 0 : HCCL_ERROR("[DevRdmaConnectionV2::%s]RaGetQpAttr failed, ret[%d]", __func__, ret);
334 0 : return HCCL_E_ROCE_CONNECT;
335 : }
336 :
337 9 : context->type = SQ_CONTEXT_TYPE_ROCE;
338 9 : context->contextInfo.roceSq.qpn = localQpAttr.qpn;
339 9 : context->contextInfo.roceSq.sqVa = ndaQpInfo_.sqInfo.qBuf.base;
340 9 : context->contextInfo.roceSq.wqeSize = ndaQpInfo_.sqInfo.qBuf.entrySize;
341 9 : context->contextInfo.roceSq.depth = ndaQpInfo_.sqInfo.qBuf.entryCnt;
342 9 : context->contextInfo.roceSq.headAddr = reinterpret_cast<uint64_t>(SqPiMem_.ptr());
343 9 : context->contextInfo.roceSq.tailAddr = reinterpret_cast<uint64_t>(SqCiMem_.ptr());
344 9 : context->contextInfo.roceSq.sl = qpInfo_.serviceLevel;
345 9 : context->contextInfo.roceSq.dbHwVa = reinterpret_cast<uint64_t>(ndaQpInfo_.sqInfo.dbHwVa.iovBase);
346 :
347 9 : if (dmaMode_ == QBUF_DMA_MODE_INDEP_UB) {
348 0 : context->contextInfo.roceSq.dbSwVa = reinterpret_cast<uint64_t>(ndaQpInfo_.sqInfo.dbrPiVa.iovBase);
349 0 : uint8_t mtuShift = static_cast<uint8_t>(localQpAttr.pathMtu - 1);
350 0 : uint8_t dbCos = static_cast<uint8_t>(localQpAttr.vendorPrivInfo & 0xFF);
351 0 : context->contextInfo.roceSq.dbVendorSpecified
352 0 : |= (static_cast<uint64_t>(mtuShift & UB_DB_VENDOR_FIELD_MASK) << UB_DB_VENDOR_MTUSHIFT_SHIFT);
353 0 : context->contextInfo.roceSq.dbVendorSpecified
354 0 : |= (static_cast<uint64_t>(dbCos & UB_DB_VENDOR_FIELD_MASK) << UB_DB_VENDOR_COS_SHIFT);
355 :
356 0 : HCCL_INFO("[DevRdmaConnectionV2][%s] mtuShift=%u, dbCos=%u", __func__, mtuShift, dbCos);
357 : }
358 :
359 9 : HCCL_INFO(
360 : "[DevRdmaConnectionV2][%s] type=%u, QPN=%u, SQ_VA=0x%llx, WQE_SIZE=%u, "
361 : "SQ_DEPTH=%u, SQ_HEAD_ADDR=0x%llx, SQ_TAIL_ADDR=0x%llx, "
362 : "SL=%u, DB_HW_VA=0x%llx, DB_SW_VA=0x%llx,"
363 : "DbVendorSpecified=0x%llx",
364 : __func__, context->type, context->contextInfo.roceSq.qpn, context->contextInfo.roceSq.sqVa,
365 : context->contextInfo.roceSq.wqeSize, context->contextInfo.roceSq.depth, context->contextInfo.roceSq.headAddr,
366 : context->contextInfo.roceSq.tailAddr, context->contextInfo.roceSq.sl, context->contextInfo.roceSq.dbHwVa,
367 : context->contextInfo.roceSq.dbSwVa, context->contextInfo.roceSq.dbVendorSpecified);
368 9 : return HCCL_SUCCESS;
369 : }
370 :
371 9 : HcclResult DevRdmaConnectionV2::BuildCqContext(CqContext* context)
372 : {
373 9 : if (context == nullptr) {
374 0 : HCCL_ERROR("[GetCqContext] Invalid null pointer for context.");
375 0 : return HCCL_E_PTR;
376 : }
377 :
378 : // 零初始化roceCq, 确保不同dmaMode下未使用字段有确定值
379 9 : (void)memset_s(
380 9 : &context->contextInfo.roceCq, sizeof(context->contextInfo.roceCq), 0, sizeof(context->contextInfo.roceCq));
381 :
382 9 : context->type = CQ_CONTEXT_TYPE_ROCE;
383 9 : context->contextInfo.roceCq.cqVa = ndaCqInfo_.cqInfo.qBuf.base;
384 9 : context->contextInfo.roceCq.cqeSize = ndaCqInfo_.cqInfo.qBuf.entrySize;
385 9 : context->contextInfo.roceCq.cqDepth = ndaCqInfo_.cqInfo.qBuf.entryCnt;
386 9 : context->contextInfo.roceCq.headAddr = reinterpret_cast<uint64_t>(CqPiMem_.ptr());
387 9 : context->contextInfo.roceCq.tailAddr = reinterpret_cast<uint64_t>(CqCiMem_.ptr());
388 : // PCIe模式(DEFAULT): 仅使用硬DB; UBNIC模式(INDEP_UB): 仅使用软DB
389 9 : if (dmaMode_ == QBUF_DMA_MODE_DEFAULT) {
390 9 : context->contextInfo.roceCq.cqn = ndaCqInfo_.resv[0]; // 云脉网卡NDA直驱,协商ndaCqInfo_.resv[0]字段为CQN
391 9 : context->contextInfo.roceCq.dbHwVa = reinterpret_cast<uint64_t>(ndaCqInfo_.cqInfo.dbHwVa.iovBase);
392 : } else {
393 0 : context->contextInfo.roceCq.cqn = DEFAULT_CQN;
394 0 : context->contextInfo.roceCq.dbSwVa = reinterpret_cast<uint64_t>(ndaCqInfo_.cqInfo.dbrCiVa.iovBase);
395 : }
396 :
397 9 : HCCL_INFO(
398 : "[DevRdmaConnectionV2][%s] type=%u, CQN=%u, CQ_VA=0x%llx, CQE_SIZE=%u, CQ_DEPTH=%u, "
399 : "CQ_HEAD_ADDR=0x%llx, CQ_TAIL_ADDR=0x%llx, DB_HW_VA=0x%llx, DB_SW_VA=0x%llx]",
400 : __func__, context->type, context->contextInfo.roceCq.cqn, context->contextInfo.roceCq.cqVa,
401 : context->contextInfo.roceCq.cqeSize, context->contextInfo.roceCq.cqDepth, context->contextInfo.roceCq.headAddr,
402 : context->contextInfo.roceCq.tailAddr, context->contextInfo.roceCq.dbHwVa, context->contextInfo.roceCq.dbSwVa);
403 :
404 9 : return HCCL_SUCCESS;
405 : }
406 :
407 4 : std::vector<char> DevRdmaConnectionV2::GetSqUniqueId() const
408 : {
409 4 : HCCL_DEBUG("start packing sq uniqueId");
410 : struct QpAttr localQpAttr;
411 4 : s32 ret = RaGetQpAttr(qpHandle_, &localQpAttr);
412 4 : if (ret != 0) {
413 0 : HCCL_ERROR("[DevRdmaConnectionV2::%s]RaGetQpAttr failed, ret[%d]", __func__, ret);
414 0 : return {};
415 : }
416 4 : uint8_t mtuShift = static_cast<uint8_t>(localQpAttr.pathMtu - 1);
417 4 : uint8_t dbCos = static_cast<uint8_t>(localQpAttr.vendorPrivInfo & 0xFF);
418 4 : uint64_t dbVendorSpecified = 0;
419 4 : dbVendorSpecified |= (static_cast<uint64_t>(mtuShift & UB_DB_VENDOR_FIELD_MASK) << UB_DB_VENDOR_MTUSHIFT_SHIFT);
420 4 : dbVendorSpecified |= (static_cast<uint64_t>(dbCos & UB_DB_VENDOR_FIELD_MASK) << UB_DB_VENDOR_COS_SHIFT);
421 :
422 4 : Hccl::BinaryStream binaryStream;
423 : // 打包1825网卡NDA直驱资源
424 4 : binaryStream << localQpAttr.qpn;
425 4 : binaryStream << ndaQpInfo_.sqInfo.qBuf.base;
426 4 : binaryStream << ndaQpInfo_.sqInfo.qBuf.entrySize;
427 4 : binaryStream << ndaQpInfo_.sqInfo.qBuf.entryCnt;
428 4 : binaryStream << reinterpret_cast<uint64_t>(SqPiMem_.ptr());
429 4 : binaryStream << reinterpret_cast<uint64_t>(SqCiMem_.ptr());
430 4 : binaryStream << reinterpret_cast<uint64_t>(ndaQpInfo_.sqInfo.dbHwVa.iovBase);
431 4 : binaryStream << reinterpret_cast<uint64_t>(ndaQpInfo_.sqInfo.dbrPiVa.iovBase);
432 4 : binaryStream << static_cast<uint8_t>(qpInfo_.serviceLevel);
433 4 : binaryStream << dbVendorSpecified;
434 :
435 4 : HCCL_DEBUG(
436 : "[DevRdmaConnectionV2][%s] mtuShift[%d], dbCos[%u], dbVendorSpecified[0x%llx]", __func__, mtuShift, dbCos,
437 : dbVendorSpecified);
438 :
439 4 : std::vector<char> result;
440 4 : binaryStream.Dump(result);
441 4 : return result;
442 4 : }
443 :
444 4 : std::vector<char> DevRdmaConnectionV2::GetCqUniqueId() const
445 : {
446 4 : HCCL_DEBUG("start packing cq uniqueId");
447 4 : Hccl::BinaryStream binaryStream;
448 : // 打包1825网卡NDA直驱资源
449 4 : binaryStream << DEFAULT_CQN;
450 4 : binaryStream << ndaCqInfo_.cqInfo.qBuf.base;
451 4 : binaryStream << ndaCqInfo_.cqInfo.qBuf.entrySize;
452 4 : binaryStream << ndaCqInfo_.cqInfo.qBuf.entryCnt;
453 4 : binaryStream << reinterpret_cast<uint64_t>(CqPiMem_.ptr());
454 4 : binaryStream << reinterpret_cast<uint64_t>(CqCiMem_.ptr());
455 4 : binaryStream << reinterpret_cast<uint64_t>(ndaCqInfo_.cqInfo.dbrCiVa.iovBase);
456 4 : binaryStream << static_cast<uint64_t>(0); // CQ DbVendorSpecified placeholder
457 :
458 4 : std::vector<char> result;
459 4 : binaryStream.Dump(result);
460 4 : return result;
461 4 : }
462 :
463 4 : std::vector<char> DevRdmaConnectionV2::GetUniqueId() const
464 : {
465 4 : HCCL_DEBUG("start packing conn uniqueId");
466 4 : Hccl::BinaryStream binaryStream;
467 4 : binaryStream << dmaMode_;
468 4 : binaryStream << GetSqUniqueId();
469 4 : binaryStream << GetCqUniqueId();
470 :
471 4 : std::vector<char> result;
472 4 : binaryStream.Dump(result);
473 4 : return result;
474 4 : }
475 :
476 : } // namespace hcomm
|