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 <unistd.h>
12 : #include <stdlib.h>
13 : #include <sys/types.h>
14 : #include <netinet/in.h>
15 : #include <arpa/inet.h>
16 : #include <dlfcn.h>
17 : #include <string.h>
18 : #include <urma_opcode.h>
19 : #include <udma_u_ctl.h>
20 : #include "securec.h"
21 : #include "user_log.h"
22 : #include "dl_urma_function.h"
23 : #include "ra_rs_err.h"
24 : #include "ra_rs_ctx.h"
25 : #include "rs_inner.h"
26 : #include "rs_epoll.h"
27 : #include "rs_ctx_inner.h"
28 : #include "rs_ctx.h"
29 : #include "rs_ub_jetty.h"
30 : #include "rs_ub_jfc.h"
31 : #include "rs_ub.h"
32 :
33 0 : int RsUbGetDevEidInfoNum(unsigned int phyId, unsigned int *num)
34 : {
35 : (void)phyId;
36 0 : urma_eid_info_t *eidList = NULL;
37 0 : urma_device_t **devList = NULL;
38 0 : unsigned int totalNum = 0;
39 0 : unsigned int eidNum = 0;
40 0 : int devNum = 0;
41 0 : int ret = 0;
42 0 : int i = 0;
43 :
44 0 : ret = RsUbApiInit();
45 0 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_ub_api_init failed, ret:%d", ret), ret);
46 :
47 0 : devList = RsUrmaGetDeviceList(&devNum);
48 0 : if (devList == NULL) {
49 0 : hccp_err("rs_urma_get_device_list failed, errno:%d", errno);
50 0 : ret = -EINVAL;
51 0 : goto ub_api_deinit;
52 : }
53 :
54 0 : for (i = 0; i < devNum; i++) {
55 0 : eidList = RsUrmaGetEidList(devList[i], &eidNum);
56 : // normal case, should continue to get eid_list from the rest of device
57 0 : if (eidList == NULL) {
58 0 : hccp_warn("rs_urma_get_eid_list i=%u unsuccessful, eidList is NULL, errno:%d", i, errno);
59 0 : continue;
60 : }
61 :
62 0 : totalNum += eidNum;
63 0 : RsUrmaFreeEidList(eidList);
64 : }
65 :
66 0 : *num = totalNum;
67 :
68 0 : RsUrmaFreeDeviceList(devList);
69 0 : ub_api_deinit:
70 0 : RsUbApiDeinit();
71 0 : return ret;
72 : }
73 :
74 0 : STATIC int RsUbCreateCtx(urma_device_t *urmaDev, unsigned int eidIndex, urma_context_t **urmaCtx)
75 : {
76 0 : *urmaCtx = RsUrmaCreateContext(urmaDev, eidIndex);
77 0 : CHK_PRT_RETURN(*urmaCtx == NULL, hccp_err("rs_urma_create_context failed! errno:%d, eidIndex:%u", errno, eidIndex),
78 : -ENODEV);
79 :
80 0 : return 0;
81 : }
82 :
83 1 : int RsUbGetUeInfo(urma_context_t *urmaCtx, struct DevBaseAttr *devAttr)
84 : {
85 : (void)urmaCtx;
86 : (void)devAttr;
87 : #ifdef CUSTOM_INTERFACE
88 1 : struct udma_u_ue_info ueInfo = {0};
89 1 : urma_user_ctl_out_t out = {0};
90 1 : urma_user_ctl_in_t in = {0};
91 : int ret;
92 :
93 1 : in.opcode = UDMA_U_USER_CTL_QUERY_UE_INFO;
94 1 : out.addr = (uint64_t)(uintptr_t)&ueInfo;
95 1 : out.len = sizeof(struct udma_u_ue_info);
96 1 : ret = RsUrmaUserCtl(urmaCtx, &in, &out);
97 1 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_user_ctl query ue info failed! ret:%d errno:%d", ret, errno), -EOPENSRC);
98 :
99 1 : devAttr->ub.dieId = ueInfo.die_id;
100 1 : devAttr->ub.chipId = ueInfo.chip_id;
101 1 : devAttr->ub.funcId = ueInfo.ue_id;
102 1 : hccp_info("func_id:%u, chipId:%u, dieId:%u", devAttr->ub.funcId, devAttr->ub.chipId, devAttr->ub.dieId);
103 : #endif
104 1 : return 0;
105 : }
106 :
107 0 : STATIC int RsUbFillDevEidInfoList(struct HccpDevEidInfo *totalList, unsigned int index, urma_device_t *device,
108 : urma_eid_info_t *eidInfo)
109 : {
110 0 : struct DevBaseAttr devAttr = {0};
111 0 : urma_context_t *urmaCtx = NULL;
112 0 : int ret = 0;
113 :
114 0 : totalList[index].eidIndex = eidInfo->eid_index;
115 0 : totalList[index].type = device->type;
116 :
117 0 : (void)memcpy_s(totalList[index].eid.raw, sizeof(totalList[index].eid.raw), eidInfo->eid.raw,
118 : sizeof(eidInfo->eid.raw));
119 :
120 0 : ret = strcpy_s(totalList[index].name, DEV_EID_INFO_MAX_NAME, device->name);
121 0 : CHK_PRT_RETURN(ret != 0, hccp_err("strcpy device name failed, ret:%d", ret), -ESAFEFUNC);
122 :
123 0 : ret = RsUbCreateCtx(device, eidInfo->eid_index, &urmaCtx);
124 0 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_ub_create_ctx failed, ret:%d, eidIndex:%u", ret, eidInfo->eid_index), ret);
125 :
126 0 : ret = RsUbGetUeInfo(urmaCtx, &devAttr);
127 0 : if (ret != 0) {
128 0 : hccp_err("rs_ub_get_ue_info failed, ret:%d", ret);
129 0 : goto free_ctx;
130 : }
131 :
132 0 : totalList[index].dieId = devAttr.ub.dieId;
133 0 : totalList[index].chipId = devAttr.ub.chipId;
134 0 : totalList[index].funcId = devAttr.ub.funcId;
135 :
136 0 : free_ctx:
137 0 : (void)RsUrmaDeleteContext(urmaCtx);
138 0 : return ret;
139 : }
140 :
141 0 : STATIC int RsUbFillInfoByEidList(urma_device_t *currDev, unsigned int *index, struct HccpDevEidInfo *totalList,
142 : unsigned int totalNum)
143 : {
144 0 : urma_eid_info_t *eidList = NULL;
145 0 : urma_device_attr_t attr = {0};
146 0 : unsigned int eidNum = 0;
147 : unsigned int j;
148 0 : int ret = 0;
149 :
150 0 : ret = RsUrmaQueryDevice(currDev, &attr);
151 0 : CHK_PRT_RETURN(ret != 0, hccp_err("RsUrmaQueryDevice failed, ret:%d, errno:%d", ret, errno), -EOPENSRC);
152 :
153 0 : eidList = RsUrmaGetEidList(currDev, &eidNum);
154 : // normal case, should continue to get eid_list from the rest of device
155 0 : if (eidList == NULL) {
156 0 : hccp_warn("rs_urma_get_eid_list unsuccessful, eidList is NULL, errno:%d", errno);
157 0 : return 0;
158 : }
159 :
160 0 : for (j = 0; j < eidNum; j++) {
161 0 : if (*index >= totalNum) {
162 0 : hccp_err("index out of range, index:%u, totalNum:%u", *index, totalNum);
163 0 : ret = -EINVAL;
164 0 : goto free_eid_list;
165 : }
166 0 : ret = RsUbFillDevEidInfoList(totalList, *index, currDev, &eidList[j]);
167 0 : if (ret != 0) {
168 0 : hccp_err("rs_ub_fill_dev_eid_info_list failed, index:%u, ret:%d", *index, ret);
169 0 : goto free_eid_list;
170 : }
171 0 : totalList[*index].devFeature = attr.dev_cap.feature.value;
172 0 : *index += 1;
173 : }
174 :
175 0 : free_eid_list:
176 0 : RsUrmaFreeEidList(eidList);
177 0 : return ret;
178 : }
179 :
180 0 : int RsUbGetDevEidInfoList(unsigned int phyId, struct HccpDevEidInfo infoList[], unsigned int startIndex,
181 : unsigned int count)
182 : {
183 0 : struct HccpDevEidInfo *totalList = NULL;
184 0 : urma_device_t **devList = NULL;
185 0 : unsigned int totalNum = 0;
186 0 : unsigned int index = 0;
187 : int devNum, ret, i;
188 :
189 0 : ret = RsUbApiInit();
190 0 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_ub_api_init failed, ret:%d", ret), ret);
191 :
192 0 : ret = RsUbGetDevEidInfoNum(phyId, &totalNum);
193 0 : if ((ret != 0) || (startIndex > UINT_MAX - count) || (startIndex + count > totalNum)) {
194 0 : hccp_err("rs_ub_get_dev_eid_info_num failed ret:%d data size exceeds the max offset range "
195 : "or start_index:%u + count:%u > total_num:%u",
196 : ret, startIndex, count, totalNum);
197 0 : ret = -EINVAL;
198 0 : goto ub_api_deinit;
199 : }
200 :
201 0 : totalList = calloc(totalNum, sizeof(struct HccpDevEidInfo));
202 0 : if (totalList == NULL) {
203 0 : hccp_err("calloc total_list failed, errno:%d", errno);
204 0 : ret = -ENOMEM;
205 0 : goto ub_api_deinit;
206 : }
207 :
208 0 : devList = RsUrmaGetDeviceList(&devNum);
209 0 : if (devList == NULL) {
210 0 : hccp_err("rs_urma_get_device_list failed, errno: %d", errno);
211 0 : ret = -EINVAL;
212 0 : goto free_total_list;
213 : }
214 :
215 0 : for (i = 0; i < devNum; i++) {
216 0 : ret = RsUbFillInfoByEidList(devList[i], &index, totalList, totalNum);
217 0 : if (ret != 0) {
218 0 : goto free_dev_list;
219 : }
220 : }
221 :
222 : // start_index + count <= total_num make sure count is valid
223 0 : (void)memcpy_s(infoList, sizeof(struct HccpDevEidInfo) * count, totalList + startIndex,
224 : sizeof(struct HccpDevEidInfo) * count);
225 :
226 0 : free_dev_list:
227 0 : RsUrmaFreeDeviceList(devList);
228 0 : free_total_list:
229 0 : free(totalList);
230 0 : totalList = NULL;
231 0 : ub_api_deinit:
232 0 : RsUbApiDeinit();
233 0 : return ret;
234 : }
235 :
236 2 : int RsUbGetDevCb(struct rs_cb *rscb, unsigned int devIndex, struct RsUbDevCb **devCb)
237 : {
238 2 : struct RsUbDevCb *devCbCurr = NULL;
239 2 : struct RsUbDevCb *devCbNext = NULL;
240 :
241 2 : RS_LIST_GET_HEAD_ENTRY(devCbCurr, devCbNext, &rscb->udevList, list, struct RsUbDevCb);
242 3 : for (; (&devCbCurr->list) != &rscb->udevList;
243 1 : devCbCurr = devCbNext, devCbNext = list_entry(devCbNext->list.next, struct RsUbDevCb, list)) {
244 2 : if (devCbCurr->index == devIndex) {
245 1 : *devCb = devCbCurr;
246 1 : return 0;
247 : }
248 : }
249 :
250 1 : *devCb = NULL;
251 1 : hccp_err("dev_cb for devIndex:0x%x do not available!", devIndex);
252 1 : return -ENODEV;
253 : }
254 :
255 0 : STATIC int RsUbGetDevAttr(struct RsUbDevCb *devCb, struct DevBaseAttr *devAttr, unsigned int *devIndex)
256 : {
257 0 : urma_device_attr_t attr = {0};
258 : int ret;
259 : int i;
260 :
261 0 : ret = RsUrmaQueryDevice(devCb->urmaDev, &attr);
262 0 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_query_device failed ret:%d", ret), -EOPENSRC);
263 :
264 0 : devAttr->sqMaxDepth = attr.dev_cap.max_jfs_depth;
265 0 : devAttr->rqMaxDepth = attr.dev_cap.max_jfr_depth;
266 0 : devAttr->sqMaxSge = attr.dev_cap.max_jfs_sge;
267 0 : devAttr->rqMaxSge = attr.dev_cap.max_jfr_sge;
268 0 : devAttr->ub.maxJfsInlineLen = attr.dev_cap.max_jfs_inline_len;
269 0 : devAttr->ub.maxJfsRsge = attr.dev_cap.max_jfs_rsge;
270 0 : devAttr->maxReadSize = attr.dev_cap.max_read_size;
271 0 : devAttr->maxWriteSize = attr.dev_cap.max_write_size;
272 0 : devAttr->maxMsgSize = attr.dev_cap.max_msg_size;
273 0 : devAttr->ub.rmTpCap.value = attr.dev_cap.rm_tp_cap.value;
274 0 : devAttr->ub.rcTpCap.value = attr.dev_cap.rc_tp_cap.value;
275 0 : devAttr->ub.umTpCap.value = attr.dev_cap.um_tp_cap.value;
276 0 : devAttr->ub.tpFeat.value = attr.dev_cap.tp_feature.value;
277 0 : for (i = 0; i < MAX_PRIORITY_CNT && i < URMA_MAX_PRIORITY_CNT; i++) {
278 0 : devAttr->ub.priorityInfo[i].SL = attr.dev_cap.priority_info[i].SL;
279 0 : devAttr->ub.priorityInfo[i].tpType.value = attr.dev_cap.priority_info[i].tp_type.value;
280 : }
281 0 : ret = RsUbGetUeInfo(devCb->urmaCtx, devAttr);
282 0 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_ub_get_ue_info failed ret:%d", ret), -EOPENSRC);
283 :
284 0 : (void)memcpy_s(&devCb->devAttr, sizeof(struct DevBaseAttr), devAttr, sizeof(struct DevBaseAttr));
285 0 : devCb->rscb->devCnt++;
286 0 : *devIndex = RsGenerateDevIndex(devCb->rscb->devCnt, devAttr->ub.dieId, devAttr->ub.funcId);
287 0 : devCb->index = *devIndex;
288 :
289 0 : hccp_info("max_jetty:%u, maxJfsInlineLen:%u, sqMaxDepth:%u, rqMaxDepth:%u, sqMaxSge:%u, rqMaxSge:%u "
290 : "maxReadSize:%u maxWriteSize:%u maxMsgSize:%llu",
291 : attr.dev_cap.max_jetty, devAttr->ub.maxJfsInlineLen, devAttr->sqMaxDepth, devAttr->rqMaxDepth,
292 : devAttr->sqMaxSge, devAttr->rqMaxSge, devAttr->maxReadSize, devAttr->maxWriteSize, devAttr->maxMsgSize);
293 0 : return 0;
294 : }
295 :
296 0 : STATIC int RsUbDevShareJfrInit(struct RsUbDevCb *devCb)
297 : {
298 0 : urma_jfc_cfg_t jfcCfg = {0};
299 0 : urma_jfr_cfg_t jfrCfg = {0};
300 0 : int randNum = 0;
301 : int ret;
302 :
303 0 : jfcCfg.depth = CQ_DEFAULT_MIN_RECV_DEPTH;
304 0 : devCb->shareJfc = RsUrmaCreateJfc(devCb->urmaCtx, &jfcCfg);
305 0 : CHK_PRT_RETURN(devCb->shareJfc == NULL, hccp_err("RsUrmaCreateJfc failed, errno:%d", errno), -ENOMEM);
306 :
307 0 : jfrCfg.depth = CQ_DEFAULT_MIN_RECV_DEPTH;
308 0 : jfrCfg.flag.bs.token_policy = URMA_TOKEN_PLAIN_TEXT;
309 0 : jfrCfg.trans_mode = URMA_TM_RM;
310 0 : jfrCfg.max_sge = QP_DEFAULT_MIN_CAP_RECV_SGE;
311 0 : jfrCfg.min_rnr_timer = URMA_TYPICAL_MIN_RNR_TIMER;
312 0 : jfrCfg.jfc = devCb->shareJfc;
313 0 : ret = RsDrvGetRandomNum(&randNum);
314 0 : if (ret != 0) {
315 0 : hccp_err("RsDrvGetRandomNum failed, ret:%d", ret);
316 0 : goto delete_jfc;
317 : }
318 0 : jfrCfg.token_value.token = (uint32_t)randNum;
319 0 : devCb->shareJfr = RsUrmaCreateJfr(devCb->urmaCtx, &jfrCfg);
320 0 : if (devCb->shareJfr == NULL) {
321 0 : hccp_err("RsUrmaCreateJfr failed, errno:%d", errno);
322 0 : ret = -ENOMEM;
323 0 : goto delete_jfc;
324 : }
325 :
326 0 : return 0;
327 :
328 0 : delete_jfc:
329 0 : RsUrmaDeleteJfc(devCb->shareJfc);
330 0 : devCb->shareJfc = NULL;
331 0 : return ret;
332 : }
333 :
334 0 : STATIC void RsUbDevShareJfrDeinit(struct RsUbDevCb *devCb)
335 : {
336 0 : (void)RsUrmaDeleteJfr(devCb->shareJfr);
337 0 : devCb->shareJfr = NULL;
338 0 : (void)RsUrmaDeleteJfc(devCb->shareJfc);
339 0 : devCb->shareJfc = NULL;
340 0 : }
341 :
342 0 : STATIC int RsUbDevCbInit(struct CtxInitAttr *attr, struct RsUbDevCb *devCb, struct rs_cb *rscb, unsigned int *devIndex,
343 : struct DevBaseAttr *devAttr)
344 : {
345 : int ret;
346 :
347 0 : devCb->rscb = rscb;
348 0 : devCb->phyId = attr->phyId;
349 0 : devCb->eidIndex = attr->ub.eidIndex;
350 0 : devCb->eid = attr->ub.eid;
351 :
352 0 : ret = pthread_mutex_init(&devCb->mutex, NULL);
353 0 : CHK_PRT_RETURN(ret != 0, hccp_err("mutex_init failed ret:%d", ret), -ESYSFUNC);
354 :
355 0 : RS_INIT_LIST_HEAD(&devCb->asyncEventList);
356 0 : RS_INIT_LIST_HEAD(&devCb->jfceList);
357 0 : RS_INIT_LIST_HEAD(&devCb->jfcList);
358 0 : RS_INIT_LIST_HEAD(&devCb->jettyList);
359 0 : RS_INIT_LIST_HEAD(&devCb->rjettyList);
360 0 : RS_INIT_LIST_HEAD(&devCb->tokenIdList);
361 0 : RS_INIT_LIST_HEAD(&devCb->lsegList);
362 0 : RS_INIT_LIST_HEAD(&devCb->rsegList);
363 :
364 0 : ret = RsUbCreateCtx(devCb->urmaDev, attr->ub.eidIndex, &(devCb->urmaCtx));
365 0 : if (ret != 0) {
366 0 : hccp_err("rs_ub_create_ctx failed, ret:%d", ret);
367 0 : goto destroy_mutex;
368 : }
369 :
370 0 : ret = RsUbDevShareJfrInit(devCb);
371 0 : if (ret != 0) {
372 0 : hccp_err("RsUbDevShareJfrInit failed, ret:%d", ret);
373 0 : goto close_dev;
374 : }
375 :
376 0 : ret = RsEpollCtl(devCb->rscb->connCb.epollfd, EPOLL_CTL_ADD, devCb->urmaCtx->async_fd, EPOLLIN | EPOLLRDHUP);
377 0 : if (ret != 0) {
378 0 : hccp_err("rs_epoll_ctl failed, ret:%d fd:%d", ret, devCb->urmaCtx->async_fd);
379 0 : goto free_share_jfr;
380 : }
381 :
382 0 : ret = RsUbGetDevAttr(devCb, devAttr, devIndex);
383 0 : if (ret != 0) {
384 0 : hccp_err("rs_ub_get_dev_attr failed, ret:%d", ret);
385 0 : goto epoll_del;
386 : }
387 :
388 0 : return 0;
389 :
390 0 : epoll_del:
391 0 : (void)RsEpollCtl(devCb->rscb->connCb.epollfd, EPOLL_CTL_DEL, devCb->urmaCtx->async_fd, EPOLLIN | EPOLLRDHUP);
392 0 : free_share_jfr:
393 0 : RsUbDevShareJfrDeinit(devCb);
394 0 : close_dev:
395 0 : (void)RsUrmaDeleteContext(devCb->urmaCtx);
396 0 : destroy_mutex:
397 0 : pthread_mutex_destroy(&devCb->mutex);
398 0 : return ret;
399 : }
400 :
401 1 : int RsUbCtxInit(struct rs_cb *rsCb, struct CtxInitAttr *attr, unsigned int *devIndex, struct DevBaseAttr *devAttr)
402 : {
403 1 : struct RsUbDevCb *devCb = NULL;
404 : urma_eid_t eid;
405 : int ret;
406 :
407 1 : ret = RsUbApiInit();
408 1 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_ub_api_init failed, ret:%d", ret), ret);
409 :
410 1 : devCb = calloc(1, sizeof(struct RsUbDevCb));
411 1 : if (devCb == NULL) {
412 0 : hccp_err("calloc for dev_cb failed, errno:%d", errno);
413 0 : ret = -ENOMEM;
414 0 : goto ub_api_deinit;
415 : }
416 :
417 1 : (void)memcpy_s(eid.raw, sizeof(eid.raw), attr->ub.eid.raw, sizeof(attr->ub.eid.raw));
418 :
419 1 : devCb->urmaDev = RsUrmaGetDeviceByEid(eid, URMA_TRANSPORT_UB);
420 1 : if (devCb->urmaDev == NULL) {
421 1 : hccp_err("rs_urma_get_device_by_eid failed, urmaDev is NULL, errno:%d eid:%016llx:%016llx", errno,
422 : (unsigned long long)be64toh(eid.in6.subnet_prefix), (unsigned long long)be64toh(eid.in6.interface_id));
423 1 : ret = -EINVAL;
424 1 : goto free_dev_cb;
425 : }
426 :
427 0 : ret = RsSensorNodeRegister(attr->phyId, rsCb);
428 0 : if (ret != 0) {
429 0 : hccp_err("rs_sensor_node_register failed, phyId(%u), ret(%d)", attr->phyId, ret);
430 0 : goto free_dev_cb;
431 : }
432 :
433 0 : ret = RsUbDevCbInit(attr, devCb, rsCb, devIndex, devAttr);
434 0 : if (ret != 0) {
435 0 : RsSensorNodeUnregister(devCb->rscb);
436 0 : hccp_err("rs_ub_dev_cb_init failed ret:%d, eidIndex:%u eid:%016llx:%016llx", ret, attr->ub.eidIndex,
437 : (unsigned long long)be64toh(eid.in6.subnet_prefix), (unsigned long long)be64toh(eid.in6.interface_id));
438 0 : goto free_dev_cb;
439 : }
440 :
441 0 : RS_PTHREAD_MUTEX_LOCK(&rsCb->mutex);
442 0 : RsListAddTail(&devCb->list, &rsCb->udevList);
443 0 : RS_PTHREAD_MUTEX_ULOCK(&rsCb->mutex);
444 :
445 0 : hccp_run_info("phy_id:%u, eidIndex:%u, devIndex:0x%x init success", attr->phyId, attr->ub.eidIndex, *devIndex);
446 :
447 0 : return 0;
448 :
449 1 : free_dev_cb:
450 1 : free(devCb);
451 1 : devCb = NULL;
452 1 : ub_api_deinit:
453 1 : RsUbApiDeinit();
454 1 : return ret;
455 : }
456 :
457 2 : int RsUbGetEidByIp(struct RsUbDevCb *devCb, struct IpInfo ip[], union HccpEid eid[], unsigned int *num)
458 : {
459 2 : urma_net_addr_t netAddr = {0};
460 2 : unsigned int ipNum = *num;
461 2 : urma_eid_t urmaEid = {0};
462 : unsigned int i;
463 2 : int ret = 0;
464 :
465 2 : *num = 0;
466 34 : for (i = 0; i < ipNum; i++) {
467 33 : netAddr.sin_family = (sa_family_t)ip[i].family;
468 33 : if (netAddr.sin_family == AF_INET) {
469 32 : netAddr.in4 = ip[i].ip.addr;
470 : } else {
471 1 : netAddr.in6 = ip[i].ip.addr6;
472 : }
473 33 : ret = RsUrmaGetEidByIp(devCb->urmaCtx, &netAddr, &urmaEid);
474 33 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_get_eid_by_ip failed, ret:%d devIndex:0x%x", ret, devCb->index),
475 : -EOPENSRC);
476 32 : (void)memcpy_s(eid[i].raw, sizeof(union HccpEid), urmaEid.raw, sizeof(urma_eid_t));
477 32 : (*num)++;
478 : }
479 :
480 1 : return ret;
481 : }
482 :
483 2 : int RsUbGetIpByEid(struct RsUbDevCb *devCb, union HccpEid eid[], struct IpInfo ip[], unsigned int *num)
484 : {
485 2 : urma_net_addr_t netAddr = {0};
486 2 : unsigned int eidNum = *num;
487 2 : urma_eid_t urmaEid = {0};
488 : unsigned int i;
489 2 : int ret = 0;
490 :
491 2 : *num = 0;
492 34 : for (i = 0; i < eidNum; i++) {
493 33 : (void)memcpy_s(urmaEid.raw, sizeof(urma_eid_t), eid[i].raw, sizeof(union HccpEid));
494 33 : ret = RsUrmaGetIpByEid(devCb->urmaCtx, &urmaEid, &netAddr);
495 33 : CHK_PRT_RETURN(ret != 0, hccp_err("RsUrmaGetIpByEid failed, ret:%d devIndex:0x%x", ret, devCb->index), ret);
496 32 : ip[i].family = (int)netAddr.sin_family;
497 32 : if (netAddr.sin_family == AF_INET) {
498 0 : ip[i].ip.addr = netAddr.in4;
499 : } else {
500 32 : ip[i].ip.addr6 = netAddr.in6;
501 : }
502 32 : (*num)++;
503 : }
504 :
505 1 : return ret;
506 : }
507 :
508 0 : STATIC int RsUbGetJfcCb(struct RsUbDevCb *devCb, unsigned long long addr, struct RsCtxJfcCb **jfcCb)
509 : {
510 0 : struct RsCtxJfcCb **tempJfcCb = jfcCb;
511 0 : struct RsCtxJfcCb *jfcCbCurr = NULL;
512 0 : struct RsCtxJfcCb *jfcCbNext = NULL;
513 :
514 0 : RS_LIST_GET_HEAD_ENTRY(jfcCbCurr, jfcCbNext, &devCb->jfcList, list, struct RsCtxJfcCb);
515 0 : for (; (&jfcCbCurr->list) != &devCb->jfcList;
516 0 : jfcCbCurr = jfcCbNext, jfcCbNext = list_entry(jfcCbNext->list.next, struct RsCtxJfcCb, list)) {
517 0 : if (jfcCbCurr->jfcAddr == addr) {
518 0 : *tempJfcCb = jfcCbCurr;
519 0 : return 0;
520 : }
521 : }
522 :
523 0 : *tempJfcCb = NULL;
524 0 : hccp_err("jfc_cb for jfc_addr:0x%llx do not available!", addr);
525 :
526 0 : return -ENODEV;
527 : }
528 :
529 0 : STATIC int RsUbFreeJfcCb(struct RsUbDevCb *devCb, struct RsCtxJfcCb *jfcCb)
530 : {
531 0 : urma_jfc_t *urmaJfc = NULL;
532 0 : int ret = 0;
533 :
534 0 : RsListDel(&jfcCb->list);
535 0 : devCb->jfcCnt--;
536 :
537 0 : if (jfcCb->jfcType == JFC_MODE_STARS_POLL || jfcCb->jfcType == JFC_MODE_CCU_POLL ||
538 0 : jfcCb->jfcType == JFC_MODE_USER_CTL_NORMAL) {
539 0 : (void)RsUbDeleteJfcExt(devCb, jfcCb);
540 0 : hccp_info("[deinit][rs_jfc]destroy success, dev jfcCnt:%u", devCb->jfcCnt);
541 0 : } else if (jfcCb->jfcType == JFC_MODE_NORMAL) {
542 0 : urmaJfc = (urma_jfc_t *)(uintptr_t)jfcCb->jfcAddr;
543 0 : (void)RsUrmaDeleteJfc(urmaJfc);
544 0 : hccp_info("[deinit][rs_jfc]destroy success, dev jfcCnt:%u", devCb->jfcCnt);
545 : } else {
546 0 : hccp_err("jfc_type:%d is invalid, not support!", jfcCb->jfcType);
547 0 : ret = -EINVAL;
548 : }
549 :
550 0 : free(jfcCb);
551 0 : jfcCb = NULL;
552 0 : return ret;
553 : }
554 :
555 1 : int RsUbCtxJfcDestroy(struct RsUbDevCb *devCb, unsigned long long addr)
556 : {
557 1 : struct RsCtxJfcCb *jfcCb = NULL;
558 : int ret;
559 :
560 1 : hccp_info("[deinit][rs_jfc]destroy addr:0x%llx", addr);
561 :
562 1 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
563 1 : ret = RsUbGetJfcCb(devCb, addr, &jfcCb);
564 1 : if (ret != 0) {
565 1 : hccp_err("get jfc_cb failed, ret:%d, jfc addr:0x%llx", ret, addr);
566 1 : goto out;
567 : }
568 :
569 0 : ret = RsUbFreeJfcCb(devCb, jfcCb);
570 1 : out:
571 1 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
572 1 : return ret;
573 : }
574 :
575 0 : STATIC void RsUbFreeJfcCbList(struct RsUbDevCb *devCb, struct RsListHead *jfcList)
576 : {
577 0 : struct RsCtxJfcCb *jfcCurr = NULL;
578 0 : struct RsCtxJfcCb *jfcNext = NULL;
579 : int ret;
580 :
581 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
582 0 : if (!RsListEmpty(jfcList)) {
583 0 : hccp_warn("jfc list do not empty!");
584 0 : RS_LIST_GET_HEAD_ENTRY(jfcCurr, jfcNext, jfcList, list, struct RsCtxJfcCb);
585 0 : for (; (&jfcCurr->list) != jfcList;
586 0 : jfcCurr = jfcNext, jfcNext = list_entry(jfcNext->list.next, struct RsCtxJfcCb, list)) {
587 0 : ret = RsUbFreeJfcCb(devCb, jfcCurr);
588 0 : if (ret != 0) {
589 0 : hccp_err("rs_ub_free_jfc_cb failed, ret:%d", ret);
590 : }
591 : }
592 : }
593 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
594 0 : }
595 :
596 0 : STATIC int RsUbFreeSegCb(struct RsUbDevCb *devCb, struct RsSegCb *segCb)
597 : {
598 : int ret;
599 :
600 0 : ret = RsUrmaUnregisterSeg(segCb->segment);
601 0 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_unregister_seg failed ret:%d", ret), -EOPENSRC);
602 :
603 0 : RsListDel(&segCb->list);
604 0 : devCb->lsegCnt--;
605 0 : free(segCb);
606 0 : segCb = NULL;
607 :
608 0 : return 0;
609 : }
610 :
611 0 : STATIC void RsUbFreeSegCbList(struct RsUbDevCb *devCb, struct RsListHead *lsegList, struct RsListHead *rsegList)
612 : {
613 0 : struct RsSegCb *segCurr = NULL;
614 0 : struct RsSegCb *segNext = NULL;
615 : int ret;
616 :
617 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
618 0 : if (!RsListEmpty(lsegList)) {
619 0 : hccp_warn("lseg list do not empty!");
620 0 : RS_LIST_GET_HEAD_ENTRY(segCurr, segNext, lsegList, list, struct RsSegCb);
621 0 : for (; (&segCurr->list) != lsegList;
622 0 : segCurr = segNext, segNext = list_entry(segNext->list.next, struct RsSegCb, list)) {
623 0 : ret = RsUbFreeSegCb(devCb, segCurr);
624 0 : if (ret != 0) {
625 0 : hccp_err("rs_ub_free_seg_cb failed, ret:%d", ret);
626 : }
627 : }
628 : }
629 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
630 :
631 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
632 0 : if (!RsListEmpty(rsegList)) {
633 0 : hccp_warn("rseg list do not empty!");
634 0 : RS_LIST_GET_HEAD_ENTRY(segCurr, segNext, rsegList, list, struct RsSegCb);
635 0 : for (; (&segCurr->list) != rsegList;
636 0 : segCurr = segNext, segNext = list_entry(segNext->list.next, struct RsSegCb, list)) {
637 0 : (void)RsUrmaUnimportSeg(segCurr->segment);
638 0 : RsListDel(&segCurr->list);
639 0 : free(segCurr);
640 0 : segCurr = NULL;
641 : }
642 : }
643 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
644 0 : }
645 :
646 0 : STATIC void RsUbCtxFreeJettyCb(struct RsCtxJettyCb *jettyCb)
647 : {
648 0 : struct RsCtxJettyCb *tmpJettyCb = jettyCb;
649 :
650 : #ifdef CUSTOM_INTERFACE
651 0 : if (jettyCb->qpShareInfoAddr != NULL) {
652 0 : (void)DlHalBuffFree((void *)(uintptr_t)jettyCb->qpShareInfoAddr);
653 0 : jettyCb->qpShareInfoAddr = NULL;
654 : }
655 : #endif
656 :
657 0 : pthread_mutex_destroy(&tmpJettyCb->crErrInfo.mutex);
658 0 : pthread_mutex_destroy(&tmpJettyCb->mutex);
659 0 : free(tmpJettyCb);
660 0 : tmpJettyCb = NULL;
661 0 : }
662 :
663 0 : STATIC void RsUbCtxDrvJettyDelete(struct RsCtxJettyCb *jettyCb)
664 : {
665 0 : if (jettyCb->jettyMode == JETTY_MODE_URMA_NORMAL) {
666 0 : (void)RsUrmaDeleteJetty(jettyCb->jetty);
667 : } else {
668 0 : RsUbCtxExtJettyDelete(jettyCb);
669 : }
670 :
671 : // ccu jetty unreg db addr
672 0 : if (jettyCb->jettyMode == JETTY_MODE_CCU || jettyCb->jettyMode == JETTY_MODE_CCU_TA_CACHE) {
673 0 : (void)RsUbCtxLmemUnreg(jettyCb->devCb, jettyCb->dbSegHandle);
674 : }
675 0 : }
676 :
677 0 : STATIC int RsUbFreeRemJettyCb(struct RsUbDevCb *devCb, struct RsCtxRemJettyCb *rjettyCb)
678 : {
679 0 : unsigned int remJettyId = rjettyCb->tjetty->id.id;
680 0 : unsigned int devIndex = devCb->index;
681 : int ret;
682 :
683 0 : RsListDel(&rjettyCb->list);
684 0 : devCb->rjettyCnt--;
685 :
686 0 : ret = RsUrmaUnimportJetty(rjettyCb->tjetty);
687 0 : CHK_PRT_RETURN(ret != 0,
688 : hccp_err("rs_urma_unimport_jetty failed, ret:%d, devIndex:0x%x, remJettyId %u", ret, devIndex, remJettyId),
689 : -EOPENSRC);
690 :
691 0 : free(rjettyCb);
692 0 : rjettyCb = NULL;
693 :
694 0 : return 0;
695 : }
696 :
697 0 : STATIC void RsUbUnbindJettyCbList(struct RsUbDevCb *devCb, struct RsListHead *jettyList)
698 : {
699 0 : struct RsCtxJettyCb *jettyCurr = NULL;
700 0 : struct RsCtxJettyCb *jettyNext = NULL;
701 : int ret;
702 :
703 0 : if (!RsListEmpty(jettyList)) {
704 0 : hccp_warn("jetty list do not empty! start to unbind");
705 0 : RS_LIST_GET_HEAD_ENTRY(jettyCurr, jettyNext, jettyList, list, struct RsCtxJettyCb);
706 0 : for (; (&jettyCurr->list) != jettyList;
707 0 : jettyCurr = jettyNext, jettyNext = list_entry(jettyNext->list.next, struct RsCtxJettyCb, list)) {
708 : // no need to unbind
709 0 : if (jettyCurr->state != RS_JETTY_STATE_BIND) {
710 0 : continue;
711 : }
712 0 : hccp_info("jetty_id[%u] will be unbind", jettyCurr->jetty->jetty_id.id);
713 0 : ret = RsUrmaUnbindJetty(jettyCurr->jetty);
714 0 : if (ret != 0) {
715 0 : hccp_err("rs_urma_unbind_jetty failed, ret:%d errno:%d devIndex:0x%x jetty_id:%u", ret, errno,
716 : devCb->index, jettyCurr->jetty->jetty_id.id);
717 : }
718 0 : jettyCurr->state = RS_JETTY_STATE_CREATED;
719 : }
720 : }
721 0 : }
722 :
723 0 : STATIC void RsUbUnimportJettyCbList(struct RsUbDevCb *devCb, struct RsListHead *rjettyList)
724 : {
725 0 : struct RsCtxRemJettyCb *remJettyCurr = NULL;
726 0 : struct RsCtxRemJettyCb *remJettyNext = NULL;
727 : int ret;
728 :
729 0 : if (!RsListEmpty(rjettyList)) {
730 0 : hccp_warn("rjetty list do not empty! start to unimport");
731 0 : RS_LIST_GET_HEAD_ENTRY(remJettyCurr, remJettyNext, rjettyList, list, struct RsCtxRemJettyCb);
732 0 : for (; (&remJettyCurr->list) != rjettyList;
733 0 : remJettyCurr = remJettyNext,
734 0 : remJettyNext = list_entry(remJettyNext->list.next, struct RsCtxRemJettyCb, list)) {
735 : // no need to unimport
736 0 : if (remJettyCurr->state != RS_JETTY_STATE_IMPORTED) {
737 0 : continue;
738 : }
739 0 : hccp_info("rjetty_id[%u] will be destroyed", remJettyCurr->tjetty->id.id);
740 0 : ret = RsUbFreeRemJettyCb(devCb, remJettyCurr);
741 0 : if (ret != 0) {
742 0 : hccp_err("rs_ub_ctx_jetty_unimport failed, ret:%d", ret);
743 : }
744 : }
745 : }
746 0 : }
747 :
748 7 : STATIC int RsUbCallocJettyBatchInfo(struct JettyDestroyBatchInfo *batchInfo, unsigned int num)
749 : {
750 7 : batchInfo->jettyCbArr = calloc(num, sizeof(struct RsCtxJettyCb *));
751 7 : CHK_PRT_RETURN(batchInfo->jettyCbArr == NULL, hccp_err("calloc jetty_cb_arr failed"), -ENOMEM);
752 7 : batchInfo->jettyArr = calloc(num, sizeof(urma_jetty_t *));
753 7 : CHK_PRT_RETURN(batchInfo->jettyArr == NULL, hccp_err("calloc jetty_arr failed"), -ENOMEM);
754 :
755 7 : return 0;
756 : }
757 :
758 8 : STATIC void RsUbFreeJettyBatchInfo(struct JettyDestroyBatchInfo *batchInfo)
759 : {
760 8 : if (batchInfo->jettyCbArr != NULL) {
761 7 : free(batchInfo->jettyCbArr);
762 7 : batchInfo->jettyCbArr = NULL;
763 : }
764 8 : if (batchInfo->jettyArr != NULL) {
765 7 : free(batchInfo->jettyArr);
766 7 : batchInfo->jettyArr = NULL;
767 : }
768 8 : }
769 :
770 0 : STATIC void RsUbFreeJettyCbBatch(struct JettyDestroyBatchInfo *batchInfo, unsigned int *num, urma_jetty_t *badJetty,
771 : urma_jfr_t *badJfr)
772 : {
773 : (void)badJfr;
774 0 : unsigned int jettyDestroyNum = *num;
775 : unsigned int i;
776 :
777 0 : for (i = 0; i < *num; ++i) {
778 : // ccu jetty unreg db addr
779 0 : if (batchInfo->jettyCbArr[i]->jettyMode == JETTY_MODE_CCU ||
780 0 : batchInfo->jettyCbArr[i]->jettyMode == JETTY_MODE_CCU_TA_CACHE) {
781 0 : (void)RsUbCtxLmemUnreg(batchInfo->jettyCbArr[i]->devCb, batchInfo->jettyCbArr[i]->dbSegHandle);
782 : }
783 0 : RsUbCtxFreeJettyCb(batchInfo->jettyCbArr[i]);
784 :
785 0 : if (batchInfo->jettyArr[i] == badJetty) {
786 0 : jettyDestroyNum = i;
787 : }
788 : }
789 0 : *num = jettyDestroyNum;
790 0 : }
791 :
792 2 : STATIC int RsUbDestroyJettyCbBatch(struct JettyDestroyBatchInfo *batchInfo, unsigned int *num)
793 : {
794 2 : urma_jetty_t *badJetty = NULL;
795 2 : urma_jfr_t *badJfr = NULL;
796 2 : int jettyDestroyRet = 0;
797 :
798 2 : RsUbVaMunmapBatch(batchInfo->jettyCbArr, *num);
799 2 : jettyDestroyRet = RsUrmaDeleteJettyBatch(batchInfo->jettyArr, (int)*num, &badJetty);
800 2 : if (jettyDestroyRet != 0) {
801 1 : hccp_err("rs_urma_delete_jetty_batch failed, jettyDestroyRet:%d, num:%u", jettyDestroyRet, *num);
802 : }
803 :
804 2 : RsUbFreeJettyIdBatch(batchInfo->jettyCbArr, *num);
805 2 : RsUbFreeJettyCbBatch(batchInfo, num, badJetty, badJfr);
806 2 : return jettyDestroyRet;
807 : }
808 :
809 0 : STATIC void RsUbDestroyJettyCbList(struct RsUbDevCb *devCb, struct RsListHead *jettyList)
810 : {
811 0 : struct JettyDestroyBatchInfo batchInfo = {0};
812 0 : struct RsCtxJettyCb *jettyCurr = NULL;
813 0 : struct RsCtxJettyCb *jettyNext = NULL;
814 0 : unsigned int num = 0, i = 0;
815 : int ret;
816 :
817 0 : if (RsListEmpty(jettyList)) {
818 0 : return;
819 : }
820 :
821 0 : hccp_warn("jetty list is not empty! start to delete");
822 0 : ret = RsUbCallocJettyBatchInfo(&batchInfo, devCb->jettyCnt);
823 0 : if (ret != 0) {
824 0 : hccp_err("rs_ub_calloc_jetty_batch_info failed, ret:%d", ret);
825 0 : goto free_batch_info;
826 : }
827 :
828 0 : RS_LIST_GET_HEAD_ENTRY(jettyCurr, jettyNext, jettyList, list, struct RsCtxJettyCb);
829 0 : for (; (&jettyCurr->list) != jettyList;
830 0 : jettyCurr = jettyNext, jettyNext = list_entry(jettyNext->list.next, struct RsCtxJettyCb, list)) {
831 : // no need to destroy
832 0 : if (jettyCurr->state != RS_JETTY_STATE_CREATED) {
833 0 : continue;
834 : }
835 0 : hccp_info("jetty_id[%u] will be destroyed", jettyCurr->jetty->jetty_id.id);
836 0 : batchInfo.jettyCbArr[i] = jettyCurr;
837 0 : batchInfo.jettyArr[i] = jettyCurr->jetty;
838 :
839 0 : RsListDel(&jettyCurr->list);
840 0 : devCb->jettyCnt--;
841 0 : i++;
842 : }
843 :
844 0 : num = i;
845 0 : if (num != 0) {
846 0 : ret = RsUbDestroyJettyCbBatch(&batchInfo, &num);
847 0 : if (ret != 0) {
848 0 : hccp_err("rs_ub_ctx_jetty_destroy_batch failed, ret:%d, need to be destroyed:%u, actually destroyed:%u",
849 : ret, i, num);
850 : }
851 : }
852 :
853 0 : free_batch_info:
854 0 : RsUbFreeJettyBatchInfo(&batchInfo);
855 : }
856 :
857 0 : void RsUbFreeJettyCbList(struct RsUbDevCb *devCb, struct RsListHead *jettyList, struct RsListHead *rjettyList)
858 : {
859 : // free jetty step: unbind -> unimport -> delete
860 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
861 0 : RsUbUnbindJettyCbList(devCb, jettyList);
862 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
863 :
864 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
865 0 : RsUbUnimportJettyCbList(devCb, rjettyList);
866 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
867 :
868 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
869 0 : RsUbDestroyJettyCbList(devCb, jettyList);
870 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
871 0 : }
872 :
873 2 : int RsUbCtxChanCreate(struct RsUbDevCb *devCb, union DataPlaneCstmFlag dataPlaneFlag, unsigned long long *addr, int *fd)
874 : {
875 2 : struct RsCtxJfceCb *jfceCb = NULL;
876 2 : urma_jfce_t *outJfce = NULL;
877 2 : int ret = 0;
878 :
879 2 : jfceCb = calloc(1, sizeof(struct RsCtxJfceCb));
880 2 : CHK_PRT_RETURN(jfceCb == NULL, hccp_err("calloc jfce_cb failed"), -ENOMEM);
881 :
882 2 : jfceCb->devCb = devCb;
883 2 : outJfce = RsUrmaCreateJfce(devCb->urmaCtx);
884 2 : if (outJfce == NULL) {
885 1 : hccp_err("rs_urma_create_jfce failed, errno:%d", errno);
886 1 : ret = -EOPENSRC;
887 1 : goto free_ctx_jfce_cb;
888 : }
889 :
890 1 : jfceCb->jfceAddr = (uint64_t)(uintptr_t)outJfce; // urma_jfce_t *
891 1 : *addr = jfceCb->jfceAddr;
892 :
893 1 : if (dataPlaneFlag.bs.pollCqCstm == 0) {
894 1 : ret = RsEpollCtl(devCb->rscb->connCb.epollfd, EPOLL_CTL_ADD, outJfce->fd, EPOLLIN | EPOLLRDHUP);
895 1 : if (ret != 0) {
896 1 : hccp_err("rs_epoll_ctl failed ret:%d, fd:%d", ret, devCb->rscb->connCb.epollfd);
897 1 : goto delete_jfce;
898 : }
899 : }
900 0 : jfceCb->dataPlaneFlag = dataPlaneFlag;
901 :
902 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
903 0 : RsListAddTail(&jfceCb->list, &devCb->jfceList);
904 0 : jfceCb->devCb->jfceCnt++;
905 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
906 :
907 0 : *fd = outJfce->fd;
908 0 : hccp_info("dev_index:0x%x jfce addr:0x%llx fd:%d", devCb->index, jfceCb->jfceAddr, outJfce->fd);
909 0 : return ret;
910 :
911 1 : delete_jfce:
912 1 : (void)RsUrmaDeleteJfce(outJfce);
913 2 : free_ctx_jfce_cb:
914 2 : free(jfceCb);
915 2 : jfceCb = NULL;
916 2 : return ret;
917 : }
918 :
919 0 : STATIC int RsUbGetJfceCb(struct RsUbDevCb *devCb, unsigned long long addr, struct RsCtxJfceCb **jfceCb)
920 : {
921 0 : struct RsCtxJfceCb **tempJfceCb = jfceCb;
922 0 : struct RsCtxJfceCb *jfceCbCurr = NULL;
923 0 : struct RsCtxJfceCb *jfceCbNext = NULL;
924 :
925 0 : RS_LIST_GET_HEAD_ENTRY(jfceCbCurr, jfceCbNext, &devCb->jfceList, list, struct RsCtxJfceCb);
926 0 : for (; (&jfceCbCurr->list) != (&devCb->jfceList);
927 0 : jfceCbCurr = jfceCbNext, jfceCbNext = list_entry(jfceCbNext->list.next, struct RsCtxJfceCb, list)) {
928 0 : if (jfceCbCurr->jfceAddr == addr) {
929 0 : *tempJfceCb = jfceCbCurr;
930 0 : return 0;
931 : }
932 : }
933 :
934 0 : *tempJfceCb = NULL;
935 0 : hccp_err("jfce_cb for jfce_addr:0x%llx do not available!", addr);
936 :
937 0 : return -ENODEV;
938 : }
939 :
940 0 : int RsUbCtxChanDestroy(struct RsUbDevCb *devCb, unsigned long long addr)
941 : {
942 0 : struct RsCtxJfceCb *jfceCb = NULL;
943 0 : urma_jfce_t *jfce = NULL;
944 : int ret;
945 :
946 0 : hccp_info("[rs_ctx_chan]jfce destroy addr:0x%llx", addr);
947 :
948 0 : ret = RsUbGetJfceCb(devCb, addr, &jfceCb);
949 0 : CHK_PRT_RETURN(ret != 0, hccp_err("get jfce_cb failed, ret:%d, jfce addr:0x%llx", ret, addr), ret);
950 :
951 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
952 0 : RsListDel(&jfceCb->list);
953 0 : jfceCb->devCb->jfceCnt--;
954 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
955 :
956 0 : jfce = (urma_jfce_t *)(uintptr_t)jfceCb->jfceAddr;
957 0 : if (jfceCb->dataPlaneFlag.bs.pollCqCstm == 0) {
958 0 : (void)RsEpollCtl(devCb->rscb->connCb.epollfd, EPOLL_CTL_DEL, jfce->fd, EPOLLIN | EPOLLRDHUP);
959 : }
960 :
961 0 : ret = RsUrmaDeleteJfce(jfce);
962 0 : CHK_PRT_RETURN(ret != 0,
963 : hccp_err("rs_urma_delete_jfce failed, ret:%d errno:%d jfce addr:0x%llx", ret, errno, jfceCb->jfceAddr),
964 : -EOPENSRC);
965 :
966 0 : free(jfceCb);
967 0 : jfceCb = NULL;
968 :
969 0 : hccp_info("rs ctx jfce destroy success, dev jfce num is %u", devCb->jfceCnt);
970 0 : return ret;
971 : }
972 :
973 0 : STATIC int RsUbFreeJfceCb(struct RsUbDevCb *devCb, struct RsCtxJfceCb *jfceCb)
974 : {
975 0 : int ret = 0;
976 :
977 0 : RsListDel(&jfceCb->list);
978 0 : devCb->jfceCnt--;
979 :
980 0 : ret = RsUrmaDeleteJfce((urma_jfce_t *)(uintptr_t)jfceCb->jfceAddr);
981 0 : CHK_PRT_RETURN(ret != 0,
982 : hccp_err("[rs_ctx_chan]rs_ub_delete_jfce failed, ret:%d, jfce addr:0x%llx", ret, jfceCb->jfceAddr), -EOPENSRC);
983 :
984 0 : free(jfceCb);
985 0 : jfceCb = NULL;
986 :
987 0 : return 0;
988 : }
989 :
990 0 : STATIC void RsUbFreeJfceCbList(struct RsUbDevCb *devCb, struct RsListHead *jfceList)
991 : {
992 0 : struct RsCtxJfceCb *jfceCurr = NULL;
993 0 : struct RsCtxJfceCb *jfceNext = NULL;
994 : int ret;
995 :
996 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
997 0 : if (!RsListEmpty(jfceList)) {
998 0 : hccp_warn("jfce list do not empty!");
999 0 : RS_LIST_GET_HEAD_ENTRY(jfceCurr, jfceNext, jfceList, list, struct RsCtxJfceCb);
1000 0 : for (; (&jfceCurr->list) != jfceList;
1001 0 : jfceCurr = jfceNext, jfceNext = list_entry(jfceNext->list.next, struct RsCtxJfceCb, list)) {
1002 0 : ret = RsUbFreeJfceCb(devCb, jfceCurr);
1003 0 : if (ret != 0) {
1004 0 : hccp_err("rs_ub_free_jfce_cb failed, ret:%d", ret);
1005 : }
1006 : }
1007 : }
1008 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1009 0 : }
1010 :
1011 0 : int RsUbCtxTokenIdAlloc(struct RsUbDevCb *devCb, unsigned long long *addr, unsigned int *tokenId)
1012 : {
1013 0 : struct RsTokenIdCb *tokenIdCb = NULL;
1014 :
1015 0 : tokenIdCb = calloc(1, sizeof(struct RsTokenIdCb));
1016 0 : CHK_PRT_RETURN(tokenIdCb == NULL, hccp_err("calloc token_id_cb failed"), -ENOMEM);
1017 :
1018 0 : tokenIdCb->devCb = devCb;
1019 0 : tokenIdCb->tokenId = RsUrmaAllocTokenId(devCb->urmaCtx);
1020 0 : if (tokenIdCb->tokenId == NULL) {
1021 0 : hccp_err("rs_urma_alloc_token_id failed, errno:%d, devIndex:0x%x", errno, devCb->index);
1022 0 : goto free_ctx_token_id_cb;
1023 : }
1024 :
1025 0 : *addr = (uint64_t)(uintptr_t)tokenIdCb->tokenId; // urma_token_id_t *
1026 0 : *tokenId = tokenIdCb->tokenId->token_id;
1027 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1028 0 : RsListAddTail(&tokenIdCb->list, &devCb->tokenIdList);
1029 0 : tokenIdCb->devCb->tokenIdCnt++;
1030 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1031 :
1032 0 : hccp_info("alloc success, tokenId addr:0x%llx, devIndex:0x%x", *addr, devCb->index);
1033 0 : return 0;
1034 :
1035 0 : free_ctx_token_id_cb:
1036 0 : free(tokenIdCb);
1037 0 : tokenIdCb = NULL;
1038 0 : return -EOPENSRC;
1039 : }
1040 :
1041 0 : STATIC int RsUbGetTokenIdCb(struct RsUbDevCb *devCb, unsigned long long addr, struct RsTokenIdCb **tokenIdCb)
1042 : {
1043 0 : struct RsTokenIdCb **tempTokenIdCb = tokenIdCb;
1044 0 : struct RsTokenIdCb *tokenIdCbCurr = NULL;
1045 0 : struct RsTokenIdCb *tokenIdCbNext = NULL;
1046 :
1047 0 : RS_LIST_GET_HEAD_ENTRY(tokenIdCbCurr, tokenIdCbNext, &devCb->tokenIdList, list, struct RsTokenIdCb);
1048 0 : for (; (&tokenIdCbCurr->list) != (&devCb->tokenIdList);
1049 0 : tokenIdCbCurr = tokenIdCbNext,
1050 0 : tokenIdCbNext = list_entry(tokenIdCbNext->list.next, struct RsTokenIdCb, list)) {
1051 0 : if ((uint64_t)(uintptr_t)tokenIdCbCurr->tokenId == addr) {
1052 0 : *tempTokenIdCb = tokenIdCbCurr;
1053 0 : return 0;
1054 : }
1055 : }
1056 :
1057 0 : *tempTokenIdCb = NULL;
1058 0 : hccp_err("token_id_cb for token_id addr:0x%llx do not available! devIndex:0x%x", addr, devCb->index);
1059 :
1060 0 : return -ENODEV;
1061 : }
1062 :
1063 0 : STATIC int RsUbFreeTokenIdCb(struct RsUbDevCb *devCb, struct RsTokenIdCb *tokenIdCb)
1064 : {
1065 0 : int ret = 0;
1066 :
1067 0 : RsListDel(&tokenIdCb->list);
1068 0 : devCb->tokenIdCnt--;
1069 :
1070 0 : ret = RsUrmaFreeTokenId(tokenIdCb->tokenId);
1071 0 : CHK_PRT_RETURN(ret != 0,
1072 : hccp_err("rs_urma_free_token_id failed, ret:%d, devIndex:0x%x, tokenId addr:0x%llx", ret, devCb->index,
1073 : (uint64_t)(uintptr_t)tokenIdCb->tokenId),
1074 : -EOPENSRC);
1075 :
1076 0 : free(tokenIdCb);
1077 0 : tokenIdCb = NULL;
1078 0 : return 0;
1079 : }
1080 :
1081 0 : int RsUbCtxTokenIdFree(struct RsUbDevCb *devCb, unsigned long long addr)
1082 : {
1083 0 : struct RsTokenIdCb *tokenIdCb = NULL;
1084 : int ret;
1085 :
1086 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1087 0 : ret = RsUbGetTokenIdCb(devCb, addr, &tokenIdCb);
1088 0 : if (ret != 0) {
1089 0 : hccp_err("get token_id_cb failed! ret %d, devIndex:0x%x, tokenId addr:0x%llx", ret, devCb->index, addr);
1090 0 : goto free_lock;
1091 : }
1092 0 : ret = RsUbFreeTokenIdCb(devCb, tokenIdCb);
1093 0 : if (ret != 0) {
1094 0 : hccp_err("free_token_id_cb failed, ret:%d, devIndex:0x%x, tokenId addr:0x%llx", ret, devCb->index, addr);
1095 0 : goto free_lock;
1096 : }
1097 0 : hccp_info("rs token id free success, dev tokenId num is %u, devIndex:0x%x, tokenId addr:0x%llx", devCb->tokenIdCnt,
1098 : devCb->index, addr);
1099 :
1100 0 : free_lock:
1101 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1102 0 : return ret;
1103 : }
1104 :
1105 0 : STATIC void RsUbFreeTokenIdCbList(struct RsUbDevCb *devCb, struct RsListHead *tokenIdList)
1106 : {
1107 0 : struct RsTokenIdCb *tokenIdCurr = NULL;
1108 0 : struct RsTokenIdCb *tokenIdNext = NULL;
1109 :
1110 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1111 0 : if (!RsListEmpty(tokenIdList)) {
1112 0 : hccp_warn("token_id list do not empty!");
1113 0 : RS_LIST_GET_HEAD_ENTRY(tokenIdCurr, tokenIdNext, tokenIdList, list, struct RsTokenIdCb);
1114 0 : for (; (&tokenIdCurr->list) != tokenIdList;
1115 0 : tokenIdCurr = tokenIdNext, tokenIdNext = list_entry(tokenIdNext->list.next, struct RsTokenIdCb, list)) {
1116 0 : (void)RsUbFreeTokenIdCb(devCb, tokenIdCurr);
1117 : }
1118 : }
1119 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1120 0 : return;
1121 : }
1122 :
1123 0 : void RsUbFreeAsyncEventCb(struct RsUbDevCb *devCb, struct RsCtxAsyncEventCb *asyncEventCb)
1124 : {
1125 0 : RsListDel(&asyncEventCb->list);
1126 0 : devCb->asyncEventCnt--;
1127 :
1128 0 : free(asyncEventCb);
1129 0 : asyncEventCb = NULL;
1130 0 : }
1131 :
1132 0 : STATIC void RsUbFreeAsyncEventCbList(struct RsUbDevCb *devCb, struct RsListHead *asyncEventList)
1133 : {
1134 0 : struct RsCtxAsyncEventCb *asyncEventCurr = NULL;
1135 0 : struct RsCtxAsyncEventCb *asyncEventNext = NULL;
1136 :
1137 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1138 0 : (void)RsEpollCtl(devCb->rscb->connCb.epollfd, EPOLL_CTL_DEL, devCb->urmaCtx->async_fd, EPOLLIN | EPOLLRDHUP);
1139 0 : if (!RsListEmpty(asyncEventList)) {
1140 0 : hccp_run_warn("async_event list do not empty!");
1141 0 : RS_LIST_GET_HEAD_ENTRY(asyncEventCurr, asyncEventNext, asyncEventList, list, struct RsCtxAsyncEventCb);
1142 0 : for (; (&asyncEventCurr->list) != asyncEventList;
1143 0 : asyncEventCurr = asyncEventNext,
1144 0 : asyncEventNext = list_entry(asyncEventNext->list.next, struct RsCtxAsyncEventCb, list)) {
1145 0 : RsUbFreeAsyncEventCb(devCb, asyncEventCurr);
1146 : }
1147 : }
1148 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1149 0 : }
1150 :
1151 0 : int RsUbCtxDeinit(struct RsUbDevCb *devCb)
1152 : {
1153 : int ret;
1154 :
1155 0 : hccp_info("[deinit][rs_ctx]start deinit, phyId:%u, devIndex:0x%x", devCb->phyId, devCb->index);
1156 :
1157 0 : RsUbFreeSegCbList(devCb, &devCb->lsegList, &devCb->rsegList);
1158 0 : RsUbFreeJettyCbList(devCb, &devCb->jettyList, &devCb->rjettyList);
1159 :
1160 : /* Destroy shared JFR and JFC after all jettys are freed */
1161 0 : RsUbDevShareJfrDeinit(devCb);
1162 :
1163 0 : RsUbFreeJfcCbList(devCb, &devCb->jfcList);
1164 0 : RsUbFreeJfceCbList(devCb, &devCb->jfceList);
1165 0 : RsUbFreeTokenIdCbList(devCb, &devCb->tokenIdList);
1166 0 : RsUbFreeAsyncEventCbList(devCb, &devCb->asyncEventList);
1167 :
1168 0 : ret = RsUrmaDeleteContext(devCb->urmaCtx);
1169 0 : if (ret != 0) {
1170 0 : hccp_err("rs_urma_delete_context failed, ret:%d", ret);
1171 : }
1172 :
1173 0 : pthread_mutex_destroy(&devCb->mutex);
1174 :
1175 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->rscb->mutex);
1176 0 : RsListDel(&devCb->list);
1177 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->rscb->mutex);
1178 0 : RsSensorNodeUnregister(devCb->rscb);
1179 :
1180 0 : RsUbApiDeinit();
1181 :
1182 0 : hccp_run_info("phyId:%u, devIndex:0x%x deinit success", devCb->phyId, devCb->index);
1183 0 : free(devCb);
1184 0 : devCb = NULL;
1185 0 : return ret;
1186 : }
1187 :
1188 0 : STATIC int RsUbQuerySegCb(struct RsUbDevCb *devCb, uint64_t addr, struct RsSegCb **segCb, struct RsListHead *segList)
1189 : {
1190 0 : struct RsSegCb *segCurr = NULL;
1191 0 : struct RsSegCb *segNext = NULL;
1192 :
1193 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1194 0 : RS_LIST_GET_HEAD_ENTRY(segCurr, segNext, segList, list, struct RsSegCb);
1195 0 : for (; (&segCurr->list) != segList;
1196 0 : segCurr = segNext, segNext = list_entry(segNext->list.next, struct RsSegCb, list)) {
1197 0 : if ((segCurr->segInfo.addr <= addr) && (addr < segCurr->segInfo.addr + segCurr->segInfo.len)) {
1198 0 : *segCb = segCurr;
1199 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1200 0 : return 0;
1201 : }
1202 : }
1203 :
1204 0 : *segCb = NULL;
1205 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1206 :
1207 0 : hccp_info("cannot find seg_cb for addr@0x%lx", addr);
1208 0 : return -ENODEV;
1209 : }
1210 :
1211 1 : STATIC int RsUbInitSegCb(struct MemRegAttrT *memAttr, struct RsUbDevCb *devCb, struct RsSegCb *segCb)
1212 : {
1213 1 : struct RsTokenIdCb *tokenIdCb = NULL;
1214 1 : urma_seg_cfg_t segCfg = {0};
1215 1 : int ret = 0;
1216 :
1217 1 : segCfg.flag.value = memAttr->ub.flags.value;
1218 1 : segCfg.va = memAttr->mem.addr;
1219 1 : segCfg.len = memAttr->mem.size;
1220 1 : segCfg.token_value = segCb->tokenValue;
1221 1 : segCfg.user_ctx = (uintptr_t)NULL;
1222 1 : segCfg.iova = 0;
1223 :
1224 1 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1225 :
1226 : // token id in cfg is valid, get token id by mem_attr->ub.token_id_addr
1227 1 : if (segCfg.flag.bs.token_id_valid == URMA_TOKEN_ID_VALID) {
1228 0 : ret = RsUbGetTokenIdCb(devCb, memAttr->ub.tokenIdAddr, &tokenIdCb);
1229 0 : if (ret != 0) {
1230 0 : hccp_err("get token_id_cb failed! ret %d, devIndex:0x%x, tokenId addr:0x%llx", ret, devCb->index,
1231 : memAttr->ub.tokenIdAddr);
1232 0 : goto free_lock;
1233 : }
1234 0 : segCfg.token_id = tokenIdCb->tokenId;
1235 : }
1236 :
1237 1 : segCb->segment = RsUrmaRegisterSeg(devCb->urmaCtx, &segCfg);
1238 1 : if (segCb->segment == NULL) {
1239 1 : hccp_err("[init][rs_ctx_lmem]rs_urma_register_seg len[0x%llx] failed, errno:%d", segCfg.len, errno);
1240 1 : ret = -EOPENSRC;
1241 1 : goto free_lock;
1242 : }
1243 :
1244 0 : segCb->segInfo.seg = segCb->segment->seg;
1245 : // resv len as 1 to save addr for later unreg to query
1246 0 : segCb->segInfo.addr = (uint64_t)(uintptr_t)segCb->segment;
1247 0 : segCb->segInfo.len = 1;
1248 0 : RsListAddTail(&segCb->list, &devCb->lsegList);
1249 0 : devCb->lsegCnt++;
1250 :
1251 1 : free_lock:
1252 1 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1253 1 : return ret;
1254 : }
1255 :
1256 0 : STATIC void RsUbDeinitSegCb(struct RsUbDevCb *devCb, struct RsSegCb *segCb)
1257 : {
1258 0 : (void)RsUrmaUnregisterSeg(segCb->segment);
1259 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1260 0 : RsListDel(&segCb->list);
1261 0 : devCb->lsegCnt--;
1262 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1263 0 : }
1264 :
1265 1 : int RsUbCtxLmemReg(struct RsUbDevCb *devCb, struct MemRegAttrT *memAttr, struct MemRegInfoT *memInfo)
1266 : {
1267 1 : struct RsSegCb *lsegCb = NULL;
1268 : int ret;
1269 :
1270 1 : CHK_PRT_RETURN(memAttr->mem.size == 0, hccp_err("mem_attr->mem.size is 0"), -EINVAL);
1271 :
1272 1 : lsegCb = calloc(1, sizeof(struct RsSegCb));
1273 1 : CHK_PRT_RETURN(lsegCb == NULL, hccp_err("calloc lseg_cb failed"), -ENOMEM);
1274 1 : lsegCb->devCb = devCb;
1275 1 : lsegCb->tokenValue.token = memAttr->ub.tokenValue;
1276 :
1277 1 : ret = RsUbInitSegCb(memAttr, devCb, lsegCb);
1278 1 : if (ret != 0) {
1279 1 : hccp_err("RsUbInitSegCb failed, ret:%d devIndex:0x%x addr:0x%llx, len[0x%llx], flag[0x%x]", ret, devCb->index,
1280 : memAttr->mem.addr, memAttr->mem.size, memAttr->ub.flags.value);
1281 1 : goto init_err;
1282 : }
1283 :
1284 0 : ret = memcpy_s(memInfo->key.value, sizeof(memInfo->key.value), &lsegCb->segInfo.seg, sizeof(urma_seg_t));
1285 0 : if (ret != 0) {
1286 0 : hccp_err("memcpy_s seg failed ret:%d sizeof(memInfo->key.value):%zu sizeof(urma_seg_t):%zu", ret,
1287 : sizeof(memInfo->key.value), sizeof(urma_seg_t));
1288 0 : ret = -ESAFEFUNC;
1289 0 : goto reg_err;
1290 : }
1291 0 : memInfo->key.size = sizeof(urma_seg_t);
1292 0 : memInfo->ub.tokenId = lsegCb->segment->token_id->token_id;
1293 0 : memInfo->ub.targetSegHandle = (uintptr_t)lsegCb->segment;
1294 :
1295 0 : hccp_run_info("devIndex:0x%x addr:0x%llx, len[0x%llx], flag[0x%x] segment:0x%llx register success", devCb->index,
1296 : memAttr->mem.addr, memAttr->mem.size, memAttr->ub.flags.value, memInfo->ub.targetSegHandle);
1297 0 : return 0;
1298 :
1299 0 : reg_err:
1300 0 : RsUbDeinitSegCb(devCb, lsegCb);
1301 1 : init_err:
1302 1 : free(lsegCb);
1303 1 : lsegCb = NULL;
1304 1 : return ret;
1305 : }
1306 :
1307 0 : int RsUbCtxLmemUnreg(struct RsUbDevCb *devCb, unsigned long long addr)
1308 : {
1309 0 : struct RsSegCb *lsegCb = NULL;
1310 : int ret;
1311 :
1312 0 : ret = RsUbQuerySegCb(devCb, addr, &lsegCb, &devCb->lsegList);
1313 0 : CHK_PRT_RETURN(ret != 0,
1314 : hccp_err("RsUbQuerySegCb failed ret:%d devIndex:0x%x segment:0x%llx", ret, devCb->index, addr), ret);
1315 :
1316 0 : ret = RsUrmaUnregisterSeg(lsegCb->segment);
1317 0 : CHK_PRT_RETURN(ret != 0,
1318 : hccp_err("urma_unregister_seg failed ret:%d devIndex:0x%x segment:0x%llx", ret, devCb->index, addr), ret);
1319 :
1320 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1321 0 : RsListDel(&lsegCb->list);
1322 0 : devCb->lsegCnt--;
1323 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1324 0 : hccp_run_info("devIndex:0x%x segment:0x%llx unregister success", devCb->index, addr);
1325 0 : free(lsegCb);
1326 0 : lsegCb = NULL;
1327 0 : return 0;
1328 : }
1329 :
1330 1 : int RsUbCtxRmemImport(struct RsUbDevCb *devCb, struct MemImportAttrT *memAttr, struct MemImportInfoT *memInfo)
1331 : {
1332 1 : struct RsSegCb *remSegCb = NULL;
1333 1 : urma_import_seg_flag_t flag = {0};
1334 1 : urma_token_t tokenValue = {0};
1335 1 : uint64_t mappingAddr = 0;
1336 : int ret;
1337 :
1338 1 : remSegCb = calloc(1, sizeof(struct RsSegCb));
1339 1 : CHK_PRT_RETURN(remSegCb == NULL, hccp_err("[init][rs_ctx_rmem]calloc rem_seg_cb failed"), -ENOMEM);
1340 :
1341 1 : ret = memcpy_s(&remSegCb->segInfo.seg, sizeof(urma_seg_t), &memAttr->key.value, memAttr->key.size);
1342 1 : if (ret != 0) {
1343 0 : hccp_err("[init][rs_ctx_rmem]memcpy_s failed, ret:%d", ret);
1344 0 : ret = -ESAFEFUNC;
1345 0 : goto free_rem_seg_cb;
1346 : }
1347 :
1348 1 : tokenValue.token = memAttr->ub.tokenValue;
1349 1 : flag.value = memAttr->ub.flags.value;
1350 : // mapping_addr is needed if flag mapping set value
1351 1 : if (memAttr->ub.flags.bs.mapping == 1) {
1352 0 : mappingAddr = memAttr->ub.mappingAddr;
1353 : }
1354 1 : remSegCb->segment = RsUrmaImportSeg(devCb->urmaCtx, &remSegCb->segInfo.seg, &tokenValue, mappingAddr, flag);
1355 1 : if (remSegCb->segment == NULL) {
1356 1 : hccp_err("[init][rs_ctx_rmem]rs_urma_import_seg failed, errno:%d", errno);
1357 1 : ret = -EOPENSRC;
1358 1 : goto free_rem_seg_cb;
1359 : }
1360 :
1361 0 : memInfo->ub.targetSegHandle = (uintptr_t)remSegCb->segment;
1362 : // resv len as 1 to save addr for later unimport to query
1363 0 : remSegCb->segInfo.addr = memInfo->ub.targetSegHandle;
1364 0 : remSegCb->segInfo.len = 1;
1365 :
1366 0 : hccp_run_info("devIndex:0x%x segment:0x%llx import success", devCb->index, remSegCb->segInfo.addr);
1367 :
1368 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1369 0 : RsListAddTail(&remSegCb->list, &devCb->rsegList);
1370 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1371 :
1372 0 : return 0;
1373 :
1374 1 : free_rem_seg_cb:
1375 1 : free(remSegCb);
1376 1 : remSegCb = NULL;
1377 1 : return ret;
1378 : }
1379 :
1380 0 : int RsUbCtxRmemUnimport(struct RsUbDevCb *devCb, unsigned long long addr)
1381 : {
1382 0 : struct RsSegCb *remSegCb = NULL;
1383 : int ret;
1384 :
1385 0 : ret = RsUbQuerySegCb(devCb, addr, &remSegCb, &devCb->rsegList);
1386 0 : CHK_PRT_RETURN(ret != 0, hccp_warn("[deinit][rs_ctx_rmem]can not find rem seg cb for addr:0x%llx", addr), 0);
1387 :
1388 0 : RsUrmaUnimportSeg(remSegCb->segment);
1389 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1390 0 : RsListDel(&remSegCb->list);
1391 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1392 :
1393 0 : hccp_run_info("devIndex:0x%x segment:0x%llx unimport success", devCb->index, addr);
1394 :
1395 0 : free(remSegCb);
1396 0 : remSegCb = NULL;
1397 0 : return 0;
1398 : }
1399 :
1400 0 : STATIC int RsUbCtxJfcCreateNormal(struct RsUbDevCb *devCb, urma_jfc_cfg_t *jfcCfg, urma_jfc_t **outJfc)
1401 : {
1402 0 : uint64_t jfceAddr = (uint64_t)(uintptr_t)jfcCfg->jfce;
1403 0 : struct RsCtxJfceCb *jfceCb = NULL;
1404 0 : int ret = 0;
1405 :
1406 0 : if (jfcCfg->jfce != NULL) {
1407 0 : ret = RsUbGetJfceCb(devCb, jfceAddr, &jfceCb);
1408 0 : CHK_PRT_RETURN(ret != 0, hccp_err("get jfce_cb failed, ret:%d, jfce addr:0x%llx", ret, jfceAddr), ret);
1409 : }
1410 :
1411 0 : *outJfc = RsUrmaCreateJfc(devCb->urmaCtx, jfcCfg);
1412 0 : CHK_PRT_RETURN(*outJfc == NULL, hccp_err("rs_urma_create_jfc failed, errno:%d", errno), -EOPENSRC);
1413 :
1414 0 : ret = RsUrmaRearmJfc(*outJfc, false);
1415 0 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_rearm_jfc failed, ret:%d errno:%d", ret, errno), -EOPENSRC);
1416 :
1417 0 : return ret;
1418 : }
1419 :
1420 0 : STATIC void RsUbFillJfcInfo(struct RsCtxJfcCb *jfcCb, struct CtxCqInfo *info)
1421 : {
1422 0 : info->addr = jfcCb->jfcAddr;
1423 0 : info->ub.id = jfcCb->jfcId;
1424 0 : info->ub.cqeSize = WQE_BB_SIZE;
1425 0 : info->ub.bufAddr = jfcCb->bufAddr;
1426 0 : info->ub.swdbAddr = jfcCb->swdbAddr;
1427 0 : }
1428 :
1429 1 : int RsUbCtxJfcCreate(struct RsUbDevCb *devCb, struct CtxCqAttr *attr, struct CtxCqInfo *info)
1430 : {
1431 1 : struct RsCtxJfcCb *jfcCb = NULL;
1432 1 : urma_jfc_cfg_t jfcCfg = {0};
1433 1 : urma_jfc_t *outJfc = NULL;
1434 1 : int ret = 0;
1435 :
1436 1 : jfcCb = (struct RsCtxJfcCb *)calloc(1, sizeof(struct RsCtxJfcCb));
1437 1 : CHK_PRT_RETURN(jfcCb == NULL, hccp_err("calloc jfc_cb failed"), -ENOMEM);
1438 :
1439 1 : jfcCb->devCb = devCb;
1440 1 : jfcCb->jfcType = attr->ub.mode;
1441 1 : jfcCb->depth = attr->depth;
1442 1 : jfcCb->ccuExCfg.valid = attr->ub.ccuExCfg.valid;
1443 1 : jfcCb->ccuExCfg.cqeFlag = attr->ub.ccuExCfg.cqeFlag;
1444 1 : jfcCfg.depth = attr->depth;
1445 1 : jfcCfg.flag.value = attr->ub.flag.value;
1446 1 : jfcCfg.user_ctx = attr->ub.userCtx;
1447 1 : jfcCfg.ceqn = attr->ub.ceqn;
1448 1 : jfcCfg.jfce = attr->chanAddr == 0 ? NULL : (urma_jfce_t *)(uintptr_t)attr->chanAddr;
1449 1 : if (attr->ub.mode == JFC_MODE_STARS_POLL || attr->ub.mode == JFC_MODE_CCU_POLL ||
1450 0 : attr->ub.mode == JFC_MODE_USER_CTL_NORMAL) {
1451 1 : ret = RsUbCtxJfcCreateExt(jfcCb, &jfcCfg, &outJfc);
1452 1 : if (ret != 0) {
1453 1 : hccp_err("rs_ub_ctx_jfc_create_ext jfc_mode:%d failed, ret:%d", attr->ub.mode, ret);
1454 1 : goto jfc_cb_init_err;
1455 : }
1456 0 : } else if (attr->ub.mode == JFC_MODE_NORMAL) {
1457 0 : jfcCfg.jfce = (attr->chanAddr == 0) ? NULL : (urma_jfce_t *)(uintptr_t)attr->chanAddr;
1458 0 : ret = RsUbCtxJfcCreateNormal(devCb, &jfcCfg, &outJfc);
1459 0 : if (ret != 0) {
1460 0 : hccp_err("rs_ub_ctx_jfc_create_normal failed, jfcMode:%d ret:%d", attr->ub.mode, ret);
1461 0 : goto jfc_cb_init_err;
1462 : }
1463 : } else {
1464 0 : hccp_err("jfc_type %d is invalid, not support!", attr->ub.mode);
1465 0 : ret = -EINVAL;
1466 0 : goto jfc_cb_init_err;
1467 : }
1468 0 : jfcCb->jfcAddr = (uint64_t)(uintptr_t)outJfc; // urma_jfc_t *
1469 0 : RsUbFillJfcInfo(jfcCb, info);
1470 :
1471 0 : hccp_info("jfc addr:0x%llx mode:%d", jfcCb->jfcAddr, jfcCb->jfcType);
1472 :
1473 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1474 0 : jfcCb->devCb->jfcCnt++;
1475 0 : RsListAddTail(&jfcCb->list, &devCb->jfcList);
1476 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1477 :
1478 0 : return 0;
1479 :
1480 1 : jfc_cb_init_err:
1481 1 : free(jfcCb);
1482 1 : jfcCb = NULL;
1483 :
1484 1 : return ret;
1485 : }
1486 :
1487 0 : STATIC bool RsUbIsJettyModeValid(int jettyMode, bool lockFlag)
1488 : {
1489 0 : if (jettyMode < 0 || jettyMode >= JETTY_MODE_MAX || (jettyMode == JETTY_MODE_CCU_TA_CACHE && !lockFlag)) {
1490 0 : return false;
1491 : }
1492 :
1493 0 : return true;
1494 : }
1495 :
1496 0 : STATIC int RsUbJettyCbInit(struct RsUbDevCb *devCb, struct CtxQpAttr *jettyAttr, struct RsCtxJettyCb *jettyCb)
1497 : {
1498 0 : bool lockFlag = jettyAttr->ub.taCacheMode.lockFlag;
1499 0 : int jettyMode = jettyAttr->ub.mode;
1500 :
1501 0 : if (!RsUbIsJettyModeValid(jettyMode, lockFlag)) {
1502 0 : hccp_err("unsupported jetty_mode:%d, lockFlag:%d", jettyMode, lockFlag);
1503 0 : return -EINVAL;
1504 : }
1505 :
1506 0 : jettyCb->txDepth = jettyAttr->sqDepth;
1507 0 : jettyCb->rxDepth = jettyAttr->rqDepth;
1508 0 : jettyCb->devCb = devCb;
1509 0 : jettyCb->jettyMode = jettyMode;
1510 0 : jettyCb->jettyId = jettyAttr->ub.jettyId;
1511 0 : jettyCb->transportMode = jettyAttr->transportMode;
1512 0 : jettyCb->state = RS_QP_STATUS_DISCONNECT;
1513 0 : jettyCb->flag.value = jettyAttr->ub.flag.value;
1514 0 : jettyCb->jfsFlag.value = jettyAttr->ub.jfsFlag.value;
1515 0 : jettyCb->tokenIdAddr = jettyAttr->ub.tokenIdAddr;
1516 0 : jettyCb->tokenValue = jettyAttr->ub.tokenValue;
1517 0 : jettyCb->priority = jettyAttr->ub.priority;
1518 0 : jettyCb->rnrRetry = jettyAttr->ub.rnrRetry;
1519 0 : jettyCb->errTimeout = jettyAttr->ub.errTimeout;
1520 :
1521 0 : if (jettyCb->jettyMode == JETTY_MODE_CCU_TA_CACHE) {
1522 0 : jettyCb->taCacheMode.lockFlag = jettyAttr->ub.taCacheMode.lockFlag;
1523 0 : jettyCb->taCacheMode.sqeBufIdx = jettyAttr->ub.taCacheMode.sqeBufIdx;
1524 : } else {
1525 0 : jettyCb->extMode.sq = jettyAttr->ub.extMode.sq;
1526 0 : jettyCb->extMode.piType = jettyAttr->ub.extMode.piType;
1527 0 : jettyCb->extMode.cstmFlag = jettyAttr->ub.extMode.cstmFlag;
1528 0 : jettyCb->extMode.sqebbNum = jettyAttr->ub.extMode.sqebbNum;
1529 : }
1530 0 : return 0;
1531 : }
1532 :
1533 : #ifdef CUSTOM_INTERFACE
1534 0 : STATIC int RsUbJettyCbBuffAlloc(struct RsUbDevCb *devCb, struct RsCtxJettyCb *jettyCb, enum JfcMode jfcType)
1535 : {
1536 0 : unsigned int logicDevid = 0;
1537 0 : unsigned long flag = 0;
1538 0 : int ret = 0;
1539 :
1540 0 : if (jfcType != JFC_MODE_NORMAL) {
1541 0 : jettyCb->qpShareInfoAddr = NULL;
1542 0 : return 0;
1543 : }
1544 :
1545 0 : ret = rsGetLocalDevIDByHostDevID(devCb->phyId, &logicDevid);
1546 0 : CHK_PRT_RETURN(ret != 0, hccp_err("rsGetLocalDevIDByHostDevID failed, phyId(%u), ret(%d)", devCb->phyId, ret), ret);
1547 :
1548 0 : flag = ((unsigned long)logicDevid << BUFF_FLAGS_DEVID_OFFSET) | BUFF_SP_SVM;
1549 0 : ret = DlHalBuffAllocAlignEx(sizeof(struct CtxQpShareInfo), CI_ADDR_BUFFER_ALIGN_4K_PAGE_SIZE, flag,
1550 0 : (int)devCb->rscb->grpId, (void **)&jettyCb->qpShareInfoAddr);
1551 0 : if (ret != 0) {
1552 0 : hccp_err("dl_hal_buff_alloc_align_ex failed, length:0x%llx, dev_id:0x%x, flag:0x%lx, grp_id:%u, ret:%d",
1553 : sizeof(struct CtxQpShareInfo), logicDevid, flag, devCb->rscb->grpId, ret);
1554 : }
1555 :
1556 0 : return ret;
1557 : }
1558 : #endif
1559 :
1560 1 : STATIC int RsUbCtxInitJettyCb(struct RsUbDevCb *devCb, struct CtxQpAttr *attr, struct RsCtxJettyCb **jettyCb)
1561 : {
1562 1 : struct RsCtxJettyCb *tmpJettyCb = NULL;
1563 : int ret;
1564 :
1565 1 : tmpJettyCb = calloc(1, sizeof(struct RsCtxJettyCb));
1566 1 : CHK_PRT_RETURN(tmpJettyCb == NULL, hccp_err("calloc tmp_jetty_cb failed, errno:%d", errno), -ENOMEM);
1567 :
1568 1 : ret = pthread_mutex_init(&tmpJettyCb->mutex, NULL);
1569 1 : if (ret != 0) {
1570 1 : hccp_err("pthread_mutex_init failed, ret:%d", ret);
1571 1 : goto pthread_mutex_init_err;
1572 : }
1573 :
1574 0 : ret = pthread_mutex_init(&tmpJettyCb->crErrInfo.mutex, NULL);
1575 0 : if (ret != 0) {
1576 0 : hccp_err("pthread_mutex_init failed, ret:%d", ret);
1577 0 : goto cr_err_mutex_init_err;
1578 : }
1579 :
1580 0 : ret = RsUbJettyCbInit(devCb, attr, tmpJettyCb);
1581 0 : if (ret != 0) {
1582 0 : hccp_err("jetty_cb init failed ret:%d", ret);
1583 0 : goto jetty_cb_init_err;
1584 : }
1585 :
1586 0 : *jettyCb = tmpJettyCb;
1587 0 : return 0;
1588 :
1589 0 : jetty_cb_init_err:
1590 0 : pthread_mutex_destroy(&tmpJettyCb->crErrInfo.mutex);
1591 0 : cr_err_mutex_init_err:
1592 0 : pthread_mutex_destroy(&tmpJettyCb->mutex);
1593 1 : pthread_mutex_init_err:
1594 1 : free(tmpJettyCb);
1595 1 : tmpJettyCb = NULL;
1596 :
1597 1 : return ret;
1598 : }
1599 :
1600 0 : STATIC void RsUbCtxFillJfsCfg(struct RsCtxJettyCb *jettyCb, struct RsCtxJfcCb *sendJfcCb, urma_jfs_cfg_t *jfsCfg)
1601 : {
1602 0 : jfsCfg->depth = (uint32_t)jettyCb->txDepth;
1603 0 : jfsCfg->flag.value = jettyCb->jfsFlag.value;
1604 0 : jfsCfg->trans_mode = jettyCb->transportMode;
1605 0 : jfsCfg->priority = jettyCb->priority;
1606 0 : jfsCfg->max_sge = (uint8_t)jettyCb->devCb->devAttr.sqMaxSge;
1607 0 : jfsCfg->max_rsge = (uint8_t)jettyCb->devCb->devAttr.ub.maxJfsRsge;
1608 0 : jfsCfg->max_inline_data = jettyCb->devCb->devAttr.ub.maxJfsInlineLen;
1609 0 : jfsCfg->rnr_retry = jettyCb->rnrRetry;
1610 0 : jfsCfg->err_timeout = jettyCb->errTimeout;
1611 0 : jfsCfg->jfc = (urma_jfc_t *)(uintptr_t)sendJfcCb->jfcAddr;
1612 0 : jfsCfg->user_ctx = (uint64_t)NULL;
1613 0 : }
1614 :
1615 0 : int RsUbCtxRegJettyDb(struct RsCtxJettyCb *jettyCb, struct udma_u_jetty_info *jettyInfo)
1616 : {
1617 0 : struct MemRegAttrT memAttr = {0};
1618 0 : struct MemRegInfoT memInfo = {0};
1619 : int ret;
1620 :
1621 : // register dwqe_addr with page size 4096, return db_addr to use, specify ub to alloc token id
1622 0 : hccp_dbg("jetty_info->dwqe_addr:%pK, jettyInfo->dbAddr:%pK", jettyInfo->dwqe_addr, jettyInfo->db_addr);
1623 0 : memAttr.mem.addr = (uint64_t)(uintptr_t)jettyInfo->dwqe_addr;
1624 0 : memAttr.mem.size = 4096U;
1625 0 : memAttr.ub.flags.value = 0;
1626 0 : memAttr.ub.flags.bs.tokenPolicy = URMA_TOKEN_PLAIN_TEXT;
1627 0 : memAttr.ub.flags.bs.cacheable = URMA_NON_CACHEABLE;
1628 0 : memAttr.ub.flags.bs.access = MEM_SEG_ACCESS_READ | MEM_SEG_ACCESS_WRITE;
1629 0 : memAttr.ub.flags.bs.nonPin = 1;
1630 : // use user specified token id to register
1631 0 : if (jettyCb->tokenIdAddr != 0) {
1632 0 : memAttr.ub.flags.bs.tokenIdValid = URMA_TOKEN_ID_VALID;
1633 0 : memAttr.ub.tokenIdAddr = jettyCb->tokenIdAddr;
1634 : }
1635 0 : memAttr.ub.tokenValue = jettyCb->tokenValue;
1636 0 : ret = RsUbCtxLmemReg(jettyCb->devCb, &memAttr, &memInfo);
1637 0 : CHK_PRT_RETURN(ret != 0, hccp_err("RsUbCtxLmemReg failed, ret:%d flags:0x%x", ret, memAttr.ub.flags.value), ret);
1638 :
1639 0 : jettyCb->dbTokenId = memInfo.ub.tokenId;
1640 0 : jettyCb->dbSegHandle = memInfo.ub.targetSegHandle;
1641 0 : return 0;
1642 : }
1643 :
1644 0 : STATIC int RsUbCtxDrvJettyCreate(struct RsCtxJettyCb *jettyCb, struct RsCtxJfcCb *sendJfcCb,
1645 : struct RsCtxJfcCb *recvJfcCb)
1646 : {
1647 0 : urma_jetty_cfg_t jettyInitCfg = {0};
1648 0 : urma_jfs_cfg_t jfsCfg = {0};
1649 :
1650 0 : jettyInitCfg.id = jettyCb->jettyId;
1651 0 : jettyInitCfg.flag = jettyCb->flag;
1652 0 : RsUbCtxFillJfsCfg(jettyCb, sendJfcCb, &jfsCfg);
1653 0 : jettyInitCfg.jfs_cfg = jfsCfg;
1654 :
1655 0 : jettyInitCfg.shared.jfr = jettyCb->devCb->shareJfr;
1656 0 : jettyInitCfg.shared.jfc = (urma_jfc_t *)(uintptr_t)recvJfcCb->jfcAddr;
1657 :
1658 0 : if (jettyCb->jettyMode == JETTY_MODE_URMA_NORMAL) {
1659 0 : jettyCb->jetty = RsUrmaCreateJetty(jettyCb->devCb->urmaCtx, &jettyInitCfg);
1660 0 : if (jettyCb->jetty == NULL) {
1661 0 : hccp_err("rs_urma_create_jetty failed, errno=%d", errno);
1662 : }
1663 : } else {
1664 0 : RsUbCtxExtJettyCreate(jettyCb, &jettyInitCfg);
1665 : }
1666 :
1667 0 : if (jettyCb->jetty == NULL) {
1668 0 : return -ENOMEM;
1669 : }
1670 :
1671 0 : jettyCb->state = RS_JETTY_STATE_CREATED;
1672 0 : return 0;
1673 : }
1674 :
1675 0 : STATIC int RsUbFillJettyInfo(struct RsCtxJettyCb *jettyCb, struct QpCreateInfo *jettyInfo)
1676 : {
1677 0 : struct RsJettyKeyInfo jettyKeyInfo = {0};
1678 : int ret;
1679 :
1680 0 : jettyKeyInfo.jettyId = jettyCb->jetty->jetty_id;
1681 0 : jettyKeyInfo.transMode = jettyCb->transportMode;
1682 0 : ret = memcpy_s(jettyInfo->key.value, DEV_QP_KEY_SIZE, &jettyKeyInfo, sizeof(struct RsJettyKeyInfo));
1683 0 : CHK_PRT_RETURN(ret != 0, hccp_err("memcpy jetty_key_info failed, ret:%d", ret), -ESAFEFUNC);
1684 :
1685 0 : jettyInfo->key.size = (uint8_t)sizeof(struct RsJettyKeyInfo);
1686 0 : jettyInfo->ub.uasid = jettyCb->jetty->jetty_id.uasid;
1687 0 : jettyInfo->ub.id = jettyCb->jetty->jetty_id.id;
1688 0 : jettyInfo->ub.dbAddr = jettyCb->dbAddr;
1689 0 : jettyInfo->ub.sqBuffVa = jettyCb->sqBuffVa;
1690 0 : jettyInfo->ub.wqebbSize = WQE_BB_SIZE;
1691 0 : jettyInfo->ub.dbTokenId = jettyCb->dbTokenId;
1692 0 : jettyInfo->va = (uint64_t)(uintptr_t)jettyCb->jetty;
1693 0 : jettyInfo->ub.shareInfoAddr = (uint64_t)(uintptr_t)jettyCb->qpShareInfoAddr;
1694 0 : jettyInfo->ub.shareInfoLen = sizeof(struct CtxQpShareInfo);
1695 :
1696 0 : return 0;
1697 : }
1698 :
1699 0 : STATIC int RsUbQueryJfcCb(struct RsUbDevCb *devCb, unsigned long long scqIndex, unsigned long long rcqIndex,
1700 : struct RsCtxJfcCb **sendJfcCb, struct RsCtxJfcCb **recvJfcCb)
1701 : {
1702 : int ret;
1703 :
1704 0 : ret = RsUbGetJfcCb(devCb, scqIndex, sendJfcCb);
1705 0 : CHK_PRT_RETURN(ret != 0, hccp_err("get send_jfc_cb failed, ret:%d scqIndex:0x%llx", ret, scqIndex), ret);
1706 :
1707 0 : ret = RsUbGetJfcCb(devCb, rcqIndex, recvJfcCb);
1708 0 : CHK_PRT_RETURN(ret != 0, hccp_err("get recv_jfc_cb failed, ret:%d rcqIndex:0x%llx", ret, rcqIndex), ret);
1709 :
1710 0 : return 0;
1711 : }
1712 :
1713 2 : int RsUbCtxJettyCreate(struct RsUbDevCb *devCb, struct CtxQpAttr *attr, struct QpCreateInfo *info)
1714 : {
1715 2 : struct RsCtxJfcCb *sendJfcCb = NULL;
1716 2 : struct RsCtxJfcCb *recvJfcCb = NULL;
1717 2 : struct RsCtxJettyCb *jettyCb = NULL;
1718 : int ret;
1719 :
1720 2 : ret = RsUbCtxInitJettyCb(devCb, attr, &jettyCb);
1721 2 : CHK_PRT_RETURN(ret != 0, hccp_err("alloc mem for jetty_cb failed, ret:%d", ret), ret);
1722 :
1723 2 : ret = RsUbQueryJfcCb(devCb, attr->scqIndex, attr->rcqIndex, &sendJfcCb, &recvJfcCb);
1724 2 : if (ret != 0) {
1725 1 : hccp_err("query jfc_cb scq_index:0x%llx rcq_index:0x%llx failed, ret:%d", attr->scqIndex, attr->rcqIndex, ret);
1726 1 : goto free_jetty_cb;
1727 : }
1728 :
1729 : #ifdef CUSTOM_INTERFACE
1730 1 : ret = RsUbJettyCbBuffAlloc(devCb, jettyCb, sendJfcCb->jfcType);
1731 1 : if (ret != 0) {
1732 0 : hccp_err("jetty_cb buff alloc failed ret:%d", ret);
1733 0 : goto free_jetty_cb;
1734 : }
1735 : #endif
1736 :
1737 1 : ret = RsUbCtxDrvJettyCreate(jettyCb, sendJfcCb, recvJfcCb);
1738 1 : if (ret != 0) {
1739 0 : hccp_err("rs_ub_ctx_drv_jetty_create failed, ret:%d", ret);
1740 0 : goto free_jetty_cb;
1741 : }
1742 :
1743 1 : ret = RsUbFillJettyInfo(jettyCb, info);
1744 1 : if (ret != 0) {
1745 1 : hccp_err("rs_ub_fill_jetty_info failed, ret:%d", ret);
1746 1 : goto fill_jetty_info_err;
1747 : }
1748 :
1749 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1750 0 : jettyCb->scqIndex = attr->scqIndex;
1751 0 : jettyCb->rcqIndex = attr->rcqIndex;
1752 0 : RsListAddTail(&jettyCb->list, &devCb->jettyList);
1753 0 : devCb->jettyCnt++;
1754 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1755 :
1756 0 : hccp_run_info("devIndex:0x%x jettyId:%u mode:%d create success, jettyCnt:%u", devCb->index, info->ub.id,
1757 : jettyCb->jettyMode, devCb->jettyCnt);
1758 :
1759 0 : return 0;
1760 :
1761 1 : fill_jetty_info_err:
1762 1 : RsUbCtxDrvJettyDelete(jettyCb);
1763 2 : free_jetty_cb:
1764 2 : RsUbCtxFreeJettyCb(jettyCb);
1765 :
1766 2 : return ret;
1767 : }
1768 :
1769 2 : int RsUbGetJettyCb(struct RsUbDevCb *devCb, unsigned int jettyId, struct RsCtxJettyCb **jettyCb)
1770 : {
1771 2 : struct RsCtxJettyCb **tempJettyCb = jettyCb;
1772 2 : struct RsCtxJettyCb *jettyCbCurr = NULL;
1773 2 : struct RsCtxJettyCb *jettyCbNext = NULL;
1774 :
1775 2 : RS_LIST_GET_HEAD_ENTRY(jettyCbCurr, jettyCbNext, &devCb->jettyList, list, struct RsCtxJettyCb);
1776 3 : for (; (&jettyCbCurr->list) != &devCb->jettyList;
1777 1 : jettyCbCurr = jettyCbNext, jettyCbNext = list_entry(jettyCbNext->list.next, struct RsCtxJettyCb, list)) {
1778 2 : if (jettyCbCurr->jetty != NULL && jettyCbCurr->jetty->jetty_id.id == jettyId) {
1779 1 : *tempJettyCb = jettyCbCurr;
1780 1 : return 0;
1781 : }
1782 : }
1783 :
1784 1 : *tempJettyCb = NULL;
1785 1 : return -ENODEV;
1786 : }
1787 :
1788 0 : int RsUbCtxJettyDestroy(struct RsUbDevCb *devCb, unsigned int jettyId)
1789 : {
1790 0 : struct RsCtxJettyCb *jettyCb = NULL;
1791 : int ret;
1792 :
1793 0 : ret = RsUbGetJettyCb(devCb, jettyId, &jettyCb);
1794 0 : CHK_PRT_RETURN(ret != 0, hccp_run_warn("get jetty_cb unsuccessful, ret:%d, jettyId %u", ret, jettyId), ret);
1795 0 : if (jettyCb->state != RS_JETTY_STATE_CREATED) {
1796 0 : hccp_err("jetty_cb->state:%u not support to destroy, jettyId:%u", jettyCb->state, jettyId);
1797 0 : return -EINVAL;
1798 : }
1799 :
1800 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1801 0 : RsListDel(&jettyCb->list);
1802 0 : devCb->jettyCnt--;
1803 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1804 :
1805 0 : RsUbCtxDrvJettyDelete(jettyCb);
1806 :
1807 0 : RsUbCtxFreeJettyCb(jettyCb);
1808 :
1809 0 : hccp_run_info("devIndex:0x%x jettyId:%u destroy success, jettyCnt:%u", devCb->index, jettyId, devCb->jettyCnt);
1810 :
1811 0 : return 0;
1812 : }
1813 :
1814 2 : int RsUbCtxJettyFree(struct rs_cb *rscb, unsigned int ueInfo, unsigned int jettyId)
1815 : {
1816 2 : struct RsUbDevCb *devCbCurr = NULL;
1817 2 : struct RsUbDevCb *devCbNext = NULL;
1818 2 : struct RsCtxJettyCb *jettyCb = NULL;
1819 2 : int ret = 0;
1820 :
1821 2 : RS_LIST_GET_HEAD_ENTRY(devCbCurr, devCbNext, &rscb->udevList, list, struct RsUbDevCb);
1822 3 : for (; (&devCbCurr->list) != &rscb->udevList;
1823 1 : devCbCurr = devCbNext, devCbNext = list_entry(devCbNext->list.next, struct RsUbDevCb, list)) {
1824 2 : if ((devCbCurr->index & DEV_INDEX_UE_INFO_MASK) != ueInfo) {
1825 0 : continue;
1826 : }
1827 :
1828 2 : RS_PTHREAD_MUTEX_LOCK(&devCbCurr->mutex);
1829 2 : ret = RsUbGetJettyCb(devCbCurr, jettyId, &jettyCb);
1830 2 : if (ret == 0) {
1831 1 : goto jetty_found;
1832 : }
1833 1 : RS_PTHREAD_MUTEX_ULOCK(&devCbCurr->mutex);
1834 : }
1835 :
1836 1 : hccp_run_warn("get jetty_cb unsuccessful, ueInfo:0x%x, jettyId:%u", ueInfo, jettyId);
1837 1 : return -ENODEV;
1838 :
1839 1 : jetty_found:
1840 1 : RsListDel(&jettyCb->list);
1841 1 : devCbCurr->jettyCnt--;
1842 1 : RS_PTHREAD_MUTEX_ULOCK(&devCbCurr->mutex);
1843 :
1844 1 : if (jettyCb->state == RS_JETTY_STATE_BIND) {
1845 1 : hccp_info("jetty_id:%u will be unbind, devIndex:0x%x", jettyId, devCbCurr->index);
1846 1 : (void)RsUrmaUnbindJetty(jettyCb->jetty);
1847 : }
1848 :
1849 1 : if (jettyCb->state == RS_JETTY_STATE_BIND || jettyCb->state == RS_JETTY_STATE_CREATED) {
1850 1 : hccp_info("jetty_id:%u will be destroyed, devIndex:0x%x", jettyId, devCbCurr->index);
1851 1 : RsUbCtxDrvJettyDelete(jettyCb);
1852 : }
1853 :
1854 1 : RsUbCtxFreeJettyCb(jettyCb);
1855 1 : return 0;
1856 : }
1857 :
1858 0 : STATIC int RsUbGetRemJettyCb(struct RsUbDevCb *devCb, urma_jetty_id_t *remJettyId, struct RsCtxRemJettyCb **rjettyCb)
1859 : {
1860 0 : struct RsCtxRemJettyCb **tempJettyCb = rjettyCb;
1861 0 : struct RsCtxRemJettyCb *jettyCbCurr = NULL;
1862 0 : struct RsCtxRemJettyCb *jettyCbNext = NULL;
1863 :
1864 0 : RS_LIST_GET_HEAD_ENTRY(jettyCbCurr, jettyCbNext, &devCb->rjettyList, list, struct RsCtxRemJettyCb);
1865 0 : for (; (&jettyCbCurr->list) != &devCb->rjettyList;
1866 0 : jettyCbCurr = jettyCbNext, jettyCbNext = list_entry(jettyCbNext->list.next, struct RsCtxRemJettyCb, list)) {
1867 0 : if (jettyCbCurr->tjetty == NULL) {
1868 0 : hccp_warn("devIndex:0x%x remJettyId:%u tjetty is NULL", devCb->index, remJettyId->id);
1869 0 : continue;
1870 : }
1871 0 : if (memcmp(&jettyCbCurr->tjetty->id, remJettyId, sizeof(urma_jetty_id_t)) == 0) {
1872 0 : *tempJettyCb = jettyCbCurr;
1873 0 : return 0;
1874 : }
1875 : }
1876 :
1877 0 : *tempJettyCb = NULL;
1878 0 : hccp_warn("devIndex:0x%x remJettyId:%u do not available!", devCb->index, remJettyId->id);
1879 0 : return -ENODEV;
1880 : }
1881 :
1882 0 : STATIC int RsUbCtxInitRjettyCb(struct RsUbDevCb *devCb, struct RsJettyImportAttr *importAttr,
1883 : struct RsCtxRemJettyCb **rjettyCb)
1884 : {
1885 0 : struct RsCtxRemJettyCb *tmpRjettyCb = NULL;
1886 0 : urma_jetty_id_t remJettyId = {0};
1887 : int ret;
1888 :
1889 0 : ret = memcpy_s(&remJettyId, sizeof(remJettyId), importAttr->key.value, REM_JETTY_ID_SIZE);
1890 0 : CHK_PRT_RETURN(ret != 0,
1891 : hccp_err("memcpy_s remJettyId failed, size:%u sizeof(remJettyId):%zu", REM_JETTY_ID_SIZE, sizeof(remJettyId)),
1892 : -ESAFEFUNC);
1893 0 : ret = RsUbGetRemJettyCb(devCb, &remJettyId, &tmpRjettyCb);
1894 0 : CHK_PRT_RETURN(ret == 0,
1895 : hccp_err("devIndex:0x%x remJettyId:%u not support to import again", ret, devCb->index, remJettyId.id), -EEXIST);
1896 :
1897 0 : tmpRjettyCb = calloc(1, sizeof(struct RsCtxRemJettyCb));
1898 0 : CHK_PRT_RETURN(tmpRjettyCb == NULL, hccp_err("calloc tmpRjettyCb failed, errno:%d", errno), -ENOMEM);
1899 :
1900 0 : tmpRjettyCb->devCb = devCb;
1901 0 : tmpRjettyCb->jettyKey = importAttr->key;
1902 0 : tmpRjettyCb->mode = importAttr->attr.mode;
1903 0 : tmpRjettyCb->tokenValue = importAttr->attr.tokenValue;
1904 0 : tmpRjettyCb->policy = importAttr->attr.policy;
1905 0 : tmpRjettyCb->type = importAttr->attr.type;
1906 0 : tmpRjettyCb->flag = importAttr->attr.flag;
1907 0 : tmpRjettyCb->tpType = importAttr->attr.tpType;
1908 0 : tmpRjettyCb->expImportCfg = importAttr->attr.expImportCfg;
1909 :
1910 0 : *rjettyCb = tmpRjettyCb;
1911 0 : return 0;
1912 : }
1913 :
1914 1 : STATIC void RsUbCtxExpJettyImport(struct RsCtxRemJettyCb *rjettyCb, urma_rjetty_t *rjetty, urma_token_t *tokenValue)
1915 : {
1916 1 : urma_import_jetty_ex_cfg_t expCfg = {0};
1917 :
1918 1 : expCfg.tp_handle = rjettyCb->expImportCfg.tpHandle;
1919 1 : expCfg.peer_tp_handle = rjettyCb->expImportCfg.peerTpHandle;
1920 1 : expCfg.tag = rjettyCb->expImportCfg.tag;
1921 1 : expCfg.tp_attr.tx_psn = rjettyCb->expImportCfg.txPsn;
1922 1 : expCfg.tp_attr.rx_psn = rjettyCb->expImportCfg.rxPsn;
1923 :
1924 1 : rjettyCb->tjetty = RsUrmaImportJettyEx(rjettyCb->devCb->urmaCtx, rjetty, tokenValue, &expCfg);
1925 1 : }
1926 :
1927 1 : STATIC int RsUbCtxDrvJettyImport(struct RsCtxRemJettyCb *rjettyCb)
1928 : {
1929 : struct RsJettyKeyInfo *jettyKeyInfo;
1930 1 : urma_token_t tokenValue = {0};
1931 1 : urma_rjetty_t rjetty = {0};
1932 :
1933 1 : tokenValue.token = rjettyCb->tokenValue;
1934 1 : jettyKeyInfo = (struct RsJettyKeyInfo *)rjettyCb->jettyKey.value;
1935 1 : rjetty.jetty_id = jettyKeyInfo->jettyId;
1936 1 : rjetty.trans_mode = jettyKeyInfo->transMode;
1937 1 : rjetty.policy = (urma_jetty_grp_policy_t)rjettyCb->policy;
1938 1 : rjetty.type = (urma_target_type_t)rjettyCb->type;
1939 1 : rjetty.flag.value = rjettyCb->flag.value;
1940 1 : rjetty.tp_type = rjettyCb->tpType;
1941 :
1942 1 : if (rjettyCb->mode == JETTY_IMPORT_MODE_NORMAL) {
1943 0 : rjettyCb->tjetty = RsUrmaImportJetty(rjettyCb->devCb->urmaCtx, &rjetty, &tokenValue);
1944 : } else { // rjetty_cb->mode == JETTY_IMPORT_MODE_EXP
1945 1 : RsUbCtxExpJettyImport(rjettyCb, &rjetty, &tokenValue);
1946 : }
1947 1 : CHK_PRT_RETURN(rjettyCb->tjetty == NULL, hccp_err("import_jetty failed, mode:%d errno:%d", rjettyCb->mode, errno),
1948 : -EOPENSRC);
1949 1 : return 0;
1950 : }
1951 :
1952 1 : int RsUbCtxJettyImport(struct RsUbDevCb *devCb, struct RsJettyImportAttr *importAttr,
1953 : struct RsJettyImportInfo *importInfo)
1954 : {
1955 1 : struct RsCtxRemJettyCb *rjettyCb = NULL;
1956 : int ret;
1957 :
1958 1 : ret = RsUbCtxInitRjettyCb(devCb, importAttr, &rjettyCb);
1959 1 : CHK_PRT_RETURN(ret != 0, hccp_err("RsUbCtxInitRjettyCb failed, ret:%d devIndex:0x%x", ret, devCb->index), ret);
1960 :
1961 1 : ret = RsUbCtxDrvJettyImport(rjettyCb);
1962 1 : if (ret != 0) {
1963 1 : hccp_err("RsUbCtxDrvJettyImport failed, ret:%d devIndex:0x%x", ret, devCb->index);
1964 1 : goto free_rjetty_cb;
1965 : }
1966 :
1967 0 : importInfo->remJettyId = rjettyCb->tjetty->id.id;
1968 0 : importInfo->info.tjettyHandle = (uint64_t)(uintptr_t)rjettyCb->tjetty;
1969 0 : importInfo->info.tpn = rjettyCb->tjetty->tp.tpn;
1970 :
1971 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
1972 0 : RsListAddTail(&rjettyCb->list, &devCb->rjettyList);
1973 0 : devCb->rjettyCnt++;
1974 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
1975 :
1976 0 : rjettyCb->state = RS_JETTY_STATE_IMPORTED;
1977 :
1978 0 : hccp_run_info("devIndex:0x%x remJettyId:%u rjettyHandle:0x%llx mode:%d import success, rjettyCnt:%u", devCb->index,
1979 : importInfo->remJettyId, rjettyCb->tjetty->handle, importAttr->attr.mode, devCb->rjettyCnt);
1980 :
1981 0 : return 0;
1982 :
1983 1 : free_rjetty_cb:
1984 1 : free(rjettyCb);
1985 1 : rjettyCb = NULL;
1986 :
1987 1 : return ret;
1988 : }
1989 :
1990 0 : STATIC int RsUbGetRemJettyCbDeprecated(struct RsUbDevCb *devCb, unsigned int remJettyId,
1991 : struct RsCtxRemJettyCb **rjettyCb)
1992 : {
1993 0 : struct RsCtxRemJettyCb **tempJettyCb = rjettyCb;
1994 0 : struct RsCtxRemJettyCb *jettyCbCurr = NULL;
1995 0 : struct RsCtxRemJettyCb *jettyCbNext = NULL;
1996 :
1997 0 : RS_LIST_GET_HEAD_ENTRY(jettyCbCurr, jettyCbNext, &devCb->rjettyList, list, struct RsCtxRemJettyCb);
1998 0 : for (; (&jettyCbCurr->list) != &devCb->rjettyList;
1999 0 : jettyCbCurr = jettyCbNext, jettyCbNext = list_entry(jettyCbNext->list.next, struct RsCtxRemJettyCb, list)) {
2000 0 : if (jettyCbCurr->tjetty == NULL) {
2001 0 : hccp_warn("rem_jetty_id:%u jetty_cb_curr->tjetty is NULL", remJettyId);
2002 0 : continue;
2003 : }
2004 0 : if (jettyCbCurr->tjetty->id.id == remJettyId) {
2005 0 : *tempJettyCb = jettyCbCurr;
2006 0 : return 0;
2007 : }
2008 : }
2009 :
2010 0 : *tempJettyCb = NULL;
2011 0 : hccp_err("rjetty_cb for rem_jetty %u do not available!", remJettyId);
2012 :
2013 0 : return -ENODEV;
2014 : }
2015 :
2016 0 : int RsUbCtxJettyUnimport(struct RsUbDevCb *devCb, unsigned char rawRemJettyId[], unsigned int size)
2017 : {
2018 0 : struct RsCtxRemJettyCb *rjettyCb = NULL;
2019 0 : urma_jetty_id_t remJettyId = {0};
2020 0 : unsigned int rjettyCnt = 0;
2021 0 : uint64_t rjettyHandle = 0;
2022 : int ret;
2023 :
2024 0 : if (size == REM_JETTY_ID_DEPRECATED_SIZE) {
2025 0 : (void)memcpy_s(&remJettyId.id, size, rawRemJettyId, size);
2026 0 : ret = RsUbGetRemJettyCbDeprecated(devCb, remJettyId.id, &rjettyCb);
2027 : } else { // size == REM_JETTY_ID_SIZE
2028 0 : ret = memcpy_s(&remJettyId, sizeof(remJettyId), rawRemJettyId, size);
2029 0 : CHK_PRT_RETURN(ret != 0,
2030 : hccp_err("memcpy_s remJettyId failed, size:%u sizeof(remJettyId):%u", size, sizeof(remJettyId)),
2031 : -ESAFEFUNC);
2032 0 : ret = RsUbGetRemJettyCb(devCb, &remJettyId, &rjettyCb);
2033 : }
2034 0 : CHK_PRT_RETURN(ret != 0,
2035 : hccp_err("RsUbGetRemJettyCb failed, ret:%d devIndex:0x%x remJettyId:%u size:%u", ret, devCb->index,
2036 : remJettyId.id, size),
2037 : ret);
2038 :
2039 0 : rjettyHandle = rjettyCb->tjetty->handle;
2040 0 : CHK_PRT_RETURN(rjettyCb->state != RS_JETTY_STATE_IMPORTED,
2041 : hccp_err("unimport failed, remJettyId:%u "
2042 : "rjettyHandle:0x%llx state:%u",
2043 : remJettyId.id, rjettyHandle, rjettyCb->state),
2044 : -EINVAL);
2045 :
2046 0 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
2047 0 : RsListDel(&rjettyCb->list);
2048 0 : devCb->rjettyCnt--;
2049 0 : rjettyCnt = devCb->rjettyCnt;
2050 0 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
2051 :
2052 0 : ret = RsUrmaUnimportJetty(rjettyCb->tjetty);
2053 0 : if (ret != 0) {
2054 0 : hccp_err("urma_unimport_jetty failed, ret:%d devIndex:0x%x remJettyId:%u rjettyHandle:0x%llx", ret,
2055 : devCb->index, remJettyId.id, rjettyHandle);
2056 0 : goto out;
2057 : }
2058 :
2059 0 : hccp_run_info("devIndex:0x%x remJettyId:%u rjettyHandle:0x%llx unimport success, rjettyCnt:%u", devCb->index,
2060 : remJettyId.id, rjettyHandle, rjettyCnt);
2061 0 : out:
2062 0 : free(rjettyCb);
2063 0 : rjettyCb = NULL;
2064 0 : return ret;
2065 : }
2066 :
2067 0 : int RsUbCtxJettyBind(struct RsUbDevCb *devCb, struct RsCtxQpInfo *jettyInfo, struct RsCtxQpInfo *rjettyInfo)
2068 : {
2069 0 : struct RsCtxRemJettyCb *rjettyCb = NULL;
2070 0 : struct RsCtxJettyCb *jettyCb = NULL;
2071 : int ret;
2072 :
2073 0 : ret = RsUbGetJettyCb(devCb, jettyInfo->id, &jettyCb);
2074 0 : CHK_PRT_RETURN(ret != 0, hccp_err("get jetty_cb failed, ret:%d, jettyId %u", ret, jettyInfo->id), ret);
2075 :
2076 0 : ret = RsUbGetRemJettyCbDeprecated(devCb, rjettyInfo->id, &rjettyCb);
2077 0 : CHK_PRT_RETURN(ret != 0, hccp_err("get rjetty_cb failed, ret:%d, remJettyId %u", ret, rjettyInfo->id), ret);
2078 :
2079 0 : if (jettyCb->state != RS_JETTY_STATE_CREATED || rjettyCb->state != RS_JETTY_STATE_IMPORTED) {
2080 0 : hccp_err("local jetty id:%u state:%u or remote jetty id:%u state:%u not support to bind", jettyInfo->id,
2081 : jettyCb->state, rjettyInfo->id, rjettyCb->state);
2082 0 : return -EINVAL;
2083 : }
2084 :
2085 0 : ret = RsUrmaBindJetty(jettyCb->jetty, rjettyCb->tjetty);
2086 0 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_bind_jetty failed, ret:%d errno:%d", ret, errno), -EOPENSRC);
2087 :
2088 0 : jettyCb->state = RS_JETTY_STATE_BIND;
2089 :
2090 0 : hccp_run_info("rs ctx local jetty %u bind rem_jetty %u success, devIndex:0x%x", jettyInfo->id, rjettyInfo->id,
2091 : devCb->index);
2092 :
2093 0 : return 0;
2094 : }
2095 :
2096 0 : int RsUbCtxJettyUnbind(struct RsUbDevCb *devCb, unsigned int jettyId)
2097 : {
2098 0 : struct RsCtxJettyCb *jettyCb = NULL;
2099 : int ret;
2100 :
2101 0 : ret = RsUbGetJettyCb(devCb, jettyId, &jettyCb);
2102 0 : CHK_PRT_RETURN(ret != 0, hccp_run_warn("get jetty_cb unsuccessful, ret:%d, jettyId %u", ret, jettyId), ret);
2103 0 : if (jettyCb->state != RS_JETTY_STATE_BIND) {
2104 0 : hccp_err("jetty_cb->state:%u not support to unbind, jettyId:%u", jettyCb->state, jettyId);
2105 0 : return -EINVAL;
2106 : }
2107 :
2108 0 : ret = RsUrmaUnbindJetty(jettyCb->jetty);
2109 0 : CHK_PRT_RETURN(ret != 0, hccp_err("rs_urma_unbind_jetty failed, ret:%d jettyId %u", ret, jettyId), -EOPENSRC);
2110 :
2111 0 : jettyCb->state = RS_JETTY_STATE_CREATED;
2112 :
2113 0 : hccp_run_info("rs ctx local jetty %u unbind rem jetty success, devIndex:0x%x", jettyId, devCb->index);
2114 :
2115 0 : return 0;
2116 : }
2117 :
2118 0 : STATIC int RsUbCtxFillLsge(struct RsUbDevCb *devCb, urma_sge_t *lsge, struct BatchSendWrData *wrData,
2119 : unsigned int *totalLen, bool isInline)
2120 : {
2121 0 : struct RsSegCb *segCb = NULL;
2122 0 : unsigned int totalLenTmp = 0;
2123 : unsigned int i;
2124 : int ret;
2125 :
2126 0 : if (isInline == false) {
2127 0 : for (i = 0; i < wrData->numSge; i++) {
2128 0 : lsge[i].addr = wrData->sges[i].addr;
2129 0 : lsge[i].len = wrData->sges[i].len;
2130 0 : totalLenTmp += lsge[i].len;
2131 0 : ret = RsUbQuerySegCb(devCb, wrData->sges[i].devLmemHandle, &segCb, &devCb->lsegList);
2132 0 : CHK_PRT_RETURN(ret != 0,
2133 : hccp_err("[send][rs_ub_ctx]can not find lmem seg cb for addr:0x%llx", lsge[i].addr), ret);
2134 0 : lsge[i].tseg = segCb->segment;
2135 : }
2136 : } else {
2137 0 : lsge[0].addr = (uint64_t)(uintptr_t)wrData->inlineData;
2138 0 : lsge[0].len = wrData->inlineSize;
2139 0 : lsge[0].tseg = NULL;
2140 : }
2141 :
2142 0 : *totalLen = totalLenTmp;
2143 0 : return 0;
2144 : }
2145 :
2146 0 : STATIC int RsUbCtxFillRsge(struct RsUbDevCb *devCb, urma_sge_t *rsge, struct BatchSendWrData *wrData,
2147 : unsigned int totalLen, urma_opcode_t opcode)
2148 : {
2149 0 : struct RsSegCb *segCb = NULL;
2150 : int ret;
2151 :
2152 0 : rsge[0].addr = wrData->remoteAddr;
2153 0 : rsge[0].len = totalLen;
2154 0 : ret = RsUbQuerySegCb(devCb, wrData->devRmemHandle, &segCb, &devCb->rsegList);
2155 0 : CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]can not find rmem seg cb for addr:0x%llx", rsge[0].addr), ret);
2156 0 : rsge[0].tseg = segCb->segment;
2157 :
2158 0 : if (opcode == URMA_OPC_WRITE_NOTIFY) {
2159 0 : rsge[1].addr = wrData->ub.notifyInfo.notifyAddr;
2160 0 : rsge[1].len = 8; /* notify data is fixed 8 bytes */
2161 0 : ret = RsUbQuerySegCb(devCb, wrData->ub.notifyInfo.notifyHandle, &segCb, &devCb->rsegList);
2162 0 : CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]can not find rmem seg cb for addr:0x%llx", rsge[1].addr),
2163 : ret);
2164 0 : rsge[1].tseg = segCb->segment;
2165 : }
2166 :
2167 0 : return 0;
2168 : }
2169 :
2170 0 : STATIC int RsUbCtxInitRwWr(struct RsUbDevCb *devCb, urma_jfs_wr_t *ubWr, struct BatchSendWrData *wrData,
2171 : urma_sge_t *lsge, urma_sge_t *rsge)
2172 : {
2173 : unsigned int lsgeNum, rsgeNum;
2174 0 : unsigned int totalLen = 0;
2175 : int ret;
2176 :
2177 0 : lsgeNum = (ubWr->flag.bs.inline_flag == 0) ? wrData->numSge : 1;
2178 0 : ret = RsUbCtxFillLsge(devCb, lsge, wrData, &totalLen, ubWr->flag.bs.inline_flag);
2179 0 : CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]fill lsge failed, ret:%d", ret), ret);
2180 :
2181 : /* write with norify have 2 dst sge, sge[0] is data sge, sge[1] is notify sge */
2182 0 : rsgeNum = (ubWr->opcode == URMA_OPC_WRITE_NOTIFY) ? 2 : 1;
2183 0 : ret = RsUbCtxFillRsge(devCb, rsge, wrData, totalLen, ubWr->opcode);
2184 0 : CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]fill rsge failed, ret:%d", ret), ret);
2185 :
2186 0 : if (ubWr->opcode == URMA_OPC_READ) {
2187 0 : ubWr->rw.src.sge = rsge;
2188 0 : ubWr->rw.src.num_sge = rsgeNum;
2189 0 : ubWr->rw.dst.sge = lsge;
2190 0 : ubWr->rw.dst.num_sge = lsgeNum;
2191 : } else {
2192 0 : ubWr->rw.src.sge = lsge;
2193 0 : ubWr->rw.src.num_sge = lsgeNum;
2194 0 : ubWr->rw.dst.sge = rsge;
2195 0 : ubWr->rw.dst.num_sge = rsgeNum;
2196 : }
2197 :
2198 : // assign notify data & imm data
2199 0 : if (ubWr->opcode == URMA_OPC_WRITE_NOTIFY) {
2200 0 : ubWr->rw.notify_data = wrData->ub.notifyInfo.notifyData;
2201 : } else {
2202 0 : ubWr->rw.notify_data = (uint64_t)wrData->immData;
2203 : }
2204 :
2205 0 : return 0;
2206 : }
2207 :
2208 0 : STATIC int RsUbCtxInitJfsWr(struct RsCtxJettyCb *jettyCb, struct udma_u_jfs_wr_ex *ubWr, struct BatchSendWrData *wrData,
2209 : urma_sge_t *lsge, urma_sge_t *rsge)
2210 : {
2211 0 : urma_opcode_t opcode = (urma_opcode_t)wrData->ub.opcode;
2212 0 : struct RsCtxRemJettyCb *rjettyCb = NULL;
2213 : int ret;
2214 :
2215 0 : if (wrData->numSge > MAX_SGE_NUM) {
2216 0 : hccp_err("[send][rs_ub_ctx]num_sge is invalid, numSge[%d]", wrData->numSge);
2217 0 : return -EINVAL;
2218 : }
2219 :
2220 0 : ubWr->wr.opcode = opcode;
2221 0 : ubWr->wr.flag.value = wrData->ub.flags.value;
2222 0 : ubWr->wr.user_ctx = wrData->ub.userCtx;
2223 :
2224 0 : if (opcode == URMA_OPC_NOP) {
2225 0 : return 0;
2226 : }
2227 :
2228 : // only write & write with notify & read op support inline reduce
2229 0 : if (opcode == URMA_OPC_READ || opcode == URMA_OPC_WRITE || opcode == URMA_OPC_WRITE_NOTIFY) {
2230 0 : ubWr->reduce_en = wrData->ub.reduceInfo.reduceEn;
2231 0 : ubWr->reduce_opcode = wrData->ub.reduceInfo.reduceOpcode;
2232 0 : ubWr->reduce_data_type = wrData->ub.reduceInfo.reduceDataType;
2233 0 : hccp_dbg("[send][rs_ub_ctx]opcode[%d] reduce_en[%d] reduce_opcode[%d] reduce_data_type[%d]", opcode,
2234 : ubWr->reduce_en, ubWr->reduce_opcode, ubWr->reduce_data_type);
2235 : }
2236 :
2237 0 : if (opcode == URMA_OPC_READ || opcode == URMA_OPC_WRITE || opcode == URMA_OPC_WRITE_NOTIFY ||
2238 : opcode == URMA_OPC_WRITE_IMM) {
2239 0 : ret = RsUbGetRemJettyCbDeprecated(jettyCb->devCb, (unsigned int)wrData->ub.remJetty, &rjettyCb);
2240 0 : CHK_PRT_RETURN(ret != 0,
2241 : hccp_err("[send][rs_ub_ctx]get rjetty_cb failed, ret:%d remJettyId:%llu", ret, wrData->ub.remJetty), ret);
2242 :
2243 0 : ubWr->wr.tjetty = rjettyCb->tjetty;
2244 0 : return RsUbCtxInitRwWr(jettyCb->devCb, &ubWr->wr, wrData, lsge, rsge);
2245 : }
2246 :
2247 0 : hccp_err("[send][rs_ub_ctx]invalid opcode[%d]", opcode);
2248 0 : return -EINVAL;
2249 : }
2250 :
2251 0 : STATIC int RsUbCtxBatchSendWrExt(struct RsCtxJettyCb *jettyCb, struct BatchSendWrData *wrData,
2252 : struct SendWrResp *wrResp, struct WrlistSendCompleteNum *wrlistNum)
2253 : {
2254 : #define UB_DWQE_BB_NUM 2U
2255 : #define UB_DWQE_BB_SIZE 64U
2256 0 : unsigned int sendNum = wrlistNum->sendNum;
2257 0 : struct udma_u_jfs_wr_ex *badWr = NULL;
2258 0 : struct udma_u_post_info wrOut = {0};
2259 0 : urma_sge_t rsge[MAX_RSGE_NUM] = {0};
2260 0 : urma_sge_t lsge[MAX_SGE_NUM] = {0};
2261 0 : struct udma_u_jfs_wr_ex ubWr = {0};
2262 0 : struct udma_u_wr_ex wrIn = {0};
2263 0 : urma_user_ctl_out_t out = {0};
2264 0 : urma_user_ctl_in_t in = {0};
2265 : unsigned int i;
2266 0 : int ret = 0;
2267 :
2268 0 : for (i = 0; i < sendNum; i++) {
2269 0 : ret = RsUbCtxInitJfsWr(jettyCb, &ubWr, &wrData[i], &lsge[0], &rsge[0]);
2270 0 : if (ret != 0) {
2271 0 : hccp_err("[send][rs_ub_ctx]init jfs wr failed, ret:%d, curr_num[%u], sendNum[%u]", ret, i, sendNum);
2272 0 : break;
2273 : }
2274 :
2275 0 : wrIn.is_jetty = true;
2276 0 : wrIn.jetty = jettyCb->jetty;
2277 0 : wrIn.wr = &ubWr;
2278 0 : wrIn.bad_wr = &badWr;
2279 :
2280 0 : in.addr = (uint64_t)(uintptr_t)&wrIn;
2281 0 : in.len = (uint32_t)sizeof(struct udma_u_wr_ex);
2282 0 : in.opcode = UDMA_U_USER_CTL_POST_WR;
2283 :
2284 0 : out.addr = (uint64_t)(uintptr_t)&wrOut;
2285 0 : out.len = sizeof(struct udma_u_post_info);
2286 :
2287 0 : ret = RsUrmaUserCtl(jettyCb->devCb->urmaCtx, &in, &out);
2288 0 : if (ret != 0) {
2289 0 : hccp_err("rs_urma_user_ctl batch send wr failed, ret:%d, wr[%u], sendNum[%u] errno:%d", ret, i, sendNum,
2290 : errno);
2291 0 : ret = -EOPENSRC;
2292 0 : break;
2293 : }
2294 :
2295 0 : wrResp[i].doorbellInfo.dieId = (uint16_t)jettyCb->devCb->devAttr.ub.dieId;
2296 0 : wrResp[i].doorbellInfo.funcId = (uint16_t)jettyCb->devCb->devAttr.ub.funcId;
2297 0 : wrResp[i].doorbellInfo.jettyId = (uint16_t)jettyCb->jetty->jetty_id.id;
2298 0 : wrResp[i].doorbellInfo.piVal = (uint16_t)wrOut.pi;
2299 : // prepare dwqe doorbell info, only support 2BB, each BB size is 64B
2300 0 : if (wrOut.pi - jettyCb->lastPi <= UB_DWQE_BB_NUM) {
2301 0 : wrResp[i].doorbellInfo.dwqeSize = (uint16_t)(wrOut.pi - jettyCb->lastPi) * UB_DWQE_BB_SIZE;
2302 0 : ret = memcpy_s(wrResp[i].doorbellInfo.dwqe, wrResp[i].doorbellInfo.dwqeSize, wrOut.ctrl,
2303 0 : wrResp[i].doorbellInfo.dwqeSize);
2304 0 : if (ret != 0) {
2305 0 : hccp_err("[send][rs_ub_ctx]memcpy_s failed, ret:%d, wr[%u], sendNum[%u]", ret, i, sendNum);
2306 0 : ret = -ESAFEFUNC;
2307 0 : break;
2308 : }
2309 : }
2310 0 : jettyCb->lastPi = wrOut.pi;
2311 :
2312 : // record doorbell info
2313 0 : hccp_dbg("jetty_id %u post info: dwqe_addr:%pK, dbAddr:%pK, ctrl:%pK, pi:%u", jettyCb->jetty->jetty_id.id,
2314 : wrOut.dwqe_addr, wrOut.db_addr, wrOut.ctrl, wrOut.pi);
2315 : }
2316 :
2317 0 : *wrlistNum->completeNum = i;
2318 0 : return ret;
2319 : }
2320 :
2321 2 : int RsUbCtxBatchSendWr(struct rs_cb *rsCb, struct WrlistBaseInfo *baseInfo, struct BatchSendWrData *wrData,
2322 : struct SendWrResp *wrResp, struct WrlistSendCompleteNum *wrlistNum)
2323 : {
2324 2 : struct RsCtxJettyCb *jettyCb = NULL;
2325 2 : struct RsUbDevCb *devCb = NULL;
2326 : int ret;
2327 :
2328 2 : if (wrlistNum->sendNum > MAX_CTX_WR_NUM || wrlistNum->sendNum == 0) {
2329 0 : hccp_err("[send][rs_ub_ctx] send_num[%u] is invalid", wrlistNum->sendNum);
2330 0 : return -EINVAL;
2331 : }
2332 :
2333 2 : ret = RsUbGetDevCb(rsCb, baseInfo->devIndex, &devCb);
2334 2 : CHK_PRT_RETURN(ret != 0,
2335 : hccp_err("[send][rs_ub_ctx]get dev_cb failed, ret:%d, devIndex:0x%x", ret, baseInfo->devIndex), ret);
2336 :
2337 1 : ret = RsUbGetJettyCb(devCb, baseInfo->qpn, &jettyCb);
2338 1 : CHK_PRT_RETURN(ret != 0, hccp_err("[send][rs_ub_ctx]get jetty_cb failed, ret:%d, jettyId[%u]", ret, baseInfo->qpn),
2339 : ret);
2340 :
2341 0 : ret = RsUbCtxBatchSendWrExt(jettyCb, wrData, wrResp, wrlistNum);
2342 0 : CHK_PRT_RETURN(ret != 0,
2343 : hccp_err("[send][rs_ub_ctx]send wr ext failed, ret:%d, sendNum[%u], completeNum[%u]", ret, wrlistNum->sendNum,
2344 : *wrlistNum->completeNum),
2345 : ret);
2346 :
2347 0 : return 0;
2348 : }
2349 :
2350 0 : int RsUbCtxJettyUpdateCi(struct RsUbDevCb *devCb, unsigned int jettyId, uint16_t ci)
2351 : {
2352 0 : struct RsCtxJettyCb *jettyCb = NULL;
2353 0 : struct udma_u_update_ci ciData = {0};
2354 0 : urma_user_ctl_out_t out = {0};
2355 0 : urma_user_ctl_in_t in = {0};
2356 : int ret;
2357 :
2358 0 : ret = RsUbGetJettyCb(devCb, jettyId, &jettyCb);
2359 0 : CHK_PRT_RETURN(ret != 0, hccp_err("get jetty_cb failed, ret:%d, jettyId:%u", ret, jettyId), ret);
2360 :
2361 0 : ciData.is_jetty = true;
2362 0 : ciData.ci = ci;
2363 0 : ciData.jetty = jettyCb->jetty;
2364 0 : in.addr = (uint64_t)(uintptr_t)&ciData;
2365 0 : in.len = (uint32_t)sizeof(struct udma_u_update_ci);
2366 0 : in.opcode = UDMA_U_USER_CTL_UPDATE_CI;
2367 0 : ret = RsUrmaUserCtl(jettyCb->devCb->urmaCtx, &in, &out);
2368 0 : CHK_PRT_RETURN(ret != 0,
2369 : hccp_err("rs_urma_user_ctl update ci failed, ret:%d errno:%d jettyId:%u ci:%u", ret, errno, jettyId, ci),
2370 : -EOPENSRC);
2371 :
2372 0 : hccp_info("[update_ci]devIndex:0x%x jetty_id:%u update ci:%u success", devCb->index, jettyId, ci);
2373 :
2374 0 : return 0;
2375 : }
2376 :
2377 5 : STATIC int RsUbGetJettyDestroyBatchInfo(struct RsUbDevCb *devCb, unsigned int jettyIds[],
2378 : struct JettyDestroyBatchInfo *batchInfo, unsigned int *num)
2379 : {
2380 : unsigned int i;
2381 5 : int ret = 0;
2382 :
2383 8 : for (i = 0; i < *num; ++i) {
2384 5 : ret = RsUbGetJettyCb(devCb, jettyIds[i], &batchInfo->jettyCbArr[i]);
2385 5 : CHK_PRT_RETURN(ret != 0, hccp_err("get jetty_cb[%u] failed, jettyId:%u, ret:%d", i, jettyIds[i], ret), ret);
2386 4 : CHK_PRT_RETURN(batchInfo->jettyCbArr[i]->state != RS_JETTY_STATE_CREATED,
2387 : hccp_err("jetty_cb[%u]->state:%u "
2388 : "not support to destroy, jettyId:%u",
2389 : i, batchInfo->jettyCbArr[i]->state, jettyIds[i]),
2390 : -EINVAL);
2391 :
2392 3 : RS_PTHREAD_MUTEX_LOCK(&devCb->mutex);
2393 3 : RsListDel(&batchInfo->jettyCbArr[i]->list);
2394 3 : devCb->jettyCnt--;
2395 3 : RS_PTHREAD_MUTEX_ULOCK(&devCb->mutex);
2396 :
2397 3 : batchInfo->jettyArr[i] = batchInfo->jettyCbArr[i]->jetty;
2398 : }
2399 :
2400 3 : return ret;
2401 : }
2402 :
2403 9 : int RsUbCtxJettyDestroyBatch(struct RsUbDevCb *devCb, unsigned int jettyIds[], unsigned int *num)
2404 : {
2405 9 : struct JettyDestroyBatchInfo batchInfo = {0};
2406 : int ret;
2407 :
2408 9 : CHK_PRT_RETURN(*num == 0, hccp_err("num(%u) = 0, no need to destroy batch", *num), -EINVAL);
2409 :
2410 8 : ret = RsUbCallocJettyBatchInfo(&batchInfo, *num);
2411 8 : if (ret != 0) {
2412 1 : *num = 0;
2413 1 : hccp_err("rs_ub_calloc_jetty_batch_info failed, ret:%d", ret);
2414 1 : goto free_batch_info;
2415 : }
2416 :
2417 7 : ret = RsUbGetJettyDestroyBatchInfo(devCb, jettyIds, &batchInfo, num);
2418 7 : if (ret != 0) {
2419 2 : *num = 0;
2420 2 : hccp_err("get jetty destroy batch info failed, ret:%d", ret);
2421 2 : goto free_batch_info;
2422 : }
2423 :
2424 5 : ret = RsUbDestroyJettyCbBatch(&batchInfo, num);
2425 5 : if (ret != 0) {
2426 2 : hccp_err("rs_ub_destroy_jetty_cb_batch failed, ret:%d", ret);
2427 : }
2428 :
2429 3 : free_batch_info:
2430 8 : RsUbFreeJettyBatchInfo(&batchInfo);
2431 8 : return ret;
2432 : }
2433 :
2434 3 : int RsUbCtxQueryJettyBatch(struct RsUbDevCb *devCb, unsigned int jettyIds[], struct JettyAttr attr[], unsigned int *num)
2435 : {
2436 3 : struct RsCtxJettyCb *jettyCb = NULL;
2437 3 : urma_jetty_attr_t attrTmp = {0};
2438 3 : urma_jetty_cfg_t cfg = {0};
2439 3 : unsigned int i = 0;
2440 3 : int ret = 0;
2441 :
2442 6 : for (i = 0; i < *num; ++i) {
2443 5 : (void)memset_s(&attrTmp, sizeof(urma_jetty_attr_t), 0, sizeof(urma_jetty_attr_t));
2444 5 : ret = RsUbGetJettyCb(devCb, jettyIds[i], &jettyCb);
2445 5 : if (ret != 0) {
2446 1 : hccp_err("get jetty_cb failed, ret:%d, jettyId[%u]:%u", ret, i, jettyIds[i]);
2447 1 : break;
2448 : }
2449 :
2450 4 : ret = RsUrmaQueryJetty(jettyCb->jetty, &cfg, &attrTmp);
2451 4 : if (ret != 0) {
2452 1 : hccp_err("rs_urma_query_jetty failed, ret:%d, jettyId[%u]:%u", ret, i, jettyIds[i]);
2453 1 : break;
2454 : }
2455 :
2456 3 : (void)memcpy_s(&attr[i], sizeof(urma_jetty_attr_t), &attrTmp, sizeof(urma_jetty_attr_t));
2457 : }
2458 :
2459 3 : *num = i;
2460 3 : return ret;
2461 : }
|