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 HCCLV2_ADAPTER_HCCP_H
12 : #define HCCLV2_ADAPTER_HCCP_H
13 : #include <vector>
14 : #include <unordered_set>
15 : #include "hccp_common.h"
16 : #include "ip_address.h"
17 : #include "data_type.h"
18 : #include "reduce_op.h"
19 : #include "hccp_tlv.h"
20 : #include <mutex>
21 : #include "hccp_async_ctx.h"
22 : #include "hccp_nda.h"
23 :
24 : namespace Hccl {
25 : using namespace std;
26 :
27 : /// 与 `Hccl::UB_QOS_DEFAULT`(legacy/framework/env_config/env_config_v2.h)及 Next `EnvConfig::UB_QOS_DEFAULT`
28 : /// 数值一致; 本头文件不 include env_config,避免经 base_config.h 拉入 dma_mode.h 导致 platform 等目标缺头编译失败。
29 : constexpr u32 kRaUbGetTpInfoParamDefaultQos = 4U;
30 :
31 : /// 单次向管控面查询 TP 列表条数上限(异步接口传入/返回 num;与 buffer 中 HccpTpInfo 条数一致)。
32 : constexpr uint32_t TP_HANDLE_REQUEST_NUM = 1U;
33 :
34 : constexpr u32 DEFAULT_INIT_PHY_ID = 0;
35 : constexpr u32 DEFAULT_INIT_NIC_POS = 0;
36 : constexpr u32 DEFAULT_HDC_TYPE = 6;
37 : constexpr u32 PID_HDC_TYPE = 18;
38 :
39 : constexpr u32 SOCKET_NOT_CONNECTED = 0;
40 : constexpr u32 SOCKET_CONNECTED = 1;
41 : constexpr u32 SOCKET_CONNECT_TIMEOUT = 2;
42 : constexpr u32 SOCKET_CONNECTING = 3;
43 :
44 : // QP CQ default attr
45 : constexpr u32 DEFAULT_OPBASE_MAX_SEND_WR = 32768;
46 : constexpr u32 DEFAULT_OFFLINE_MAX_SEND_WR = 128;
47 : constexpr u32 DEFAULT_MAX_RECV_WR = 128;
48 : constexpr u32 DEFAULT_MAX_SEND_SGE = 1;
49 : constexpr u32 DEFAULT_MAX_RECV_SGE = 1;
50 : constexpr u32 DEFAULT_MAX_SEND_CQ_DEPTH = 32768;
51 : constexpr u32 DEFAULT_MAX_RECV_CQ_DEPTH = 128;
52 : constexpr u32 DEFAULT_MAX_INLINE_DATA = 32;
53 : constexpr u32 HETEROG_OFFLINE_EXT_MAX_SEND_WR = 512;
54 :
55 : // 适配URMA,直接组装WQE的TOKENID需要进行移位,包括CCU与AICPU
56 : constexpr u32 URMA_TOKEN_ID_RIGHT_SHIFT = 8;
57 :
58 : // HCCL 默认无效端口号
59 : constexpr u32 HCCL_INVALID_PORT = 65536;
60 :
61 : using RdmaHandle = void*;
62 : using QpHandle = void*;
63 : using CqHandle = void*;
64 :
65 : using SocketHandle = void*;
66 : using FdHandle = void*;
67 :
68 : using MrHandle = void*;
69 :
70 661 : MAKE_ENUM(HrtNetworkMode, PEER, HDC)
71 : enum class DeviceIdType { DEVICE_ID_TYPE_PHY_ID = 0, DEVICE_ID_TYPE_SDID };
72 :
73 : inline s32 EnvLinkTimeoutGet();
74 :
75 : struct HRaInitConfig {
76 : HrtNetworkMode mode;
77 : uint32_t phyId;
78 : uint32_t hdcType{DEFAULT_HDC_TYPE};
79 : };
80 :
81 : void HrtRaInit(HRaInitConfig& cfg);
82 : void HrtRaDeInit(HRaInitConfig& cfg);
83 :
84 : struct HRaTlvInitConfig {
85 : HrtNetworkMode mode;
86 : uint32_t phyId;
87 : int32_t version;
88 : };
89 :
90 : void* HrtRaTlvInit(HRaTlvInitConfig& cfg);
91 : HcclResult HrtRaTlvRequest(void* tlv_handle, u32 tlv_module_type, u32 tlv_ccu_msg_type);
92 : void HrtRaTlvRequestForCustomChannel(void* tlvHandle, u32 msgType, void* customIn, void* customOut);
93 : void HrtRaTlvDeInit(void* tlv_handle);
94 :
95 : u32 HrtRaGetInterfaceVersion(u32 phyId, u32 interfaceOpcode);
96 :
97 : enum class TlsStatus : int {
98 : UNKNOWN = -1, // 不支持查询
99 : DISABLE = 0, // 未使能
100 : ENABLE, // 使能
101 : };
102 :
103 : HcclResult HrtRaGetTlsStatus(struct RaInfo* info, TlsStatus& tlsStatus);
104 :
105 : struct RaInterface {
106 : uint32_t phyId;
107 : IpAddress address;
108 : };
109 :
110 : SocketHandle HrtRaSocketInit(HrtNetworkMode netMode, RaInterface& in);
111 : void HrtRaSocketDeInit(SocketHandle socketHandle);
112 :
113 : struct RaSocketListenParam {
114 : SocketHandle socketHandle; /**< socket handle */
115 : unsigned int port; /**< Socket listening port number */
116 : IpAddress localIp; /**< local IP address */
117 26 : RaSocketListenParam(SocketHandle handle, u32 port, IpAddress ip) : socketHandle(handle), port(port), localIp(ip) {}
118 : };
119 :
120 : using QpConfig = struct QpConfigDef {
121 : IpAddress selfIp;
122 : IpAddress peerIp;
123 : u32 maxWr;
124 : u32 maxSendSge;
125 : u32 maxRecvSge;
126 : s32 sqEvent;
127 : s32 rqEvent;
128 :
129 : QpConfigDef(
130 : IpAddress& selfIp, IpAddress& peerIp, u32 maxWr, u32 maxSendSge, u32 maxRecvSge, s32 sqEvent, s32 rqEvent)
131 : : selfIp(selfIp),
132 : peerIp(peerIp),
133 : maxWr(maxWr),
134 : maxSendSge(maxSendSge),
135 : maxRecvSge(maxRecvSge),
136 : sqEvent(sqEvent),
137 : rqEvent(rqEvent)
138 : {}
139 0 : QpConfigDef(u32 maxWr, u32 maxSendSge, u32 maxRecvSge, s32 sqEvent, s32 rqEvent)
140 0 : : maxWr(maxWr),
141 0 : maxSendSge(maxSendSge),
142 0 : maxRecvSge(maxRecvSge),
143 0 : sqEvent(sqEvent),
144 0 : rqEvent(rqEvent)
145 0 : {}
146 103 : QpConfigDef() : maxWr(0), maxSendSge(0), maxRecvSge(0), sqEvent(0), rqEvent(0) {}
147 : };
148 :
149 : using QpInfo = struct QpInfoDef {
150 : QpConfig attr;
151 : RdmaHandle rdmaHandle;
152 : QpHandle qpHandle;
153 : struct ibv_qp* qp;
154 : void* context;
155 : struct ibv_cq* sendCq;
156 : struct ibv_cq* recvCq;
157 : struct ibv_srq* srq;
158 : struct ibv_cq* srqCq;
159 : void* srqContext;
160 : struct ibv_comp_channel* sendChannel;
161 : struct ibv_comp_channel* recvChannel;
162 : s32 flag = 0;
163 : s32 qpMode = 0;
164 : u32 trafficClass = 0;
165 : u32 serviceLevel = 0;
166 : u32 retryCnt = 0;
167 : u32 retryInterval = 0;
168 : s32 lbValue = -1; // 支持负载均衡(lbmax > 0)的网卡才会更新该值
169 : u32 udpSport = 0;
170 103 : QpInfoDef()
171 206 : : rdmaHandle(nullptr),
172 103 : qpHandle(nullptr),
173 103 : qp(nullptr),
174 103 : context(nullptr),
175 103 : sendCq(nullptr),
176 103 : recvCq(nullptr),
177 103 : srq(nullptr),
178 103 : srqCq(nullptr),
179 103 : srqContext(nullptr),
180 103 : sendChannel(nullptr),
181 103 : recvChannel(nullptr),
182 103 : trafficClass(HCCL_COMM_TRAFFIC_CLASS_CONFIG_NOT_SET),
183 103 : serviceLevel(HCCL_COMM_SERVICE_LEVEL_CONFIG_NOT_SET)
184 103 : {}
185 : QpInfoDef(
186 : QpConfig attr, RdmaHandle rdmaHandle, QpHandle qpHandle, struct ibv_qp* qp, void* context,
187 : struct ibv_cq* sendCq, struct ibv_cq* recvCq, struct ibv_srq* srq, struct ibv_cq* srqCq,
188 : void* srqContext = nullptr, struct ibv_comp_channel* sendChannel = nullptr,
189 : struct ibv_comp_channel* recvChannel = nullptr, u32 tc = HCCL_COMM_TRAFFIC_CLASS_CONFIG_NOT_SET,
190 : u32 sl = HCCL_COMM_SERVICE_LEVEL_CONFIG_NOT_SET)
191 : : attr(attr),
192 : rdmaHandle(rdmaHandle),
193 : qpHandle(qpHandle),
194 : qp(qp),
195 : context(context),
196 : sendCq(sendCq),
197 : recvCq(recvCq),
198 : srq(srq),
199 : srqCq(srqCq),
200 : srqContext(srqContext),
201 : sendChannel(sendChannel),
202 : recvChannel(recvChannel),
203 : trafficClass(tc),
204 : serviceLevel(sl)
205 : {}
206 : };
207 :
208 : using CqInfo = struct CqInfoDef {
209 : struct ibv_cq* sq;
210 : struct ibv_cq* rq;
211 : void* context;
212 : u32 depth;
213 : u32 used;
214 : s32 sqEvent;
215 : s32 rqEvent;
216 : void* srqContext;
217 : struct ibv_comp_channel* sendChannel;
218 : struct ibv_comp_channel* recvChannel;
219 : std::vector<QpInfo> qps;
220 0 : CqInfoDef()
221 0 : : sq(nullptr),
222 0 : rq(nullptr),
223 0 : context(nullptr),
224 0 : depth(0),
225 0 : used(0),
226 0 : sqEvent(-1),
227 0 : rqEvent(-1),
228 0 : srqContext(nullptr),
229 0 : sendChannel(nullptr),
230 0 : recvChannel(nullptr)
231 0 : {}
232 0 : CqInfoDef(
233 : struct ibv_cq* sq, struct ibv_cq* rq, void* context, u32 depth, s32 sqEvent, s32 rqEvent,
234 : void* srqContext = nullptr, struct ibv_comp_channel* sendChannel = nullptr,
235 : struct ibv_comp_channel* recvChannel = nullptr)
236 0 : : sq(sq),
237 0 : rq(rq),
238 0 : context(context),
239 0 : depth(depth),
240 0 : used(0),
241 0 : sqEvent(sqEvent),
242 0 : rqEvent(rqEvent),
243 0 : srqContext(srqContext),
244 0 : sendChannel(sendChannel),
245 0 : recvChannel(recvChannel)
246 0 : {}
247 : };
248 :
249 : void HrtRaSocketListenOneStart(RaSocketListenParam& in, HrtNetworkMode netMode);
250 : void HrtRaSocketListenOneStop(RaSocketListenParam& in);
251 : bool HrtRaSocketTryListenOneStart(RaSocketListenParam& in, HrtNetworkMode netMode);
252 :
253 : void HrtRaSocketSetWhiteListStatus(u32 enable);
254 : u32 HrtRaSocketGetWhiteListStatus();
255 :
256 : struct RaSocketWhitelist {
257 : IpAddress remoteIp; /**< IP address of remote */
258 : uint32_t connLimit; /**< limit of whilte list */
259 : std::string tag;
260 : };
261 :
262 : void HrtRaSocketWhiteListAdd(SocketHandle socketHandle, vector<RaSocketWhitelist>& wlists);
263 : void HrtRaSocketWhiteListDel(SocketHandle socketHandle, vector<RaSocketWhitelist>& wlists);
264 : void HrtRaSocketGetVnicIpInfos(u32 phyId, DeviceIdType deviceIdType, u32 deviceId, IpAddress& vnicIP);
265 :
266 : struct RaSocketConnectParam {
267 : SocketHandle socketHandle; /**< socket handle */
268 : IpAddress remoteIp; /**< IP address of remote socket, [0-7] is reserved for vnic */
269 : unsigned int port; /**< Socket listening port number */
270 : std::string tag;
271 6 : RaSocketConnectParam(SocketHandle handle, IpAddress& remoteIp, u32 port, const std::string& tag)
272 6 : : socketHandle(handle),
273 6 : remoteIp(remoteIp),
274 6 : port(port),
275 6 : tag(tag)
276 6 : {}
277 : };
278 :
279 : struct RaSocketCloseParam {
280 : SocketHandle socketHandle;
281 : FdHandle fdHandle;
282 16 : RaSocketCloseParam(SocketHandle socketHandle, FdHandle fdHandle) : socketHandle(socketHandle), fdHandle(fdHandle) {}
283 : };
284 :
285 : void HrtRaSocketConnectOne(RaSocketConnectParam& in);
286 : void HrtRaSocketCloseOne(RaSocketCloseParam& in);
287 :
288 : struct RaSocketGetParam {
289 : SocketHandle socketHandle; /**< socket handle */
290 : IpAddress remoteIp; /**< IP address of remote socket */
291 : std::string tag;
292 : FdHandle fdHandle;
293 21 : RaSocketGetParam(SocketHandle handle, IpAddress& remoteIp, const std::string& tag, FdHandle fdHandle)
294 21 : : socketHandle(handle),
295 21 : remoteIp(remoteIp),
296 21 : tag(tag),
297 21 : fdHandle(fdHandle)
298 21 : {}
299 : };
300 :
301 : struct RaSocketFdHandleParam {
302 : FdHandle fdHandle; /**< fd handle */
303 : int status; /**< socket status:0 not connected 1:connected 2:connect timeout 3:connecting */
304 40 : RaSocketFdHandleParam(FdHandle fdHandle, int status) : fdHandle(fdHandle), status(status) {}
305 : };
306 : RaSocketFdHandleParam HrtRaBlockGetOneSocket(u32 role, RaSocketGetParam& param, u32 timeout = 0);
307 :
308 : void HrtRaSocketBlockSend(const FdHandle fdHandle, const void* data, u32 sendSize);
309 : bool HrtRaSocketNonBlockSend(const FdHandle fdHandle, void* data, u64 size, u64* sentSize);
310 : void HrtRaSocketBlockRecv(const FdHandle fdHandle, void* data, u32 size);
311 : HcclResult HrtRaSocketNonBlockSendHeart(const FdHandle fdHandle, void* data, u64 size, u64* sentSize);
312 : HcclResult HrtRaSocketNonBlockRecvHeart(const FdHandle fdHandle, void* data, u64 size, u64* recvSize);
313 :
314 : vector<std::pair<std::string, IpAddress>> HrtGetHostIf(u32 devPhyId);
315 : vector<IpAddress> HrtGetDeviceIp(u32 devicePhyId, NetworkMode netWorkMode = NetworkMode::NETWORK_OFFLINE);
316 :
317 : constexpr u32 RDMA_MEM_KEY_MAX_LEN = 64; // 最大的memKey长度
318 : constexpr u32 RDMA_MEM_KEY_LEN_ROCE = 4; // 暂定ROCE k的ey长度为4, 未来从HCCP新接口获取key真实长度
319 :
320 : RdmaHandle HrtRaRdmaInit(HrtNetworkMode netMode, RaInterface& in);
321 : void HrtRaRdmaDeInit(RdmaHandle rdmaHandle, HrtNetworkMode netMode);
322 :
323 : void HrtRaGetNotifyBaseAddr(RdmaHandle rdmaHandle, u64* va, u64* size);
324 :
325 : constexpr s32 QP_FLAG_RC = 0; // flag: 0 = RC, 1= UD,其它预留
326 : constexpr s32 OFFLINE_QP_MODE = 1; // 下沉模式的QP(80)
327 : constexpr s32 OPBASE_QP_MODE = 2; // 单算子模式的QP(80)
328 : constexpr s32 OFFLINE_QP_MODE_EXT = 3; // 下沉模式(81)QP
329 : constexpr s32 OPBASE_QP_MODE_EXT = 4; // 单算子模式(81)的QP
330 :
331 : QpHandle HrtRaQpCreate(RdmaHandle rdmaHandle, int flag, int qpMode);
332 :
333 : void HrtRaQpDestroy(QpHandle qpHandle);
334 : void HrtRaQpConnectAsync(QpHandle qpHandle, FdHandle fdHandle);
335 : int HrtGetRaQpStatus(QpHandle qpHandle);
336 :
337 : struct RaMrInfo {
338 : void* addr; /**< starting address of mr */
339 : unsigned long long size; /**< size of mr */
340 : int access; /**< access of mr, reference to ra_access_flags */
341 : unsigned int lkey; /**< local addr access key */
342 : };
343 :
344 : void HrtRaMrReg(QpHandle qpHandle, RaMrInfo& info);
345 : void HrtRaMrDereg(QpHandle qpHandle, RaMrInfo& info);
346 :
347 : struct HRaSendWr {
348 : uint64_t locAddr; /**< address of buf */
349 : uint32_t len; /**< len of buf */
350 : uint64_t rmtAddr; /**< destination address */
351 : uint32_t op; /**< operations of RDMA supported:RDMA_WRITE:0 */
352 : int sendFlag; /**< reference to ra_send_flags */
353 3 : HRaSendWr(uint64_t locAddr, uint32_t len, uint64_t rmtAddr, uint32_t op, int sendFlag)
354 3 : : locAddr(locAddr),
355 3 : len(len),
356 3 : rmtAddr(rmtAddr),
357 3 : op(op),
358 3 : sendFlag(sendFlag)
359 3 : {}
360 : };
361 :
362 : struct RaSendWrResp {
363 : unsigned int sqIndex; /**< index of sq */
364 : unsigned int wqeIndex; /**< index of wqe */
365 : unsigned int dbIndex; /**< index of db */
366 : unsigned long dbInfo; /**< db content */
367 3 : RaSendWrResp(unsigned int sqIndex, unsigned int wqeIndex, unsigned int dbIndex, unsigned long dbInfo)
368 3 : : sqIndex(sqIndex),
369 3 : wqeIndex(wqeIndex),
370 3 : dbIndex(dbIndex),
371 3 : dbInfo(dbInfo)
372 3 : {}
373 : };
374 :
375 : RaSendWrResp HrtRaSendOneWr(QpHandle qpHandle, HRaSendWr& in);
376 :
377 : string HrtRaGetKeyDescribe(const u8* key, u32 len);
378 :
379 : using LocMemHandle = u64;
380 : using RemMemHandle = u64;
381 : using JfcHandle = u64;
382 : using JettyHandle = u64;
383 : using TargetJettyHandle = u64;
384 : using NotifyHandle = u64;
385 : using TokenIdHandle = u64;
386 :
387 : using HrtRaUbCtxInitParam = struct HrtRaUbCtxInitParamDef {
388 : HrtNetworkMode mode;
389 : u32 phyId;
390 : const IpAddress& addr;
391 30 : HrtRaUbCtxInitParamDef(HrtNetworkMode mode, u32 phyId, const IpAddress& addr) : mode(mode), phyId(phyId), addr(addr)
392 30 : {}
393 : };
394 :
395 : RdmaHandle HrtRaUbCtxInit(const HrtRaUbCtxInitParam& in);
396 :
397 : void HrtRaUbCtxDestroy(RdmaHandle handle);
398 :
399 : std::pair<TokenIdHandle, uint32_t> RaUbAllocTokenIdHandle(RdmaHandle handle);
400 : void RaUbFreeTokenIdHandle(RdmaHandle handle, TokenIdHandle tokenIdHandle);
401 :
402 : using HrtRaUbLocMemRegParam = struct HrtRaUbLocalMemRegParamDef {
403 : u64 addr;
404 : u64 size;
405 : u32 tokenValue;
406 : TokenIdHandle tokenIdHandle;
407 : u32 nonPin{1}; // 1: 寄存器(notify和cntNotify、CCU), 0: Memory(rtMalloc)
408 641 : HrtRaUbLocalMemRegParamDef(u64 addr, u64 size, u32 tokenValue, TokenIdHandle tokenIdHandle, u32 nonPin = 1)
409 641 : : addr(addr),
410 641 : size(size),
411 641 : tokenValue(tokenValue),
412 641 : tokenIdHandle(tokenIdHandle),
413 641 : nonPin(nonPin)
414 641 : {}
415 : };
416 :
417 : constexpr u32 HRT_UB_MEM_KEY_MAX_LEN = 64; // UB 最大的memKey长度
418 :
419 : using HrtRaUbLocalMemRegOutParam = struct HrtRaUbLocMemHandleParamDef {
420 : LocMemHandle handle{0};
421 : u8 key[HRT_UB_MEM_KEY_MAX_LEN]{};
422 : u32 tokenId{0};
423 : u64 targetSegVa{0};
424 : u32 keySize{0};
425 : };
426 :
427 : HrtRaUbLocalMemRegOutParam HrtRaUbLocalMemReg(RdmaHandle handle, const HrtRaUbLocMemRegParam& in);
428 :
429 : std::pair<u64, u64> BufAlign(u64 addr, u64 size);
430 :
431 : void HrtRaUbLocalMemUnreg(RdmaHandle rdmaHandle, LocMemHandle lmemHandle);
432 :
433 : using HrtRaUbRemMemImportedOutParam = struct HrtRaUbRemMemHandleParamDef {
434 : RemMemHandle handle{0};
435 : u64 targetSegVa{0};
436 : };
437 :
438 : HrtRaUbRemMemImportedOutParam HrtRaUbRemoteMemImport(RdmaHandle handle, u8* key, u32 keyLen, u32 tokenValue);
439 :
440 : void HrtRaUbRemoteMemUnimport(RdmaHandle rdmaHandle, RemMemHandle rmemHandle);
441 :
442 6140 : MAKE_ENUM(HrtUbJfcMode, NORMAL, STARS_POLL, CCU_POLL, USER_CTL)
443 :
444 : struct CqCreateInfo {
445 : uint64_t va;
446 : uint32_t id;
447 : uint64_t bufAddr;
448 : uint32_t cqeSize;
449 : uint32_t cqDepth;
450 : uint64_t swdbAddr;
451 : };
452 :
453 : JfcHandle HrtRaUbCreateJfc(RdmaHandle handle, CqCreateInfo& cqInfo, HrtUbJfcMode mode);
454 :
455 : JfcHandle HrtRaUbCreateJfcUserCtl(RdmaHandle handle, CqCreateInfo& cqInfo);
456 :
457 : void HrtRaUbDestroyJfc(RdmaHandle handle, JfcHandle jfcHandle);
458 :
459 2040 : MAKE_ENUM(HrtTransportMode, RM);
460 2276 : MAKE_ENUM(TpProtocol, CTP, TP, UBOE, UB_RTP);
461 :
462 : // STANDARD: URMA标准CreateJetty
463 : // HOST_OFFLOAD: HOST侧展开下沉算子,需要指定sqeBbNum
464 : // HOST_OPBASE: Host展开单算子,需要指定sqeBbNum,
465 : // DEV_USED: 在Dev的APICPU展开算子,STARS不能使用UB DirectWQE的task,可以使用UB DbSend task,不需要指定sqeBbNum
466 : // CACHE_LOCK_DWQE: 该模式下, STARS仅能使用UB DirectWQE的task,不能使用UB DbSend task,,需要指定sqeBbNum
467 : // CCU_CCUM_CACHE: 不需要指定sqeBbNum
468 2839 : MAKE_ENUM(HrtJettyMode, STANDARD, HOST_OFFLOAD, HOST_OPBASE, DEV_USED, CACHE_LOCK_DWQE, CCU_CCUM_CACHE)
469 : using HrtRaUbCreateJettyParam = struct HrtRaUbJettyCreateParamDef {
470 : JfcHandle sjfcHandle{0};
471 : JfcHandle rjfcHandle{0};
472 :
473 : // CCU的DB需要注册,填写tokenValue
474 : u32 tokenValue{0};
475 : TokenIdHandle tokenIdHandle{0};
476 :
477 : HrtJettyMode jettyMode{HrtJettyMode::STANDARD};
478 :
479 : // 如果jettyId为0,则代表UB自行申请jetty,如果jettyId不为0,则代表使用预留jetty id
480 : // [1024, 1024 +127]为ccuJetty预留的id
481 : // [1024 + 192, 1024 + 192 + 4K - 1]为starsJetty预留的id
482 : u32 jettyId{0};
483 :
484 : // 指定内存,需要填写的参数,CCU类型需要填写,即HrtJettyMode::CCU_CCUM_CACHE
485 : u64 sqBufVa{0};
486 : u32 sqBufSize{0};
487 : // 指定sqeBB资源起始id,当前预留
488 : u32 sqeBufIndex{0};
489 :
490 : // HOST_OFFLOAD / HOST_OPBASE / CACHE_LOCK_DWQE 类型的Jetty ,需要指定WQEBB的数目
491 : // STADARD 类型Jetty,该参数代表SQ深度
492 : u32 sqDepth{0};
493 : /// UB Jetty priority(低 4bit);GetQpCreateAttr 写入 attr.ub.priority
494 : u8 qos{2};
495 : u32 rqDepth{64};
496 : HrtTransportMode transMode{HrtTransportMode::RM}; // 仅能使用RM模式的Jetty
497 : u8 errTimeout{16};
498 :
499 808 : HrtRaUbJettyCreateParamDef() {}
500 :
501 954 : HrtRaUbJettyCreateParamDef(
502 : JfcHandle sjfcHandle, JfcHandle rjfcHandle, u32 tokenValue, TokenIdHandle tokenIdHandle, HrtJettyMode jettyMode,
503 : u32 jettyId, u64 sqBufVa, u32 sqBufSize, u32 sqeBufIndex, u32 sqDepth, u8 errTimeout = 16)
504 954 : : sjfcHandle(sjfcHandle),
505 954 : rjfcHandle(rjfcHandle),
506 954 : tokenValue(tokenValue),
507 954 : tokenIdHandle(tokenIdHandle),
508 954 : jettyMode(jettyMode),
509 954 : jettyId(jettyId),
510 954 : sqBufVa(sqBufVa),
511 954 : sqBufSize(sqBufSize),
512 954 : sqeBufIndex(sqeBufIndex),
513 954 : sqDepth(sqDepth),
514 954 : errTimeout(errTimeout)
515 954 : {}
516 : };
517 :
518 : constexpr u32 HRT_UB_QP_KEY_MAX_LEN = 64; // UB 最大的QpKey长度
519 :
520 : using HrtRaUbJettyCreatedOutParam = struct HrtRaUbJettyCreatedOutParamDef {
521 : JettyHandle handle{0};
522 : u8 key[HRT_UB_QP_KEY_MAX_LEN]{0};
523 : u64 jettyVa{0};
524 : u32 uasid{0};
525 : u32 id{0};
526 : u32 keySize{0};
527 : u64 dbVa{0};
528 : u32 dbTokenId{0};
529 : uint64_t sqBuffVa{0}; // 适配HCCP修改,jettybufva由HCCP提供,不再由HCCL分配
530 : };
531 :
532 : HrtRaUbJettyCreatedOutParam HrtRaUbCreateJetty(RdmaHandle handle, const HrtRaUbCreateJettyParam& in);
533 :
534 : void HrtRaUbDestroyJetty(JettyHandle jettyHandle);
535 :
536 : struct JettyImportCfg {
537 : u64 localTpHandle{0};
538 : u64 remoteTpHandle{0};
539 : u64 localTag{0}; // tag是hccp预留字段,暂不需要赋值
540 : u32 localPsn{0};
541 : u32 remotePsn{0};
542 : TpProtocol protocol{TpProtocol::INVALID};
543 : };
544 :
545 : using HrtRaUbJettyImportedInParam = struct HrtRaUbJettyImportedInParamDef {
546 : u8* key{nullptr};
547 : u32 keyLen{0};
548 : u32 tokenValue{0};
549 : JettyImportCfg jettyImportCfg{};
550 : };
551 :
552 : using HrtRaUbJettyImportedOutParam = struct HrtRaUbJettyImportedOutParamDef {
553 : TargetJettyHandle handle{0};
554 : u64 targetJettyVa{0};
555 : u32 tpn{0};
556 : };
557 :
558 : HrtRaUbJettyImportedOutParam RaUbImportJetty(RdmaHandle handle, u8* key, u32 keyLen, u32 tokenValue);
559 : HrtRaUbJettyImportedOutParam
560 : RaUbTpImportJetty(RdmaHandle handle, u8* key, u32 keyLen, u32 tokenValue, const JettyImportCfg& jettyImportCfg);
561 :
562 : void HrtRaUbUnimportJetty(RdmaHandle handle, TargetJettyHandle targetJettyHandle);
563 :
564 : void HrtRaUbJettyBind(JettyHandle jettyHandle, TargetJettyHandle targetJettyHandle);
565 :
566 : void HrtRaUbJettyUnbind(JettyHandle jettyHandle);
567 :
568 : // 参照hccp做opcode定义
569 739 : MAKE_ENUM(HrtUbSendWrOpCode, WRITE, WRITE_WITH_NOTIFY, READ, NOP)
570 :
571 : using HrtRaUbSendWrReqParam = struct HrtRaUbSendWrParamDef {
572 : HrtUbSendWrOpCode opcode;
573 : bool cqeEn{true};
574 :
575 : bool inlineFlag{false};
576 : u8* inlineData;
577 :
578 : bool inlineReduceFlag{false};
579 : DataType dataType;
580 : ReduceOp reduceOp;
581 :
582 : u64 notifyData;
583 : u64 notifyAddr;
584 : NotifyHandle notifyHandle;
585 :
586 : u64 localAddr;
587 : u64 remoteAddr;
588 : u32 size;
589 :
590 : LocMemHandle lmemHandle;
591 : RemMemHandle rmemHandle;
592 :
593 : TargetJettyHandle handle; // valid when RM mode
594 : };
595 :
596 : using HrtRaUbSendWrRespParam = struct HrtRaUbDbInfoParamDef {
597 : u32 jettyId{0};
598 : u32 funcId{0};
599 : u32 dieId{0};
600 : u32 piVal{0};
601 : u8 dwqe[128]{0};
602 : u32 dwqeSize{0};
603 : };
604 :
605 : HrtRaUbSendWrRespParam HrtRaUbPostSend(JettyHandle jettyHandle, HrtRaUbSendWrReqParam& in);
606 : void HrtRaUbPostNops(JettyHandle jettyHandle, JettyHandle remoteJettyHandle, const u32 numNop);
607 :
608 : std::pair<uint32_t, uint32_t> HraGetDieAndFuncId(RdmaHandle handle);
609 : bool HraGetRtpEnable(RdmaHandle handle);
610 :
611 : struct HRaInfo {
612 : HrtNetworkMode mode;
613 : uint32_t phyId;
614 24 : HRaInfo(HrtNetworkMode mode, uint32_t phyId) : mode(mode), phyId(phyId) {}
615 : };
616 :
617 : void RaUbUpdateCi(JettyHandle jettyHandle, u32 ci);
618 :
619 : struct HrtDevEidInfo {
620 : #ifdef HCCL_ALG_ANALYZER_DAVID
621 : std::string portId{0};
622 : #endif
623 : std::string name{0};
624 : IpAddress ipAddress{0};
625 : uint32_t eidIndex{0};
626 : uint32_t type{0};
627 : uint32_t dieId{0};
628 : uint32_t chipId{0};
629 : uint32_t funcId{0};
630 : uint32_t devFeature{0};
631 : };
632 : std::vector<HrtDevEidInfo> HrtRaGetDevEidInfoList(const HRaInfo& raInfo);
633 :
634 : RaSocketFdHandleParam RaGetOneSocket(u32 role, RaSocketGetParam& param);
635 :
636 : using RequestHandle = u64;
637 :
638 10730692 : MAKE_ENUM(ReqHandleResult, COMPLETED, NOT_COMPLETED, SOCK_E_AGAIN, INVALID_PARA);
639 :
640 : ReqHandleResult HrtRaGetAsyncReqResult(RequestHandle& reqHandle);
641 :
642 : RequestHandle RaSocketConnectOneAsync(RaSocketConnectParam& in);
643 : RequestHandle RaSocketCloseOneAsync(RaSocketCloseParam& in);
644 : RequestHandle RaSocketListenOneStartAsync(SocketListenInfoT* listenInfo);
645 : RequestHandle RaSocketListenOneStopAsync(RaSocketListenParam& in);
646 :
647 : RequestHandle HrtRaSocketSendAsync(const FdHandle fdHandle, const void* data, u32 size, unsigned long long& sentSize);
648 : RequestHandle HrtRaSocketRecvAsync(const FdHandle fdHandle, void* data, u32 size, unsigned long long& recvSize);
649 :
650 : RequestHandle
651 : RaUbLocalMemRegAsync(RdmaHandle handle, const HrtRaUbLocMemRegParam& in, vector<char_t>& out, void*& lmemHandle);
652 : RequestHandle RaUbLocalMemUnregAsync(RdmaHandle rdmaHandle, LocMemHandle lmemHandle);
653 :
654 : RequestHandle RaUbCreateJettyAsync(
655 : const RdmaHandle handle, const HrtRaUbCreateJettyParam& in, vector<char_t>& out, void*& jettyHandle);
656 : RequestHandle RaUbDestroyJettyAsync(void* jettyHandle);
657 :
658 : using RaUbGetTpInfoParam = struct RaUbGetTpInfoParamDef {
659 : IpAddress locAddr{};
660 : IpAddress rmtAddr{};
661 : TpProtocol tpProtocol{TpProtocol::CTP};
662 : /// 与 Next TpMgr 一致:参与 SL→jetty priority 映射(0–7);默认见 kRaUbGetTpInfoParamDefaultQos
663 : uint32_t qos{kRaUbGetTpInfoParamDefaultQos};
664 : uint32_t slLevelCount{0U};
665 : bool loopFirstTpLowestSl{false};
666 : /// 与 Next `GetTpInfoParam::ccuLoopbackGetTpInfo` 对齐:标识 CCU 设备环回 GetTpInfo(便于日志/后续分支)
667 : bool ccuLoopbackGetTpInfo{false};
668 : /// UBOE SetTpAttr sip/dip 用 IPv4 地址(GetTpInfo 写回 SL/DSCP 后再设置)
669 : IpAddress locIpv4Addr{};
670 : IpAddress rmtIpv4Addr{};
671 :
672 27 : explicit RaUbGetTpInfoParamDef() = default;
673 53 : RaUbGetTpInfoParamDef(const IpAddress& locAddr, const IpAddress& rmtAddr, TpProtocol tpProtocol)
674 53 : : locAddr(locAddr),
675 53 : rmtAddr(rmtAddr),
676 53 : tpProtocol(tpProtocol)
677 53 : {}
678 :
679 77 : std::string Describe() const
680 : {
681 : return StringFormat(
682 : "RaUbGetTpInfoParam[locAddr=%s, rmtAddr=%s, tpProtocol=%s, qos=%u, loopFirstTpLowestSl=%d, ccuLoop=%d]",
683 231 : locAddr.Describe().c_str(), rmtAddr.Describe().c_str(), tpProtocol.Describe().c_str(),
684 77 : static_cast<unsigned>(qos & 0xFFU), static_cast<int>(loopFirstTpLowestSl),
685 308 : static_cast<int>(ccuLoopbackGetTpInfo));
686 : }
687 : };
688 :
689 : RequestHandle
690 : RaUbGetTpInfoAsync(const RdmaHandle rdmaHandle, const RaUbGetTpInfoParam& param, vector<char_t>& out, uint32_t& num);
691 :
692 : void RaUbGetTpInfo(const RdmaHandle rdmaHandle, const RaUbGetTpInfoParam& param, vector<char_t>& out, uint32_t& num);
693 :
694 : RequestHandle RaUbImportJettyAsync(
695 : const RdmaHandle rdmaHandle, const HrtRaUbJettyImportedInParam& in, vector<char_t>& out, void*& remQpHandle);
696 : RequestHandle RaUbTpImportJettyAsync(
697 : const RdmaHandle rdmaHandle, const HrtRaUbJettyImportedInParam& in, vector<char_t>& out, void*& remQpHandle);
698 : RequestHandle RaUbUnimportJettyAsync(void* targetJettyHandle);
699 :
700 : struct SocketEventInfo {
701 : u32 event;
702 : FdHandle fdHandle;
703 : };
704 :
705 : HcclResult HrtRaWaitEventHandle(
706 : int event_handle, std::vector<SocketEventInfo>& event_infos, int timeout, unsigned int maxevents, u32& events_num);
707 : void HrtRaGetSecRandom(u32* value, u32& devPhyId);
708 :
709 : HcclResult HrtRaCreateQpWithCq(
710 : RdmaHandle rdmaHandle, s32 sqEvent, s32 rqEvent, void* sendChannel, void* recvChannel, QpInfo& info,
711 : bool isHdcMode);
712 : HcclResult HrtRaDestroyQpWithCq(const QpInfo& info, bool isHdcMode);
713 : HcclResult HrtRaCreateCq(RdmaHandle rdmaHandle, CqInfo& cq);
714 : HcclResult HrtRaDestroyCq(RdmaHandle rdmaHandle, CqInfo& cq);
715 : HcclResult ConstructQpDefaultAttrs(s32 qpMode, struct qp_ext_attrs& attrs, bool isWorkFlowLib);
716 : HcclResult HrtRaNormalQpCreate(RdmaHandle rdmaHandle, QpInfo& qp);
717 : HcclResult HrtRaNormalQpDestroy(QpHandle qpHandle);
718 : HcclResult HrtRaNdaQpCreate(
719 : RdmaHandle rdmaHandle, NdaOps* ndaOps, uint32_t dmaMode, NdaCqInfo* cqInfo, NdaQpInfo* qpInfo, QpHandle* qpHandle);
720 : HcclResult HrtRaNdaCqCreate(
721 : RdmaHandle rdmaHandle, NdaOps* ndaOps, uint32_t dmaMode, uint32_t cqAttrFlags, NdaCqInfo* cqInfo,
722 : CqHandle* cqHandle);
723 : HcclResult HrtRaNdaCqDestroy(RdmaHandle rdmaHandle, CqHandle cqHandle);
724 :
725 0 : MAKE_ENUM(AuxInfoInType, AUX_INFO_IN_TYPE_CQE, AUX_INFO_IN_TYPE_AE, AUX_INFO_IN_TYPE_MAX);
726 : struct AuxInfoIn {
727 : AuxInfoInType auxInfoInType;
728 : union {
729 : struct {
730 : uint32_t status;
731 : uint8_t sR;
732 : } cqe;
733 : struct {
734 : uint32_t eventType;
735 : } ae;
736 : };
737 : u8 resv[7];
738 : };
739 :
740 : constexpr u32 MAX_AUX_INFO_NUM = 256;
741 : struct AuxInfoOut {
742 : uint32_t auxInfoTypes[MAX_AUX_INFO_NUM];
743 : uint32_t auxInfoValues[MAX_AUX_INFO_NUM];
744 : uint32_t auxInfoNum{0};
745 : };
746 : HcclResult RaGetAuxInfo(const RdmaHandle rdmaHandle, AuxInfoIn auxInfoIn, AuxInfoOut& auxInfoOut);
747 :
748 0 : MAKE_ENUM(JettyStatus, RESET, READY, SUSPENDED, ERROR);
749 : constexpr u32 MAX_JETTY_QUERY_NUM = 128;
750 : HcclResult
751 : RaBatchQueryJettyStatus(const std::vector<JettyHandle>& jettyHandles, std::vector<JettyStatus>& jettyAttrs, u32& num);
752 :
753 : struct ConnJettyInfo {
754 : RdmaHandle rdmaHandle{nullptr};
755 : JettyHandle remoteJetty{0};
756 : JettyHandle localJetty{0};
757 : };
758 :
759 : struct BatchDeleteJettyInfo {
760 : std::unordered_map<RdmaHandle, std::unordered_set<JettyHandle>> unimportJettyList;
761 : std::unordered_map<RdmaHandle, std::unordered_set<JettyHandle>> deleteJettyList;
762 : };
763 : constexpr u32 MAX_DELETE_JETTY_NUMS = 768;
764 : HcclResult HrtRaCtxQpDestoryBatch(
765 : const RdmaHandle handle, const std::unordered_set<JettyHandle>& jettyHandles,
766 : std::vector<JettyHandle>& failJettyHandles);
767 :
768 : enum CcuMemTypeBitmap : uint64_t {
769 : CCU_MEMTYPE_INVALID = 0,
770 : CCU_MEMTYPE_INS = 1ULL << 0,
771 : CCU_MEMTYPE_GSA = 1ULL << 1,
772 : CCU_MEMTYPE_XN = 1ULL << 2,
773 : CCU_MEMTYPE_CKE = 1ULL << 3,
774 : CCU_MEMTYPE_LOOP_CKE = 1ULL << 4,
775 : CCU_MEMTYPE_PFE = 1ULL << 5,
776 : CCU_MEMTYPE_CHN = 1ULL << 6,
777 : CCU_MEMTYPE_JETTY_CTX = 1ULL << 7,
778 : CCU_MEMTYPE_MISSION_CTX = 1ULL << 8,
779 : CCU_MEMTYPE_LOOP_CTX = 1ULL << 9,
780 : CCU_MEMTYPE_MISSION_SQE = 1ULL << 10,
781 : CCU_MEMTYPE_CQE_BLOCK0 = 1ULL << 11,
782 : CCU_MEMTYPE_CQE_BLOCK1 = 1ULL << 12,
783 : CCU_MEMTYPE_CQE_BLOCK2 = 1ULL << 13,
784 : CCU_MEMTYPE_WQEBB = 1ULL << 14,
785 : CCU_MEMTYPE_MS_BLOCK0 = 1ULL << 32,
786 : CCU_MEMTYPE_MS_BLOCK1 = 1ULL << 33,
787 : CCU_MEMTYPE_MS_BLOCK2 = 1ULL << 34,
788 : CCU_MEMTYPE_MS_BLOCK3 = 1ULL << 35
789 : };
790 :
791 : struct CcuMemInfo {
792 : CcuMemTypeBitmap memType{CcuMemTypeBitmap::CCU_MEMTYPE_INVALID};
793 : uint64_t memVa{0};
794 : uint32_t memSize{0};
795 : uint32_t resv[1];
796 : };
797 :
798 : void HrtSetMemInfoList(struct CcuMemInfo* memInfoList, uint32_t count, struct ccu_mem_info* recvMemList);
799 : HcclResult HrtGetCcuMemInfo(
800 : void* tlv_handle, uint32_t udieIdx, uint64_t memTypeBitmap, struct CcuMemInfo* memInfoList, uint32_t count);
801 :
802 : HcclResult HrtRaGetEidByIp(RdmaHandle handle, const vector<IpAddress>& ipV4AddrList, vector<IpAddress>& eidAddrList);
803 :
804 : /// 同步 Get/Set TpAttr(HOST_NET ctx 路径,包装 RaCtxGetTpAttr / RaCtxSetTpAttr)。
805 : HcclResult HrtRaGetTpAttr(RdmaHandle handle, uint64_t tpHandle, uint32_t& attrBitmap, TpAttr& attr);
806 : HcclResult HrtRaSetTpAttr(RdmaHandle handle, uint64_t tpHandle, uint32_t attrBitmap, TpAttr& attr);
807 : /// 设备侧是否支持 GetTpAttr(接口版本探测)。
808 : bool HrtRaSupportsGetTpAttr(u32 phyId);
809 :
810 : /// 发起 RaSetTpAttrAsync 后 WaitRequestResult 阻塞至完成;对调用方为同步语义。
811 : HcclResult
812 : HrtRaSetTpAttrAsync(RdmaHandle handle, uint64_t tpHandle, uint32_t attrBitmap, TpAttr& attr, RequestHandle& reqHandle);
813 : /// 发起 RaGetTpAttrAsync 后 WaitRequestResult 阻塞至完成;对调用方为同步语义。
814 : HcclResult HrtRaGetTpAttrAsync(
815 : u32 phyId, RdmaHandle handle, uint64_t tpHandle, uint32_t& attrBitmap, TpAttr& attr, RequestHandle& reqHandle);
816 : /// 仅发起 RaGetTpAttrAsync,不 Wait;供轮询路径使用。
817 : /// 调用方须先确认 HrtRaSupportsGetTpAttr(phyId) 为 true(本接口无 phyId,不做设备支持校验)。
818 : HcclResult HrtRaStartGetTpAttrAsync(
819 : RdmaHandle handle, uint64_t tpHandle, uint32_t& attrBitmap, TpAttr& attr, RequestHandle& reqHandle);
820 :
821 : constexpr u32 GET_UBOE_FLAG_ENABLE_OPCODE = 57;
822 : constexpr u32 GET_UBOE_FLAG_ENABLE_VERSION = 2;
823 : constexpr u32 UBOE_DEV_FLAG_RIGHT_SHIFT = 19;
824 :
825 : HcclResult HrtGetUboeFlagEnable(const u32 devPhyId);
826 :
827 4 : inline bool HrtCheckUboeSupported(const u32 devFeature)
828 : {
829 : // 设备特性位掩码, 右移取UBOE标志位, 值为1表示支持
830 4 : return (devFeature >> UBOE_DEV_FLAG_RIGHT_SHIFT) & 1;
831 : }
832 :
833 : } // namespace Hccl
834 : #endif // HCCLV2_ADAPTER_HCCP_H
|