LCOV - code coverage report
Current view: top level - base_comm/resources/endpoint_pairs/channels/aicpu - dev_rdma_connection_v2.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 81.4 % 285 232
Test Date: 2026-08-18 17:47:01 Functions: 100.0 % 21 21

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

Generated by: LCOV version 2.0-1