LCOV - code coverage report
Current view: top level - base_comm/resources/hccp/rdma_service/ctx - rs_ub_jetty.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 13.7 % 190 26
Test Date: 2026-08-04 10:52:23 Functions: 35.7 % 14 5

            Line data    Source code
       1              : /**
       2              :  * Copyright (c) 2025 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 <unistd.h>
      12              : #include <stdlib.h>
      13              : #include <sys/types.h>
      14              : #include <netinet/in.h>
      15              : #include <arpa/inet.h>
      16              : #include <dlfcn.h>
      17              : #include <urma_opcode.h>
      18              : #include <udma_u_ctl.h>
      19              : #include "user_log.h"
      20              : #include "dl_urma_function.h"
      21              : #include "dl_net_function.h"
      22              : #include "ra_rs_err.h"
      23              : #include "rs_inner.h"
      24              : #include "rs_ctx_inner.h"
      25              : #include "rs_ub.h"
      26              : #include "rs_ub_jetty.h"
      27              : 
      28            0 : STATIC int RsResAddrMunmap(struct RsCtxJettyCb *jettyCb, struct UdmaVaInfo *vaInfo)
      29              : {
      30            0 :     struct res_map_info_in resInfoIn = {0};
      31            0 :     int ret = 0;
      32              : 
      33            0 :     resInfoIn.res_id = RsGenerateMmapResId(jettyCb->jetty->jetty_id.id, jettyCb->devCb->devAttr.ub.dieId,
      34            0 :         jettyCb->devCb->devAttr.ub.funcId);
      35            0 :     resInfoIn.target_proc_type = PROCESS_CP1;
      36            0 :     resInfoIn.res_type = vaInfo->resType;
      37            0 :     resInfoIn.priv_len = sizeof(struct UdmaVaInfo);
      38            0 :     resInfoIn.priv = (void *)vaInfo;
      39            0 :     ret = DlHalResAddrUnmapV2(jettyCb->devCb->rscb->logicId, &resInfoIn);
      40            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("DlHalResAddrUnmapV2 failed, res_type:%d ret:%d, errno:%d",
      41              :         resInfoIn.res_type, ret, errno), ret);
      42              : 
      43            0 :     return ret;
      44              : }
      45              : 
      46            0 : STATIC int RsResAddrMmap(struct RsCtxJettyCb *jettyCb, struct UdmaVaInfo *vaInfo,
      47              :     struct res_map_info_out *resInfoOut)
      48              : {
      49            0 :     struct res_map_info_in resInfoIn = {0};
      50            0 :     int ret = 0;
      51              : 
      52            0 :     resInfoIn.res_id = RsGenerateMmapResId(jettyCb->jetty->jetty_id.id, jettyCb->devCb->devAttr.ub.dieId,
      53            0 :         jettyCb->devCb->devAttr.ub.funcId);
      54            0 :     resInfoIn.target_proc_type = PROCESS_CP1;
      55            0 :     resInfoIn.res_type = vaInfo->resType;
      56            0 :     resInfoIn.priv_len = sizeof(struct UdmaVaInfo);
      57            0 :     resInfoIn.priv = (void *)vaInfo;
      58            0 :     ret = DlHalResAddrMapV2(jettyCb->devCb->rscb->logicId, &resInfoIn, resInfoOut);
      59            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("DlHalResAddrMapV2 failed, res_type:%d ret:%d, errno:%d",
      60              :         resInfoIn.res_type, ret, errno), ret);
      61              : 
      62            0 :     return ret;
      63              : }
      64              : 
      65            3 : STATIC void RsMunmapJettyVa(struct RsCtxJettyCb *jettyCb)
      66              : {
      67            3 :     struct UdmaVaInfo vaInfo = {0};
      68              : 
      69            3 :     if ((jettyCb->jettyMode != JETTY_MODE_CACHE_LOCK_DWQE) && (jettyCb->jettyMode != JETTY_MODE_USER_CTL_NORMAL)) {
      70            3 :         return;
      71              :     }
      72              : 
      73            0 :     vaInfo.resType = RES_ADDR_TYPE_HCCP_URMA_JETTY;
      74            0 :     vaInfo.va = jettyCb->sqBuffVa;
      75            0 :     vaInfo.len = WQE_BB_SIZE * jettyCb->txDepth * WQEBB_NUM_PER_SQE;
      76            0 :     vaInfo.pid = getpid();
      77            0 :     (void)RsResAddrMunmap(jettyCb, &vaInfo);
      78              : 
      79            0 :     vaInfo.resType = RES_ADDR_TYPE_HCCP_URMA_DB;
      80            0 :     vaInfo.va = ALIGN_DOWN(jettyCb->dbAddr, RA_RS_4K_PAGE_SIZE);
      81            0 :     vaInfo.len = sizeof(uint64_t);
      82            0 :     vaInfo.pid = getpid();
      83            0 :     (void)RsResAddrMunmap(jettyCb, &vaInfo);
      84              : }
      85              : 
      86            0 : STATIC int RsMmapJettyVa(struct RsCtxJettyCb *jettyCb)
      87              : {
      88            0 :     struct res_map_info_out jettyVaInfoOut = {0};
      89            0 :     struct res_map_info_out dbVaInfoOut = {0};
      90            0 :     struct UdmaVaInfo jettyVaInfo = {0};
      91            0 :     struct UdmaVaInfo dbVaInfo = {0};
      92            0 :     uint64_t dbOffset = 0;
      93            0 :     int ret = 0;
      94              : 
      95            0 :     jettyVaInfo.resType = RES_ADDR_TYPE_HCCP_URMA_JETTY;
      96            0 :     jettyVaInfo.va = jettyCb->sqBuffVa;
      97            0 :     jettyVaInfo.len = WQE_BB_SIZE * jettyCb->txDepth * WQEBB_NUM_PER_SQE;
      98            0 :     jettyVaInfo.pid = getpid();
      99            0 :     ret = RsResAddrMmap(jettyCb, &jettyVaInfo, &jettyVaInfoOut);
     100            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_res_addr_mmap failed, res_type:%u ret:%d",
     101              :         jettyVaInfo.resType, ret), ret);
     102            0 :     jettyCb->sqBuffVa = jettyVaInfoOut.va;
     103              : 
     104            0 :     dbVaInfo.resType = RES_ADDR_TYPE_HCCP_URMA_DB;
     105            0 :     dbVaInfo.va = ALIGN_DOWN(jettyCb->dbAddr, RA_RS_4K_PAGE_SIZE);
     106            0 :     dbOffset = jettyCb->dbAddr - dbVaInfo.va;
     107            0 :     dbVaInfo.len = sizeof(uint64_t);
     108            0 :     dbVaInfo.pid = getpid();
     109            0 :     ret = RsResAddrMmap(jettyCb, &dbVaInfo, &dbVaInfoOut);
     110            0 :     if (ret != 0) {
     111            0 :         hccp_err("rs_res_addr_mmap failed, res_type:%u ret:%d", dbVaInfo.resType, ret);
     112            0 :         goto munmap_sq_buff_va;
     113              :     }
     114            0 :     jettyCb->dbAddr = dbVaInfoOut.va + dbOffset;
     115            0 :     return ret;
     116              : 
     117            0 : munmap_sq_buff_va:
     118            0 :     jettyVaInfo.va = jettyVaInfoOut.va;
     119            0 :     ret += RsResAddrMunmap(jettyCb, &jettyVaInfo);
     120            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_res_addr_munmap failed, res_type:%u ret:%d",
     121              :         jettyVaInfo.resType, ret), ret);
     122            0 :     return ret;
     123              : }
     124              : 
     125            1 : void RsUbCtxExtJettyDelete(struct RsCtxJettyCb *jettyCb)
     126              : {
     127            1 :     int ret = 0;
     128              : 
     129            1 :     RsMunmapJettyVa(jettyCb);
     130            1 :     ret = RsUrmaDeactiveJetty(jettyCb->jetty);
     131            1 :     if (ret != 0) {
     132            0 :         hccp_err("rs_urma_deactive_jetty failed, ret:%d errno:%d", ret, errno);
     133              :     }
     134              : 
     135            1 :     ret = RsUrmaFreeJetty(jettyCb->jetty);
     136            1 :     if (ret != 0) {
     137            0 :         hccp_err("rs_urma_free_jetty failed, ret:%d errno:%d", ret, errno);
     138              :     }
     139              : 
     140            1 :     if (jettyCb->jettyMode == JETTY_MODE_CACHE_LOCK_DWQE) {
     141            0 :         ret = RsNetFreeJettyId(jettyCb->devCb->urmaDev->name, jettyCb->jettyMode, jettyCb->jettyId);
     142            0 :         if (ret != 0) {
     143            0 :             hccp_err("rs_net_free_jetty_id failed, jettyId:%u ret:%d", jettyCb->jettyId, ret);
     144              :         }
     145              :     }
     146              : 
     147            1 :     return;
     148              : }
     149              : 
     150            0 : STATIC int RsSetCcuJettyOpt(struct RsCtxJettyCb *jettyCb)
     151              : {
     152            0 :     uint64_t ccuJettySqBuffVa = 0;
     153            0 :     int ret = 0;
     154              : 
     155            0 :     if (!RsIsCcuJetty(jettyCb->jettyMode)) {
     156            0 :         return ret;
     157              :     }
     158              : 
     159            0 :     if (jettyCb->jettyMode == JETTY_MODE_CCU) {
     160            0 :         ccuJettySqBuffVa = jettyCb->extMode.sq.buffVa;
     161            0 :     } else if (jettyCb->jettyMode == JETTY_MODE_CCU_TA_CACHE) {
     162            0 :         ccuJettySqBuffVa = (uint64_t)jettyCb->taCacheMode.sqeBufIdx;
     163              :     }
     164              : 
     165            0 :     ret = RsUrmaSetJettyOpt(jettyCb->jetty, URMA_JFS_SQE_BASE_ADDR, (void *)&ccuJettySqBuffVa, sizeof(uint64_t));
     166            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_set_jetty_opt URMA_JFS_SQE_BASE_ADDR failed, ret:%d, errno:%d",
     167              :         ret, errno), -EOPENSRC);
     168              : 
     169            0 :     return ret;
     170              : }
     171              : 
     172            0 : STATIC int RsSetJettyOpt(struct RsCtxJettyCb *jettyCb)
     173              : {
     174            0 :     uint8_t dbCstm = jettyCb->extMode.cstmFlag.bs.dbCstm;
     175            0 :     uint16_t piType = jettyCb->extMode.piType;
     176            0 :     int ret = 0;
     177              : 
     178            0 :     hccp_dbg("sq.buff:0x%llx, sq.buffSize:%u, piType:%u, sqebbNum:%u, dbCstm:%u, txDepth:%u",
     179              :         jettyCb->extMode.sq.buffVa, jettyCb->extMode.sq.buffSize, piType, jettyCb->extMode.sqebbNum, dbCstm, jettyCb->txDepth);
     180              : 
     181            0 :     ret = RsUrmaSetJettyOpt(jettyCb->jetty, URMA_JFS_DB_STATUS, (void *)&dbCstm, sizeof(uint8_t));
     182            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_set_jetty_opt URMA_JFS_DB_STATUS failed, ret:%d, errno:%d",
     183              :         ret, errno), -EOPENSRC);
     184              : 
     185            0 :     ret = RsUrmaSetJettyOpt(jettyCb->jetty, URMA_JFS_PI_TYPE, (void *)&piType, sizeof(uint16_t));
     186            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_set_jetty_opt URMA_JFS_PI_TYPE failed, ret:%d, errno:%d",
     187              :         ret, errno), -EOPENSRC);
     188              : 
     189            0 :     ret = RsSetCcuJettyOpt(jettyCb);
     190            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("RsSetCcuJettyOpt failed, ret:%d, mode:%d", ret, jettyCb->jettyMode), ret);
     191              : 
     192            0 :     return ret;
     193              : }
     194              : 
     195            0 : STATIC int RsGetJettyOpt(struct RsCtxJettyCb *jettyCb)
     196              : {
     197            0 :     uint64_t sqBuffVa = 0, dbVa = 0;
     198            0 :     int ret = 0;
     199              : 
     200            0 :     ret = RsUrmaGetJettyOpt(jettyCb->jetty, URMA_JFS_SQE_BASE_ADDR, &sqBuffVa, sizeof(uint64_t));
     201            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_get_jetty_opt URMA_JFS_SQE_BASE_ADDR failed, ret:%d, errno:%d",
     202              :         ret, errno), -EOPENSRC);
     203              : 
     204            0 :     ret = RsUrmaGetJettyOpt(jettyCb->jetty, URMA_JFS_DB_ADDR, &dbVa, sizeof(uint64_t));
     205            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_get_jetty_opt URMA_JFS_DB_ADDR failed, ret:%d, errno:%d",
     206              :         ret, errno), -EOPENSRC);
     207              : 
     208            0 :     jettyCb->sqBuffVa = sqBuffVa;
     209            0 :     jettyCb->dbAddr = dbVa;
     210            0 :     if ((jettyCb->jettyMode == JETTY_MODE_CACHE_LOCK_DWQE) || (jettyCb->jettyMode == JETTY_MODE_USER_CTL_NORMAL)) {
     211            0 :         ret = RsMmapJettyVa(jettyCb);
     212            0 :         CHK_PRT_RETURN(ret != 0, hccp_err("rs_mmap_jetty_va failed, ret:%d", ret), ret);
     213              :     }
     214              : 
     215            0 :     return ret;
     216              : }
     217              : 
     218            2 : STATIC int RsFreeJettyId(const char *udevName, unsigned int jettyMode, unsigned int jettyId)
     219              : {
     220            2 :     int ret = 0;
     221              : 
     222            2 :     if (jettyMode != JETTY_MODE_CACHE_LOCK_DWQE) {
     223            2 :         return 0;
     224              :     }
     225              : 
     226              :     // only stars jetty need to free jetty id
     227            0 :     ret = RsNetFreeJettyId(udevName, jettyMode, jettyId);
     228            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_net_free_jetty_id failed, jettyId:%u ret:%d", jettyId, ret), ret);
     229              : 
     230            0 :     return ret;
     231              : }
     232              : 
     233            0 : STATIC int RsJettyAttrInit(struct RsCtxJettyCb *jettyCb, urma_jetty_cfg_t *jettyCfg)
     234              : {
     235            0 :     int ret = 0;
     236              : 
     237            0 :     CHK_PRT_RETURN(jettyCb->extMode.cstmFlag.bs.sqCstm == 1 && !RsIsCcuJetty(jettyCb->jettyMode),
     238              :         hccp_err("Non-CCU jetty cannot be created by specifying va, sqCstm:%u jettyMode:%u",
     239              :         jettyCb->extMode.cstmFlag.bs.sqCstm, jettyCb->jettyMode), -EINVAL);
     240              : 
     241            0 :     if (jettyCb->jettyMode == JETTY_MODE_CACHE_LOCK_DWQE) {
     242            0 :         ret = RsNetAllocJettyId(jettyCb->devCb->urmaDev->name, jettyCb->jettyMode, &jettyCfg->id);
     243            0 :         CHK_PRT_RETURN(ret != 0, hccp_err("rs_net_alloc_jetty_id failed, ret:%d", ret), ret);
     244            0 :         jettyCb->jettyId = jettyCfg->id;
     245              :     }
     246              : 
     247            0 :     ret = RsUrmaAllocJetty(jettyCb->devCb->urmaCtx, jettyCfg, &jettyCb->jetty);
     248            0 :     if (ret != 0) {
     249            0 :         ret = -EOPENSRC;
     250            0 :         RsFreeJettyId(jettyCb->devCb->urmaDev->name, jettyCb->jettyMode, jettyCb->jettyId);
     251            0 :         hccp_err("urma_alloc_jetty failed, ret:%d, errno:%d", ret, errno);
     252              :     }
     253              : 
     254            0 :     return ret;
     255              : }
     256              : 
     257            0 : STATIC int RsCcuJettyDbReg(struct RsCtxJettyCb *jettyCb)
     258              : {
     259            0 :     struct udma_u_jetty_info jettyInfo = {0};
     260            0 :     int ret = 0;
     261              : 
     262            0 :     if (!RsIsCcuJetty(jettyCb->jettyMode)) {
     263            0 :         return ret;
     264              :     }
     265              : 
     266              :     // only ccu jetty requires db registration
     267            0 :     jettyInfo.dwqe_addr = (void *)(ALIGN_DOWN(jettyCb->dbAddr, RA_RS_4K_PAGE_SIZE));
     268            0 :     ret = RsUbCtxRegJettyDb(jettyCb, &jettyInfo);
     269            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("rs_ub_ctx_reg_jetty_db failed, ret:%d", ret), ret);
     270              : 
     271            0 :     return ret;
     272              : }
     273              : 
     274            0 : void RsUbCtxExtJettyCreate(struct RsCtxJettyCb *jettyCb, urma_jetty_cfg_t *jettyCfg)
     275              : {
     276            0 :     int ret = 0;
     277              : 
     278            0 :     ret = RsJettyAttrInit(jettyCb, jettyCfg);
     279            0 :     if (ret != 0) {
     280            0 :         jettyCb->jetty = NULL;
     281            0 :         return;
     282              :     }
     283              : 
     284            0 :     ret = RsSetJettyOpt(jettyCb);
     285            0 :     if (ret != 0) {
     286            0 :         hccp_err("rs_set_jetty_opt failed, ret:%d", ret);
     287            0 :         goto free_jetty;
     288              :     }
     289              : 
     290            0 :     ret = RsUrmaActiveJetty(jettyCb->jetty);
     291            0 :     if (ret != 0) {
     292            0 :         hccp_err("rs_urma_active_jetty failed, ret:%d, errno:%d", ret, errno);
     293            0 :         ret = -EOPENSRC;
     294            0 :         goto free_jetty;
     295              :     }
     296              : 
     297            0 :     ret = RsGetJettyOpt(jettyCb);
     298            0 :     if (ret != 0) {
     299            0 :         hccp_err("rs_get_jetty_opt failed, ret:%d", ret);
     300            0 :         goto deactive_jetty;
     301              :     }
     302              : 
     303            0 :     ret = RsCcuJettyDbReg(jettyCb);
     304            0 :     if (ret != 0) {
     305            0 :         goto deactive_jetty;
     306              :     }
     307            0 :     return;
     308              : 
     309            0 : deactive_jetty:
     310            0 :     ret = RsUrmaDeactiveJetty(jettyCb->jetty);
     311            0 :     if (ret != 0) {
     312            0 :         hccp_err("rs_urma_deactive_jetty failed, ret:%d errno:%d", ret, errno);
     313              :     }
     314            0 : free_jetty:
     315            0 :     ret = RsUrmaFreeJetty(jettyCb->jetty);
     316            0 :     if (ret != 0) {
     317            0 :         hccp_err("rs_urma_free_jetty failed, ret:%d errno:%d", ret, errno);
     318              :     }
     319              : 
     320            0 :     (void)RsFreeJettyId(jettyCb->devCb->urmaDev->name, jettyCb->jettyMode, jettyCb->jettyId);
     321            0 :     jettyCb->jetty = NULL;
     322              : }
     323              : 
     324            2 : void RsUbVaMunmapBatch(struct RsCtxJettyCb **jettyCbArr, unsigned int num)
     325              : {
     326              :     unsigned int i;
     327              : 
     328            4 :     for (i = 0; i < num; ++i) {
     329            2 :         RsMunmapJettyVa(jettyCbArr[i]);
     330              :     }
     331            2 : }
     332              : 
     333            2 : void RsUbFreeJettyIdBatch(struct RsCtxJettyCb **jettyCbArr, unsigned int num)
     334              : {
     335              :     unsigned int i;
     336              : 
     337            4 :     for (i = 0; i < num; ++i) {
     338            2 :         (void)RsFreeJettyId(jettyCbArr[i]->devCb->urmaDev->name, jettyCbArr[i]->jettyMode,
     339            2 :             jettyCbArr[i]->jettyId);
     340              :     }
     341            2 : }
        

Generated by: LCOV version 2.0-1