LCOV - code coverage report
Current view: top level - legacy/ascend950/unified_platform/ccu/ccu_device - ccu_device_manager.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 6 6
Test Date: 2026-08-18 17:47:01 Functions: 93.8 % 16 15

            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              : #ifndef CCU_DEVICE_MANAGER_H
      12              : #define CCU_DEVICE_MANAGER_H
      13              : 
      14              : #include <array>
      15              : #include "hccl/hccl_types.h"
      16              : 
      17              : #include "ip_address.h"
      18              : #include "ccu_dev_mgr.h"
      19              : #include "orion_adapter_hccp.h"
      20              : #include "local_ub_rma_buffer.h"
      21              : 
      22              : #include "../../../../../base_comm/resources/ccu/pub_inc/ccu_res_repo.h"
      23              : 
      24              : namespace Hccl {
      25              : 
      26              : using CcuResHandle = void*;
      27              : 
      28        28647 : MAKE_ENUM(CcuVersion, CCU_V1, CCU_V2, CCU_INVALID);
      29              : 
      30        25772 : MAKE_ENUM(ResType, LOOP, MS, CKE, XN, COUNT_XN, GSA, INS, MISSION);
      31              : 
      32              : // 使用对外头文件的数据结构
      33              : using MissionReqType = hcomm::MissionReqType;
      34              : using ResInfo = hcomm::ResInfo;
      35              : using MissionResInfo = hcomm::MissionResInfo;
      36              : using CcuResRepository = hcomm::CcuResRepository;
      37              : using MissionReq = hcomm::MissionReq;
      38              : using CcuResReq = hcomm::CcuResReq;
      39              : 
      40              : struct ChannelPara {
      41              :     uint32_t feId;
      42              :     uint32_t jettyNum;
      43              :     uint32_t sqSize;
      44              : };
      45              : 
      46              : using JettyInfo = CcuJettyInfo;
      47              : using ChannelInfo = CcuChannelInfo;
      48              : 
      49              : struct JettyCfg {
      50              :     uint16_t jettyCtxId;
      51              :     uint64_t dbVa;
      52              :     uint32_t dbTokenId;
      53              :     uint32_t dbTokenValue;
      54              : };
      55              : 
      56              : struct ChannelCfg {
      57              :     uint32_t channelId{0};
      58              :     // remote channel info
      59              :     Eid remoteEid{};
      60              :     uint32_t tpn{0};
      61              : 
      62              :     uint64_t remoteCcuVa{0};
      63              :     uint32_t memTokenId{0};
      64              :     uint32_t memTokenValue{0};
      65              :     std::vector<JettyCfg> jettyCfgs;
      66              : };
      67              : 
      68              : /* opcode definition */
      69              : enum class CcuOpcodeType {
      70              :     CCU_U_OP_GET_VERSION = 0, /* 获取CCU版本号 */
      71              : 
      72              :     CCU_U_OP_K_MIN = 10, /* 定义需要向内核发送请求的操作最小值 */
      73              : 
      74              :     CCU_U_OP_GET_BASIC_INFO = 11,  /* 获取基础信息 */
      75              :     CCU_U_OP_GET_DIE_WORKING = 15, /* 获取该dieId是否工作 */
      76              : 
      77              :     CCU_U_OP_SET_MSID_TOKEN = 53,       /* 设置连续MSID的配置值和Token相关值 */
      78              :     CCU_U_OP_SET_TASKKILL = 54,         /* 启动taskkill任务 */
      79              :     CCU_U_OP_CLEAN_TASKKILL_STATE = 55, /* 清除taskkill任务 */
      80              :     CCU_U_OP_CLEAN_TIF_TABLE = 56,      /* 清除TIF表项 */
      81              : 
      82              :     CCU_U_OP_K_MAX = 100,              /* 定义需要向内核发送请求的造作最大值 */
      83              :     CCU_U_OP_SET_TIF_SPLIT_SIZE = 127, /* 配置0.5RTT特性中的count计数单位 */
      84              :     CCU_U_OP_SET_XN_TOTAL_CNT = 128,   /* 配置比较寄存器 */
      85              : 
      86              :     /* 以下为操作CCU映射到用户态资源空间的操作码 */
      87              :     CCU_U_OP_IN_RS_MIN = 200,       /* 定义一个在RS空间操作的最小值 */
      88              :     CCU_U_OP_GET_INSTRUCTION = 201, /* 设置INS指令 */
      89              :     CCU_U_OP_GET_GSA = 202,         /* 获取GSA数据 */
      90              :     CCU_U_OP_GET_XN = 203,          /* 获取XN数据 */
      91              :     CCU_U_OP_GET_CKE = 204,         /* 获取CKE数据 */
      92              :     CCU_U_OP_GET_PFE = 205,         /* 获取PFE数据 */
      93              :     CCU_U_OP_GET_CHANNEL = 206,     /* 获取Channel数据 */
      94              :     CCU_U_OP_GET_JETTY_CTX = 207,   /* 获取Jetty_ctx数据 */
      95              :     CCU_U_OP_GET_MISSION_CTX = 208, /* 获取Mission_ctx数据 */
      96              :     CCU_U_OP_GET_LOOP_CTX = 209,    /* 获取Loop_ctx数据 */
      97              : 
      98              :     CCU_U_OP_SET_INSTRUCTION = 251, /* 设置INS指令 */
      99              :     CCU_U_OP_SET_GSA = 252,         /* 设置GSA数据 */
     100              :     CCU_U_OP_SET_XN = 253,          /* 设置XN数据 */
     101              :     CCU_U_OP_SET_CKE = 254,         /* 设置CKE数据 */
     102              :     CCU_U_OP_SET_PFE = 255,         /* 设置PFE数据 */
     103              :     CCU_U_OP_SET_CHANNEL = 256,     /* 设置Channel数据 */
     104              :     CCU_U_OP_SET_JETTY_CTX = 257,   /* 设置Jetty_ctx数据 */
     105              :     CCU_U_OP_SET_MISSION_CTX = 258, /* 设置Mission_ctx数据 */
     106              :     CCU_U_OP_SET_LOOP_CTX = 259,    /* 设置Loop_ctx数据 */
     107              : 
     108              :     CCU_U_OP_IN_RS_MAX = 300, /* 定义一个在RS空间操作的最大值 */
     109              : };
     110              : 
     111              : struct CcuDataByte8 {
     112              :     char raw[8];
     113              : };
     114              : 
     115              : struct CcuDataByte32 {
     116              :     char raw[32];
     117              : };
     118              : 
     119              : struct CcuDataByte64 {
     120              :     char raw[64];
     121              : };
     122              : 
     123              : struct CcuInstrInfo {
     124              :     uint64_t resourceAddr;
     125              : };
     126              : 
     127              : constexpr uint32_t CCU_ENABLE_FLAG = 1;
     128              : 
     129              : struct CcuDieInfo {
     130              :     uint32_t enableFlag;
     131              : };
     132              : 
     133              : enum class CcuVersionEnum {
     134              :     CCU_V1 = 0,
     135              :     CCU_V2 = 1,
     136              : };
     137              : 
     138              : struct CcuTifSplitSize {
     139              :     uint32_t splitPktUnit;
     140              :     uint32_t tpSplitSize;
     141              :     uint32_t ctpSplitSize;
     142              : };
     143              : 
     144              : struct CcuTotalCntXn {
     145              :     uint32_t cntIndex;
     146              :     uint32_t totalValue;
     147              :     uint32_t totalAddr;
     148              :     uint32_t flagFromAddr;
     149              :     uint32_t flagToAddr;
     150              : };
     151              : 
     152              : struct CcuDataCaps {
     153              :     uint32_t cap0;
     154              :     uint32_t cap1;
     155              :     uint32_t cap2;
     156              :     uint32_t cap3;
     157              :     uint32_t cap4;
     158              : };
     159              : 
     160              : struct CcuBaseInfoData {
     161              :     uint32_t msId;
     162              : 
     163              :     uint32_t tokenId;
     164              :     uint32_t tokenValue;
     165              :     uint32_t tokenValid;
     166              : 
     167              :     uint32_t missionKey;
     168              :     uint64_t resourceAddr;
     169              :     struct CcuDataCaps caps;
     170              : };
     171              : 
     172              : union CcuDataTypeUnion {
     173              :     struct CcuDataByte8 byte8;
     174              :     struct CcuDataByte32 byte32;
     175              :     struct CcuDataByte64 byte64;
     176              :     struct CcuBaseInfoData baseinfo;
     177              :     struct CcuInstrInfo insinfo;
     178              :     struct CcuDieInfo dieinfo;
     179              :     CcuVersionEnum ccuVersion;
     180              :     struct CcuTifSplitSize tifSplitSize;
     181              :     struct CcuTotalCntXn xnTotalCnt;
     182              :     // struct CcuHighPerfXn   highPerfXn;
     183              : };
     184              : 
     185              : struct CcuData {
     186              :     uint32_t udieIdx;
     187              :     uint32_t dataLen;                    /* 数据的总长度(sizeof(dataArray[xxx]) *  dataArraySize的值 */
     188              :     uint32_t dataArraySize;              /* dataArray数组的个数 */
     189              :     union CcuDataTypeUnion dataArray[8]; /* 不同类型的数据,通过联合体来存储 */
     190              : };
     191              : 
     192              : union CcuDataUnion {
     193              :     char raw[2048]; /* 对外呈现是一个字符数组,内部转换成对应类型CcuData */
     194              :     struct CcuData dataInfo;
     195              : };
     196              : 
     197              : struct CustomChannelInfoIn {
     198              :     CcuDataUnion data; /* 对外呈现是一个字符数组,内部转换成对应类型ccu_data */
     199              :     uint32_t offsetStartIdx; /* 对应需要操作的元素的idx位置,位置用正整数代替,使用者不需要关心元素的实际大小 */
     200              :     CcuOpcodeType op;
     201              : 
     202         1778 :     CustomChannelInfoIn() : offsetStartIdx(0), op(CcuOpcodeType::CCU_U_OP_GET_VERSION)
     203              :     {
     204         1778 :         (void)memset_s(&data, sizeof(data), 0, sizeof(data));
     205         1778 :     }
     206              : };
     207              : 
     208              : struct CustomChannelInfoOut {
     209              :     CcuDataUnion data;      /* 对外呈现是一个字符数组,内部转换成对应类型CcuData */
     210              :     uint32_t offsetNextIdx; /* 操作后返回下一个元素的idx位置,位置用正整数代替,使用者不需要关心元素的实际大小 */
     211              :     int opRet;
     212              : 
     213         1776 :     CustomChannelInfoOut() : offsetNextIdx(0), opRet(0) { (void)memset_s(&data, sizeof(data), 0, sizeof(data)); }
     214              : };
     215              : 
     216              : constexpr uint32_t SHIFT_2BITS = 2;
     217              : constexpr uint32_t SHIFT_4BITS = 4;
     218              : constexpr uint32_t SHIFT_8BITS = 8;
     219              : constexpr uint32_t SHIFT_12BITS = 12;
     220              : constexpr uint32_t SHIFT_16BITS = 16;
     221              : constexpr uint32_t SHIFT_20BITS = 20;
     222              : constexpr uint32_t SHIFT_24BITS = 24;
     223              : constexpr uint32_t SHIFT_40BITS = 40;
     224              : 
     225              : class CcuDeviceManager {
     226              : public:
     227              :     CcuDeviceManager() = delete;
     228              :     ~CcuDeviceManager() = delete;
     229              : 
     230              :     static HcclResult GetCcuVersion(const int32_t deviceLogicId, CcuVersion& ccuVersion);
     231              : 
     232              :     static HcclResult
     233              :     GetCcuResourceSpaceBufInfo(const int32_t deviceLogicId, const uint8_t dieId, uint64_t& addr, uint64_t& size);
     234              :     static HcclResult GetCcuResourceSpaceTokenInfo(
     235              :         const int32_t deviceLogicId, const uint8_t dieId, uint64_t& tokenId, uint64_t& tokenValue);
     236              :     static HcclResult GetCcuResourceSpaceTokenInfoForLocal(
     237              :         const int32_t deviceLogicId, const uint8_t dieId, uint64_t& tokenId, uint64_t& tokenValue);
     238              : 
     239              :     static HcclResult ConfigChannel(const int32_t deviceLogicId, const uint8_t dieId, ChannelCfg& cfg);
     240              :     static HcclResult
     241              :     GetLoopChannelId(const int32_t deviceLogicId, const uint8_t srcDieId, const uint8_t dstDieId, uint32_t& channIdx);
     242              : 
     243              :     static HcclResult GetResource(const int32_t deviceLogicId, const CcuResHandle handle, CcuResRepository& ccuResRepo);
     244              :     static HcclResult AllocResHandle(const int32_t deviceLogicId, const CcuResReq resReq, CcuResHandle& handle);
     245              :     static HcclResult ReleaseResHandle(const int32_t deviceLogicId, const CcuResHandle handle);
     246              : 
     247              :     static HcclResult AllocIns(const int32_t deviceLogicId, const uint8_t dieId, const uint32_t num, ResInfo& insInfo);
     248              :     static HcclResult ReleaseIns(const int32_t deviceLogicId, const uint8_t dieId, ResInfo& insInfo);
     249              :     static HcclResult
     250              :     AllocCke(const int32_t deviceLogicId, const uint8_t dieId, const uint32_t num, std::vector<ResInfo>& ckeInfos);
     251              :     static HcclResult ReleaseCke(const int32_t deviceLogicId, const uint8_t dieId, std::vector<ResInfo>& ckeInfos);
     252              :     static HcclResult
     253              :     AllocXn(const int32_t deviceLogicId, const uint8_t dieId, const uint32_t num, std::vector<ResInfo>& xnInfos);
     254              :     static HcclResult ReleaseXn(const int32_t deviceLogicId, const uint8_t dieId, std::vector<ResInfo>& xnInfos);
     255              : 
     256              :     static HcclResult GetMissionKey(const int32_t deviceLogicId, const uint8_t dieId, uint32_t& missionKey);
     257              :     static HcclResult GetInstructionNum(const int32_t deviceLogicId, const uint8_t dieId, uint32_t& instrNum);
     258              :     static HcclResult GetXnBaseAddr(const uint32_t devLogicId, const uint8_t dieId, uint64_t& xnBaseAddr);
     259              : };
     260              : 
     261              : HcclResult CheckDieValid(
     262              :     const char* funcName, const int32_t devLogicId, const uint8_t dieId,
     263              :     const std::array<bool, MAX_CCU_IODIE_NUM>& dieEnableFlags);
     264              : 
     265              : }; // namespace Hccl
     266              : 
     267              : #endif // CCU_DEVICE_MANAGER_H
        

Generated by: LCOV version 2.0-1