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

Generated by: LCOV version 2.0-1