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-17 10:19:35 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              : #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
        

Generated by: LCOV version 2.0-1