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 HCOMM_ADAPTER_HCCP_H
12 : #define HCOMM_ADAPTER_HCCP_H
13 :
14 : #include <vector>
15 : #include <string>
16 :
17 : #include "hccp.h"
18 : #include "hccp_ctx.h"
19 :
20 : #include "env_config.h"
21 : #include "enum_factory.h"
22 : #include "hccl_rank_graph.h"
23 : // orion 暂时复用
24 : #include "ip_address.h"
25 :
26 : namespace hcomm {
27 :
28 : // 暂时放在adapter
29 : constexpr uint32_t URMA_EID_LEN = 16;
30 : MAKE_ENUM(HrtNetworkMode, PEER, HDC);
31 :
32 : using Eid = HccpEid; // 使用hccp定义的union表示eid
33 : // 当前支持编译定义,后续考虑直接使用hccp数据结构
34 : struct DevEidInfo {
35 : std::string name{};
36 : CommAddr commAddr{};
37 : uint32_t eidIndex{0};
38 : uint32_t type{0};
39 : uint32_t dieId{0};
40 : uint32_t chipId{0};
41 : uint32_t funcId{0};
42 : uint32_t devFeature{0};
43 : };
44 :
45 : HcclResult IpAddressToHccpEid(const Hccl::IpAddress& ipAddr, Eid& eid);
46 : HcclResult IpAddressToReverseHcclEid(const Hccl::IpAddress& ipAddr, Hccl::Eid& eid);
47 :
48 : HcclResult RaGetDevEidInfos(const RaInfo& raInfo, std::vector<DevEidInfo>& devEidInfos);
49 :
50 : using RequestHandle = u64;
51 1656 : MAKE_ENUM(
52 : RequestResult, COMPLETED, NOT_COMPLETED, SOCK_E_AGAIN, INVALID_PARA, GET_REQ_RESULT_FAILED, ASYNC_REQUEST_FAILED);
53 :
54 : RequestResult HccpGetAsyncReqResult(RequestHandle& reqHandle);
55 :
56 : using CtxHandle = void*;
57 : using JettyHandle = void*;
58 : using TargetJettyHandle = void*;
59 : using JfcHandle = void*;
60 : using TokenIdHandle = void*;
61 :
62 : HcclResult HrtRaDumpJettyContext(JettyHandle jettyHandle, u32 jettyId);
63 :
64 652 : MAKE_ENUM(HrtTransportMode, RM);
65 : // STANDARD: URMA标准CreateJetty
66 : // HOST_OFFLOAD: HOST侧展开下沉算子,需要指定sqeBbNum
67 : // HOST_OPBASE: Host展开单算子,需要指定sqeBbNum,
68 : // DEV_USED: 在Dev的APICPU展开算子,STARS不能使用UB DirectWQE的task,可以使用UB DbSend task,不需要指定sqeBbNum
69 : // CACHE_LOCK_DWQE: 该模式下, STARS仅能使用UB DirectWQE的task,不能使用UB DbSend task,,需要指定sqeBbNum
70 : // CCU_CCUM_CACHE: 不需要指定sqeBbNum
71 : // CCU_TA_CACHE: A6 CCU专用
72 2446 : MAKE_ENUM(HrtJettyMode, STANDARD, HOST_OFFLOAD, HOST_OPBASE, DEV_USED, CACHE_LOCK_DWQE, CCU_CCUM_CACHE, CCU_TA_CACHE);
73 : MAKE_ENUM(HrtUbJfcMode, NORMAL, STARS_POLL, CCU_POLL, USER_CTL);
74 : using HrtRaUbCreateJettyParam = struct HrtRaUbJettyCreateParamDef {
75 : JfcHandle sjfcHandle{nullptr};
76 : JfcHandle rjfcHandle{nullptr};
77 :
78 : // CCU的DB需要注册,填写tokenValue
79 : u32 tokenValue{0};
80 : TokenIdHandle tokenIdHandle{0};
81 :
82 : HrtJettyMode jettyMode{HrtJettyMode::STANDARD};
83 :
84 : // 如果jettyId为0,则代表UB自行申请jetty,如果jettyId不为0,则代表使用预留jetty id
85 : // [1024, 1024 +127]为ccuJetty预留的id
86 : // [1024 + 192, 1024 + 192 + 4K - 1]为starsJetty预留的id
87 : u32 jettyId{0};
88 :
89 : // 指定内存,需要填写的参数,CCU类型 和 DEV_USED类型需要填写
90 : u64 sqBufVa{0};
91 : u32 sqBufSize{0};
92 : // 指定sqeBB资源起始id,当前预留
93 : u32 sqeBufIndex{0};
94 :
95 : // HOST_OFFLOAD / HOST_OPBASE / CACHE_LOCK_DWQE 类型的Jetty ,需要指定WQEBB的数目
96 : // STADARD 类型Jetty,该参数代表SQ深度
97 : u32 sqDepth{0};
98 : u32 rqDepth{64};
99 : HrtTransportMode transMode{HrtTransportMode::RM}; // 仅能使用RM模式的Jetty
100 : u8 errTimeout{16};
101 : /// 低 4bit 映射 UB Jetty 创建属性中的 priority(attr.ub.priority = qos & 0xF)
102 : u32 qos{EnvConfig::UB_QOS_DEFAULT};
103 :
104 33 : HrtRaUbJettyCreateParamDef() {}
105 :
106 219 : HrtRaUbJettyCreateParamDef(
107 : JfcHandle sjfcHandle, JfcHandle rjfcHandle, u32 tokenValue, TokenIdHandle tokenIdHandle, HrtJettyMode jettyMode,
108 : u32 jettyId, u64 sqBufVa, u32 sqBufSize, u32 sqeBufIndex, u32 sqDepth, u8 errTimeout = 16)
109 219 : : sjfcHandle(sjfcHandle),
110 219 : rjfcHandle(rjfcHandle),
111 219 : tokenValue(tokenValue),
112 219 : tokenIdHandle(tokenIdHandle),
113 219 : jettyMode(jettyMode),
114 219 : jettyId(jettyId),
115 219 : sqBufVa(sqBufVa),
116 219 : sqBufSize(sqBufSize),
117 219 : sqeBufIndex(sqeBufIndex),
118 219 : sqDepth(sqDepth),
119 219 : errTimeout(errTimeout)
120 219 : {}
121 : };
122 :
123 : constexpr u32 HRT_UB_QP_KEY_MAX_LEN = 64; // UB 最大的QpKey长度
124 :
125 : using HrtRaUbJettyCreatedOutParam = struct HrtRaUbJettyCreatedOutParamDef {
126 : JettyHandle handle{0};
127 : u8 key[HRT_UB_QP_KEY_MAX_LEN]{0};
128 : u64 jettyVa{0};
129 : u32 uasid{0};
130 : u32 id{0};
131 : u32 keySize{0};
132 : u64 dbVa{0};
133 : u32 dbTokenId{0};
134 : };
135 :
136 : HcclResult
137 : HccpUbCreateJetty(const CtxHandle ctxhandle, const HrtRaUbCreateJettyParam& in, HrtRaUbJettyCreatedOutParam& out);
138 :
139 : HcclResult HccpUbCreateJettyAsync(
140 : const CtxHandle ctxhandle, const HrtRaUbCreateJettyParam& in, std::vector<char>& out, void*& jettyHandle,
141 : RequestHandle& reqHandle);
142 :
143 0 : MAKE_ENUM(JettyStatus, RESET, READY, SUSPENDED, ERROR);
144 : constexpr u32 MAX_JETTY_QUERY_NUM = 128;
145 : HcclResult
146 : RaBatchQueryJettyStatus(const std::vector<JettyHandle>& jettyHandles, std::vector<JettyStatus>& jettyAttrs, u32& num);
147 :
148 : using HrtRaUbJettyImportedOutParam = struct HrtRaUbJettyImportedOutParamDef {
149 : TargetJettyHandle handle{0};
150 : u64 targetJettyVa{0};
151 : u32 tpn{0};
152 : };
153 :
154 8221 : MAKE_ENUM(TpProtocol, CTP, RTP, UBOE);
155 :
156 : struct JettyImportCfg {
157 : u64 localTpHandle{0};
158 : u64 remoteTpHandle{0};
159 : u64 localTag{0}; // tag是hccp预留字段,暂不需要赋值
160 : u32 localPsn{0};
161 : u32 remotePsn{0};
162 : TpProtocol protocol{TpProtocol::INVALID};
163 : };
164 :
165 : HcclResult HccpUbTpImportJetty(
166 : const CtxHandle ctxHandle, u8* key, const u32 keyLen, const u32 tokenValue, const JettyImportCfg& jettyImportCfg,
167 : HrtRaUbJettyImportedOutParam& out);
168 :
169 : using HccpUbJettyImportedInParam = struct HccpUbJettyImportedInParamDef {
170 : u8* key{nullptr};
171 : u32 keyLen{0};
172 : u32 tokenValue{0};
173 : JettyImportCfg jettyImportCfg{};
174 : };
175 :
176 : HcclResult HccpUbTpImportJettyAsync(
177 : const CtxHandle ctxHandle, const HccpUbJettyImportedInParam& in, std::vector<char>& out, void*& remQpHandle,
178 : RequestHandle& reqHandle);
179 :
180 : HcclResult HccpRaTlvCcuCustomChannel(int32_t devLogicId, void* customIn, void* customOut);
181 :
182 : HcclResult HccpRaTlvRequestForCustomChannel(void* tlvHandle, unsigned int msgType, void* customIn, void* customOut);
183 :
184 : HcclResult HccpRaGetDevBaseAttr(void* ctxHandle, struct DevBaseAttr* attr);
185 :
186 : /**
187 : * @brief 查询已初始化HCCP Context对应URMA Device是否支持CTP
188 : */
189 : HcclResult HccpGetCtpEnable(void* ctxHandle, bool& ctpEnable);
190 :
191 : constexpr u32 GET_UBOE_FLAG_ENABLE_OPCODE = 57;
192 : constexpr u32 GET_UBOE_FLAG_ENABLE_VERSION = 2;
193 : constexpr u32 UBOE_DEV_FLAG_RIGHT_SHIFT = 19;
194 :
195 : HcclResult HccpGetUboeFlagEnable(const u32 devPhyId);
196 :
197 : /**
198 : * @brief 使用已初始化的HCCP Context将Device上的UBoE EID查询为IPv4地址
199 : */
200 : HcclResult HccpGetIpByEid(void* ctxHandle, const CommAddr& eidAddr, CommAddr& ipAddr);
201 :
202 7 : inline bool HccpCheckUboeSupported(const u32 devFeature)
203 : {
204 : // 设备特性位掩码, 右移取UBOE标志位, 值为1表示支持
205 7 : return (devFeature >> UBOE_DEV_FLAG_RIGHT_SHIFT) & 1;
206 : }
207 : } // namespace hcomm
208 : #endif // HCOMM_ADAPTER_HCCP_H
|