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 : #include <stdlib.h>
12 : #include <string.h>
13 : #include <arpa/inet.h>
14 : #include <unistd.h>
15 : #include <errno.h>
16 : #include "user_log.h"
17 : #include "ra_hdc.h"
18 : #include "securec.h"
19 : #include "ra.h"
20 : #include "ra_rs_comm.h"
21 : #include "ra_rs_err.h"
22 : #include "dl_hal_function.h"
23 : #include "ra_rdma_lite.h"
24 : #include "ra_hdc_lite.h"
25 : #include "ra_hdc_rdma_notify.h"
26 : #include "ra_hdc_rdma_verbs.h"
27 : #include "ra_hdc_rdma.h"
28 :
29 16 : STATIC int RaHdcNotifyBaseAddrInit(unsigned int notifyType, unsigned int phyId, unsigned long long **notifyVa)
30 : {
31 16 : unsigned long long moudleId = HCCP;
32 16 : unsigned int notifySize = 0;
33 : unsigned int logicId;
34 : int ret, drvRet;
35 :
36 16 : CHK_PRT_RETURN(notifyType != NOTIFY, hccp_err("[init][base_addr]notify_type[%u] error", notifyType), -EINVAL);
37 16 : ret = DlDrvDeviceGetIndexByPhyId(phyId, &logicId);
38 16 : CHK_PRT_RETURN(ret, hccp_err("[init][base_addr]drvDeviceGetIndexByPhyId failed, ret(%d), phyId(%u)", ret, phyId),
39 : ret);
40 :
41 15 : ret = DlHalNotifyGetInfo(logicId, 0, RA_NOTIFY_TYPE_TOTAL_SIZE, ¬ifySize);
42 15 : CHK_PRT_RETURN(ret, hccp_err("[init][base_addr]halNotifyGetInfo failed, ret(%d), logicId(%u)", ret, logicId), ret);
43 :
44 14 : ret = DlHalMemAlloc((void *)notifyVa, (unsigned long long)notifySize,
45 14 : RA_MEM_TYPE_HBM | (moudleId << MEM_MODULE_ID_BIT));
46 14 : CHK_PRT_RETURN(ret, hccp_err("[init][base_addr]halMemAlloc failed, ret(%d), phyId(%u)", ret, phyId), ret);
47 :
48 13 : hccp_info("notify info: size[%u]", notifySize);
49 13 : ret = RaHdcNotifyCfgSet(phyId, (uintptr_t)*notifyVa, notifySize);
50 13 : if (ret) {
51 4 : hccp_err("[init][base_addr]ra_hdc_notify_cfg_set failed, ret(%d), phyId(%u)", ret, phyId);
52 4 : goto free_mem;
53 : }
54 9 : return 0;
55 :
56 4 : free_mem:
57 4 : drvRet = DlHalMemFree((void *)*notifyVa);
58 4 : if (drvRet) {
59 1 : hccp_err("[init][base_addr]halMemFree failed! ret(%d)", drvRet);
60 : }
61 4 : return ret;
62 : }
63 :
64 10 : static void RaHdcGetQpHdc(struct RaRdmaHandle *rdmaHandle, int flag, int qpMode, unsigned int qpn,
65 : struct RaQpHandle *qpHdc)
66 : {
67 10 : qpHdc->phyId = rdmaHandle->rdevInfo.phyId;
68 10 : qpHdc->rdevIndex = rdmaHandle->rdevIndex;
69 10 : qpHdc->rdmaHandle = rdmaHandle;
70 10 : qpHdc->rdmaOps = rdmaHandle->rdmaOps;
71 10 : qpHdc->qpMode = qpMode;
72 10 : qpHdc->flag = flag;
73 10 : qpHdc->qpn = qpn;
74 10 : }
75 :
76 12 : STATIC int RaHdcCmdQpDestroy(struct RaQpHandle *qpHdc)
77 : {
78 : int ret;
79 12 : union OpQpDestroyData qpDestroyData = {0};
80 :
81 12 : qpDestroyData.txData.qpn = qpHdc->qpn;
82 12 : qpDestroyData.txData.phyId = qpHdc->phyId;
83 12 : qpDestroyData.txData.rdevIndex = qpHdc->rdevIndex;
84 12 : ret = RaHdcProcessMsg(RA_RS_QP_DESTROY, qpHdc->phyId, (char *)&qpDestroyData, sizeof(union OpQpDestroyData));
85 12 : if (ret) {
86 2 : hccp_err("[destroy][ra_hdc_qp]hdc_send_recv_pkt failed ret(%d) phyId(%u)", ret, qpHdc->phyId);
87 : }
88 :
89 12 : return ret;
90 : }
91 :
92 0 : STATIC int RaHdcCmdQpDestroyWithoutCQ(struct RaQpHandle *qpHdc)
93 : {
94 : int ret;
95 0 : union OpQpDestroyData qpDestroyData = {0};
96 :
97 0 : qpDestroyData.txData.qpn = qpHdc->qpn;
98 0 : qpDestroyData.txData.phyId = qpHdc->phyId;
99 0 : qpDestroyData.txData.rdevIndex = qpHdc->rdevIndex;
100 0 : ret = RaHdcProcessMsg(RA_RS_QP_DESTROY_WITHOUT_CQ, qpHdc->phyId, (char *)&qpDestroyData,
101 : sizeof(union OpQpDestroyData));
102 0 : if (ret) {
103 0 : hccp_err("[destroy][ra_hdc_qp]hdc_send_recv_pkt failed ret(%d) phyId(%u)", ret, qpHdc->phyId);
104 : }
105 :
106 0 : return ret;
107 : }
108 :
109 9 : int RaHdcQpCreate(struct RaRdmaHandle *rdmaHandle, int flag, int qpMode, void **qpHandle)
110 : {
111 9 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
112 9 : union OpQpCreateData qpCreateData = {0};
113 9 : struct RaQpHandle *qpHdc = NULL;
114 : struct rdma_lite_qp_cap cap;
115 : int ret;
116 :
117 9 : qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
118 9 : CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_qp]qp_hdc calloc failed phyId(%u)", phyId), -ENOMEM);
119 :
120 8 : qpCreateData.txData.phyId = phyId;
121 8 : qpCreateData.txData.rdevIndex = rdmaHandle->rdevIndex;
122 8 : qpCreateData.txData.flag = flag;
123 8 : qpCreateData.txData.qpMode = qpMode;
124 8 : qpCreateData.txData.memAlign = rdmaHandle->supportLite;
125 :
126 8 : ret = RaHdcProcessMsg(RA_RS_QP_CREATE, phyId, (char *)&qpCreateData, sizeof(union OpQpCreateData));
127 8 : if (ret) {
128 1 : hccp_err("[create][ra_hdc_qp]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
129 1 : free(qpHdc);
130 1 : qpHdc = NULL;
131 1 : return ret;
132 : }
133 :
134 7 : RaHdcGetQpHdc(rdmaHandle, flag, qpMode, qpCreateData.rxData.qpn, qpHdc);
135 7 : qpHdc->psn = qpCreateData.rxData.psn;
136 7 : qpHdc->gidIdx = qpCreateData.rxData.gidIdx;
137 :
138 7 : cap.max_inline_data = QP_DEFAULT_MAX_CAP_INLINE_DATA;
139 7 : cap.max_send_sge = QP_DEFAULT_MIN_CAP_SEND_SGE;
140 7 : cap.max_recv_sge = QP_DEFAULT_MIN_CAP_RECV_SGE;
141 7 : cap.max_send_wr = RA_QP_32K_DEPTH;
142 7 : cap.max_recv_wr = RA_QP_128_DEPTH;
143 7 : ret = RaHdcLiteQpCreate(rdmaHandle, qpHdc, &cap);
144 7 : if (ret) {
145 0 : (void)RaHdcCmdQpDestroy(qpHdc);
146 0 : hccp_err("[create][ra_hdc_qp]ra_hdc_lite_qp_create failed ret(%d) phyId(%u)", ret, phyId);
147 0 : free(qpHdc);
148 0 : qpHdc = NULL;
149 0 : return ret;
150 : }
151 :
152 7 : qpHdc->sqDepth = cap.max_send_wr;
153 7 : *qpHandle = qpHdc;
154 :
155 7 : return 0;
156 : }
157 :
158 1 : int RaHdcQpCreateWithAttrs(struct RaRdmaHandle *rdmaHandle, struct QpExtAttrs *extAttrs, void **qpHandle)
159 : {
160 1 : int flag = (extAttrs->qpAttr.qp_type == IBV_QPT_RC) ? 0 : 1;
161 1 : union OpQpCreateWithAttrsData opData = {0};
162 1 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
163 1 : struct RaQpHandle *qpHdc = NULL;
164 : struct rdma_lite_qp_cap cap;
165 : int ret;
166 :
167 1 : qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
168 1 : CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_qp_with_attrs]qp_hdc calloc failed phyId(%u)", phyId),
169 : -ENOMEM);
170 :
171 1 : opData.txData.phyId = phyId;
172 1 : opData.txData.rdevIndex = rdmaHandle->rdevIndex;
173 1 : ret = memcpy_s(&opData.txData.extAttrs, sizeof(struct QpExtAttrs), extAttrs, sizeof(struct QpExtAttrs));
174 1 : if (ret) {
175 0 : hccp_err("[create][ra_hdc_qp_with_attrs]memcpy_s for ext_attrs failed, ret:%d", ret);
176 0 : ret = -ESAFEFUNC;
177 0 : goto out;
178 : }
179 :
180 1 : opData.txData.extAttrs.memAlign = rdmaHandle->supportLite;
181 1 : ret = RaHdcProcessMsg(RA_RS_QP_CREATE_WITH_ATTRS, phyId, (char *)&opData, sizeof(union OpQpCreateWithAttrsData));
182 1 : if (ret) {
183 0 : hccp_err("[create][ra_hdc_qp_with_attrs]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
184 0 : goto out;
185 : }
186 :
187 1 : RaHdcGetQpHdc(rdmaHandle, flag, extAttrs->qpMode, opData.rxData.qpn, qpHdc);
188 1 : qpHdc->psn = opData.rxData.psn;
189 1 : qpHdc->gidIdx = opData.rxData.gidIdx;
190 :
191 1 : cap.max_inline_data = extAttrs->qpAttr.cap.max_inline_data;
192 1 : cap.max_send_sge = extAttrs->qpAttr.cap.max_send_sge;
193 1 : cap.max_recv_sge = extAttrs->qpAttr.cap.max_recv_sge;
194 1 : cap.max_send_wr = extAttrs->qpAttr.cap.max_send_wr;
195 1 : cap.max_recv_wr = extAttrs->qpAttr.cap.max_recv_wr;
196 1 : ret = RaHdcLiteQpCreate(rdmaHandle, qpHdc, &cap);
197 1 : if (ret) {
198 0 : (void)RaHdcCmdQpDestroy(qpHdc);
199 0 : hccp_err("[create][ra_hdc_qp_with_attrs]ra_hdc_lite_qp_create failed ret(%d) phyId(%u)", ret, phyId);
200 0 : goto out;
201 : }
202 :
203 1 : qpHdc->sqSigAll = extAttrs->qpAttr.sq_sig_all;
204 1 : qpHdc->typicalQpAttr.udpSport = extAttrs->udpSport;
205 1 : qpHdc->sqDepth = cap.max_send_wr;
206 1 : *qpHandle = qpHdc;
207 1 : return 0;
208 :
209 0 : out:
210 0 : free(qpHdc);
211 0 : qpHdc = NULL;
212 0 : return ret;
213 : }
214 :
215 0 : int RaHdcQpCreateWithCQWithAttrs(struct RaRdmaHandle *rdmaHandle, struct QpExtAttrs *extAttrs, unsigned int sendCqn,
216 : unsigned int recvCqn, void **qpHandle)
217 : {
218 0 : int flag = (extAttrs->qpAttr.qp_type == IBV_QPT_RC) ? 0 : 1;
219 0 : union OpQpCreateWithCQWithAttrsData opData = {0};
220 0 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
221 0 : struct RaQpHandle *qpHdc = NULL;
222 : struct rdma_lite_qp_cap cap;
223 : int ret;
224 :
225 0 : qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
226 0 : CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_qp_with_cq_attrs]qp_hdc calloc failed phyId(%u)", phyId),
227 : -ENOMEM);
228 :
229 0 : opData.txData.phyId = phyId;
230 0 : opData.txData.rdevIndex = rdmaHandle->rdevIndex;
231 0 : opData.txData.sendCqn = sendCqn;
232 0 : opData.txData.recvCqn = recvCqn;
233 0 : ret = memcpy_s(&opData.txData.extAttrs, sizeof(struct QpExtAttrs), extAttrs, sizeof(struct QpExtAttrs));
234 0 : if (ret) {
235 0 : hccp_err("[create][ra_hdc_qp_with_cq_attrs]memcpy_s for ext_attrs failed, ret:%d", ret);
236 0 : ret = -ESAFEFUNC;
237 0 : goto out;
238 : }
239 :
240 0 : opData.txData.extAttrs.memAlign = rdmaHandle->supportLite;
241 0 : ret = RaHdcProcessMsg(RA_RS_QP_CREATE_WITH_CQ_WITH_ATTRS, phyId, (char *)&opData,
242 : sizeof(union OpQpCreateWithCQWithAttrsData));
243 0 : if (ret) {
244 0 : hccp_err("[create][ra_hdc_qp_with_cq_attrs]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
245 0 : goto out;
246 : }
247 :
248 0 : RaHdcGetQpHdc(rdmaHandle, flag, extAttrs->qpMode, opData.rxData.qpn, qpHdc);
249 0 : qpHdc->psn = opData.rxData.psn;
250 0 : qpHdc->gidIdx = opData.rxData.gidIdx;
251 :
252 0 : cap.max_inline_data = extAttrs->qpAttr.cap.max_inline_data;
253 0 : cap.max_send_wr = extAttrs->qpAttr.cap.max_send_wr;
254 0 : cap.max_recv_wr = extAttrs->qpAttr.cap.max_recv_wr;
255 0 : cap.max_send_sge = extAttrs->qpAttr.cap.max_send_sge;
256 0 : cap.max_recv_sge = extAttrs->qpAttr.cap.max_recv_sge;
257 0 : ret = RaHdcLiteQpCreateWithCQ(rdmaHandle, qpHdc, &cap, RaHdcLiteFindTypicalCq(rdmaHandle, sendCqn),
258 : RaHdcLiteFindTypicalCq(rdmaHandle, recvCqn), sendCqn, recvCqn);
259 0 : if (ret) {
260 0 : (void)RaHdcCmdQpDestroyWithoutCQ(qpHdc);
261 0 : hccp_err("[create][ra_hdc_qp_with_cq_attrs]ra_hdc_lite_qp_create failed ret(%d) phyId(%u)", ret, phyId);
262 0 : goto out;
263 : }
264 :
265 0 : qpHdc->sqDepth = cap.max_send_wr;
266 0 : qpHdc->typicalQpAttr.udpSport = extAttrs->udpSport;
267 0 : qpHdc->sqSigAll = extAttrs->qpAttr.sq_sig_all;
268 0 : *qpHandle = qpHdc;
269 0 : return 0;
270 :
271 0 : out:
272 0 : free(qpHdc);
273 0 : qpHdc = NULL;
274 0 : return ret;
275 : }
276 :
277 0 : int RaHdcAiQpCreate(struct RaRdmaHandle *rdmaHandle, struct QpExtAttrs *extAttrs, struct AiQpInfo *info,
278 : void **qpHandle)
279 : {
280 : #define AI_QP_DEFAULT_GID_IDX 3U
281 0 : int flag = extAttrs->qpAttr.qp_type == IBV_QPT_RC ? 0 : 1;
282 0 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
283 0 : union OpAiQpCreateData qpCreateData = {0};
284 0 : struct RaQpHandle *qpHdc = NULL;
285 0 : int qpMode = extAttrs->qpMode;
286 : int ret;
287 :
288 0 : qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
289 0 : CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_ai_qp]qp_hdc calloc failed phyId(%u)", phyId), -ENOMEM);
290 :
291 0 : qpCreateData.txData.phyId = phyId;
292 0 : qpCreateData.txData.rdevIndex = rdmaHandle->rdevIndex;
293 0 : ret = memcpy_s(&qpCreateData.txData.extAttrs, sizeof(struct QpExtAttrs), extAttrs, sizeof(struct QpExtAttrs));
294 0 : if (ret) {
295 0 : hccp_err("[create][ra_hdc_ai_qp]memcpy_s for ext_attrs failed, ret:%d", ret);
296 0 : free(qpHdc);
297 0 : qpHdc = NULL;
298 0 : return -ESAFEFUNC;
299 : }
300 :
301 0 : ret = RaHdcProcessMsg(RA_RS_AI_QP_CREATE, phyId, (char *)&qpCreateData, sizeof(union OpAiQpCreateData));
302 0 : if (ret) {
303 0 : hccp_err("[create][ra_hdc_ai_qp]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
304 0 : free(qpHdc);
305 0 : qpHdc = NULL;
306 0 : return ret;
307 : }
308 :
309 0 : RaHdcGetQpHdc(rdmaHandle, flag, qpMode, qpCreateData.rxData.qpn, qpHdc);
310 0 : qpHdc->psn = qpCreateData.rxData.psn;
311 : // set a default gid_idx due to compatibility issue, rs will refresh it if it is different
312 0 : qpHdc->gidIdx = AI_QP_DEFAULT_GID_IDX;
313 0 : info->aiQpAddr = qpCreateData.rxData.aiQpAddr;
314 0 : info->sqIndex = qpCreateData.rxData.sqIndex;
315 0 : info->dbIndex = qpCreateData.rxData.dbIndex;
316 0 : qpHdc->typicalQpAttr.udpSport = extAttrs->udpSport;
317 0 : *qpHandle = qpHdc;
318 :
319 0 : return 0;
320 : }
321 :
322 1 : int RaHdcAiQpCreateWithAttrs(struct RaRdmaHandle *rdmaHandle, struct QpExtAttrs *extAttrs, struct AiQpInfo *info,
323 : void **qpHandle)
324 : {
325 1 : int flag = extAttrs->qpAttr.qp_type == IBV_QPT_RC ? 0 : 1;
326 1 : union OpAiQpCreateWithAttrsData qpCreateData = {0};
327 1 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
328 1 : struct RaQpHandle *qpHdc = NULL;
329 1 : int qpMode = extAttrs->qpMode;
330 : int ret;
331 :
332 1 : qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
333 1 : CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_ai_qp]qp_hdc calloc failed phyId(%u)", phyId), -ENOMEM);
334 :
335 1 : qpCreateData.txData.phyId = phyId;
336 1 : qpCreateData.txData.rdevIndex = rdmaHandle->rdevIndex;
337 1 : ret = memcpy_s(&qpCreateData.txData.extAttrs, sizeof(struct QpExtAttrs), extAttrs, sizeof(struct QpExtAttrs));
338 1 : if (ret) {
339 0 : hccp_err("[create][ra_hdc_ai_qp]memcpy_s for ext_attrs failed, ret:%d", ret);
340 0 : free(qpHdc);
341 0 : qpHdc = NULL;
342 0 : return -ESAFEFUNC;
343 : }
344 :
345 1 : ret = RaHdcProcessMsg(RA_RS_AI_QP_CREATE_WITH_ATTRS, phyId, (char *)&qpCreateData,
346 : sizeof(union OpAiQpCreateWithAttrsData));
347 1 : if (ret) {
348 0 : hccp_err("[create][ra_hdc_ai_qp]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
349 0 : free(qpHdc);
350 0 : qpHdc = NULL;
351 0 : return ret;
352 : }
353 :
354 1 : qpHdc->typicalQpAttr.udpSport = extAttrs->udpSport;
355 1 : RaHdcGetQpHdc(rdmaHandle, flag, qpMode, qpCreateData.rxData.qpn, qpHdc);
356 1 : qpHdc->gidIdx = qpCreateData.rxData.gidIdx;
357 1 : qpHdc->psn = qpCreateData.rxData.psn;
358 1 : info->aiQpAddr = qpCreateData.rxData.aiQpAddr;
359 1 : info->sqIndex = qpCreateData.rxData.sqIndex;
360 1 : info->dbIndex = qpCreateData.rxData.dbIndex;
361 1 : info->aiScqAddr = qpCreateData.rxData.aiScqAddr;
362 1 : info->aiRcqAddr = qpCreateData.rxData.aiRcqAddr;
363 1 : (void)memcpy_s(&info->dataPlaneInfo, sizeof(struct AiDataPlaneInfo), &qpCreateData.rxData.dataPlaneInfo,
364 : sizeof(struct AiDataPlaneInfo));
365 1 : *qpHandle = qpHdc;
366 :
367 1 : return 0;
368 : }
369 :
370 1 : int RaHdcTypicalQpCreate(struct RaRdmaHandle *rdmaHandle, int flag, int qpMode, struct TypicalQp *qpInfo,
371 : void **qpHandle)
372 : {
373 1 : union OpTypicalQpCreateData qpCreateData = {0};
374 1 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
375 1 : struct RaQpHandle *qpHdc = NULL;
376 : struct rdma_lite_qp_cap cap;
377 : int ret;
378 :
379 1 : qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
380 1 : CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_typical_qp]qp_hdc calloc failed phyId(%u)", phyId),
381 : -ENOMEM);
382 :
383 1 : qpCreateData.txData.phyId = phyId;
384 1 : qpCreateData.txData.rdevIndex = rdmaHandle->rdevIndex;
385 1 : qpCreateData.txData.flag = flag;
386 1 : qpCreateData.txData.qpMode = qpMode;
387 1 : qpCreateData.txData.memAlign = rdmaHandle->supportLite;
388 :
389 1 : ret = RaHdcProcessMsg(RA_RS_TYPICAL_QP_CREATE, phyId, (char *)&qpCreateData, sizeof(union OpTypicalQpCreateData));
390 1 : if (ret) {
391 0 : hccp_err("[create][ra_hdc_typical_qp]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
392 0 : free(qpHdc);
393 0 : qpHdc = NULL;
394 0 : return ret;
395 : }
396 :
397 1 : qpInfo->gidIdx = qpCreateData.rxData.gidIdx;
398 1 : qpInfo->psn = qpCreateData.rxData.psn;
399 1 : qpInfo->qpn = qpCreateData.rxData.qpn;
400 1 : (void)memcpy_s(qpInfo->gid, HCCP_GID_RAW_LEN, qpCreateData.rxData.gid.raw, HCCP_GID_RAW_LEN);
401 :
402 1 : RaHdcGetQpHdc(rdmaHandle, flag, qpMode, qpInfo->qpn, qpHdc);
403 1 : qpHdc->psn = qpCreateData.rxData.psn;
404 1 : qpHdc->gidIdx = qpCreateData.rxData.gidIdx;
405 :
406 1 : cap.max_inline_data = QP_DEFAULT_MAX_CAP_INLINE_DATA;
407 1 : cap.max_send_sge = QP_DEFAULT_MIN_CAP_SEND_SGE;
408 1 : cap.max_recv_sge = QP_DEFAULT_MIN_CAP_RECV_SGE;
409 1 : cap.max_send_wr = RA_QP_32K_DEPTH;
410 1 : cap.max_recv_wr = RA_QP_128_DEPTH;
411 1 : ret = RaHdcLiteQpCreate(rdmaHandle, qpHdc, &cap);
412 1 : if (ret) {
413 0 : (void)RaHdcCmdQpDestroy(qpHdc);
414 0 : hccp_err("[create][ra_hdc_typical_qp]ra_hdc_lite_qp_create failed ret(%d) phyId(%u)", ret, phyId);
415 0 : free(qpHdc);
416 0 : qpHdc = NULL;
417 0 : return ret;
418 : }
419 :
420 1 : qpHdc->sqDepth = cap.max_send_wr;
421 1 : *qpHandle = qpHdc;
422 :
423 1 : return 0;
424 : }
425 :
426 0 : int RaHdcTypicalCqCreate(struct RaRdmaHandle *rdmaHandle, unsigned int cqDepth, unsigned int *cqn, void **cqHandle)
427 : {
428 0 : union OpTypicalCqCreateData cqCreateData = {0};
429 0 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
430 0 : struct RaTypicalCqHandle *cqHdc = NULL;
431 : int ret;
432 :
433 0 : cqHdc = (struct RaTypicalCqHandle *)calloc(1, sizeof(struct RaTypicalCqHandle));
434 0 : CHK_PRT_RETURN(cqHdc == NULL, hccp_err("[create][ra_hdc_typical_cq]cq_hdc calloc failed phyId(%u)", phyId),
435 : -ENOMEM);
436 :
437 0 : cqCreateData.txData.phyId = phyId;
438 0 : cqCreateData.txData.rdevIndex = rdmaHandle->rdevIndex;
439 0 : cqCreateData.txData.cqDepth = cqDepth;
440 :
441 0 : ret = RaHdcProcessMsg(RA_RS_TYPICAL_CQ_CREATE, phyId, (char *)&cqCreateData, sizeof(union OpTypicalCqCreateData));
442 0 : if (ret) {
443 0 : hccp_err("[create][ra_hdc_typical_cq]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
444 0 : free(cqHdc);
445 0 : cqHdc = NULL;
446 0 : return ret;
447 : }
448 0 : hccp_info("RaHdcProcessMsg RA_RS_TYPICAL_CQ_CREATE Done");
449 :
450 0 : *cqn = cqCreateData.rxData.cqn;
451 :
452 0 : cqHdc->cqn = *cqn;
453 0 : cqHdc->phyId = phyId;
454 0 : cqHdc->rdevIndex = rdmaHandle->rdevIndex;
455 0 : cqHdc->rdmaHandle = rdmaHandle;
456 0 : cqHdc->rdmaOps = rdmaHandle->rdmaOps;
457 :
458 0 : if (rdmaHandle->supportLite != 0) {
459 0 : struct rdma_lite_cq *liteCq = NULL;
460 0 : ret = RaHdcLiteCqCreate(rdmaHandle, cqDepth, &cqCreateData, &liteCq);
461 0 : if (ret) {
462 0 : union OpTypicalCqDestroyData destroyData = {0};
463 0 : hccp_err("[create][ra_hdc_typical_cq]ra_hdc_lite_cq_create failed ret(%d) phyId(%u)", ret, phyId);
464 0 : destroyData.txData.cqn = cqHdc->cqn;
465 0 : destroyData.txData.phyId = cqHdc->phyId;
466 0 : destroyData.txData.rdevIndex = cqHdc->rdevIndex;
467 0 : (void)RaHdcProcessMsg(RA_RS_TYPICAL_CQ_DESTROY, phyId, (char *)&destroyData,
468 : sizeof(union OpTypicalCqDestroyData));
469 0 : free(cqHdc);
470 0 : cqHdc = NULL;
471 0 : return ret;
472 : }
473 0 : cqHdc->liteCq = liteCq;
474 : }
475 :
476 0 : *cqHandle = cqHdc;
477 :
478 0 : return 0;
479 : }
480 :
481 0 : int RaHdcTypicalCqDestroy(struct RaRdmaHandle *rdmaHandle, unsigned int cqn, void *cqHandle)
482 : {
483 0 : struct RaTypicalCqHandle *cqHdc = (struct RaTypicalCqHandle *)cqHandle;
484 0 : union OpTypicalCqDestroyData destroyData = {0};
485 0 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
486 : int ret;
487 :
488 0 : if (cqHdc == NULL) {
489 0 : hccp_err("[destroy][ra_hdc_typical_cq]cq handle is NULL phyId(%u)", phyId);
490 0 : return -EINVAL;
491 : }
492 :
493 0 : if (cqHdc->liteCq != NULL) {
494 0 : RaHdcLiteRemoveTypicalCq(rdmaHandle, cqHdc->cqn);
495 0 : (void)RaRdmaLiteDestroyCq(cqHdc->liteCq);
496 0 : cqHdc->liteCq = NULL;
497 : }
498 :
499 0 : destroyData.txData.phyId = phyId;
500 0 : destroyData.txData.rdevIndex = rdmaHandle->rdevIndex;
501 0 : destroyData.txData.cqn = cqn;
502 0 : ret = RaHdcProcessMsg(RA_RS_TYPICAL_CQ_DESTROY, phyId, (char *)&destroyData, sizeof(union OpTypicalCqDestroyData));
503 0 : if (ret) {
504 0 : hccp_err("[destroy][ra_hdc_typical_cq]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
505 : }
506 :
507 0 : free(cqHdc);
508 0 : cqHdc = NULL;
509 0 : return ret;
510 : }
511 :
512 12 : int RaHdcQpDestroy(struct RaQpHandle *qpHdc)
513 : {
514 : int ret;
515 :
516 12 : RaHdcLiteQpDestroy(qpHdc);
517 12 : ret = RaHdcCmdQpDestroy(qpHdc);
518 12 : if (ret) {
519 2 : hccp_err("[destroy][ra_hdc_qp]ra_hdc_cmd_qp_destroy failed ret(%d) phyId(%u)", ret, qpHdc->phyId);
520 : }
521 :
522 12 : free(qpHdc);
523 12 : qpHdc = NULL;
524 12 : return ret;
525 : }
526 :
527 0 : int RaHdcQpDestroyWithoutCQ(struct RaQpHandle *qpHdc)
528 : {
529 : int ret;
530 :
531 0 : RaHdcLiteQpDestroyWithoutCQ(qpHdc);
532 0 : ret = RaHdcCmdQpDestroyWithoutCQ(qpHdc);
533 0 : if (ret) {
534 0 : hccp_err("[destroy][ra_hdc_qp]ra_hdc_cmd_qp_destroy_without_cq failed ret(%d) phyId(%u)", ret, qpHdc->phyId);
535 : }
536 :
537 0 : free(qpHdc);
538 0 : qpHdc = NULL;
539 0 : return ret;
540 : }
541 :
542 3 : int RaHdcGetQpStatus(struct RaQpHandle *qpHdc, int *status)
543 : {
544 3 : union OpQpStatusData qpStatusData = {0};
545 3 : union OpQpInfoData qpInfoData = {0};
546 3 : unsigned int interfaceVersion = 0;
547 : int ret;
548 :
549 3 : ret = RaHdcGetInterfaceVersion(qpHdc->phyId, RA_RS_QP_INFO, &interfaceVersion);
550 3 : if (ret != 0) {
551 0 : hccp_warn("[get][ra_hdc_qp_status]get interface version not success ret(%d) phyId(%u)", ret, qpHdc->phyId);
552 0 : interfaceVersion = 0;
553 : }
554 :
555 3 : if (interfaceVersion >= RA_RS_OPCODE_BASE_VERSION) {
556 1 : qpInfoData.txData.qpn = qpHdc->qpn;
557 1 : qpInfoData.txData.phyId = qpHdc->phyId;
558 1 : qpInfoData.txData.rdevIndex = qpHdc->rdevIndex;
559 1 : ret = RaHdcProcessMsg(RA_RS_QP_INFO, qpHdc->phyId, (char *)&qpInfoData, sizeof(union OpQpInfoData));
560 1 : CHK_PRT_RETURN(ret,
561 : hccp_err("[get][ra_hdc_qp_status]ra hdc message process failed ret(%d) phyId(%u)", ret, qpHdc->phyId), ret);
562 1 : *status = qpInfoData.rxData.status;
563 1 : qpHdc->typicalQpAttr.udpSport = qpInfoData.rxData.udpSport;
564 : } else {
565 2 : qpStatusData.txData.qpn = qpHdc->qpn;
566 2 : qpStatusData.txData.phyId = qpHdc->phyId;
567 2 : qpStatusData.txData.rdevIndex = qpHdc->rdevIndex;
568 2 : ret = RaHdcProcessMsg(RA_RS_QP_STATUS, qpHdc->phyId, (char *)&qpStatusData, sizeof(union OpQpStatusData));
569 2 : CHK_PRT_RETURN(ret,
570 : hccp_err("[get][ra_hdc_qp_status]ra hdc message process failed ret(%d) phyId(%u)", ret, qpHdc->phyId), ret);
571 1 : *status = qpStatusData.rxData.status;
572 : }
573 :
574 2 : return RaHdcLiteGetConnectedInfo(qpHdc);
575 : }
576 :
577 1 : int RaHdcTypicalQpModify(struct RaQpHandle *qpHdc, struct TypicalQp *localQpInfo, struct TypicalQp *remoteQpInfo)
578 : {
579 1 : union OpTypicalQpModifyData qpModifyData = {0};
580 1 : unsigned int phyId = qpHdc->phyId;
581 : int ret;
582 :
583 1 : qpModifyData.txData.phyId = phyId;
584 1 : qpModifyData.txData.rdevIndex = qpHdc->rdevIndex;
585 1 : ret = memcpy_s(&(qpModifyData.txData.localQpInfo), sizeof(struct TypicalQp), localQpInfo, sizeof(struct TypicalQp));
586 1 : CHK_PRT_RETURN(ret != 0, hccp_err("[modify]memcpy_s local_qp_info failed, phyId[%u] ret[%d]", phyId, ret),
587 : -ESAFEFUNC);
588 1 : ret = memcpy_s(&(qpModifyData.txData.remoteQpInfo), sizeof(struct TypicalQp), remoteQpInfo,
589 : sizeof(struct TypicalQp));
590 1 : CHK_PRT_RETURN(ret != 0, hccp_err("[modify]memcpy_s remote_qp_info failed, phyId[%u] ret[%d]", phyId, ret),
591 : -ESAFEFUNC);
592 :
593 1 : ret = RaHdcProcessMsg(RA_RS_TYPICAL_QP_MODIFY, phyId, (char *)&qpModifyData, sizeof(union OpTypicalQpModifyData));
594 1 : CHK_PRT_RETURN(ret != 0, hccp_err("[modify][modify_qp]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId),
595 : ret);
596 :
597 1 : qpHdc->typicalQpAttr.udpSport = qpModifyData.rxData.udpSport;
598 1 : qpHdc->typicalQpAttr.pathMtu = qpModifyData.rxData.pathMtu;
599 1 : if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
600 1 : ret = RaRdmaLiteSetQpSl(qpHdc->liteQp, localQpInfo->sl);
601 1 : CHK_PRT_RETURN(ret != 0,
602 : hccp_err("[modify][modify_qp]ra_rdma_lite_set_qp_sl sl(%u) failed ret(%d) phyId(%u)", localQpInfo->sl, ret,
603 : phyId),
604 : ret);
605 : }
606 1 : return 0;
607 : }
608 :
609 3 : int RaHdcQpConnectAsync(struct RaQpHandle *qpHdc, const void *sockHandle)
610 : {
611 3 : union OpQpConnectData qpConnectData = {0};
612 : int ret;
613 :
614 3 : qpConnectData.txData.qpn = qpHdc->qpn;
615 3 : qpConnectData.txData.fd = (unsigned int)((const struct SocketHdcInfo *)sockHandle)->fd;
616 3 : qpConnectData.txData.phyId = qpHdc->phyId;
617 3 : qpConnectData.txData.rdevIndex = qpHdc->rdevIndex;
618 3 : ret = RaHdcProcessMsg(RA_RS_QP_CONNECT, qpHdc->phyId, (char *)&qpConnectData, sizeof(union OpQpConnectData));
619 3 : CHK_PRT_RETURN(ret,
620 : hccp_err("[connect_async][ra_hdc_qp]ra hdc message process failed ret(%d) phyId(%u)", ret, qpHdc->phyId), ret);
621 :
622 2 : return 0;
623 : }
624 :
625 1 : static void RaHdcSendDataInit(union OpSendWrData *sendWrData, struct RaQpHandle *qpHdc, struct SendWr *wr)
626 : {
627 1 : sendWrData->txData.phyId = qpHdc->phyId;
628 1 : sendWrData->txData.rdevIndex = qpHdc->rdevIndex;
629 1 : sendWrData->txData.qpn = qpHdc->qpn;
630 1 : sendWrData->txData.bufNum = wr->bufNum;
631 1 : sendWrData->txData.dstAddr = wr->dstAddr;
632 1 : sendWrData->txData.op = wr->op;
633 1 : sendWrData->txData.sendFlags = wr->sendFlag;
634 1 : }
635 :
636 1 : int RaHdcSendWr(struct RaQpHandle *qpHdc, struct SendWr *wr, struct SendWrRsp *opRsp)
637 : {
638 1 : union OpSendWrData sendWrData = {0};
639 1 : struct LiteSendWr liteWr = {0};
640 : int ret;
641 :
642 1 : if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
643 0 : if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
644 0 : liteWr.wr = *wr;
645 0 : return RaHdcLiteSendWr(qpHdc, &liteWr, opRsp, HDC_LITE_DEFAULT_WR_ID);
646 : }
647 : }
648 :
649 1 : RaHdcSendDataInit(&sendWrData, qpHdc, wr);
650 :
651 1 : ret = memcpy_s(sendWrData.txData.memList, (sizeof(struct SgList) * MAX_SGE_NUM), wr->bufList,
652 1 : (sizeof(struct SgList) * wr->bufNum));
653 1 : CHK_PRT_RETURN(ret,
654 : hccp_err("[send][ra_hdc_wr]memcpy_s for mem_list failed, ret(%d), phyId(%u)", ret, qpHdc->phyId), -ESAFEFUNC);
655 :
656 1 : ret = RaHdcProcessMsg(RA_RS_SEND_WR, qpHdc->phyId, (char *)&sendWrData, sizeof(union OpSendWrData));
657 1 : if (ret) {
658 0 : if (ret != -ENOENT) {
659 0 : hccp_err("[send][ra_hdc_wr]ra hdc message process failed ret(%d), phyId(%u)", ret, qpHdc->phyId);
660 : }
661 0 : return ret;
662 : }
663 :
664 1 : if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
665 0 : opRsp->wqeTmp = sendWrData.rxData.wrRsp.wqeTmp;
666 1 : } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
667 1 : qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
668 0 : opRsp->db = sendWrData.rxData.wrRsp.db;
669 : }
670 :
671 1 : return ret;
672 : }
673 :
674 0 : int RaHdcSendWrV2(struct RaQpHandle *qpHdc, struct SendWrV2 *wr, struct SendWrRsp *opRsp)
675 : {
676 0 : struct LiteSendWr liteWr = {0};
677 :
678 0 : if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
679 0 : if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
680 0 : liteWr.wr.bufList = wr->bufList;
681 0 : liteWr.wr.bufNum = wr->bufNum;
682 0 : liteWr.wr.dstAddr = wr->dstAddr;
683 0 : liteWr.wr.op = wr->op;
684 0 : liteWr.wr.rkey = wr->rkey;
685 0 : liteWr.wr.sendFlag = wr->sendFlag;
686 0 : liteWr.aux = wr->aux;
687 0 : liteWr.ext = wr->ext;
688 0 : return RaHdcLiteTypicalSendWr(qpHdc, &liteWr, opRsp, wr->wrId);
689 : }
690 : }
691 :
692 0 : hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to send_wr", qpHdc->qpn, qpHdc->qpMode,
693 : qpHdc->supportLite);
694 :
695 0 : return -ENOTSUPP;
696 : }
697 :
698 0 : int RaHdcSendWrVerbs(struct RaQpHandle *qpHdc, struct SendWrVerbs *wr, struct SendWrRsp *opRsp)
699 : {
700 0 : struct LiteSendWr liteWr = {0};
701 :
702 0 : if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
703 0 : if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
704 0 : liteWr.wr.bufList = wr->sgList;
705 0 : liteWr.wr.bufNum = wr->numSge;
706 0 : liteWr.wr.dstAddr = wr->remoteAddr;
707 0 : liteWr.wr.op = wr->opcode;
708 0 : liteWr.wr.rkey = wr->rkey;
709 0 : liteWr.wr.sendFlag = wr->sendFlags;
710 0 : liteWr.ext.immData = wr->immData;
711 0 : return RaHdcLiteTypicalSendWr(qpHdc, &liteWr, opRsp, wr->wrId);
712 : }
713 : }
714 :
715 0 : hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to send_wr", qpHdc->qpn, qpHdc->qpMode,
716 : qpHdc->supportLite);
717 :
718 0 : return -ENOTSUPP;
719 : }
720 :
721 0 : int RaHdcRecvWrVerbs(struct RaQpHandle *qpHdc, struct RecvWrVerbs *wr)
722 : {
723 : struct rdma_lite_sge list[RA_SGLIST_MAX];
724 0 : struct rdma_lite_recv_wr liteWr = {
725 : .sg_list = list,
726 0 : .wr_id = wr->wrId,
727 : .num_sge = 0,
728 : .next = NULL,
729 : };
730 0 : struct rdma_lite_recv_wr *badWr = NULL;
731 : int ret;
732 :
733 0 : if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
734 0 : if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
735 0 : for (int i = 0; i < wr->numSge && i < RA_SGLIST_MAX; i++) {
736 0 : list[i].addr = (uintptr_t)wr->sgList[i].addr;
737 0 : list[i].length = wr->sgList[i].len;
738 0 : list[i].lkey = wr->sgList[i].lkey;
739 0 : liteWr.num_sge++;
740 : }
741 :
742 0 : ret = RaRdmaLitePostRecv(qpHdc->liteQp, &liteWr, &badWr);
743 0 : if (ret) {
744 0 : if (ret == -ENOMEM) {
745 0 : hccp_warn("[recv][ra_hdc_wr]ra hdc post recv unsuccessful, ret(%d) phyId(%u)", ret, qpHdc->phyId);
746 0 : return 0;
747 : } else {
748 0 : hccp_err("[recv][ra_hdc_wr]ra hdc post recv failed ret(%d) phyId(%u)", ret, qpHdc->phyId);
749 : }
750 0 : return ret;
751 : }
752 :
753 0 : qpHdc->recvWrNum++;
754 0 : return 0;
755 : }
756 : }
757 :
758 0 : hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to recv_wr_verbs", qpHdc->qpn, qpHdc->qpMode,
759 : qpHdc->supportLite);
760 :
761 0 : return -ENOTSUPP;
762 : }
763 :
764 1 : int RaHdcTypicalSendWr(struct RaQpHandle *qpHdc, struct SendWr *wr, struct SendWrRsp *opRsp)
765 : {
766 1 : struct LiteSendWr liteWr = {0};
767 :
768 1 : if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
769 1 : if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
770 1 : liteWr.wr = *wr;
771 1 : return RaHdcLiteTypicalSendWr(qpHdc, &liteWr, opRsp, HDC_LITE_DEFAULT_WR_ID);
772 : }
773 : }
774 :
775 0 : hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to send_wr", qpHdc->qpn, qpHdc->qpMode,
776 : qpHdc->supportLite);
777 :
778 0 : return -ENOTSUPP;
779 : }
780 :
781 1 : int RaHdcMrDereg(struct RaQpHandle *qpHdc, struct MrInfoT *info)
782 : {
783 1 : union OpMrDeregData mrDeregData = {0};
784 1 : mrDeregData.txData.rdevIndex = qpHdc->rdevIndex;
785 1 : mrDeregData.txData.phyId = qpHdc->phyId;
786 1 : mrDeregData.txData.qpn = qpHdc->qpn;
787 1 : mrDeregData.txData.addr = info->addr;
788 : int ret;
789 :
790 1 : ret = RaHdcProcessMsg(RA_RS_MR_DEREG, qpHdc->phyId, (char *)&mrDeregData, sizeof(union OpMrDeregData));
791 1 : CHK_PRT_RETURN(ret,
792 : hccp_err("[dereg][ra_hdc_mr]ra hdc message process failed ret(%d) phyId(%u)", ret, qpHdc->phyId), ret);
793 :
794 1 : return 0;
795 : }
796 :
797 1 : int RaHdcMrReg(struct RaQpHandle *qpHdc, struct MrInfoT *info)
798 : {
799 1 : union OpMrRegData mrRegData = {0};
800 : int ret;
801 :
802 1 : mrRegData.txData.phyId = qpHdc->phyId;
803 1 : mrRegData.txData.rdevIndex = qpHdc->rdevIndex;
804 1 : mrRegData.txData.qpn = qpHdc->qpn;
805 1 : mrRegData.txData.mrRegAttr.addr = info->addr;
806 1 : mrRegData.txData.mrRegAttr.len = info->size;
807 1 : mrRegData.txData.mrRegAttr.access = info->access;
808 :
809 1 : ret = RaHdcProcessMsg(RA_RS_MR_REG, qpHdc->phyId, (char *)&mrRegData, sizeof(union OpMrRegData));
810 1 : CHK_PRT_RETURN(ret, hccp_err("[reg][ra_hdc_mr]ra hdc message process failed ret(%d) phyId(%u)", ret, qpHdc->phyId),
811 : ret);
812 :
813 1 : info->lkey = mrRegData.rxData.lkey;
814 1 : info->rkey = mrRegData.rxData.rkey;
815 :
816 1 : return 0;
817 : }
818 :
819 1 : int RaHdcTypicalMrReg(struct RaRdmaHandle *rdmaHandle, struct MrInfoT *info, void **mrHandle)
820 : {
821 1 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
822 1 : union OpTypicalMrRegData mrRegData = {0};
823 1 : unsigned int opcode = RA_RS_TYPICAL_MR_REG_V1;
824 1 : struct RaMrHandle *mrHdc = NULL;
825 1 : unsigned int interfaceVersion = 0;
826 : int ret;
827 :
828 1 : mrHdc = (struct RaMrHandle *)calloc(1, sizeof(struct RaMrHandle));
829 1 : CHK_PRT_RETURN(mrHdc == NULL, hccp_err("[reg][ra_hdc_typical_mr]mr_hdc calloc failed phyId(%u)", phyId), -ENOMEM);
830 :
831 1 : mrRegData.txData.phyId = phyId;
832 1 : mrRegData.txData.rdevIndex = rdmaHandle->rdevIndex;
833 1 : mrRegData.txData.mrRegAttr.addr = info->addr;
834 1 : mrRegData.txData.mrRegAttr.len = info->size;
835 1 : mrRegData.txData.mrRegAttr.access = info->access;
836 :
837 1 : ret = RaHdcGetInterfaceVersion(phyId, RA_RS_TYPICAL_MR_REG, &interfaceVersion);
838 1 : if (ret == 0 && interfaceVersion >= RA_RS_OPCODE_BASE_VERSION) {
839 0 : opcode = RA_RS_TYPICAL_MR_REG;
840 : }
841 1 : ret = RaHdcProcessMsg(opcode, phyId, (char *)&mrRegData, sizeof(union OpTypicalMrRegData));
842 1 : if (ret) {
843 0 : hccp_err("[reg][ra_hdc_typical_mr]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
844 0 : free(mrHdc);
845 0 : return ret;
846 : }
847 :
848 1 : info->lkey = mrRegData.rxData.lkey;
849 1 : info->rkey = mrRegData.rxData.rkey;
850 1 : if (opcode == RA_RS_TYPICAL_MR_REG_V1) {
851 1 : mrHdc->addr = (unsigned long long)(uintptr_t)info->addr;
852 : } else {
853 0 : mrHdc->addr = mrRegData.rxData.addr;
854 : }
855 1 : *mrHandle = mrHdc;
856 1 : return 0;
857 : }
858 :
859 1 : int RaHdcRemapMr(struct RaRdmaHandle *rdmaHandle, struct MemRemapInfo info[], unsigned int num)
860 : {
861 1 : union OpRemapMrData opData = {0};
862 : int ret;
863 :
864 1 : ret = memcpy_s(opData.txData.memList, REMAP_MR_MAX_NUM * sizeof(struct MemRemapInfo), info,
865 : num * sizeof(struct MemRemapInfo));
866 1 : CHK_PRT_RETURN(ret != 0, hccp_err("[remap][ra_hdc_mr]memcpy_s mem_list failed, ret:%d", ret), -ESAFEFUNC);
867 1 : opData.txData.memNum = num;
868 1 : opData.txData.rdevIndex = rdmaHandle->rdevIndex;
869 1 : opData.txData.phyId = rdmaHandle->rdevInfo.phyId;
870 :
871 1 : ret = RaHdcProcessMsg(RA_RS_REMAP_MR, opData.txData.phyId, (char *)&opData, sizeof(union OpRemapMrData));
872 1 : CHK_PRT_RETURN(ret,
873 : hccp_err("[remap][ra_hdc_mr]ra hdc message process failed ret(%d) phyId(%u)", ret, rdmaHandle->rdevInfo.phyId),
874 : ret);
875 :
876 1 : return 0;
877 : }
878 :
879 1 : int RaHdcTypicalMrDereg(struct RaRdmaHandle *rdmaHandle, void *mrHandle)
880 : {
881 1 : union OpTypicalMrDeregData mrDeregData = {0};
882 : int ret;
883 :
884 1 : mrDeregData.txData.phyId = rdmaHandle->rdevInfo.phyId;
885 1 : mrDeregData.txData.rdevIndex = rdmaHandle->rdevIndex;
886 1 : mrDeregData.txData.addr = ((struct RaMrHandle *)mrHandle)->addr;
887 :
888 1 : ret = RaHdcProcessMsg(RA_RS_TYPICAL_MR_DEREG, rdmaHandle->rdevInfo.phyId, (char *)&mrDeregData,
889 : sizeof(union OpTypicalMrDeregData));
890 1 : CHK_PRT_RETURN(ret,
891 : hccp_err("[dereg][ra_hdc_typical_mr]ra hdc message process failed ret(%d) phyId(%u)", ret,
892 : rdmaHandle->rdevInfo.phyId),
893 : ret);
894 :
895 1 : free(mrHandle);
896 1 : mrHandle = NULL;
897 1 : return 0;
898 : }
899 :
900 0 : STATIC void RaHdcSendWrlistInit(union OpSendWrlistData *sendWrlist, struct RaQpHandle *qpHdc, unsigned int completeCnt,
901 : struct WrlistSendCompleteNum wrlistNum)
902 : {
903 0 : sendWrlist->txData.phyId = qpHdc->phyId;
904 0 : sendWrlist->txData.rdevIndex = qpHdc->rdevIndex;
905 0 : sendWrlist->txData.qpn = qpHdc->qpn;
906 0 : sendWrlist->txData.sendNum = (wrlistNum.sendNum - completeCnt) >= MAX_WR_NUM ? MAX_WR_NUM
907 0 : : wrlistNum.sendNum - completeCnt;
908 0 : }
909 :
910 6 : STATIC void RaHdcSendWrlistExtInit(union OpSendWrlistDataExt *sendWrlist, struct RaQpHandle *qpHdc,
911 : unsigned int completeCnt, struct WrlistSendCompleteNum wrlistNum)
912 : {
913 6 : sendWrlist->txData.phyId = qpHdc->phyId;
914 6 : sendWrlist->txData.rdevIndex = qpHdc->rdevIndex;
915 6 : sendWrlist->txData.qpn = qpHdc->qpn;
916 6 : sendWrlist->txData.sendNum = (wrlistNum.sendNum - completeCnt) >= MAX_WR_NUM ? MAX_WR_NUM
917 6 : : wrlistNum.sendNum - completeCnt;
918 6 : }
919 :
920 0 : STATIC int RaHdcSendWrlistV1(struct RaQpHandle *qpHdc, struct SendWrlistData wr[], struct SendWrRsp opRsp[],
921 : struct WrlistSendCompleteNum wrlistNum)
922 : {
923 0 : int ret = 0;
924 : unsigned int i, j;
925 0 : unsigned int completeCnt = 0;
926 0 : unsigned int currentSendNum = 0;
927 0 : union OpSendWrlistData *sendWrlist = NULL;
928 :
929 0 : sendWrlist = calloc(1, sizeof(union OpSendWrlistData));
930 0 : CHK_PRT_RETURN(sendWrlist == NULL, hccp_err("[send][ra_hdc_wrlist]send_wrlist calloc failed"), -ENOMEM);
931 0 : while (completeCnt < wrlistNum.sendNum) {
932 0 : RaHdcSendWrlistInit(sendWrlist, qpHdc, completeCnt, wrlistNum);
933 0 : ret = memcpy_s(sendWrlist->txData.wrlist, (sizeof(struct SendWrlistData) * MAX_WR_NUM_V1), &wr[completeCnt],
934 0 : (sizeof(struct SendWrlistData) * sendWrlist->txData.sendNum));
935 0 : if (ret) {
936 0 : hccp_err("[send][ra_hdc_wrlist]memcpy_s for wrlist failed, ret(%d).", ret);
937 0 : ret = -ESAFEFUNC;
938 0 : goto err_send_wrlist;
939 : }
940 0 : currentSendNum = sendWrlist->txData.sendNum;
941 0 : ret = RaHdcProcessMsg(RA_RS_SEND_WRLIST, qpHdc->phyId, (char *)sendWrlist, sizeof(union OpSendWrlistData));
942 :
943 0 : if (sendWrlist->rxData.completeNum > currentSendNum) {
944 0 : hccp_err("[send][ra_hdc_wrlist]complete_num[%u] is larger than send_num[%u], ret(%d).",
945 : sendWrlist->rxData.completeNum, currentSendNum, ret);
946 0 : ret = -EINVAL;
947 0 : goto err_send_wrlist;
948 : }
949 :
950 0 : for (i = 0; i < sendWrlist->rxData.completeNum; i++) {
951 0 : j = i + completeCnt;
952 0 : if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
953 0 : opRsp[j].wqeTmp = sendWrlist->rxData.wrRsp[i].wqeTmp;
954 0 : } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
955 0 : qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
956 0 : opRsp[j].db = sendWrlist->rxData.wrRsp[i].db;
957 : }
958 : }
959 0 : completeCnt = completeCnt + sendWrlist->rxData.completeNum;
960 0 : if (ret) {
961 0 : if (ret != -ENOENT) {
962 0 : hccp_err("[send][ra_hdc_wrlist]ra hdc message process failed ret(%d), phyId(%u)", ret, qpHdc->phyId);
963 : }
964 0 : goto err_send_wrlist;
965 : }
966 : }
967 :
968 0 : err_send_wrlist:
969 0 : free(sendWrlist);
970 0 : sendWrlist = NULL;
971 0 : *(wrlistNum.completeNum) = completeCnt;
972 0 : return ret;
973 : }
974 :
975 5 : STATIC int RaHdcSendWrlistExtV1(struct RaQpHandle *qpHdc, struct SendWrlistDataExt wr[], struct SendWrRsp opRsp[],
976 : struct WrlistSendCompleteNum wrlistNum)
977 : {
978 5 : int ret = 0;
979 : unsigned int i, j;
980 5 : unsigned int completeCnt = 0;
981 5 : unsigned int currentSendNum = 0;
982 5 : union OpSendWrlistDataExt *sendWrlist = NULL;
983 :
984 5 : sendWrlist = calloc(1, sizeof(union OpSendWrlistDataExt));
985 5 : CHK_PRT_RETURN(sendWrlist == NULL, hccp_err("[send][ra_hdc_wrlist_ext]send_wrlist calloc failed"), -ENOMEM);
986 7 : while (completeCnt < wrlistNum.sendNum) {
987 5 : RaHdcSendWrlistExtInit(sendWrlist, qpHdc, completeCnt, wrlistNum);
988 5 : ret = memcpy_s(sendWrlist->txData.wrlist, (sizeof(struct SendWrlistDataExt) * MAX_WR_NUM_V1), &wr[completeCnt],
989 5 : (sizeof(struct SendWrlistDataExt) * sendWrlist->txData.sendNum));
990 5 : if (ret) {
991 1 : hccp_err("[send][ra_hdc_wrlist_ext]memcpy_s for wrlist failed, ret(%d).", ret);
992 1 : ret = -ESAFEFUNC;
993 1 : goto err_send_wrlist;
994 : }
995 4 : currentSendNum = sendWrlist->txData.sendNum;
996 4 : ret = RaHdcProcessMsg(RA_RS_SEND_WRLIST_EXT, qpHdc->phyId, (char *)sendWrlist,
997 : sizeof(union OpSendWrlistDataExt));
998 :
999 4 : if (sendWrlist->rxData.completeNum > currentSendNum) {
1000 2 : hccp_err("[send][ra_hdc_wrlist_ext]complete_num[%u] is larger than send_num[%u], ret(%d).",
1001 : sendWrlist->rxData.completeNum, currentSendNum, ret);
1002 2 : ret = -EINVAL;
1003 2 : goto err_send_wrlist;
1004 : }
1005 :
1006 4 : for (i = 0; i < sendWrlist->rxData.completeNum; i++) {
1007 2 : j = i + completeCnt;
1008 2 : if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
1009 0 : opRsp[j].wqeTmp = sendWrlist->rxData.wrRsp[i].wqeTmp;
1010 2 : } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
1011 2 : qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
1012 0 : opRsp[j].db = sendWrlist->rxData.wrRsp[i].db;
1013 : }
1014 : }
1015 2 : completeCnt = completeCnt + sendWrlist->rxData.completeNum;
1016 2 : if (ret) {
1017 0 : if (ret != -ENOENT) {
1018 0 : hccp_err("[send][ra_hdc_wrlist_ext]ra hdc message process failed ret(%d), phyId(%u)", ret,
1019 : qpHdc->phyId);
1020 : }
1021 0 : goto err_send_wrlist;
1022 : }
1023 : }
1024 :
1025 2 : err_send_wrlist:
1026 5 : free(sendWrlist);
1027 5 : sendWrlist = NULL;
1028 5 : *(wrlistNum.completeNum) = completeCnt;
1029 5 : return ret;
1030 : }
1031 :
1032 0 : STATIC void RaHdcSendWrlistInitV2(union OpSendWrlistDataV2 *sendWrlist, struct RaQpHandle *qpHdc,
1033 : unsigned int completeCnt, struct WrlistSendCompleteNum wrlistNum)
1034 : {
1035 0 : sendWrlist->txData.phyId = qpHdc->phyId;
1036 0 : sendWrlist->txData.rdevIndex = qpHdc->rdevIndex;
1037 0 : sendWrlist->txData.qpn = qpHdc->qpn;
1038 0 : sendWrlist->txData.sendNum = (wrlistNum.sendNum - completeCnt) >= MAX_WR_NUM ? MAX_WR_NUM
1039 0 : : wrlistNum.sendNum - completeCnt;
1040 0 : }
1041 :
1042 1 : STATIC void RaHdcSendWrlistExtInitV2(union OpSendWrlistDataExtV2 *sendWrlist, struct RaQpHandle *qpHdc,
1043 : unsigned int completeCnt, struct WrlistSendCompleteNum wrlistNum)
1044 : {
1045 1 : sendWrlist->txData.phyId = qpHdc->phyId;
1046 1 : sendWrlist->txData.rdevIndex = qpHdc->rdevIndex;
1047 1 : sendWrlist->txData.qpn = qpHdc->qpn;
1048 1 : sendWrlist->txData.sendNum = (wrlistNum.sendNum - completeCnt) >= MAX_WR_NUM ? MAX_WR_NUM
1049 1 : : wrlistNum.sendNum - completeCnt;
1050 1 : }
1051 :
1052 0 : STATIC int RaHdcSendWrlistV2(struct RaQpHandle *qpHdc, struct SendWrlistData wr[], struct SendWrRsp opRsp[],
1053 : struct WrlistSendCompleteNum wrlistNum)
1054 : {
1055 0 : int ret = 0;
1056 : unsigned int i, j;
1057 0 : unsigned int completeCnt = 0;
1058 0 : unsigned int currentSendNum = 0;
1059 0 : union OpSendWrlistDataV2 *sendWrlist = NULL;
1060 :
1061 0 : sendWrlist = calloc(1, sizeof(union OpSendWrlistDataV2));
1062 0 : CHK_PRT_RETURN(sendWrlist == NULL, hccp_err("[send][ra_hdc_wrlist_v2]send_wrlist calloc failed"), -ENOMEM);
1063 0 : while (completeCnt < wrlistNum.sendNum) {
1064 0 : RaHdcSendWrlistInitV2(sendWrlist, qpHdc, completeCnt, wrlistNum);
1065 0 : ret = memcpy_s(sendWrlist->txData.wrlist, (sizeof(struct SendWrlistData) * MAX_WR_NUM), &wr[completeCnt],
1066 0 : (sizeof(struct SendWrlistData) * sendWrlist->txData.sendNum));
1067 0 : if (ret) {
1068 0 : hccp_err("[send][ra_hdc_wrlist_v2]memcpy_s for wrlist failed, ret(%d).", ret);
1069 0 : ret = -ESAFEFUNC;
1070 0 : goto err_send_wrlist;
1071 : }
1072 0 : currentSendNum = sendWrlist->txData.sendNum;
1073 0 : ret = RaHdcProcessMsg(RA_RS_SEND_WRLIST_V2, qpHdc->phyId, (char *)sendWrlist, sizeof(union OpSendWrlistDataV2));
1074 :
1075 0 : if (sendWrlist->rxData.completeNum > currentSendNum) {
1076 0 : hccp_err("[send][ra_hdc_wrlist_v2]complete_num[%u] is larger than send_num[%u], ret(%d).",
1077 : sendWrlist->rxData.completeNum, currentSendNum, ret);
1078 0 : ret = -EINVAL;
1079 0 : goto err_send_wrlist;
1080 : }
1081 :
1082 0 : for (i = 0; i < sendWrlist->rxData.completeNum; i++) {
1083 0 : j = i + completeCnt;
1084 0 : if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
1085 0 : opRsp[j].wqeTmp = sendWrlist->rxData.wrRsp[i].wqeTmp;
1086 0 : } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
1087 0 : qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
1088 0 : opRsp[j].db = sendWrlist->rxData.wrRsp[i].db;
1089 : }
1090 : }
1091 0 : completeCnt = completeCnt + sendWrlist->rxData.completeNum;
1092 0 : if (ret) {
1093 0 : if (ret != -ENOENT) {
1094 0 : hccp_err("[send][ra_hdc_wrlist_v2]ra hdc message process failed ret(%d), phyId(%u)", ret, qpHdc->phyId);
1095 : }
1096 0 : goto err_send_wrlist;
1097 : }
1098 : }
1099 :
1100 0 : err_send_wrlist:
1101 0 : free(sendWrlist);
1102 0 : sendWrlist = NULL;
1103 0 : *(wrlistNum.completeNum) = completeCnt;
1104 0 : return ret;
1105 : }
1106 :
1107 0 : STATIC int RaHdcSendWrlistExtV2(struct RaQpHandle *qpHdc, struct SendWrlistDataExt wr[], struct SendWrRsp opRsp[],
1108 : struct WrlistSendCompleteNum wrlistNum)
1109 : {
1110 0 : int ret = 0;
1111 : unsigned int i, j;
1112 0 : unsigned int completeCnt = 0;
1113 0 : unsigned int currentSendNum = 0;
1114 0 : union OpSendWrlistDataExtV2 *sendWrlist = NULL;
1115 :
1116 0 : sendWrlist = calloc(1, sizeof(union OpSendWrlistDataExtV2));
1117 0 : CHK_PRT_RETURN(sendWrlist == NULL, hccp_err("[send][ra_hdc_wrlist_ext_v2]send_wrlist calloc failed"), -ENOMEM);
1118 0 : while (completeCnt < wrlistNum.sendNum) {
1119 0 : RaHdcSendWrlistExtInitV2(sendWrlist, qpHdc, completeCnt, wrlistNum);
1120 0 : ret = memcpy_s(sendWrlist->txData.wrlist, (sizeof(struct SendWrlistDataExt) * MAX_WR_NUM), &wr[completeCnt],
1121 0 : (sizeof(struct SendWrlistDataExt) * sendWrlist->txData.sendNum));
1122 0 : if (ret) {
1123 0 : hccp_err("[send][ra_hdc_wrlist_ext_v2]memcpy_s for wrlist failed, ret(%d).", ret);
1124 0 : ret = -ESAFEFUNC;
1125 0 : goto err_send_wrlist;
1126 : }
1127 0 : currentSendNum = sendWrlist->txData.sendNum;
1128 0 : ret = RaHdcProcessMsg(RA_RS_SEND_WRLIST_EXT_V2, qpHdc->phyId, (char *)sendWrlist,
1129 : sizeof(union OpSendWrlistDataExtV2));
1130 :
1131 0 : if (sendWrlist->rxData.completeNum > currentSendNum) {
1132 0 : hccp_err("[send][ra_hdc_wrlist_ext_v2]complete_num[%u] is larger than send_num[%u], ret(%d).",
1133 : sendWrlist->rxData.completeNum, currentSendNum, ret);
1134 0 : ret = -EINVAL;
1135 0 : goto err_send_wrlist;
1136 : }
1137 :
1138 0 : for (i = 0; i < sendWrlist->rxData.completeNum; i++) {
1139 0 : j = i + completeCnt;
1140 0 : if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
1141 0 : opRsp[j].wqeTmp = sendWrlist->rxData.wrRsp[i].wqeTmp;
1142 0 : } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
1143 0 : qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
1144 0 : opRsp[j].db = sendWrlist->rxData.wrRsp[i].db;
1145 : }
1146 : }
1147 0 : completeCnt = completeCnt + sendWrlist->rxData.completeNum;
1148 0 : if (ret) {
1149 0 : if (ret != -ENOENT) {
1150 0 : hccp_err("[send][ra_hdc_wrlist_ext_v2]ra hdc message process failed ret(%d), phyId(%u)", ret,
1151 : qpHdc->phyId);
1152 : }
1153 0 : goto err_send_wrlist;
1154 : }
1155 : }
1156 :
1157 0 : err_send_wrlist:
1158 0 : free(sendWrlist);
1159 0 : sendWrlist = NULL;
1160 0 : *(wrlistNum.completeNum) = completeCnt;
1161 0 : return ret;
1162 : }
1163 :
1164 0 : int RaHdcSendWrlist(struct RaQpHandle *qpHdc, struct SendWrlistData wr[], struct SendWrRsp opRsp[],
1165 : struct WrlistSendCompleteNum wrlistNum)
1166 : {
1167 : int ret;
1168 0 : unsigned int interfaceVersion = 0;
1169 :
1170 0 : if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
1171 0 : if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
1172 0 : return RaHdcLiteSendWrlist(qpHdc, wr, opRsp, wrlistNum);
1173 : }
1174 : }
1175 :
1176 0 : ret = RaHdcGetInterfaceVersion(qpHdc->phyId, RA_RS_SEND_WRLIST_V2, &interfaceVersion);
1177 0 : if (ret != 0 || interfaceVersion != RA_RS_SEND_WRLIST_V2_VERSION) {
1178 0 : return RaHdcSendWrlistV1(qpHdc, wr, opRsp, wrlistNum);
1179 : }
1180 :
1181 0 : return RaHdcSendWrlistV2(qpHdc, wr, opRsp, wrlistNum);
1182 : }
1183 :
1184 5 : int RaHdcSendWrlistExt(struct RaQpHandle *qpHdc, struct SendWrlistDataExt wr[], struct SendWrRsp opRsp[],
1185 : struct WrlistSendCompleteNum wrlistNum)
1186 : {
1187 : int ret;
1188 5 : unsigned int interfaceVersion = 0;
1189 :
1190 5 : if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
1191 0 : if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
1192 0 : return RaHdcLiteSendWrlistExt(qpHdc, wr, opRsp, wrlistNum);
1193 : }
1194 : }
1195 :
1196 5 : ret = RaHdcGetInterfaceVersion(qpHdc->phyId, RA_RS_SEND_WRLIST_EXT_V2, &interfaceVersion);
1197 5 : if (ret != 0 || interfaceVersion != RA_RS_SEND_WRLIST_EXT_V2_VERSION) {
1198 5 : return RaHdcSendWrlistExtV1(qpHdc, wr, opRsp, wrlistNum);
1199 : }
1200 :
1201 0 : return RaHdcSendWrlistExtV2(qpHdc, wr, opRsp, wrlistNum);
1202 : }
1203 :
1204 1 : STATIC void RaHdcSendWrlistNormalInit(union OpSendNormalWrlistData *sendWrlist, struct RaQpHandle *qpHdc,
1205 : unsigned int completeCnt, struct WrlistSendCompleteNum wrlistNum)
1206 : {
1207 1 : (void)memset_s(sendWrlist, sizeof(union OpSendNormalWrlistData), 0, sizeof(union OpSendNormalWrlistData));
1208 1 : sendWrlist->txData.phyId = qpHdc->phyId;
1209 1 : sendWrlist->txData.rdevIndex = qpHdc->rdevIndex;
1210 1 : sendWrlist->txData.qpn = qpHdc->qpn;
1211 1 : sendWrlist->txData.sendNum = ((wrlistNum.sendNum - completeCnt) >= MAX_WR_NUM) ? MAX_WR_NUM
1212 1 : : wrlistNum.sendNum - completeCnt;
1213 1 : }
1214 :
1215 1 : STATIC int RaHdcSendWrlistNormal(struct RaQpHandle *qpHdc, struct WrInfo wr[], struct SendWrRsp opRsp[],
1216 : struct WrlistSendCompleteNum wrlistNum)
1217 : {
1218 1 : union OpSendNormalWrlistData *sendWrlist = NULL;
1219 1 : unsigned int currentSendNum = 0;
1220 1 : unsigned int completeCnt = 0;
1221 : unsigned int i;
1222 1 : int ret = 0;
1223 :
1224 1 : sendWrlist = calloc(1, sizeof(union OpSendNormalWrlistData));
1225 1 : CHK_PRT_RETURN(sendWrlist == NULL, hccp_err("[send][send_wrlist]send_wrlist calloc failed"), -ENOMEM);
1226 :
1227 2 : while (completeCnt < wrlistNum.sendNum) {
1228 1 : RaHdcSendWrlistNormalInit(sendWrlist, qpHdc, completeCnt, wrlistNum);
1229 1 : ret = memcpy_s(sendWrlist->txData.wrlist, (sizeof(struct WrInfo) * MAX_WR_NUM), &wr[completeCnt],
1230 1 : (sizeof(struct WrInfo) * sendWrlist->txData.sendNum));
1231 1 : if (ret != 0) {
1232 0 : hccp_err("[send][send_wrlist]memcpy_s for wrlist failed, ret(%d)", ret);
1233 0 : ret = -ESAFEFUNC;
1234 0 : goto err_send_wrlist;
1235 : }
1236 1 : currentSendNum = sendWrlist->txData.sendNum;
1237 1 : ret = RaHdcProcessMsg(RA_RS_SEND_NORMAL_WRLIST, qpHdc->phyId, (char *)sendWrlist,
1238 : sizeof(union OpSendNormalWrlistData));
1239 :
1240 1 : if (sendWrlist->rxData.completeNum > currentSendNum) {
1241 0 : hccp_err("[send][send_wrlist]complete_num[%u] is larger than send_num[%u], ret(%d)",
1242 : sendWrlist->rxData.completeNum, currentSendNum, ret);
1243 0 : ret = -EINVAL;
1244 0 : goto err_send_wrlist;
1245 : }
1246 :
1247 2 : for (i = 0; i < sendWrlist->rxData.completeNum; i++) {
1248 1 : if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
1249 0 : opRsp[completeCnt + i].wqeTmp = sendWrlist->rxData.wrRsp[i].wqeTmp;
1250 1 : } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
1251 1 : qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
1252 0 : opRsp[completeCnt + i].db = sendWrlist->rxData.wrRsp[i].db;
1253 : }
1254 : }
1255 1 : completeCnt += sendWrlist->rxData.completeNum;
1256 : // send wrlist success, continue to send
1257 1 : if (ret == 0) {
1258 1 : continue;
1259 : }
1260 0 : if (ret != -ENOENT && ret != -ENOMEM) {
1261 0 : hccp_err("[send][send_wrlist]ra hdc message process failed ret(%d), phyId(%u)", ret, qpHdc->phyId);
1262 : }
1263 0 : goto err_send_wrlist;
1264 : }
1265 :
1266 1 : err_send_wrlist:
1267 1 : free(sendWrlist);
1268 1 : sendWrlist = NULL;
1269 1 : *(wrlistNum.completeNum) = completeCnt;
1270 1 : return ret;
1271 : }
1272 :
1273 2 : int RaHdcSendNormalWrlist(struct RaQpHandle *qpHdc, struct WrInfo wr[], struct SendWrRsp opRsp[],
1274 : struct WrlistSendCompleteNum wrlistNum)
1275 : {
1276 2 : if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
1277 1 : if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
1278 1 : return RaHdcLiteSendNormalWrlist(qpHdc, wr, opRsp, wrlistNum);
1279 : }
1280 : }
1281 :
1282 1 : return RaHdcSendWrlistNormal(qpHdc, wr, opRsp, wrlistNum);
1283 : }
1284 :
1285 2 : int RaHdcGetNotifyBaseAddr(struct RaRdmaHandle *rdmaHandle, unsigned long long *va, unsigned long long *size)
1286 : {
1287 : int ret;
1288 2 : union OpGetNotifyBaData getNotifyBaData = {0};
1289 2 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
1290 :
1291 2 : getNotifyBaData.txData.phyId = phyId;
1292 2 : getNotifyBaData.txData.rdevIndex = rdmaHandle->rdevIndex;
1293 :
1294 2 : ret = RaHdcProcessMsg(RA_RS_GET_NOTIFY_BA, phyId, (char *)&getNotifyBaData, sizeof(union OpGetNotifyBaData));
1295 2 : CHK_PRT_RETURN(ret,
1296 : hccp_err("[get][ra_hdc_notify_base_addr]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId), ret);
1297 :
1298 2 : *va = getNotifyBaData.rxData.va;
1299 2 : *size = getNotifyBaData.rxData.size;
1300 2 : return 0;
1301 : }
1302 :
1303 2 : int RaHdcGetNotifyMrInfo(struct RaRdmaHandle *rdmaHandle, struct MrInfoT *info)
1304 : {
1305 2 : union OpGetNotifyBaData getNotifyBaData = {0};
1306 2 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
1307 2 : unsigned int interfaceVersion = 0;
1308 : int ret;
1309 :
1310 : // check opcode version, reuse RA_RS_GET_NOTIFY_BA
1311 2 : ret = RaHdcGetInterfaceVersion(phyId, RA_RS_GET_NOTIFY_BA, &interfaceVersion);
1312 2 : if (ret != 0 || interfaceVersion == RA_RS_GET_NOTIFY_BA_VERSION) {
1313 0 : hccp_err("[get][ra_hdc_notify_mr_info]interface_version(%u) not support, ret(%d)", interfaceVersion, ret);
1314 0 : return -ENOTSUPP;
1315 : }
1316 :
1317 2 : getNotifyBaData.txData.phyId = phyId;
1318 2 : getNotifyBaData.txData.rdevIndex = rdmaHandle->rdevIndex;
1319 :
1320 2 : ret = RaHdcProcessMsg(RA_RS_GET_NOTIFY_BA, phyId, (char *)&getNotifyBaData, sizeof(union OpGetNotifyBaData));
1321 2 : CHK_PRT_RETURN(ret,
1322 : hccp_err("[get][ra_hdc_notify_mr_info]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId), ret);
1323 :
1324 2 : info->addr = (void *)(uintptr_t)getNotifyBaData.rxData.va;
1325 2 : info->size = getNotifyBaData.rxData.size;
1326 2 : info->access = getNotifyBaData.rxData.access;
1327 2 : info->lkey = getNotifyBaData.rxData.lkey;
1328 2 : return 0;
1329 : }
1330 :
1331 2 : int RaHdcRecvWrlist(struct RaQpHandle *qpHdc, struct RecvWrlistData *wr, unsigned int recvNum,
1332 : unsigned int *completeNum)
1333 : {
1334 2 : if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
1335 1 : if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
1336 1 : return RaHdcLiteRecvWrlist(qpHdc, wr, recvNum, completeNum);
1337 : }
1338 : }
1339 :
1340 1 : hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to recv_wrlist", qpHdc->qpn, qpHdc->qpMode,
1341 : qpHdc->supportLite);
1342 :
1343 1 : return -ENOTSUPP;
1344 : }
1345 :
1346 2 : int RaHdcPollCq(struct RaQpHandle *qpHdc, bool isSendCq, unsigned int numEntries, void *wc)
1347 : {
1348 2 : struct rdma_lite_wc_v2 *liteWc = (struct rdma_lite_wc_v2 *)wc;
1349 :
1350 2 : if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
1351 1 : if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
1352 1 : return RaHdcLitePollCq(qpHdc, isSendCq, numEntries, liteWc);
1353 : }
1354 : }
1355 :
1356 1 : hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to poll_cq", qpHdc->qpn, qpHdc->qpMode,
1357 : qpHdc->supportLite);
1358 :
1359 1 : return -ENOTSUPP;
1360 : }
1361 :
1362 0 : int RaHdcPollTypicalCq(struct RaTypicalCqHandle *cqHdc, unsigned int numEntries, void *wc)
1363 : {
1364 0 : struct rdma_lite_wc_v2 *liteWc = (struct rdma_lite_wc_v2 *)wc;
1365 0 : struct rdma_lite_cq *liteCq = RaHdcLiteFindTypicalCq(cqHdc->rdmaHandle, cqHdc->cqn);
1366 0 : if (liteCq == NULL) {
1367 0 : hccp_warn("cqn:%u liteCq not found in table", cqHdc->cqn);
1368 0 : return -ENOTSUPP;
1369 : }
1370 0 : int ret = RaRdmaLitePollCqV2(liteCq, (int)numEntries, liteWc);
1371 0 : if (ret < 0) {
1372 0 : hccp_err("ra_rdma_lite_poll_cq_v2 failed, ret %d", ret);
1373 0 : return ret;
1374 : }
1375 0 : return ret;
1376 : }
1377 :
1378 12 : int RaHdcNotifyCfgSet(unsigned int phyId, unsigned long long va, unsigned long long size)
1379 : {
1380 12 : union OpNotifyCfgSetData setNotifyBaData = {0};
1381 : int ret;
1382 :
1383 12 : setNotifyBaData.txData.phyId = phyId;
1384 12 : setNotifyBaData.txData.va = va;
1385 12 : setNotifyBaData.txData.size = size;
1386 :
1387 12 : ret = RaHdcProcessMsg(RA_RS_NOTIFY_CFG_SET, phyId, (char *)&setNotifyBaData, sizeof(union OpNotifyCfgSetData));
1388 12 : CHK_PRT_RETURN(ret,
1389 : hccp_err("[set][ra_hdc_notify_cfg]ra hdc message process failed ret(%d), phyId(%u)", ret, phyId), ret);
1390 :
1391 9 : return 0;
1392 : }
1393 :
1394 6 : int RaHdcNotifyCfgGet(unsigned int phyId, unsigned long long *va, unsigned long long *size)
1395 : {
1396 6 : union OpNotifyCfgGetData getNotifyBaData = {0};
1397 : int ret;
1398 :
1399 6 : getNotifyBaData.txData.phyId = phyId;
1400 :
1401 6 : ret = RaHdcProcessMsg(RA_RS_NOTIFY_CFG_GET, phyId, (char *)&getNotifyBaData, sizeof(union OpNotifyCfgGetData));
1402 6 : CHK_PRT_RETURN(ret,
1403 : hccp_err("[get][ra_hdc_notify_cfg]ra hdc message process failed ret(%d), phyId(%u)", ret, phyId), ret);
1404 6 : *va = getNotifyBaData.rxData.va;
1405 6 : *size = getNotifyBaData.rxData.size;
1406 6 : return 0;
1407 : }
1408 :
1409 0 : STATIC int RaHdcRdevInitWithBackup(struct RaRdmaHandle *rdmaHandle, unsigned int *rdevIndex)
1410 : {
1411 0 : union OpRdevInitWithBackupData rdevInitData = {0};
1412 0 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
1413 0 : unsigned int interfaceVersion = 0;
1414 : int ret;
1415 :
1416 0 : ret = RaHdcGetInterfaceVersion(phyId, RA_RS_RDEV_INIT_WITH_BACKUP, &interfaceVersion);
1417 : // check opcode version, not support to init rdev with backup info
1418 0 : if (ret != 0 || interfaceVersion < RA_RS_OPCODE_BASE_VERSION) {
1419 0 : hccp_warn("[init][ra_hdc_rdev]get opcode[%d] not support, ret[%d] != 0 or interfaceVersion[%u] is 0",
1420 : RA_RS_RDEV_INIT_WITH_BACKUP, ret, interfaceVersion);
1421 0 : return -ENOTSUPP;
1422 : }
1423 :
1424 0 : (void)memcpy_s(&(rdevInitData.txData.rdevInfo), sizeof(struct rdev), &rdmaHandle->rdevInfo, sizeof(struct rdev));
1425 0 : (void)memcpy_s(&(rdevInitData.txData.backupRdevInfo), sizeof(struct rdev), &rdmaHandle->backupInfo.rdevInfo,
1426 : sizeof(struct rdev));
1427 0 : ret = RaHdcProcessMsg(RA_RS_RDEV_INIT_WITH_BACKUP, phyId, (char *)&rdevInitData,
1428 : sizeof(union OpRdevInitWithBackupData));
1429 0 : if (ret) {
1430 0 : hccp_err("[init][ra_hdc_rdev]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
1431 0 : return ret;
1432 : }
1433 :
1434 0 : *rdevIndex = rdevInitData.rxData.rdevIndex;
1435 0 : return 0;
1436 : }
1437 :
1438 17 : int RaHdcRdevInit(struct RaRdmaHandle *rdmaHandle, unsigned int notifyType, struct rdev rdevInfo,
1439 : unsigned int *rdevIndex)
1440 : {
1441 17 : union OpRdevInitData rdevInitData = {0};
1442 17 : unsigned long long *notifyVa = NULL;
1443 : int ret, drvRet;
1444 :
1445 17 : ret = RaHdcNotifyBaseAddrInit(notifyType, rdevInfo.phyId, ¬ifyVa);
1446 17 : CHK_PRT_RETURN(ret,
1447 : hccp_err("[init][ra_hdc_rdev]ra_hdc_notify_base_addr_init failed, ret(%d), phyId(%u)", ret, rdevInfo.phyId),
1448 : ret);
1449 :
1450 : // need to init backup rdev: reg notify & normal mr, prepare for aicpu unfold
1451 14 : if (rdmaHandle->backupInfo.backupFlag) {
1452 0 : ret = RaHdcRdevInitWithBackup(rdmaHandle, rdevIndex);
1453 0 : if (ret) {
1454 0 : goto free_mem;
1455 : }
1456 : } else {
1457 14 : (void)memcpy_s(&(rdevInitData.txData.rdevInfo), sizeof(struct rdev), &rdevInfo, sizeof(struct rdev));
1458 14 : ret = RaHdcProcessMsg(RA_RS_RDEV_INIT, rdevInfo.phyId, (char *)&rdevInitData, sizeof(union OpRdevInitData));
1459 14 : if (ret) {
1460 5 : hccp_err("[init][ra_hdc_rdev]ra hdc message process failed ret(%d) phyId(%u)", ret, rdevInfo.phyId);
1461 5 : goto free_mem;
1462 : }
1463 9 : *rdevIndex = rdevInitData.rxData.rdevIndex;
1464 : }
1465 :
1466 9 : ret = RaHdcLiteInit(rdmaHandle, rdevInfo.phyId, *rdevIndex);
1467 9 : if (ret) {
1468 4 : hccp_err("[init][ra_hdc_rdev]ra_hdc_lite_init failed ret(%d) phyId(%u)", ret, rdevInfo.phyId);
1469 4 : goto free_mem;
1470 : }
1471 :
1472 5 : return 0;
1473 :
1474 9 : free_mem:
1475 9 : drvRet = DlHalMemFree((void *)notifyVa);
1476 9 : if (drvRet) {
1477 1 : hccp_err("[init][ra_hdc_rdev]halMemFree failed! drv_ret(%d)", drvRet);
1478 : }
1479 9 : return ret;
1480 : }
1481 :
1482 2 : int RaHdcRdevGetPortStatus(struct RaRdmaHandle *rdmaHandle, enum PortStatus *status)
1483 : {
1484 2 : union OpRdevGetPortStatusData statusData = {0};
1485 2 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
1486 : int ret;
1487 :
1488 2 : statusData.txData.rdevIndex = rdmaHandle->rdevIndex;
1489 2 : statusData.txData.phyId = phyId;
1490 :
1491 2 : ret = RaHdcProcessMsg(RA_RS_RDEV_GET_PORT_STATUS, phyId, (char *)&statusData,
1492 : sizeof(union OpRdevGetPortStatusData));
1493 2 : CHK_PRT_RETURN(ret != 0,
1494 : hccp_err("[get][ra_hdc_port_status]ra hdc message process failed, ret(%d) phyId(%u)", ret, phyId), ret);
1495 :
1496 1 : *status = statusData.rxData.status;
1497 1 : return 0;
1498 : }
1499 :
1500 0 : int RaHdcRdevRestoreDeinit(struct RaRdmaHandle *rdmaHandle, unsigned int notifyType)
1501 : {
1502 : // lite thread is an inner thread, make sure it will exit
1503 0 : RaHdcLiteDeinit(rdmaHandle);
1504 :
1505 0 : CHK_PRT_RETURN(notifyType != NOTIFY, hccp_err("[deinit][ra_hdc_rdev]notify_type[%u] error", notifyType), -EINVAL);
1506 :
1507 0 : return 0;
1508 : }
1509 :
1510 10 : int RaHdcRdevDeinit(struct RaRdmaHandle *rdmaHandle, unsigned int notifyType)
1511 : {
1512 10 : union OpRdevDeinitData rdevDeinitData = {0};
1513 : unsigned long long va, size;
1514 : int ret;
1515 :
1516 : // lite thread is an inner thread, make sure it will exit
1517 10 : RaHdcLiteDeinit(rdmaHandle);
1518 :
1519 10 : CHK_PRT_RETURN(notifyType != NOTIFY, hccp_err("[deinit][ra_hdc_rdev]notify_type[%u] error", notifyType), -EINVAL);
1520 :
1521 10 : rdevDeinitData.txData.rdevIndex = rdmaHandle->rdevIndex;
1522 10 : rdevDeinitData.txData.phyId = rdmaHandle->rdevInfo.phyId;
1523 :
1524 10 : ret = RaHdcProcessMsg(RA_RS_RDEV_DEINIT, rdmaHandle->rdevInfo.phyId, (char *)&rdevDeinitData,
1525 : sizeof(union OpRdevDeinitData));
1526 10 : CHK_PRT_RETURN(ret, hccp_err("[deinit][ra_hdc_rdev]ra_hdc_notify_cfg_get failed, ret(%d)", ret), ret);
1527 :
1528 8 : ret = RaHdcNotifyCfgGet(rdmaHandle->rdevInfo.phyId, &va, &size);
1529 8 : CHK_PRT_RETURN(ret, hccp_err("[deinit][ra_hdc_rdev]ra_hdc_notify_cfg_get failed, ret(%d)", ret), ret);
1530 :
1531 7 : ret = DlHalMemFree((void *)(uintptr_t)va);
1532 7 : CHK_PRT_RETURN(ret, hccp_err("[deinit][ra_hdc_rdev]halMemFree failed, ret(%d)", ret), ret);
1533 :
1534 6 : return 0;
1535 : }
1536 :
1537 1 : int RaHdcSetTsqpDepth(struct RaRdmaHandle *rdmaHandle, unsigned int tempDepth, unsigned int *qpNum)
1538 : {
1539 1 : union OpSetTsqpDepthData setTsqpDepthData = {0};
1540 1 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
1541 : int ret;
1542 :
1543 1 : setTsqpDepthData.txData.phyId = rdmaHandle->rdevInfo.phyId;
1544 1 : setTsqpDepthData.txData.rdevIndex = rdmaHandle->rdevIndex;
1545 1 : setTsqpDepthData.txData.tempDepth = tempDepth;
1546 :
1547 1 : ret = RaHdcProcessMsg(RA_RS_SET_TSQP_DEPTH, phyId, (char *)&setTsqpDepthData, sizeof(union OpSetTsqpDepthData));
1548 1 : CHK_PRT_RETURN(ret,
1549 : hccp_err("[set][ra_hdc_tsqp_depth]ra hdc message process failed ret(%d), opcode(%d)"
1550 : "phyId(%u)",
1551 : ret, RA_RS_SET_TSQP_DEPTH, phyId),
1552 : ret);
1553 :
1554 1 : *qpNum = setTsqpDepthData.rxData.qpNum;
1555 1 : return 0;
1556 : }
1557 :
1558 1 : int RaHdcGetTsqpDepth(struct RaRdmaHandle *rdmaHandle, unsigned int *tempDepth, unsigned int *qpNum)
1559 : {
1560 1 : union OpGetTsqpDepthData getTsqpDepthData = {0};
1561 1 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
1562 : int ret;
1563 :
1564 1 : getTsqpDepthData.txData.phyId = rdmaHandle->rdevInfo.phyId;
1565 1 : getTsqpDepthData.txData.rdevIndex = rdmaHandle->rdevIndex;
1566 :
1567 1 : ret = RaHdcProcessMsg(RA_RS_GET_TSQP_DEPTH, phyId, (char *)&getTsqpDepthData, sizeof(union OpGetTsqpDepthData));
1568 1 : CHK_PRT_RETURN(ret,
1569 : hccp_err("[get][ra_hdc_tsqp_depth]ra hdc message process failed ret(%d), opcode(%d)"
1570 : "phyId(%u)",
1571 : ret, RA_RS_GET_TSQP_DEPTH, phyId),
1572 : ret);
1573 :
1574 1 : *tempDepth = getTsqpDepthData.rxData.tempDepth;
1575 1 : *qpNum = getTsqpDepthData.rxData.qpNum;
1576 :
1577 1 : return 0;
1578 : }
1579 :
1580 0 : int RaHdcSetQpAttrQos(struct RaQpHandle *qpHdc, struct QosAttr *attr)
1581 : {
1582 0 : union OpSetQpAttrQosData qpAttrQosData = {0};
1583 : int ret;
1584 :
1585 0 : qpAttrQosData.txData.phyId = qpHdc->phyId;
1586 0 : qpAttrQosData.txData.rdevIndex = qpHdc->rdevIndex;
1587 0 : qpAttrQosData.txData.qpn = qpHdc->qpn;
1588 0 : qpAttrQosData.txData.qosAttr.tc = attr->tc;
1589 0 : qpAttrQosData.txData.qosAttr.sl = attr->sl;
1590 :
1591 0 : ret = RaHdcProcessMsg(RA_RS_SET_QP_ATTR_QOS, qpHdc->phyId, (char *)&qpAttrQosData,
1592 : sizeof(union OpSetQpAttrQosData));
1593 0 : CHK_PRT_RETURN(ret,
1594 : hccp_err("[set][ra_hdc_qp_attr_qos]ra hdc message process failed ret(%d) phyId(%u)", ret, qpHdc->phyId), ret);
1595 :
1596 0 : return 0;
1597 : }
1598 :
1599 0 : int RaHdcSetQpAttrTimeout(struct RaQpHandle *qpHdc, unsigned int *timeout)
1600 : {
1601 0 : union OpSetQpAttrTimeoutData qpAttrTimeoutData = {0};
1602 : int ret;
1603 :
1604 0 : qpAttrTimeoutData.txData.phyId = qpHdc->phyId;
1605 0 : qpAttrTimeoutData.txData.rdevIndex = qpHdc->rdevIndex;
1606 0 : qpAttrTimeoutData.txData.qpn = qpHdc->qpn;
1607 0 : qpAttrTimeoutData.txData.timeout = *timeout;
1608 :
1609 0 : ret = RaHdcProcessMsg(RA_RS_SET_QP_ATTR_TIMEOUT, qpHdc->phyId, (char *)&qpAttrTimeoutData,
1610 : sizeof(union OpSetQpAttrTimeoutData));
1611 0 : CHK_PRT_RETURN(ret,
1612 : hccp_err("[set][ra_hdc_qp_attr_timeout]ra hdc message process failed ret(%d) phyId(%u)", ret, qpHdc->phyId),
1613 : ret);
1614 :
1615 0 : return 0;
1616 : }
1617 :
1618 0 : int RaHdcSetQpAttrRetryCnt(struct RaQpHandle *qpHdc, unsigned int *retryCnt)
1619 : {
1620 0 : union OpSetQpAttrRetryCntData qpAttrRetryCntData = {0};
1621 : int ret;
1622 :
1623 0 : qpAttrRetryCntData.txData.phyId = qpHdc->phyId;
1624 0 : qpAttrRetryCntData.txData.rdevIndex = qpHdc->rdevIndex;
1625 0 : qpAttrRetryCntData.txData.qpn = qpHdc->qpn;
1626 0 : qpAttrRetryCntData.txData.retryCnt = *retryCnt;
1627 :
1628 0 : ret = RaHdcProcessMsg(RA_RS_SET_QP_ATTR_RETRY_CNT, qpHdc->phyId, (char *)&qpAttrRetryCntData,
1629 : sizeof(union OpSetQpAttrRetryCntData));
1630 0 : CHK_PRT_RETURN(ret,
1631 : hccp_err("[set][ra_hdc_qp_attr_retry_cnt]ra hdc message process failed ret(%d) phyId(%u)", ret, qpHdc->phyId),
1632 : ret);
1633 :
1634 0 : return 0;
1635 : }
1636 :
1637 0 : STATIC int RaHdcGetCqeErrInfoNum(struct RaRdmaHandle *rdmaHandle, unsigned int *num)
1638 : {
1639 0 : union OpGetCqeErrInfoNumData cqeErrInfoNumData = {0};
1640 0 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
1641 0 : unsigned int interfaceVersion = 0;
1642 : int ret;
1643 :
1644 0 : *num = 0;
1645 : // check opcode version, not support to get cqe err info
1646 0 : ret = RaHdcGetInterfaceVersion(phyId, RA_RS_GET_CQE_ERR_INFO_NUM, &interfaceVersion);
1647 0 : if (ret != 0 || interfaceVersion == 0) {
1648 0 : hccp_warn("[get][cqe_err_info_list]get opcode[%d] not support, ret[%d] != 0 or interfaceVersion[%u] is 0",
1649 : RA_RS_GET_CQE_ERR_INFO_NUM, ret, interfaceVersion);
1650 0 : return 0;
1651 : }
1652 :
1653 0 : cqeErrInfoNumData.txData.phyId = phyId;
1654 0 : cqeErrInfoNumData.txData.rdevIndex = rdmaHandle->rdevIndex;
1655 0 : ret = RaHdcProcessMsg(RA_RS_GET_CQE_ERR_INFO_NUM, phyId, (char *)&cqeErrInfoNumData,
1656 : sizeof(union OpGetCqeErrInfoNumData));
1657 0 : CHK_PRT_RETURN(ret, hccp_err("ra hdc message process failed ret(%d) phyId(%u)", ret, phyId), ret);
1658 :
1659 0 : *num = cqeErrInfoNumData.rxData.num;
1660 0 : return 0;
1661 : }
1662 :
1663 0 : int RaHdcGetCqeErrInfoList(struct RaRdmaHandle *rdmaHandle, struct CqeErrInfo *infoList, unsigned int *num)
1664 : {
1665 0 : union OpGetCqeErrInfoListData cqeErrInfoListData = {0};
1666 0 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
1667 0 : unsigned int liteCqeErrNum = *num;
1668 0 : unsigned int cqeErrInfoNum = 0;
1669 0 : unsigned int hdcCqeErrNum = 0;
1670 0 : int ret = 0;
1671 :
1672 0 : ret = RaHdcLiteGetCqeErrInfoList(rdmaHandle, infoList, &liteCqeErrNum);
1673 0 : CHK_PRT_RETURN(ret != 0,
1674 : hccp_err("[get][cqe_err_info_list]get lite err info list failed, ret(%d) phyId(%u)", ret, phyId), ret);
1675 :
1676 0 : hdcCqeErrNum = *num - liteCqeErrNum;
1677 0 : *num = liteCqeErrNum;
1678 : // lite cqe err info full up info_list
1679 0 : if (hdcCqeErrNum == 0) {
1680 0 : return 0;
1681 : }
1682 :
1683 : // get cqe err info num failed or not support to get cqe err info, skip get cqe err info list
1684 0 : ret = RaHdcGetCqeErrInfoNum(rdmaHandle, &cqeErrInfoNum);
1685 0 : if (ret != 0 || cqeErrInfoNum == 0) {
1686 0 : return ret;
1687 : }
1688 :
1689 0 : cqeErrInfoListData.txData.phyId = phyId;
1690 0 : cqeErrInfoListData.txData.rdevIndex = rdmaHandle->rdevIndex;
1691 0 : cqeErrInfoListData.txData.num = hdcCqeErrNum;
1692 0 : ret = RaHdcProcessMsg(RA_RS_GET_CQE_ERR_INFO_LIST, phyId, (char *)&cqeErrInfoListData,
1693 : sizeof(union OpGetCqeErrInfoListData));
1694 0 : CHK_PRT_RETURN(ret, hccp_err("ra hdc message process failed ret(%d) phyId(%u)", ret, phyId), ret);
1695 :
1696 0 : if (cqeErrInfoListData.rxData.num > hdcCqeErrNum) {
1697 0 : hccp_err("[get][cqe_err_info_list]rx_data.num(%u) is invalid, num(%u), phyId(%u)",
1698 : cqeErrInfoListData.rxData.num, hdcCqeErrNum, phyId);
1699 0 : return -EINVAL;
1700 : }
1701 0 : ret = memcpy_s(&infoList[liteCqeErrNum], sizeof(struct CqeErrInfo) * hdcCqeErrNum,
1702 0 : &cqeErrInfoListData.rxData.infoList, sizeof(struct CqeErrInfo) * cqeErrInfoListData.rxData.num);
1703 0 : if (ret) {
1704 0 : hccp_err("[get][cqe_err_info_list]memcpy_s info_list failed, ret(%d) phyId(%u) num(%u) rxData.num(%u)", ret,
1705 : phyId, hdcCqeErrNum, cqeErrInfoListData.rxData.num);
1706 0 : return ret;
1707 : }
1708 :
1709 0 : *num = liteCqeErrNum + cqeErrInfoListData.rxData.num;
1710 0 : return 0;
1711 : }
1712 :
1713 0 : STATIC int RaHdcLiteCleanCq(struct RaQpHandle *qpHandle, bool isSendCq, unsigned int numEntries)
1714 : {
1715 0 : void *wc = NULL;
1716 : int ret;
1717 :
1718 0 : if (numEntries == 0) {
1719 0 : return 0;
1720 : }
1721 :
1722 0 : wc = calloc(numEntries, sizeof(struct rdma_lite_wc_v2));
1723 0 : if (wc == NULL) {
1724 0 : hccp_err("calloc failed, phyId:%u, qpn:%u", qpHandle->phyId, qpHandle->qpn);
1725 0 : return -ENOMEM;
1726 : }
1727 :
1728 0 : ret = RaHdcLitePollCq(qpHandle, isSendCq, numEntries, wc);
1729 0 : free(wc);
1730 0 : if (ret < 0) {
1731 0 : hccp_err("ra_hdc_lite_poll_cq failed, ret:%d, phyId:%u, qpn:%u", ret, qpHandle->phyId, qpHandle->qpn);
1732 0 : return ret;
1733 : }
1734 :
1735 0 : return 0;
1736 : }
1737 :
1738 0 : STATIC int RaHdcLiteCleanQp(struct RaQpHandle *qpHandle)
1739 : {
1740 0 : unsigned int interfaceVersion = 0;
1741 : int ret;
1742 :
1743 : // check opcode versioin, not support to clean qp
1744 0 : ret = RaHdcGetInterfaceVersion(qpHandle->phyId, RA_RS_QP_BATCH_MODIFY, &interfaceVersion);
1745 0 : if (ret != 0 || interfaceVersion <= RA_RS_OPCODE_BASE_VERSION) {
1746 0 : hccp_warn("RA_RS_QP_BATCH_MODIFY interface_version:%u <= %u, not support to clean qp, phyId:%u, qpn:%u",
1747 : interfaceVersion, RA_RS_OPCODE_BASE_VERSION, qpHandle->phyId, qpHandle->qpn);
1748 0 : return 0;
1749 : }
1750 :
1751 : // lite qp clean
1752 0 : ret = RaRdmaLiteCleanQp(qpHandle->liteQp);
1753 0 : if (ret != 0) {
1754 0 : hccp_err("ra_rdma_lite_clean_qp failed, ret:%d, phyId:%u, qpn:%u", ret, qpHandle->phyId, qpHandle->qpn);
1755 0 : return ret;
1756 : }
1757 :
1758 0 : return 0;
1759 : }
1760 :
1761 2 : STATIC int RaHdcLiteCleanQueue(struct RaQpHandle *qpHandle, int expectStatus)
1762 : {
1763 : int ret;
1764 :
1765 : // not pause status, no need to clean
1766 2 : if (expectStatus != RA_QP_STATUS_PAUSE) {
1767 1 : return 0;
1768 : }
1769 :
1770 : // not lite or not op mode, no need to clean
1771 1 : if ((qpHandle->supportLite == 0) ||
1772 0 : (qpHandle->qpMode != RA_RS_OP_QP_MODE && qpHandle->qpMode != RA_RS_OP_QP_MODE_EXT)) {
1773 1 : return 0;
1774 : }
1775 :
1776 : // poll cq to clean lite send cq
1777 0 : if (qpHandle->sendWrNum > qpHandle->pollCqeNum) {
1778 0 : ret = RaHdcLiteCleanCq(qpHandle, true, qpHandle->sendWrNum - qpHandle->pollCqeNum);
1779 0 : if (ret != 0) {
1780 0 : hccp_err("ra_hdc_lite_clean_cq send_cq failed, ret:%d, phyId:%u, qpn:%u", ret, qpHandle->phyId,
1781 : qpHandle->qpn);
1782 0 : return ret;
1783 : }
1784 : }
1785 :
1786 : // poll cq to clean lite recv cq
1787 0 : if (qpHandle->recvWrNum > qpHandle->pollRecvCqeNum) {
1788 0 : ret = RaHdcLiteCleanCq(qpHandle, false, qpHandle->recvWrNum - qpHandle->pollRecvCqeNum);
1789 0 : if (ret < 0) {
1790 0 : hccp_err("ra_hdc_lite_clean_cq recv_cq failed, ret:%d, phyId:%u, qpn:%u", ret, qpHandle->phyId,
1791 : qpHandle->qpn);
1792 0 : return ret;
1793 : }
1794 : }
1795 :
1796 : // lite qp clean
1797 0 : ret = RaHdcLiteCleanQp(qpHandle);
1798 0 : if (ret != 0) {
1799 0 : hccp_err("ra_hdc_lite_clean_qp failed, ret:%d, phyId:%u, qpn:%u", ret, qpHandle->phyId, qpHandle->qpn);
1800 0 : return ret;
1801 : }
1802 :
1803 0 : return 0;
1804 : }
1805 :
1806 2 : int RaHdcQpBatchModify(struct RaRdmaHandle *rdmaHandle, void *qpHdc[], unsigned int num, int expectStatus)
1807 : {
1808 2 : union OpQpBatchModifyData *qpBatchModifyData = NULL;
1809 2 : unsigned int phyId = rdmaHandle->rdevInfo.phyId;
1810 2 : struct RaQpHandle *qpHandle = NULL;
1811 2 : unsigned int currentSendCnt = 0;
1812 2 : unsigned int completeCnt = 0;
1813 2 : int opQpnCnt = 0;
1814 : unsigned int i;
1815 2 : int ret = 0;
1816 :
1817 2 : qpBatchModifyData = calloc(1, sizeof(union OpQpBatchModifyData));
1818 2 : CHK_PRT_RETURN(qpBatchModifyData == NULL, hccp_err("[send][ra_hdc_qp_batch_modify]qp_batch_modify calloc failed"),
1819 : -ENOMEM);
1820 4 : while (completeCnt < num) {
1821 2 : qpBatchModifyData->txData.phyId = phyId;
1822 2 : qpBatchModifyData->txData.rdevIndex = rdmaHandle->rdevIndex;
1823 2 : qpBatchModifyData->txData.status = expectStatus;
1824 :
1825 2 : currentSendCnt = (num - completeCnt) < RA_MAX_BATCH_QP_MODIFY_NUM ? (num - completeCnt)
1826 : : RA_MAX_BATCH_QP_MODIFY_NUM;
1827 2 : opQpnCnt = 0;
1828 4 : for (i = completeCnt; i < completeCnt + currentSendCnt; i++) {
1829 2 : qpHandle = (struct RaQpHandle *)qpHdc[i];
1830 2 : qpBatchModifyData->txData.qpn[opQpnCnt] = (int)qpHandle->qpn;
1831 2 : opQpnCnt++;
1832 :
1833 : // avoid poll invalid cqe after modify to RESET state, make sure lite cq ci & qp pointer are valid
1834 2 : ret = RaHdcLiteCleanQueue(qpHandle, expectStatus);
1835 2 : if (ret != 0) {
1836 0 : hccp_err("[modify][qp_batch_modify]ra_hdc_lite_clean_queue failed ret(%d) phyId(%u) qpn(%u)", ret,
1837 : phyId, qpHandle->qpn);
1838 0 : goto err_qp_batch_modify;
1839 : }
1840 : }
1841 2 : qpBatchModifyData->txData.qpnNum = opQpnCnt;
1842 :
1843 2 : ret = RaHdcProcessMsg(RA_RS_QP_BATCH_MODIFY, phyId, (char *)qpBatchModifyData,
1844 : sizeof(union OpQpBatchModifyData));
1845 2 : if (ret) {
1846 0 : hccp_err("[modify][qp_batch_modify]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
1847 0 : goto err_qp_batch_modify;
1848 : }
1849 2 : completeCnt += (unsigned int)opQpnCnt;
1850 : }
1851 :
1852 2 : err_qp_batch_modify:
1853 2 : free(qpBatchModifyData);
1854 2 : qpBatchModifyData = NULL;
1855 :
1856 2 : return ret;
1857 : }
1858 :
1859 4 : int RaHdcRdmaSetOps(struct RaRdmaHandle *rdmaHandle, struct RaRdmaOps *rdmaOps)
1860 : {
1861 4 : CHK_PRT_RETURN(rdmaHandle == NULL, hccp_err("ra_hdc_rdma_set_ops rdma_handle is NULL"), -EINVAL);
1862 :
1863 4 : rdmaHandle->rdmaOps = rdmaOps;
1864 4 : return 0;
1865 : }
1866 :
1867 0 : int RaHdcRdmaSaveSnapshot(struct RaRdmaHandle *rdmaHandle, enum SaveSnapshotAction action)
1868 : {
1869 0 : int ret = 0;
1870 :
1871 0 : if (rdmaHandle == NULL || rdmaHandle->supportLite == LITE_NOT_SUPPORT || rdmaHandle->disabledLiteThread) {
1872 0 : return 0;
1873 : }
1874 :
1875 0 : RA_PTHREAD_MUTEX_LOCK(&rdmaHandle->rdevMutex);
1876 0 : if (action == SAVE_SNAPSHOT_ACTION_PRE_PROCESSING && rdmaHandle->threadStatus == LITE_THREAD_STATUS_RUNNING) {
1877 0 : rdmaHandle->threadStatus = LITE_THREAD_STATUS_SUSPEND;
1878 0 : } else if (action == SAVE_SNAPSHOT_ACTION_POST_PROCESSING &&
1879 0 : rdmaHandle->threadStatus == LITE_THREAD_STATUS_SUSPEND) {
1880 0 : rdmaHandle->threadStatus = LITE_THREAD_STATUS_RUNNING;
1881 : } else {
1882 0 : hccp_err("duplicate or incorrect order calls are not allowed, threadStatus[%d] action[%d]",
1883 : rdmaHandle->threadStatus, action);
1884 0 : ret = -EPERM;
1885 : }
1886 0 : RA_PTHREAD_MUTEX_UNLOCK(&rdmaHandle->rdevMutex);
1887 :
1888 0 : return ret;
1889 : }
1890 :
1891 0 : int RaHdcRdmaRestoreSnapshot(struct RaRdmaHandle *rdmaHandle, struct RaRdmaOps *rdmaOps)
1892 : {
1893 0 : int ret = 0;
1894 :
1895 0 : if (rdmaHandle == NULL) {
1896 0 : return 0;
1897 : }
1898 0 : ret = RaHdcRdmaSetOps(rdmaHandle, rdmaOps);
1899 0 : CHK_PRT_RETURN(ret != 0, hccp_err("ra_hdc_rdma_set_ops failed, ret[%d]", ret), ret);
1900 :
1901 0 : if (rdmaHandle->supportLite == LITE_NOT_SUPPORT || rdmaHandle->disabledLiteThread) {
1902 0 : return 0;
1903 : }
1904 :
1905 0 : RA_PTHREAD_MUTEX_LOCK(&rdmaHandle->rdevMutex);
1906 0 : if (rdmaHandle->threadStatus != LITE_THREAD_STATUS_SUSPEND) {
1907 0 : hccp_err("incorrect order calls are not allowed, threadStatus[%d]", rdmaHandle->threadStatus);
1908 0 : ret = -EPERM;
1909 0 : goto unlock_mutex;
1910 : }
1911 0 : ret = RaRdmaLiteRestoreSnapshot(rdmaHandle->liteCtx);
1912 0 : if (ret != 0) {
1913 0 : hccp_err("ra_rdma_lite_restore_snapshot failed, ret[%d]", ret);
1914 : }
1915 :
1916 0 : unlock_mutex:
1917 0 : RA_PTHREAD_MUTEX_UNLOCK(&rdmaHandle->rdevMutex);
1918 0 : return ret;
1919 : }
|