Lines Matching refs:conn

46 static int mlx5_fpga_conn_map_buf(struct mlx5_fpga_conn *conn,  in mlx5_fpga_conn_map_buf()  argument
55 dma_device = &conn->fdev->mdev->pdev->dev; in mlx5_fpga_conn_map_buf()
60 mlx5_fpga_warn(conn->fdev, "DMA error on sg 0: %d\n", err); in mlx5_fpga_conn_map_buf()
72 mlx5_fpga_warn(conn->fdev, "DMA error on sg 1: %d\n", err); in mlx5_fpga_conn_map_buf()
82 static void mlx5_fpga_conn_unmap_buf(struct mlx5_fpga_conn *conn, in mlx5_fpga_conn_unmap_buf() argument
87 dma_device = &conn->fdev->mdev->pdev->dev; in mlx5_fpga_conn_unmap_buf()
97 static int mlx5_fpga_conn_post_recv(struct mlx5_fpga_conn *conn, in mlx5_fpga_conn_post_recv() argument
104 err = mlx5_fpga_conn_map_buf(conn, buf); in mlx5_fpga_conn_post_recv()
108 if (unlikely(conn->qp.rq.pc - conn->qp.rq.cc >= conn->qp.rq.size)) { in mlx5_fpga_conn_post_recv()
109 mlx5_fpga_conn_unmap_buf(conn, buf); in mlx5_fpga_conn_post_recv()
113 ix = conn->qp.rq.pc & (conn->qp.rq.size - 1); in mlx5_fpga_conn_post_recv()
114 data = mlx5_wq_cyc_get_wqe(&conn->qp.wq.rq, ix); in mlx5_fpga_conn_post_recv()
116 data->lkey = cpu_to_be32(conn->fdev->conn_res.mkey.key); in mlx5_fpga_conn_post_recv()
119 conn->qp.rq.pc++; in mlx5_fpga_conn_post_recv()
120 conn->qp.rq.bufs[ix] = buf; in mlx5_fpga_conn_post_recv()
124 *conn->qp.wq.rq.db = cpu_to_be32(conn->qp.rq.pc & 0xffff); in mlx5_fpga_conn_post_recv()
129 static void mlx5_fpga_conn_notify_hw(struct mlx5_fpga_conn *conn, void *wqe) in mlx5_fpga_conn_notify_hw() argument
133 *conn->qp.wq.sq.db = cpu_to_be32(conn->qp.sq.pc); in mlx5_fpga_conn_notify_hw()
136 mlx5_write64(wqe, conn->fdev->conn_res.uar->map + MLX5_BF_OFFSET, NULL); in mlx5_fpga_conn_notify_hw()
139 static void mlx5_fpga_conn_post_send(struct mlx5_fpga_conn *conn, in mlx5_fpga_conn_post_send() argument
147 ix = conn->qp.sq.pc & (conn->qp.sq.size - 1); in mlx5_fpga_conn_post_send()
149 ctrl = mlx5_wq_cyc_get_wqe(&conn->qp.wq.sq, ix); in mlx5_fpga_conn_post_send()
156 data->lkey = cpu_to_be32(conn->fdev->conn_res.mkey.key); in mlx5_fpga_conn_post_send()
164 ctrl->opmod_idx_opcode = cpu_to_be32(((conn->qp.sq.pc & 0xffff) << 8) | in mlx5_fpga_conn_post_send()
166 ctrl->qpn_ds = cpu_to_be32(size | (conn->qp.mqp.qpn << 8)); in mlx5_fpga_conn_post_send()
168 conn->qp.sq.pc++; in mlx5_fpga_conn_post_send()
169 conn->qp.sq.bufs[ix] = buf; in mlx5_fpga_conn_post_send()
170 mlx5_fpga_conn_notify_hw(conn, ctrl); in mlx5_fpga_conn_post_send()
173 int mlx5_fpga_conn_send(struct mlx5_fpga_conn *conn, in mlx5_fpga_conn_send() argument
179 if (!conn->qp.active) in mlx5_fpga_conn_send()
182 err = mlx5_fpga_conn_map_buf(conn, buf); in mlx5_fpga_conn_send()
186 spin_lock_irqsave(&conn->qp.sq.lock, flags); in mlx5_fpga_conn_send()
188 if (conn->qp.sq.pc - conn->qp.sq.cc >= conn->qp.sq.size) { in mlx5_fpga_conn_send()
189 list_add_tail(&buf->list, &conn->qp.sq.backlog); in mlx5_fpga_conn_send()
193 mlx5_fpga_conn_post_send(conn, buf); in mlx5_fpga_conn_send()
196 spin_unlock_irqrestore(&conn->qp.sq.lock, flags); in mlx5_fpga_conn_send()
200 static int mlx5_fpga_conn_post_recv_buf(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_post_recv_buf() argument
213 err = mlx5_fpga_conn_post_recv(conn, buf); in mlx5_fpga_conn_post_recv_buf()
247 static void mlx5_fpga_conn_rq_cqe(struct mlx5_fpga_conn *conn, in mlx5_fpga_conn_rq_cqe() argument
253 ix = be16_to_cpu(cqe->wqe_counter) & (conn->qp.rq.size - 1); in mlx5_fpga_conn_rq_cqe()
254 buf = conn->qp.rq.bufs[ix]; in mlx5_fpga_conn_rq_cqe()
255 conn->qp.rq.bufs[ix] = NULL; in mlx5_fpga_conn_rq_cqe()
258 conn->qp.rq.cc++; in mlx5_fpga_conn_rq_cqe()
261 mlx5_fpga_warn(conn->fdev, "RQ buf %p on FPGA QP %u completion status %d\n", in mlx5_fpga_conn_rq_cqe()
262 buf, conn->fpga_qpn, status); in mlx5_fpga_conn_rq_cqe()
264 mlx5_fpga_dbg(conn->fdev, "RQ buf %p on FPGA QP %u completion status %d\n", in mlx5_fpga_conn_rq_cqe()
265 buf, conn->fpga_qpn, status); in mlx5_fpga_conn_rq_cqe()
267 mlx5_fpga_conn_unmap_buf(conn, buf); in mlx5_fpga_conn_rq_cqe()
269 if (unlikely(status || !conn->qp.active)) { in mlx5_fpga_conn_rq_cqe()
270 conn->qp.active = false; in mlx5_fpga_conn_rq_cqe()
275 mlx5_fpga_dbg(conn->fdev, "Message with %u bytes received successfully\n", in mlx5_fpga_conn_rq_cqe()
277 conn->recv_cb(conn->cb_arg, buf); in mlx5_fpga_conn_rq_cqe()
280 err = mlx5_fpga_conn_post_recv(conn, buf); in mlx5_fpga_conn_rq_cqe()
282 mlx5_fpga_warn(conn->fdev, in mlx5_fpga_conn_rq_cqe()
288 static void mlx5_fpga_conn_sq_cqe(struct mlx5_fpga_conn *conn, in mlx5_fpga_conn_sq_cqe() argument
295 spin_lock_irqsave(&conn->qp.sq.lock, flags); in mlx5_fpga_conn_sq_cqe()
297 ix = be16_to_cpu(cqe->wqe_counter) & (conn->qp.sq.size - 1); in mlx5_fpga_conn_sq_cqe()
298 buf = conn->qp.sq.bufs[ix]; in mlx5_fpga_conn_sq_cqe()
299 conn->qp.sq.bufs[ix] = NULL; in mlx5_fpga_conn_sq_cqe()
300 conn->qp.sq.cc++; in mlx5_fpga_conn_sq_cqe()
303 if (unlikely(!list_empty(&conn->qp.sq.backlog))) { in mlx5_fpga_conn_sq_cqe()
304 if (likely(conn->qp.active)) { in mlx5_fpga_conn_sq_cqe()
305 nextbuf = list_first_entry(&conn->qp.sq.backlog, in mlx5_fpga_conn_sq_cqe()
308 mlx5_fpga_conn_post_send(conn, nextbuf); in mlx5_fpga_conn_sq_cqe()
312 spin_unlock_irqrestore(&conn->qp.sq.lock, flags); in mlx5_fpga_conn_sq_cqe()
315 mlx5_fpga_warn(conn->fdev, "SQ buf %p on FPGA QP %u completion status %d\n", in mlx5_fpga_conn_sq_cqe()
316 buf, conn->fpga_qpn, status); in mlx5_fpga_conn_sq_cqe()
318 mlx5_fpga_dbg(conn->fdev, "SQ buf %p on FPGA QP %u completion status %d\n", in mlx5_fpga_conn_sq_cqe()
319 buf, conn->fpga_qpn, status); in mlx5_fpga_conn_sq_cqe()
321 mlx5_fpga_conn_unmap_buf(conn, buf); in mlx5_fpga_conn_sq_cqe()
324 buf->complete(conn, conn->fdev, buf, status); in mlx5_fpga_conn_sq_cqe()
327 conn->qp.active = false; in mlx5_fpga_conn_sq_cqe()
330 static void mlx5_fpga_conn_handle_cqe(struct mlx5_fpga_conn *conn, in mlx5_fpga_conn_handle_cqe() argument
342 mlx5_fpga_conn_sq_cqe(conn, cqe, status); in mlx5_fpga_conn_handle_cqe()
349 mlx5_fpga_conn_rq_cqe(conn, cqe, status); in mlx5_fpga_conn_handle_cqe()
352 mlx5_fpga_warn(conn->fdev, "Unexpected cqe opcode %u\n", in mlx5_fpga_conn_handle_cqe()
357 static void mlx5_fpga_conn_arm_cq(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_arm_cq() argument
359 mlx5_cq_arm(&conn->cq.mcq, MLX5_CQ_DB_REQ_NOT, in mlx5_fpga_conn_arm_cq()
360 conn->fdev->conn_res.uar->map, conn->cq.wq.cc); in mlx5_fpga_conn_arm_cq()
366 struct mlx5_fpga_conn *conn; in mlx5_fpga_conn_cq_event() local
368 conn = container_of(mcq, struct mlx5_fpga_conn, cq.mcq); in mlx5_fpga_conn_cq_event()
369 mlx5_fpga_warn(conn->fdev, "CQ event %u on CQ #%u\n", event, mcq->cqn); in mlx5_fpga_conn_cq_event()
374 struct mlx5_fpga_conn *conn; in mlx5_fpga_conn_event() local
376 conn = container_of(mqp, struct mlx5_fpga_conn, qp.mqp); in mlx5_fpga_conn_event()
377 mlx5_fpga_warn(conn->fdev, "QP event %u on QP #%u\n", event, mqp->qpn); in mlx5_fpga_conn_event()
380 static inline void mlx5_fpga_conn_cqes(struct mlx5_fpga_conn *conn, in mlx5_fpga_conn_cqes() argument
386 cqe = mlx5_cqwq_get_cqe(&conn->cq.wq); in mlx5_fpga_conn_cqes()
391 mlx5_cqwq_pop(&conn->cq.wq); in mlx5_fpga_conn_cqes()
392 mlx5_fpga_conn_handle_cqe(conn, cqe); in mlx5_fpga_conn_cqes()
393 mlx5_cqwq_update_db_record(&conn->cq.wq); in mlx5_fpga_conn_cqes()
396 tasklet_schedule(&conn->cq.tasklet); in mlx5_fpga_conn_cqes()
400 mlx5_fpga_dbg(conn->fdev, "Re-arming CQ with cc# %u\n", conn->cq.wq.cc); in mlx5_fpga_conn_cqes()
403 mlx5_fpga_conn_arm_cq(conn); in mlx5_fpga_conn_cqes()
408 struct mlx5_fpga_conn *conn = (void *)data; in mlx5_fpga_conn_cq_tasklet() local
410 if (unlikely(!conn->qp.active)) in mlx5_fpga_conn_cq_tasklet()
412 mlx5_fpga_conn_cqes(conn, MLX5_FPGA_CQ_BUDGET); in mlx5_fpga_conn_cq_tasklet()
417 struct mlx5_fpga_conn *conn; in mlx5_fpga_conn_cq_complete() local
419 conn = container_of(mcq, struct mlx5_fpga_conn, cq.mcq); in mlx5_fpga_conn_cq_complete()
420 if (unlikely(!conn->qp.active)) in mlx5_fpga_conn_cq_complete()
422 mlx5_fpga_conn_cqes(conn, MLX5_FPGA_CQ_BUDGET); in mlx5_fpga_conn_cq_complete()
425 static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size) in mlx5_fpga_conn_create_cq() argument
427 struct mlx5_fpga_device *fdev = conn->fdev; in mlx5_fpga_conn_create_cq()
444 err = mlx5_cqwq_create(mdev, &wqp, temp_cqc, &conn->cq.wq, in mlx5_fpga_conn_create_cq()
445 &conn->cq.wq_ctrl); in mlx5_fpga_conn_create_cq()
449 for (i = 0; i < mlx5_cqwq_get_size(&conn->cq.wq); i++) { in mlx5_fpga_conn_create_cq()
450 cqe = mlx5_cqwq_get_wqe(&conn->cq.wq, i); in mlx5_fpga_conn_create_cq()
455 sizeof(u64) * conn->cq.wq_ctrl.frag_buf.npages; in mlx5_fpga_conn_create_cq()
470 MLX5_SET(cqc, cqc, log_page_size, conn->cq.wq_ctrl.frag_buf.page_shift - in mlx5_fpga_conn_create_cq()
472 MLX5_SET64(cqc, cqc, dbr_addr, conn->cq.wq_ctrl.db.dma); in mlx5_fpga_conn_create_cq()
475 mlx5_fill_page_frag_array(&conn->cq.wq_ctrl.frag_buf, pas); in mlx5_fpga_conn_create_cq()
477 err = mlx5_core_create_cq(mdev, &conn->cq.mcq, in, inlen); in mlx5_fpga_conn_create_cq()
483 conn->cq.mcq.cqe_sz = 64; in mlx5_fpga_conn_create_cq()
484 conn->cq.mcq.set_ci_db = conn->cq.wq_ctrl.db.db; in mlx5_fpga_conn_create_cq()
485 conn->cq.mcq.arm_db = conn->cq.wq_ctrl.db.db + 1; in mlx5_fpga_conn_create_cq()
486 *conn->cq.mcq.set_ci_db = 0; in mlx5_fpga_conn_create_cq()
487 *conn->cq.mcq.arm_db = 0; in mlx5_fpga_conn_create_cq()
488 conn->cq.mcq.vector = 0; in mlx5_fpga_conn_create_cq()
489 conn->cq.mcq.comp = mlx5_fpga_conn_cq_complete; in mlx5_fpga_conn_create_cq()
490 conn->cq.mcq.event = mlx5_fpga_conn_cq_event; in mlx5_fpga_conn_create_cq()
491 conn->cq.mcq.irqn = irqn; in mlx5_fpga_conn_create_cq()
492 conn->cq.mcq.uar = fdev->conn_res.uar; in mlx5_fpga_conn_create_cq()
493 tasklet_init(&conn->cq.tasklet, mlx5_fpga_conn_cq_tasklet, in mlx5_fpga_conn_create_cq()
494 (unsigned long)conn); in mlx5_fpga_conn_create_cq()
496 mlx5_fpga_dbg(fdev, "Created CQ #0x%x\n", conn->cq.mcq.cqn); in mlx5_fpga_conn_create_cq()
501 mlx5_cqwq_destroy(&conn->cq.wq_ctrl); in mlx5_fpga_conn_create_cq()
506 static void mlx5_fpga_conn_destroy_cq(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_destroy_cq() argument
508 tasklet_disable(&conn->cq.tasklet); in mlx5_fpga_conn_destroy_cq()
509 tasklet_kill(&conn->cq.tasklet); in mlx5_fpga_conn_destroy_cq()
510 mlx5_core_destroy_cq(conn->fdev->mdev, &conn->cq.mcq); in mlx5_fpga_conn_destroy_cq()
511 mlx5_cqwq_destroy(&conn->cq.wq_ctrl); in mlx5_fpga_conn_destroy_cq()
514 static int mlx5_fpga_conn_create_wq(struct mlx5_fpga_conn *conn, void *qpc) in mlx5_fpga_conn_create_wq() argument
516 struct mlx5_fpga_device *fdev = conn->fdev; in mlx5_fpga_conn_create_wq()
523 return mlx5_wq_qp_create(mdev, &wqp, qpc, &conn->qp.wq, in mlx5_fpga_conn_create_wq()
524 &conn->qp.wq_ctrl); in mlx5_fpga_conn_create_wq()
527 static int mlx5_fpga_conn_create_qp(struct mlx5_fpga_conn *conn, in mlx5_fpga_conn_create_qp() argument
530 struct mlx5_fpga_device *fdev = conn->fdev; in mlx5_fpga_conn_create_qp()
536 conn->qp.rq.pc = 0; in mlx5_fpga_conn_create_qp()
537 conn->qp.rq.cc = 0; in mlx5_fpga_conn_create_qp()
538 conn->qp.rq.size = roundup_pow_of_two(rx_size); in mlx5_fpga_conn_create_qp()
539 conn->qp.sq.pc = 0; in mlx5_fpga_conn_create_qp()
540 conn->qp.sq.cc = 0; in mlx5_fpga_conn_create_qp()
541 conn->qp.sq.size = roundup_pow_of_two(tx_size); in mlx5_fpga_conn_create_qp()
544 MLX5_SET(qpc, temp_qpc, log_rq_size, ilog2(conn->qp.rq.size)); in mlx5_fpga_conn_create_qp()
545 MLX5_SET(qpc, temp_qpc, log_sq_size, ilog2(conn->qp.sq.size)); in mlx5_fpga_conn_create_qp()
546 err = mlx5_fpga_conn_create_wq(conn, temp_qpc); in mlx5_fpga_conn_create_qp()
550 conn->qp.rq.bufs = kvzalloc(sizeof(conn->qp.rq.bufs[0]) * in mlx5_fpga_conn_create_qp()
551 conn->qp.rq.size, GFP_KERNEL); in mlx5_fpga_conn_create_qp()
552 if (!conn->qp.rq.bufs) { in mlx5_fpga_conn_create_qp()
557 conn->qp.sq.bufs = kvzalloc(sizeof(conn->qp.sq.bufs[0]) * in mlx5_fpga_conn_create_qp()
558 conn->qp.sq.size, GFP_KERNEL); in mlx5_fpga_conn_create_qp()
559 if (!conn->qp.sq.bufs) { in mlx5_fpga_conn_create_qp()
566 conn->qp.wq_ctrl.buf.npages; in mlx5_fpga_conn_create_qp()
576 conn->qp.wq_ctrl.buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT); in mlx5_fpga_conn_create_qp()
583 MLX5_SET(qpc, qpc, log_rq_size, ilog2(conn->qp.rq.size)); in mlx5_fpga_conn_create_qp()
585 MLX5_SET(qpc, qpc, log_sq_size, ilog2(conn->qp.sq.size)); in mlx5_fpga_conn_create_qp()
586 MLX5_SET(qpc, qpc, cqn_snd, conn->cq.mcq.cqn); in mlx5_fpga_conn_create_qp()
587 MLX5_SET(qpc, qpc, cqn_rcv, conn->cq.mcq.cqn); in mlx5_fpga_conn_create_qp()
588 MLX5_SET64(qpc, qpc, dbr_addr, conn->qp.wq_ctrl.db.dma); in mlx5_fpga_conn_create_qp()
592 mlx5_fill_page_array(&conn->qp.wq_ctrl.buf, in mlx5_fpga_conn_create_qp()
595 err = mlx5_core_create_qp(mdev, &conn->qp.mqp, in, inlen); in mlx5_fpga_conn_create_qp()
599 conn->qp.mqp.event = mlx5_fpga_conn_event; in mlx5_fpga_conn_create_qp()
600 mlx5_fpga_dbg(fdev, "Created QP #0x%x\n", conn->qp.mqp.qpn); in mlx5_fpga_conn_create_qp()
605 kvfree(conn->qp.sq.bufs); in mlx5_fpga_conn_create_qp()
607 kvfree(conn->qp.rq.bufs); in mlx5_fpga_conn_create_qp()
609 mlx5_wq_destroy(&conn->qp.wq_ctrl); in mlx5_fpga_conn_create_qp()
615 static void mlx5_fpga_conn_free_recv_bufs(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_free_recv_bufs() argument
619 for (ix = 0; ix < conn->qp.rq.size; ix++) { in mlx5_fpga_conn_free_recv_bufs()
620 if (!conn->qp.rq.bufs[ix]) in mlx5_fpga_conn_free_recv_bufs()
622 mlx5_fpga_conn_unmap_buf(conn, conn->qp.rq.bufs[ix]); in mlx5_fpga_conn_free_recv_bufs()
623 kfree(conn->qp.rq.bufs[ix]); in mlx5_fpga_conn_free_recv_bufs()
624 conn->qp.rq.bufs[ix] = NULL; in mlx5_fpga_conn_free_recv_bufs()
628 static void mlx5_fpga_conn_flush_send_bufs(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_flush_send_bufs() argument
633 for (ix = 0; ix < conn->qp.sq.size; ix++) { in mlx5_fpga_conn_flush_send_bufs()
634 buf = conn->qp.sq.bufs[ix]; in mlx5_fpga_conn_flush_send_bufs()
637 conn->qp.sq.bufs[ix] = NULL; in mlx5_fpga_conn_flush_send_bufs()
638 mlx5_fpga_conn_unmap_buf(conn, buf); in mlx5_fpga_conn_flush_send_bufs()
641 buf->complete(conn, conn->fdev, buf, MLX5_CQE_SYNDROME_WR_FLUSH_ERR); in mlx5_fpga_conn_flush_send_bufs()
643 list_for_each_entry_safe(buf, temp, &conn->qp.sq.backlog, list) { in mlx5_fpga_conn_flush_send_bufs()
644 mlx5_fpga_conn_unmap_buf(conn, buf); in mlx5_fpga_conn_flush_send_bufs()
647 buf->complete(conn, conn->fdev, buf, MLX5_CQE_SYNDROME_WR_FLUSH_ERR); in mlx5_fpga_conn_flush_send_bufs()
651 static void mlx5_fpga_conn_destroy_qp(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_destroy_qp() argument
653 mlx5_core_destroy_qp(conn->fdev->mdev, &conn->qp.mqp); in mlx5_fpga_conn_destroy_qp()
654 mlx5_fpga_conn_free_recv_bufs(conn); in mlx5_fpga_conn_destroy_qp()
655 mlx5_fpga_conn_flush_send_bufs(conn); in mlx5_fpga_conn_destroy_qp()
656 kvfree(conn->qp.sq.bufs); in mlx5_fpga_conn_destroy_qp()
657 kvfree(conn->qp.rq.bufs); in mlx5_fpga_conn_destroy_qp()
658 mlx5_wq_destroy(&conn->qp.wq_ctrl); in mlx5_fpga_conn_destroy_qp()
661 static inline int mlx5_fpga_conn_reset_qp(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_reset_qp() argument
663 struct mlx5_core_dev *mdev = conn->fdev->mdev; in mlx5_fpga_conn_reset_qp()
665 mlx5_fpga_dbg(conn->fdev, "Modifying QP %u to RST\n", conn->qp.mqp.qpn); in mlx5_fpga_conn_reset_qp()
668 &conn->qp.mqp); in mlx5_fpga_conn_reset_qp()
671 static inline int mlx5_fpga_conn_init_qp(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_init_qp() argument
673 struct mlx5_fpga_device *fdev = conn->fdev; in mlx5_fpga_conn_init_qp()
678 mlx5_fpga_dbg(conn->fdev, "Modifying QP %u to INIT\n", conn->qp.mqp.qpn); in mlx5_fpga_conn_init_qp()
690 MLX5_SET(qpc, qpc, pd, conn->fdev->conn_res.pdn); in mlx5_fpga_conn_init_qp()
691 MLX5_SET(qpc, qpc, cqn_snd, conn->cq.mcq.cqn); in mlx5_fpga_conn_init_qp()
692 MLX5_SET(qpc, qpc, cqn_rcv, conn->cq.mcq.cqn); in mlx5_fpga_conn_init_qp()
693 MLX5_SET64(qpc, qpc, dbr_addr, conn->qp.wq_ctrl.db.dma); in mlx5_fpga_conn_init_qp()
696 &conn->qp.mqp); in mlx5_fpga_conn_init_qp()
707 static inline int mlx5_fpga_conn_rtr_qp(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_rtr_qp() argument
709 struct mlx5_fpga_device *fdev = conn->fdev; in mlx5_fpga_conn_rtr_qp()
714 mlx5_fpga_dbg(conn->fdev, "QP RTR\n"); in mlx5_fpga_conn_rtr_qp()
724 MLX5_SET(qpc, qpc, remote_qpn, conn->fpga_qpn); in mlx5_fpga_conn_rtr_qp()
726 MLX5_GET(fpga_qpc, conn->fpga_qpc, next_send_psn)); in mlx5_fpga_conn_rtr_qp()
730 MLX5_ADDR_OF(fpga_qpc, conn->fpga_qpc, fpga_mac_47_32)); in mlx5_fpga_conn_rtr_qp()
734 conn->qp.sgid_index); in mlx5_fpga_conn_rtr_qp()
737 MLX5_ADDR_OF(fpga_qpc, conn->fpga_qpc, fpga_ip), in mlx5_fpga_conn_rtr_qp()
741 &conn->qp.mqp); in mlx5_fpga_conn_rtr_qp()
752 static inline int mlx5_fpga_conn_rts_qp(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_rts_qp() argument
754 struct mlx5_fpga_device *fdev = conn->fdev; in mlx5_fpga_conn_rts_qp()
760 mlx5_fpga_dbg(conn->fdev, "QP RTS\n"); in mlx5_fpga_conn_rts_qp()
772 MLX5_GET(fpga_qpc, conn->fpga_qpc, next_rcv_psn)); in mlx5_fpga_conn_rts_qp()
778 &conn->qp.mqp); in mlx5_fpga_conn_rts_qp()
789 static int mlx5_fpga_conn_connect(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_connect() argument
791 struct mlx5_fpga_device *fdev = conn->fdev; in mlx5_fpga_conn_connect()
794 MLX5_SET(fpga_qpc, conn->fpga_qpc, state, MLX5_FPGA_QPC_STATE_ACTIVE); in mlx5_fpga_conn_connect()
795 err = mlx5_fpga_modify_qp(conn->fdev->mdev, conn->fpga_qpn, in mlx5_fpga_conn_connect()
796 MLX5_FPGA_QPC_STATE, &conn->fpga_qpc); in mlx5_fpga_conn_connect()
802 err = mlx5_fpga_conn_reset_qp(conn); in mlx5_fpga_conn_connect()
808 err = mlx5_fpga_conn_init_qp(conn); in mlx5_fpga_conn_connect()
813 conn->qp.active = true; in mlx5_fpga_conn_connect()
815 while (!mlx5_fpga_conn_post_recv_buf(conn)) in mlx5_fpga_conn_connect()
818 err = mlx5_fpga_conn_rtr_qp(conn); in mlx5_fpga_conn_connect()
824 err = mlx5_fpga_conn_rts_qp(conn); in mlx5_fpga_conn_connect()
832 mlx5_fpga_conn_free_recv_bufs(conn); in mlx5_fpga_conn_connect()
834 MLX5_SET(fpga_qpc, conn->fpga_qpc, state, MLX5_FPGA_QPC_STATE_INIT); in mlx5_fpga_conn_connect()
835 if (mlx5_fpga_modify_qp(conn->fdev->mdev, conn->fpga_qpn, in mlx5_fpga_conn_connect()
836 MLX5_FPGA_QPC_STATE, &conn->fpga_qpc)) in mlx5_fpga_conn_connect()
846 struct mlx5_fpga_conn *ret, *conn; in mlx5_fpga_conn_create() local
853 conn = kzalloc(sizeof(*conn), GFP_KERNEL); in mlx5_fpga_conn_create()
854 if (!conn) in mlx5_fpga_conn_create()
857 conn->fdev = fdev; in mlx5_fpga_conn_create()
858 INIT_LIST_HEAD(&conn->qp.sq.backlog); in mlx5_fpga_conn_create()
860 spin_lock_init(&conn->qp.sq.lock); in mlx5_fpga_conn_create()
862 conn->recv_cb = attr->recv_cb; in mlx5_fpga_conn_create()
863 conn->cb_arg = attr->cb_arg; in mlx5_fpga_conn_create()
865 remote_mac = MLX5_ADDR_OF(fpga_qpc, conn->fpga_qpc, remote_mac_47_32); in mlx5_fpga_conn_create()
874 remote_ip = MLX5_ADDR_OF(fpga_qpc, conn->fpga_qpc, remote_ip); in mlx5_fpga_conn_create()
879 err = mlx5_core_reserved_gid_alloc(fdev->mdev, &conn->qp.sgid_index); in mlx5_fpga_conn_create()
886 err = mlx5_core_roce_gid_set(fdev->mdev, conn->qp.sgid_index, in mlx5_fpga_conn_create()
895 mlx5_fpga_dbg(fdev, "Reserved SGID index %u\n", conn->qp.sgid_index); in mlx5_fpga_conn_create()
900 err = mlx5_fpga_conn_create_cq(conn, in mlx5_fpga_conn_create()
908 mlx5_fpga_conn_arm_cq(conn); in mlx5_fpga_conn_create()
910 err = mlx5_fpga_conn_create_qp(conn, attr->tx_size, attr->rx_size); in mlx5_fpga_conn_create()
917 MLX5_SET(fpga_qpc, conn->fpga_qpc, state, MLX5_FPGA_QPC_STATE_INIT); in mlx5_fpga_conn_create()
918 MLX5_SET(fpga_qpc, conn->fpga_qpc, qp_type, qp_type); in mlx5_fpga_conn_create()
919 MLX5_SET(fpga_qpc, conn->fpga_qpc, st, MLX5_FPGA_QPC_ST_RC); in mlx5_fpga_conn_create()
920 MLX5_SET(fpga_qpc, conn->fpga_qpc, ether_type, ETH_P_8021Q); in mlx5_fpga_conn_create()
921 MLX5_SET(fpga_qpc, conn->fpga_qpc, vid, 0); in mlx5_fpga_conn_create()
922 MLX5_SET(fpga_qpc, conn->fpga_qpc, next_rcv_psn, 1); in mlx5_fpga_conn_create()
923 MLX5_SET(fpga_qpc, conn->fpga_qpc, next_send_psn, 0); in mlx5_fpga_conn_create()
924 MLX5_SET(fpga_qpc, conn->fpga_qpc, pkey, MLX5_FPGA_PKEY); in mlx5_fpga_conn_create()
925 MLX5_SET(fpga_qpc, conn->fpga_qpc, remote_qpn, conn->qp.mqp.qpn); in mlx5_fpga_conn_create()
926 MLX5_SET(fpga_qpc, conn->fpga_qpc, rnr_retry, 7); in mlx5_fpga_conn_create()
927 MLX5_SET(fpga_qpc, conn->fpga_qpc, retry_count, 7); in mlx5_fpga_conn_create()
929 err = mlx5_fpga_create_qp(fdev->mdev, &conn->fpga_qpc, in mlx5_fpga_conn_create()
930 &conn->fpga_qpn); in mlx5_fpga_conn_create()
937 err = mlx5_fpga_conn_connect(conn); in mlx5_fpga_conn_create()
943 mlx5_fpga_dbg(fdev, "FPGA QPN is %u\n", conn->fpga_qpn); in mlx5_fpga_conn_create()
944 ret = conn; in mlx5_fpga_conn_create()
948 mlx5_fpga_destroy_qp(conn->fdev->mdev, conn->fpga_qpn); in mlx5_fpga_conn_create()
950 mlx5_fpga_conn_destroy_qp(conn); in mlx5_fpga_conn_create()
952 mlx5_fpga_conn_destroy_cq(conn); in mlx5_fpga_conn_create()
954 mlx5_core_roce_gid_set(fdev->mdev, conn->qp.sgid_index, 0, 0, NULL, in mlx5_fpga_conn_create()
957 mlx5_core_reserved_gid_free(fdev->mdev, conn->qp.sgid_index); in mlx5_fpga_conn_create()
959 kfree(conn); in mlx5_fpga_conn_create()
964 void mlx5_fpga_conn_destroy(struct mlx5_fpga_conn *conn) in mlx5_fpga_conn_destroy() argument
966 struct mlx5_fpga_device *fdev = conn->fdev; in mlx5_fpga_conn_destroy()
970 conn->qp.active = false; in mlx5_fpga_conn_destroy()
971 tasklet_disable(&conn->cq.tasklet); in mlx5_fpga_conn_destroy()
972 synchronize_irq(conn->cq.mcq.irqn); in mlx5_fpga_conn_destroy()
974 mlx5_fpga_destroy_qp(conn->fdev->mdev, conn->fpga_qpn); in mlx5_fpga_conn_destroy()
976 &conn->qp.mqp); in mlx5_fpga_conn_destroy()
979 mlx5_fpga_conn_destroy_qp(conn); in mlx5_fpga_conn_destroy()
980 mlx5_fpga_conn_destroy_cq(conn); in mlx5_fpga_conn_destroy()
982 mlx5_core_roce_gid_set(conn->fdev->mdev, conn->qp.sgid_index, 0, 0, in mlx5_fpga_conn_destroy()
984 mlx5_core_reserved_gid_free(conn->fdev->mdev, conn->qp.sgid_index); in mlx5_fpga_conn_destroy()
985 kfree(conn); in mlx5_fpga_conn_destroy()