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