2 * Copyright (c) 2017 Mellanox Technologies. All rights reserved.
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and/or other materials
21 * provided with the distribution.
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34 #include <net/addrconf.h>
35 #include <linux/etherdevice.h>
36 #include <linux/mlx5/vport.h>
38 #include "mlx5_core.h"
40 #include "fpga/conn.h"
42 #define MLX5_FPGA_PKEY 0xFFFF
43 #define MLX5_FPGA_PKEY_INDEX 0 /* RoCE PKEY 0xFFFF is always at index 0 */
44 #define MLX5_FPGA_RECV_SIZE 2048
45 #define MLX5_FPGA_PORT_NUM 1
46 #define MLX5_FPGA_CQ_BUDGET 64
48 static int mlx5_fpga_conn_map_buf(struct mlx5_fpga_conn *conn,
49 struct mlx5_fpga_dma_buf *buf)
51 struct device *dma_device;
54 if (unlikely(!buf->sg[0].data))
57 dma_device = &conn->fdev->mdev->pdev->dev;
58 buf->sg[0].dma_addr = dma_map_single(dma_device, buf->sg[0].data,
59 buf->sg[0].size, buf->dma_dir);
60 err = dma_mapping_error(dma_device, buf->sg[0].dma_addr);
62 mlx5_fpga_warn(conn->fdev, "DMA error on sg 0: %d\n", err);
70 buf->sg[1].dma_addr = dma_map_single(dma_device, buf->sg[1].data,
71 buf->sg[1].size, buf->dma_dir);
72 err = dma_mapping_error(dma_device, buf->sg[1].dma_addr);
74 mlx5_fpga_warn(conn->fdev, "DMA error on sg 1: %d\n", err);
75 dma_unmap_single(dma_device, buf->sg[0].dma_addr,
76 buf->sg[0].size, buf->dma_dir);
84 static void mlx5_fpga_conn_unmap_buf(struct mlx5_fpga_conn *conn,
85 struct mlx5_fpga_dma_buf *buf)
87 struct device *dma_device;
89 dma_device = &conn->fdev->mdev->pdev->dev;
91 dma_unmap_single(dma_device, buf->sg[1].dma_addr,
92 buf->sg[1].size, buf->dma_dir);
94 if (likely(buf->sg[0].data))
95 dma_unmap_single(dma_device, buf->sg[0].dma_addr,
96 buf->sg[0].size, buf->dma_dir);
99 static int mlx5_fpga_conn_post_recv(struct mlx5_fpga_conn *conn,
100 struct mlx5_fpga_dma_buf *buf)
102 struct mlx5_wqe_data_seg *data;
106 err = mlx5_fpga_conn_map_buf(conn, buf);
110 if (unlikely(conn->qp.rq.pc - conn->qp.rq.cc >= conn->qp.rq.size)) {
111 mlx5_fpga_conn_unmap_buf(conn, buf);
115 ix = conn->qp.rq.pc & (conn->qp.rq.size - 1);
116 data = mlx5_wq_cyc_get_wqe(&conn->qp.wq.rq, ix);
117 data->byte_count = cpu_to_be32(buf->sg[0].size);
118 data->lkey = cpu_to_be32(conn->fdev->conn_res.mkey.key);
119 data->addr = cpu_to_be64(buf->sg[0].dma_addr);
122 conn->qp.rq.bufs[ix] = buf;
124 /* Make sure that descriptors are written before doorbell record. */
126 *conn->qp.wq.rq.db = cpu_to_be32(conn->qp.rq.pc & 0xffff);
131 static void mlx5_fpga_conn_notify_hw(struct mlx5_fpga_conn *conn, void *wqe)
133 /* ensure wqe is visible to device before updating doorbell record */
135 *conn->qp.wq.sq.db = cpu_to_be32(conn->qp.sq.pc);
136 /* Make sure that doorbell record is visible before ringing */
138 mlx5_write64(wqe, conn->fdev->conn_res.uar->map + MLX5_BF_OFFSET, NULL);
141 static void mlx5_fpga_conn_post_send(struct mlx5_fpga_conn *conn,
142 struct mlx5_fpga_dma_buf *buf)
144 struct mlx5_wqe_ctrl_seg *ctrl;
145 struct mlx5_wqe_data_seg *data;
146 unsigned int ix, sgi;
149 ix = conn->qp.sq.pc & (conn->qp.sq.size - 1);
151 ctrl = mlx5_wq_cyc_get_wqe(&conn->qp.wq.sq, ix);
152 data = (void *)(ctrl + 1);
154 for (sgi = 0; sgi < ARRAY_SIZE(buf->sg); sgi++) {
155 if (!buf->sg[sgi].data)
157 data->byte_count = cpu_to_be32(buf->sg[sgi].size);
158 data->lkey = cpu_to_be32(conn->fdev->conn_res.mkey.key);
159 data->addr = cpu_to_be64(buf->sg[sgi].dma_addr);
165 ctrl->fm_ce_se = MLX5_WQE_CTRL_CQ_UPDATE;
166 ctrl->opmod_idx_opcode = cpu_to_be32(((conn->qp.sq.pc & 0xffff) << 8) |
168 ctrl->qpn_ds = cpu_to_be32(size | (conn->qp.mqp.qpn << 8));
171 conn->qp.sq.bufs[ix] = buf;
172 mlx5_fpga_conn_notify_hw(conn, ctrl);
175 int mlx5_fpga_conn_send(struct mlx5_fpga_conn *conn,
176 struct mlx5_fpga_dma_buf *buf)
181 if (!conn->qp.active)
184 buf->dma_dir = DMA_TO_DEVICE;
185 err = mlx5_fpga_conn_map_buf(conn, buf);
189 spin_lock_irqsave(&conn->qp.sq.lock, flags);
191 if (conn->qp.sq.pc - conn->qp.sq.cc >= conn->qp.sq.size) {
192 list_add_tail(&buf->list, &conn->qp.sq.backlog);
196 mlx5_fpga_conn_post_send(conn, buf);
199 spin_unlock_irqrestore(&conn->qp.sq.lock, flags);
203 static int mlx5_fpga_conn_post_recv_buf(struct mlx5_fpga_conn *conn)
205 struct mlx5_fpga_dma_buf *buf;
208 buf = kzalloc(sizeof(*buf) + MLX5_FPGA_RECV_SIZE, 0);
212 buf->sg[0].data = (void *)(buf + 1);
213 buf->sg[0].size = MLX5_FPGA_RECV_SIZE;
214 buf->dma_dir = DMA_FROM_DEVICE;
216 err = mlx5_fpga_conn_post_recv(conn, buf);
223 static int mlx5_fpga_conn_create_mkey(struct mlx5_core_dev *mdev, u32 pdn,
224 struct mlx5_core_mkey *mkey)
226 int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
231 in = kvzalloc(inlen, GFP_KERNEL);
235 mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
236 MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA);
237 MLX5_SET(mkc, mkc, lw, 1);
238 MLX5_SET(mkc, mkc, lr, 1);
240 MLX5_SET(mkc, mkc, pd, pdn);
241 MLX5_SET(mkc, mkc, length64, 1);
242 MLX5_SET(mkc, mkc, qpn, 0xffffff);
244 err = mlx5_core_create_mkey(mdev, mkey, in, inlen);
250 static void mlx5_fpga_conn_rq_cqe(struct mlx5_fpga_conn *conn,
251 struct mlx5_cqe64 *cqe, u8 status)
253 struct mlx5_fpga_dma_buf *buf;
256 ix = be16_to_cpu(cqe->wqe_counter) & (conn->qp.rq.size - 1);
257 buf = conn->qp.rq.bufs[ix];
258 conn->qp.rq.bufs[ix] = NULL;
260 buf->sg[0].size = be32_to_cpu(cqe->byte_cnt);
263 if (unlikely(status && (status != MLX5_CQE_SYNDROME_WR_FLUSH_ERR)))
264 mlx5_fpga_warn(conn->fdev, "RQ buf %p on FPGA QP %u completion status %d\n",
265 buf, conn->fpga_qpn, status);
267 mlx5_fpga_dbg(conn->fdev, "RQ buf %p on FPGA QP %u completion status %d\n",
268 buf, conn->fpga_qpn, status);
270 mlx5_fpga_conn_unmap_buf(conn, buf);
272 if (unlikely(status || !conn->qp.active)) {
273 conn->qp.active = false;
278 mlx5_fpga_dbg(conn->fdev, "Message with %u bytes received successfully\n",
280 conn->recv_cb(conn->cb_arg, buf);
282 buf->sg[0].size = MLX5_FPGA_RECV_SIZE;
283 err = mlx5_fpga_conn_post_recv(conn, buf);
285 mlx5_fpga_warn(conn->fdev,
286 "Failed to re-post recv buf: %d\n", err);
291 static void mlx5_fpga_conn_sq_cqe(struct mlx5_fpga_conn *conn,
292 struct mlx5_cqe64 *cqe, u8 status)
294 struct mlx5_fpga_dma_buf *buf, *nextbuf;
298 spin_lock_irqsave(&conn->qp.sq.lock, flags);
300 ix = be16_to_cpu(cqe->wqe_counter) & (conn->qp.sq.size - 1);
301 buf = conn->qp.sq.bufs[ix];
302 conn->qp.sq.bufs[ix] = NULL;
305 /* Handle backlog still under the spinlock to ensure message post order */
306 if (unlikely(!list_empty(&conn->qp.sq.backlog))) {
307 if (likely(conn->qp.active)) {
308 nextbuf = list_first_entry(&conn->qp.sq.backlog,
309 struct mlx5_fpga_dma_buf, list);
310 list_del(&nextbuf->list);
311 mlx5_fpga_conn_post_send(conn, nextbuf);
315 spin_unlock_irqrestore(&conn->qp.sq.lock, flags);
317 if (unlikely(status && (status != MLX5_CQE_SYNDROME_WR_FLUSH_ERR)))
318 mlx5_fpga_warn(conn->fdev, "SQ buf %p on FPGA QP %u completion status %d\n",
319 buf, conn->fpga_qpn, status);
321 mlx5_fpga_dbg(conn->fdev, "SQ buf %p on FPGA QP %u completion status %d\n",
322 buf, conn->fpga_qpn, status);
324 mlx5_fpga_conn_unmap_buf(conn, buf);
326 if (likely(buf->complete))
327 buf->complete(conn, conn->fdev, buf, status);
329 if (unlikely(status))
330 conn->qp.active = false;
333 static void mlx5_fpga_conn_handle_cqe(struct mlx5_fpga_conn *conn,
334 struct mlx5_cqe64 *cqe)
336 u8 opcode, status = 0;
338 opcode = cqe->op_own >> 4;
341 case MLX5_CQE_REQ_ERR:
342 status = ((struct mlx5_err_cqe *)cqe)->syndrome;
345 mlx5_fpga_conn_sq_cqe(conn, cqe, status);
348 case MLX5_CQE_RESP_ERR:
349 status = ((struct mlx5_err_cqe *)cqe)->syndrome;
351 case MLX5_CQE_RESP_SEND:
352 mlx5_fpga_conn_rq_cqe(conn, cqe, status);
355 mlx5_fpga_warn(conn->fdev, "Unexpected cqe opcode %u\n",
360 static void mlx5_fpga_conn_arm_cq(struct mlx5_fpga_conn *conn)
362 mlx5_cq_arm(&conn->cq.mcq, MLX5_CQ_DB_REQ_NOT,
363 conn->fdev->conn_res.uar->map, conn->cq.wq.cc);
366 static void mlx5_fpga_conn_cq_event(struct mlx5_core_cq *mcq,
367 enum mlx5_event event)
369 struct mlx5_fpga_conn *conn;
371 conn = container_of(mcq, struct mlx5_fpga_conn, cq.mcq);
372 mlx5_fpga_warn(conn->fdev, "CQ event %u on CQ #%u\n", event, mcq->cqn);
375 static void mlx5_fpga_conn_event(struct mlx5_core_qp *mqp, int event)
377 struct mlx5_fpga_conn *conn;
379 conn = container_of(mqp, struct mlx5_fpga_conn, qp.mqp);
380 mlx5_fpga_warn(conn->fdev, "QP event %u on QP #%u\n", event, mqp->qpn);
383 static inline void mlx5_fpga_conn_cqes(struct mlx5_fpga_conn *conn,
386 struct mlx5_cqe64 *cqe;
389 cqe = mlx5_cqwq_get_cqe(&conn->cq.wq);
394 mlx5_cqwq_pop(&conn->cq.wq);
395 mlx5_fpga_conn_handle_cqe(conn, cqe);
396 mlx5_cqwq_update_db_record(&conn->cq.wq);
399 tasklet_schedule(&conn->cq.tasklet);
403 mlx5_fpga_dbg(conn->fdev, "Re-arming CQ with cc# %u\n", conn->cq.wq.cc);
404 /* ensure cq space is freed before enabling more cqes */
406 mlx5_fpga_conn_arm_cq(conn);
409 static void mlx5_fpga_conn_cq_tasklet(unsigned long data)
411 struct mlx5_fpga_conn *conn = (void *)data;
413 if (unlikely(!conn->qp.active))
415 mlx5_fpga_conn_cqes(conn, MLX5_FPGA_CQ_BUDGET);
418 static void mlx5_fpga_conn_cq_complete(struct mlx5_core_cq *mcq)
420 struct mlx5_fpga_conn *conn;
422 conn = container_of(mcq, struct mlx5_fpga_conn, cq.mcq);
423 if (unlikely(!conn->qp.active))
425 mlx5_fpga_conn_cqes(conn, MLX5_FPGA_CQ_BUDGET);
428 static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size)
430 struct mlx5_fpga_device *fdev = conn->fdev;
431 struct mlx5_core_dev *mdev = fdev->mdev;
432 u32 temp_cqc[MLX5_ST_SZ_DW(cqc)] = {0};
433 struct mlx5_wq_param wqp;
434 struct mlx5_cqe64 *cqe;
441 cq_size = roundup_pow_of_two(cq_size);
442 MLX5_SET(cqc, temp_cqc, log_cq_size, ilog2(cq_size));
444 wqp.buf_numa_node = mdev->priv.numa_node;
445 wqp.db_numa_node = mdev->priv.numa_node;
447 err = mlx5_cqwq_create(mdev, &wqp, temp_cqc, &conn->cq.wq,
452 for (i = 0; i < mlx5_cqwq_get_size(&conn->cq.wq); i++) {
453 cqe = mlx5_cqwq_get_wqe(&conn->cq.wq, i);
454 cqe->op_own = MLX5_CQE_INVALID << 4 | MLX5_CQE_OWNER_MASK;
457 inlen = MLX5_ST_SZ_BYTES(create_cq_in) +
458 sizeof(u64) * conn->cq.wq_ctrl.buf.npages;
459 in = kvzalloc(inlen, GFP_KERNEL);
465 err = mlx5_vector2eqn(mdev, smp_processor_id(), &eqn, &irqn);
469 cqc = MLX5_ADDR_OF(create_cq_in, in, cq_context);
470 MLX5_SET(cqc, cqc, log_cq_size, ilog2(cq_size));
471 MLX5_SET(cqc, cqc, c_eqn, eqn);
472 MLX5_SET(cqc, cqc, uar_page, fdev->conn_res.uar->index);
473 MLX5_SET(cqc, cqc, log_page_size, conn->cq.wq_ctrl.buf.page_shift -
474 MLX5_ADAPTER_PAGE_SHIFT);
475 MLX5_SET64(cqc, cqc, dbr_addr, conn->cq.wq_ctrl.db.dma);
477 pas = (__be64 *)MLX5_ADDR_OF(create_cq_in, in, pas);
478 mlx5_fill_page_frag_array(&conn->cq.wq_ctrl.buf, pas);
480 err = mlx5_core_create_cq(mdev, &conn->cq.mcq, in, inlen);
486 conn->cq.mcq.cqe_sz = 64;
487 conn->cq.mcq.set_ci_db = conn->cq.wq_ctrl.db.db;
488 conn->cq.mcq.arm_db = conn->cq.wq_ctrl.db.db + 1;
489 *conn->cq.mcq.set_ci_db = 0;
490 *conn->cq.mcq.arm_db = 0;
491 conn->cq.mcq.vector = 0;
492 conn->cq.mcq.comp = mlx5_fpga_conn_cq_complete;
493 conn->cq.mcq.event = mlx5_fpga_conn_cq_event;
494 conn->cq.mcq.irqn = irqn;
495 conn->cq.mcq.uar = fdev->conn_res.uar;
496 tasklet_init(&conn->cq.tasklet, mlx5_fpga_conn_cq_tasklet,
497 (unsigned long)conn);
499 mlx5_fpga_dbg(fdev, "Created CQ #0x%x\n", conn->cq.mcq.cqn);
504 mlx5_wq_destroy(&conn->cq.wq_ctrl);
509 static void mlx5_fpga_conn_destroy_cq(struct mlx5_fpga_conn *conn)
511 tasklet_disable(&conn->cq.tasklet);
512 tasklet_kill(&conn->cq.tasklet);
513 mlx5_core_destroy_cq(conn->fdev->mdev, &conn->cq.mcq);
514 mlx5_wq_destroy(&conn->cq.wq_ctrl);
517 static int mlx5_fpga_conn_create_wq(struct mlx5_fpga_conn *conn, void *qpc)
519 struct mlx5_fpga_device *fdev = conn->fdev;
520 struct mlx5_core_dev *mdev = fdev->mdev;
521 struct mlx5_wq_param wqp;
523 wqp.buf_numa_node = mdev->priv.numa_node;
524 wqp.db_numa_node = mdev->priv.numa_node;
526 return mlx5_wq_qp_create(mdev, &wqp, qpc, &conn->qp.wq,
530 static int mlx5_fpga_conn_create_qp(struct mlx5_fpga_conn *conn,
531 unsigned int tx_size, unsigned int rx_size)
533 struct mlx5_fpga_device *fdev = conn->fdev;
534 struct mlx5_core_dev *mdev = fdev->mdev;
535 u32 temp_qpc[MLX5_ST_SZ_DW(qpc)] = {0};
536 void *in = NULL, *qpc;
541 conn->qp.rq.size = roundup_pow_of_two(rx_size);
544 conn->qp.sq.size = roundup_pow_of_two(tx_size);
546 MLX5_SET(qpc, temp_qpc, log_rq_stride, ilog2(MLX5_SEND_WQE_DS) - 4);
547 MLX5_SET(qpc, temp_qpc, log_rq_size, ilog2(conn->qp.rq.size));
548 MLX5_SET(qpc, temp_qpc, log_sq_size, ilog2(conn->qp.sq.size));
549 err = mlx5_fpga_conn_create_wq(conn, temp_qpc);
553 conn->qp.rq.bufs = kvzalloc(sizeof(conn->qp.rq.bufs[0]) *
554 conn->qp.rq.size, GFP_KERNEL);
555 if (!conn->qp.rq.bufs) {
560 conn->qp.sq.bufs = kvzalloc(sizeof(conn->qp.sq.bufs[0]) *
561 conn->qp.sq.size, GFP_KERNEL);
562 if (!conn->qp.sq.bufs) {
567 inlen = MLX5_ST_SZ_BYTES(create_qp_in) +
568 MLX5_FLD_SZ_BYTES(create_qp_in, pas[0]) *
569 conn->qp.wq_ctrl.buf.npages;
570 in = kvzalloc(inlen, GFP_KERNEL);
576 qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
577 MLX5_SET(qpc, qpc, uar_page, fdev->conn_res.uar->index);
578 MLX5_SET(qpc, qpc, log_page_size,
579 conn->qp.wq_ctrl.buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
580 MLX5_SET(qpc, qpc, fre, 1);
581 MLX5_SET(qpc, qpc, rlky, 1);
582 MLX5_SET(qpc, qpc, st, MLX5_QP_ST_RC);
583 MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED);
584 MLX5_SET(qpc, qpc, pd, fdev->conn_res.pdn);
585 MLX5_SET(qpc, qpc, log_rq_stride, ilog2(MLX5_SEND_WQE_DS) - 4);
586 MLX5_SET(qpc, qpc, log_rq_size, ilog2(conn->qp.rq.size));
587 MLX5_SET(qpc, qpc, rq_type, MLX5_NON_ZERO_RQ);
588 MLX5_SET(qpc, qpc, log_sq_size, ilog2(conn->qp.sq.size));
589 MLX5_SET(qpc, qpc, cqn_snd, conn->cq.mcq.cqn);
590 MLX5_SET(qpc, qpc, cqn_rcv, conn->cq.mcq.cqn);
591 MLX5_SET64(qpc, qpc, dbr_addr, conn->qp.wq_ctrl.db.dma);
592 if (MLX5_CAP_GEN(mdev, cqe_version) == 1)
593 MLX5_SET(qpc, qpc, user_index, 0xFFFFFF);
595 mlx5_fill_page_frag_array(&conn->qp.wq_ctrl.buf,
596 (__be64 *)MLX5_ADDR_OF(create_qp_in, in, pas));
598 err = mlx5_core_create_qp(mdev, &conn->qp.mqp, in, inlen);
602 conn->qp.mqp.event = mlx5_fpga_conn_event;
603 mlx5_fpga_dbg(fdev, "Created QP #0x%x\n", conn->qp.mqp.qpn);
608 kvfree(conn->qp.sq.bufs);
610 kvfree(conn->qp.rq.bufs);
612 mlx5_wq_destroy(&conn->qp.wq_ctrl);
618 static void mlx5_fpga_conn_free_recv_bufs(struct mlx5_fpga_conn *conn)
622 for (ix = 0; ix < conn->qp.rq.size; ix++) {
623 if (!conn->qp.rq.bufs[ix])
625 mlx5_fpga_conn_unmap_buf(conn, conn->qp.rq.bufs[ix]);
626 kfree(conn->qp.rq.bufs[ix]);
627 conn->qp.rq.bufs[ix] = NULL;
631 static void mlx5_fpga_conn_flush_send_bufs(struct mlx5_fpga_conn *conn)
633 struct mlx5_fpga_dma_buf *buf, *temp;
636 for (ix = 0; ix < conn->qp.sq.size; ix++) {
637 buf = conn->qp.sq.bufs[ix];
640 conn->qp.sq.bufs[ix] = NULL;
641 mlx5_fpga_conn_unmap_buf(conn, buf);
644 buf->complete(conn, conn->fdev, buf, MLX5_CQE_SYNDROME_WR_FLUSH_ERR);
646 list_for_each_entry_safe(buf, temp, &conn->qp.sq.backlog, list) {
647 mlx5_fpga_conn_unmap_buf(conn, buf);
650 buf->complete(conn, conn->fdev, buf, MLX5_CQE_SYNDROME_WR_FLUSH_ERR);
654 static void mlx5_fpga_conn_destroy_qp(struct mlx5_fpga_conn *conn)
656 mlx5_core_destroy_qp(conn->fdev->mdev, &conn->qp.mqp);
657 mlx5_fpga_conn_free_recv_bufs(conn);
658 mlx5_fpga_conn_flush_send_bufs(conn);
659 kvfree(conn->qp.sq.bufs);
660 kvfree(conn->qp.rq.bufs);
661 mlx5_wq_destroy(&conn->qp.wq_ctrl);
664 static inline int mlx5_fpga_conn_reset_qp(struct mlx5_fpga_conn *conn)
666 struct mlx5_core_dev *mdev = conn->fdev->mdev;
668 mlx5_fpga_dbg(conn->fdev, "Modifying QP %u to RST\n", conn->qp.mqp.qpn);
670 return mlx5_core_qp_modify(mdev, MLX5_CMD_OP_2RST_QP, 0, NULL,
674 static inline int mlx5_fpga_conn_init_qp(struct mlx5_fpga_conn *conn)
676 struct mlx5_fpga_device *fdev = conn->fdev;
677 struct mlx5_core_dev *mdev = fdev->mdev;
681 mlx5_fpga_dbg(conn->fdev, "Modifying QP %u to INIT\n", conn->qp.mqp.qpn);
683 qpc = kzalloc(MLX5_ST_SZ_BYTES(qpc), GFP_KERNEL);
689 MLX5_SET(qpc, qpc, st, MLX5_QP_ST_RC);
690 MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED);
691 MLX5_SET(qpc, qpc, primary_address_path.pkey_index, MLX5_FPGA_PKEY_INDEX);
692 MLX5_SET(qpc, qpc, primary_address_path.vhca_port_num, MLX5_FPGA_PORT_NUM);
693 MLX5_SET(qpc, qpc, pd, conn->fdev->conn_res.pdn);
694 MLX5_SET(qpc, qpc, cqn_snd, conn->cq.mcq.cqn);
695 MLX5_SET(qpc, qpc, cqn_rcv, conn->cq.mcq.cqn);
696 MLX5_SET64(qpc, qpc, dbr_addr, conn->qp.wq_ctrl.db.dma);
698 err = mlx5_core_qp_modify(mdev, MLX5_CMD_OP_RST2INIT_QP, 0, qpc,
701 mlx5_fpga_warn(fdev, "qp_modify RST2INIT failed: %d\n", err);
710 static inline int mlx5_fpga_conn_rtr_qp(struct mlx5_fpga_conn *conn)
712 struct mlx5_fpga_device *fdev = conn->fdev;
713 struct mlx5_core_dev *mdev = fdev->mdev;
717 mlx5_fpga_dbg(conn->fdev, "QP RTR\n");
719 qpc = kzalloc(MLX5_ST_SZ_BYTES(qpc), GFP_KERNEL);
725 MLX5_SET(qpc, qpc, mtu, MLX5_QPC_MTU_1K_BYTES);
726 MLX5_SET(qpc, qpc, log_msg_max, (u8)MLX5_CAP_GEN(mdev, log_max_msg));
727 MLX5_SET(qpc, qpc, remote_qpn, conn->fpga_qpn);
728 MLX5_SET(qpc, qpc, next_rcv_psn,
729 MLX5_GET(fpga_qpc, conn->fpga_qpc, next_send_psn));
730 MLX5_SET(qpc, qpc, primary_address_path.pkey_index, MLX5_FPGA_PKEY_INDEX);
731 MLX5_SET(qpc, qpc, primary_address_path.vhca_port_num, MLX5_FPGA_PORT_NUM);
732 ether_addr_copy(MLX5_ADDR_OF(qpc, qpc, primary_address_path.rmac_47_32),
733 MLX5_ADDR_OF(fpga_qpc, conn->fpga_qpc, fpga_mac_47_32));
734 MLX5_SET(qpc, qpc, primary_address_path.udp_sport,
735 MLX5_CAP_ROCE(mdev, r_roce_min_src_udp_port));
736 MLX5_SET(qpc, qpc, primary_address_path.src_addr_index,
737 conn->qp.sgid_index);
738 MLX5_SET(qpc, qpc, primary_address_path.hop_limit, 0);
739 memcpy(MLX5_ADDR_OF(qpc, qpc, primary_address_path.rgid_rip),
740 MLX5_ADDR_OF(fpga_qpc, conn->fpga_qpc, fpga_ip),
741 MLX5_FLD_SZ_BYTES(qpc, primary_address_path.rgid_rip));
743 err = mlx5_core_qp_modify(mdev, MLX5_CMD_OP_INIT2RTR_QP, 0, qpc,
746 mlx5_fpga_warn(fdev, "qp_modify RST2INIT failed: %d\n", err);
755 static inline int mlx5_fpga_conn_rts_qp(struct mlx5_fpga_conn *conn)
757 struct mlx5_fpga_device *fdev = conn->fdev;
758 struct mlx5_core_dev *mdev = fdev->mdev;
763 mlx5_fpga_dbg(conn->fdev, "QP RTS\n");
765 qpc = kzalloc(MLX5_ST_SZ_BYTES(qpc), GFP_KERNEL);
771 MLX5_SET(qpc, qpc, log_ack_req_freq, 8);
772 MLX5_SET(qpc, qpc, min_rnr_nak, 0x12);
773 MLX5_SET(qpc, qpc, primary_address_path.ack_timeout, 0x12); /* ~1.07s */
774 MLX5_SET(qpc, qpc, next_send_psn,
775 MLX5_GET(fpga_qpc, conn->fpga_qpc, next_rcv_psn));
776 MLX5_SET(qpc, qpc, retry_count, 7);
777 MLX5_SET(qpc, qpc, rnr_retry, 7); /* Infinite retry if RNR NACK */
779 opt_mask = MLX5_QP_OPTPAR_RNR_TIMEOUT;
780 err = mlx5_core_qp_modify(mdev, MLX5_CMD_OP_RTR2RTS_QP, opt_mask, qpc,
783 mlx5_fpga_warn(fdev, "qp_modify RST2INIT failed: %d\n", err);
792 static int mlx5_fpga_conn_connect(struct mlx5_fpga_conn *conn)
794 struct mlx5_fpga_device *fdev = conn->fdev;
797 MLX5_SET(fpga_qpc, conn->fpga_qpc, state, MLX5_FPGA_QPC_STATE_ACTIVE);
798 err = mlx5_fpga_modify_qp(conn->fdev->mdev, conn->fpga_qpn,
799 MLX5_FPGA_QPC_STATE, &conn->fpga_qpc);
801 mlx5_fpga_err(fdev, "Failed to activate FPGA RC QP: %d\n", err);
805 err = mlx5_fpga_conn_reset_qp(conn);
807 mlx5_fpga_err(fdev, "Failed to change QP state to reset\n");
811 err = mlx5_fpga_conn_init_qp(conn);
813 mlx5_fpga_err(fdev, "Failed to modify QP from RESET to INIT\n");
816 conn->qp.active = true;
818 while (!mlx5_fpga_conn_post_recv_buf(conn))
821 err = mlx5_fpga_conn_rtr_qp(conn);
823 mlx5_fpga_err(fdev, "Failed to change QP state from INIT to RTR\n");
827 err = mlx5_fpga_conn_rts_qp(conn);
829 mlx5_fpga_err(fdev, "Failed to change QP state from RTR to RTS\n");
835 mlx5_fpga_conn_free_recv_bufs(conn);
837 MLX5_SET(fpga_qpc, conn->fpga_qpc, state, MLX5_FPGA_QPC_STATE_INIT);
838 if (mlx5_fpga_modify_qp(conn->fdev->mdev, conn->fpga_qpn,
839 MLX5_FPGA_QPC_STATE, &conn->fpga_qpc))
840 mlx5_fpga_err(fdev, "Failed to revert FPGA QP to INIT\n");
845 struct mlx5_fpga_conn *mlx5_fpga_conn_create(struct mlx5_fpga_device *fdev,
846 struct mlx5_fpga_conn_attr *attr,
847 enum mlx5_ifc_fpga_qp_type qp_type)
849 struct mlx5_fpga_conn *ret, *conn;
850 u8 *remote_mac, *remote_ip;
854 return ERR_PTR(-EINVAL);
856 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
858 return ERR_PTR(-ENOMEM);
861 INIT_LIST_HEAD(&conn->qp.sq.backlog);
863 spin_lock_init(&conn->qp.sq.lock);
865 conn->recv_cb = attr->recv_cb;
866 conn->cb_arg = attr->cb_arg;
868 remote_mac = MLX5_ADDR_OF(fpga_qpc, conn->fpga_qpc, remote_mac_47_32);
869 err = mlx5_query_nic_vport_mac_address(fdev->mdev, 0, remote_mac);
871 mlx5_fpga_err(fdev, "Failed to query local MAC: %d\n", err);
876 /* Build Modified EUI-64 IPv6 address from the MAC address */
877 remote_ip = MLX5_ADDR_OF(fpga_qpc, conn->fpga_qpc, remote_ip);
880 addrconf_addr_eui48(&remote_ip[8], remote_mac);
882 err = mlx5_core_reserved_gid_alloc(fdev->mdev, &conn->qp.sgid_index);
884 mlx5_fpga_err(fdev, "Failed to allocate SGID: %d\n", err);
889 err = mlx5_core_roce_gid_set(fdev->mdev, conn->qp.sgid_index,
891 MLX5_ROCE_L3_TYPE_IPV6,
892 remote_ip, remote_mac, true, 0,
895 mlx5_fpga_err(fdev, "Failed to set SGID: %d\n", err);
899 mlx5_fpga_dbg(fdev, "Reserved SGID index %u\n", conn->qp.sgid_index);
901 /* Allow for one cqe per rx/tx wqe, plus one cqe for the next wqe,
902 * created during processing of the cqe
904 err = mlx5_fpga_conn_create_cq(conn,
905 (attr->tx_size + attr->rx_size) * 2);
907 mlx5_fpga_err(fdev, "Failed to create CQ: %d\n", err);
912 mlx5_fpga_conn_arm_cq(conn);
914 err = mlx5_fpga_conn_create_qp(conn, attr->tx_size, attr->rx_size);
916 mlx5_fpga_err(fdev, "Failed to create QP: %d\n", err);
921 MLX5_SET(fpga_qpc, conn->fpga_qpc, state, MLX5_FPGA_QPC_STATE_INIT);
922 MLX5_SET(fpga_qpc, conn->fpga_qpc, qp_type, qp_type);
923 MLX5_SET(fpga_qpc, conn->fpga_qpc, st, MLX5_FPGA_QPC_ST_RC);
924 MLX5_SET(fpga_qpc, conn->fpga_qpc, ether_type, ETH_P_8021Q);
925 MLX5_SET(fpga_qpc, conn->fpga_qpc, vid, 0);
926 MLX5_SET(fpga_qpc, conn->fpga_qpc, next_rcv_psn, 1);
927 MLX5_SET(fpga_qpc, conn->fpga_qpc, next_send_psn, 0);
928 MLX5_SET(fpga_qpc, conn->fpga_qpc, pkey, MLX5_FPGA_PKEY);
929 MLX5_SET(fpga_qpc, conn->fpga_qpc, remote_qpn, conn->qp.mqp.qpn);
930 MLX5_SET(fpga_qpc, conn->fpga_qpc, rnr_retry, 7);
931 MLX5_SET(fpga_qpc, conn->fpga_qpc, retry_count, 7);
933 err = mlx5_fpga_create_qp(fdev->mdev, &conn->fpga_qpc,
936 mlx5_fpga_err(fdev, "Failed to create FPGA RC QP: %d\n", err);
941 err = mlx5_fpga_conn_connect(conn);
947 mlx5_fpga_dbg(fdev, "FPGA QPN is %u\n", conn->fpga_qpn);
952 mlx5_fpga_destroy_qp(conn->fdev->mdev, conn->fpga_qpn);
954 mlx5_fpga_conn_destroy_qp(conn);
956 mlx5_fpga_conn_destroy_cq(conn);
958 mlx5_core_roce_gid_set(fdev->mdev, conn->qp.sgid_index, 0, 0, NULL,
959 NULL, false, 0, MLX5_FPGA_PORT_NUM);
961 mlx5_core_reserved_gid_free(fdev->mdev, conn->qp.sgid_index);
968 void mlx5_fpga_conn_destroy(struct mlx5_fpga_conn *conn)
970 struct mlx5_fpga_device *fdev = conn->fdev;
971 struct mlx5_core_dev *mdev = fdev->mdev;
974 conn->qp.active = false;
975 tasklet_disable(&conn->cq.tasklet);
976 synchronize_irq(conn->cq.mcq.irqn);
978 mlx5_fpga_destroy_qp(conn->fdev->mdev, conn->fpga_qpn);
979 err = mlx5_core_qp_modify(mdev, MLX5_CMD_OP_2ERR_QP, 0, NULL,
982 mlx5_fpga_warn(fdev, "qp_modify 2ERR failed: %d\n", err);
983 mlx5_fpga_conn_destroy_qp(conn);
984 mlx5_fpga_conn_destroy_cq(conn);
986 mlx5_core_roce_gid_set(conn->fdev->mdev, conn->qp.sgid_index, 0, 0,
987 NULL, NULL, false, 0, MLX5_FPGA_PORT_NUM);
988 mlx5_core_reserved_gid_free(conn->fdev->mdev, conn->qp.sgid_index);
992 int mlx5_fpga_conn_device_init(struct mlx5_fpga_device *fdev)
996 err = mlx5_nic_vport_enable_roce(fdev->mdev);
998 mlx5_fpga_err(fdev, "Failed to enable RoCE: %d\n", err);
1002 fdev->conn_res.uar = mlx5_get_uars_page(fdev->mdev);
1003 if (IS_ERR(fdev->conn_res.uar)) {
1004 err = PTR_ERR(fdev->conn_res.uar);
1005 mlx5_fpga_err(fdev, "get_uars_page failed, %d\n", err);
1008 mlx5_fpga_dbg(fdev, "Allocated UAR index %u\n",
1009 fdev->conn_res.uar->index);
1011 err = mlx5_core_alloc_pd(fdev->mdev, &fdev->conn_res.pdn);
1013 mlx5_fpga_err(fdev, "alloc pd failed, %d\n", err);
1016 mlx5_fpga_dbg(fdev, "Allocated PD %u\n", fdev->conn_res.pdn);
1018 err = mlx5_fpga_conn_create_mkey(fdev->mdev, fdev->conn_res.pdn,
1019 &fdev->conn_res.mkey);
1021 mlx5_fpga_err(fdev, "create mkey failed, %d\n", err);
1022 goto err_dealloc_pd;
1024 mlx5_fpga_dbg(fdev, "Created mkey 0x%x\n", fdev->conn_res.mkey.key);
1029 mlx5_core_dealloc_pd(fdev->mdev, fdev->conn_res.pdn);
1031 mlx5_put_uars_page(fdev->mdev, fdev->conn_res.uar);
1033 mlx5_nic_vport_disable_roce(fdev->mdev);
1038 void mlx5_fpga_conn_device_cleanup(struct mlx5_fpga_device *fdev)
1040 mlx5_core_destroy_mkey(fdev->mdev, &fdev->conn_res.mkey);
1041 mlx5_core_dealloc_pd(fdev->mdev, fdev->conn_res.pdn);
1042 mlx5_put_uars_page(fdev->mdev, fdev->conn_res.uar);
1043 mlx5_nic_vport_disable_roce(fdev->mdev);