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
|