forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/drivers/net/ethernet/mellanox/mlx5/core/fpga/conn.c
....@@ -54,7 +54,7 @@
5454 if (unlikely(!buf->sg[0].data))
5555 goto out;
5656
57
- dma_device = &conn->fdev->mdev->pdev->dev;
57
+ dma_device = mlx5_core_dma_dev(conn->fdev->mdev);
5858 buf->sg[0].dma_addr = dma_map_single(dma_device, buf->sg[0].data,
5959 buf->sg[0].size, buf->dma_dir);
6060 err = dma_mapping_error(dma_device, buf->sg[0].dma_addr);
....@@ -86,7 +86,7 @@
8686 {
8787 struct device *dma_device;
8888
89
- dma_device = &conn->fdev->mdev->pdev->dev;
89
+ dma_device = mlx5_core_dma_dev(conn->fdev->mdev);
9090 if (buf->sg[1].data)
9191 dma_unmap_single(dma_device, buf->sg[1].dma_addr,
9292 buf->sg[1].size, buf->dma_dir);
....@@ -135,7 +135,7 @@
135135 *conn->qp.wq.sq.db = cpu_to_be32(conn->qp.sq.pc);
136136 /* Make sure that doorbell record is visible before ringing */
137137 wmb();
138
- mlx5_write64(wqe, conn->fdev->conn_res.uar->map + MLX5_BF_OFFSET, NULL);
138
+ mlx5_write64(wqe, conn->fdev->conn_res.uar->map + MLX5_BF_OFFSET);
139139 }
140140
141141 static void mlx5_fpga_conn_post_send(struct mlx5_fpga_conn *conn,
....@@ -165,7 +165,7 @@
165165 ctrl->fm_ce_se = MLX5_WQE_CTRL_CQ_UPDATE;
166166 ctrl->opmod_idx_opcode = cpu_to_be32(((conn->qp.sq.pc & 0xffff) << 8) |
167167 MLX5_OPCODE_SEND);
168
- ctrl->qpn_ds = cpu_to_be32(size | (conn->qp.mqp.qpn << 8));
168
+ ctrl->qpn_ds = cpu_to_be32(size | (conn->qp.qpn << 8));
169169
170170 conn->qp.sq.pc++;
171171 conn->qp.sq.bufs[ix] = buf;
....@@ -334,19 +334,19 @@
334334 {
335335 u8 opcode, status = 0;
336336
337
- opcode = cqe->op_own >> 4;
337
+ opcode = get_cqe_opcode(cqe);
338338
339339 switch (opcode) {
340340 case MLX5_CQE_REQ_ERR:
341341 status = ((struct mlx5_err_cqe *)cqe)->syndrome;
342
- /* Fall through */
342
+ fallthrough;
343343 case MLX5_CQE_REQ:
344344 mlx5_fpga_conn_sq_cqe(conn, cqe, status);
345345 break;
346346
347347 case MLX5_CQE_RESP_ERR:
348348 status = ((struct mlx5_err_cqe *)cqe)->syndrome;
349
- /* Fall through */
349
+ fallthrough;
350350 case MLX5_CQE_RESP_SEND:
351351 mlx5_fpga_conn_rq_cqe(conn, cqe, status);
352352 break;
....@@ -360,23 +360,6 @@
360360 {
361361 mlx5_cq_arm(&conn->cq.mcq, MLX5_CQ_DB_REQ_NOT,
362362 conn->fdev->conn_res.uar->map, conn->cq.wq.cc);
363
-}
364
-
365
-static void mlx5_fpga_conn_cq_event(struct mlx5_core_cq *mcq,
366
- enum mlx5_event event)
367
-{
368
- struct mlx5_fpga_conn *conn;
369
-
370
- conn = container_of(mcq, struct mlx5_fpga_conn, cq.mcq);
371
- mlx5_fpga_warn(conn->fdev, "CQ event %u on CQ #%u\n", event, mcq->cqn);
372
-}
373
-
374
-static void mlx5_fpga_conn_event(struct mlx5_core_qp *mqp, int event)
375
-{
376
- struct mlx5_fpga_conn *conn;
377
-
378
- conn = container_of(mqp, struct mlx5_fpga_conn, qp.mqp);
379
- mlx5_fpga_warn(conn->fdev, "QP event %u on QP #%u\n", event, mqp->qpn);
380363 }
381364
382365 static inline void mlx5_fpga_conn_cqes(struct mlx5_fpga_conn *conn,
....@@ -405,16 +388,17 @@
405388 mlx5_fpga_conn_arm_cq(conn);
406389 }
407390
408
-static void mlx5_fpga_conn_cq_tasklet(unsigned long data)
391
+static void mlx5_fpga_conn_cq_tasklet(struct tasklet_struct *t)
409392 {
410
- struct mlx5_fpga_conn *conn = (void *)data;
393
+ struct mlx5_fpga_conn *conn = from_tasklet(conn, t, cq.tasklet);
411394
412395 if (unlikely(!conn->qp.active))
413396 return;
414397 mlx5_fpga_conn_cqes(conn, MLX5_FPGA_CQ_BUDGET);
415398 }
416399
417
-static void mlx5_fpga_conn_cq_complete(struct mlx5_core_cq *mcq)
400
+static void mlx5_fpga_conn_cq_complete(struct mlx5_core_cq *mcq,
401
+ struct mlx5_eqe *eqe)
418402 {
419403 struct mlx5_fpga_conn *conn;
420404
....@@ -429,10 +413,10 @@
429413 struct mlx5_fpga_device *fdev = conn->fdev;
430414 struct mlx5_core_dev *mdev = fdev->mdev;
431415 u32 temp_cqc[MLX5_ST_SZ_DW(cqc)] = {0};
416
+ u32 out[MLX5_ST_SZ_DW(create_cq_out)];
432417 struct mlx5_wq_param wqp;
433418 struct mlx5_cqe64 *cqe;
434419 int inlen, err, eqn;
435
- unsigned int irqn;
436420 void *cqc, *in;
437421 __be64 *pas;
438422 u32 i;
....@@ -461,7 +445,7 @@
461445 goto err_cqwq;
462446 }
463447
464
- err = mlx5_vector2eqn(mdev, smp_processor_id(), &eqn, &irqn);
448
+ err = mlx5_vector2eqn(mdev, smp_processor_id(), &eqn);
465449 if (err) {
466450 kvfree(in);
467451 goto err_cqwq;
....@@ -478,7 +462,7 @@
478462 pas = (__be64 *)MLX5_ADDR_OF(create_cq_in, in, pas);
479463 mlx5_fill_page_frag_array(&conn->cq.wq_ctrl.buf, pas);
480464
481
- err = mlx5_core_create_cq(mdev, &conn->cq.mcq, in, inlen);
465
+ err = mlx5_core_create_cq(mdev, &conn->cq.mcq, in, inlen, out, sizeof(out));
482466 kvfree(in);
483467
484468 if (err)
....@@ -491,11 +475,8 @@
491475 *conn->cq.mcq.arm_db = 0;
492476 conn->cq.mcq.vector = 0;
493477 conn->cq.mcq.comp = mlx5_fpga_conn_cq_complete;
494
- conn->cq.mcq.event = mlx5_fpga_conn_cq_event;
495
- conn->cq.mcq.irqn = irqn;
496478 conn->cq.mcq.uar = fdev->conn_res.uar;
497
- tasklet_init(&conn->cq.tasklet, mlx5_fpga_conn_cq_tasklet,
498
- (unsigned long)conn);
479
+ tasklet_setup(&conn->cq.tasklet, mlx5_fpga_conn_cq_tasklet);
499480
500481 mlx5_fpga_dbg(fdev, "Created CQ #0x%x\n", conn->cq.mcq.cqn);
501482
....@@ -532,8 +513,9 @@
532513 unsigned int tx_size, unsigned int rx_size)
533514 {
534515 struct mlx5_fpga_device *fdev = conn->fdev;
516
+ u32 out[MLX5_ST_SZ_DW(create_qp_out)] = {};
535517 struct mlx5_core_dev *mdev = fdev->mdev;
536
- u32 temp_qpc[MLX5_ST_SZ_DW(qpc)] = {0};
518
+ u32 temp_qpc[MLX5_ST_SZ_DW(qpc)] = {};
537519 void *in = NULL, *qpc;
538520 int err, inlen;
539521
....@@ -598,12 +580,13 @@
598580 mlx5_fill_page_frag_array(&conn->qp.wq_ctrl.buf,
599581 (__be64 *)MLX5_ADDR_OF(create_qp_in, in, pas));
600582
601
- err = mlx5_core_create_qp(mdev, &conn->qp.mqp, in, inlen);
583
+ MLX5_SET(create_qp_in, in, opcode, MLX5_CMD_OP_CREATE_QP);
584
+ err = mlx5_cmd_exec(mdev, in, inlen, out, sizeof(out));
602585 if (err)
603586 goto err_sq_bufs;
604587
605
- conn->qp.mqp.event = mlx5_fpga_conn_event;
606
- mlx5_fpga_dbg(fdev, "Created QP #0x%x\n", conn->qp.mqp.qpn);
588
+ conn->qp.qpn = MLX5_GET(create_qp_out, out, qpn);
589
+ mlx5_fpga_dbg(fdev, "Created QP #0x%x\n", conn->qp.qpn);
607590
608591 goto out;
609592
....@@ -656,7 +639,13 @@
656639
657640 static void mlx5_fpga_conn_destroy_qp(struct mlx5_fpga_conn *conn)
658641 {
659
- mlx5_core_destroy_qp(conn->fdev->mdev, &conn->qp.mqp);
642
+ struct mlx5_core_dev *dev = conn->fdev->mdev;
643
+ u32 in[MLX5_ST_SZ_DW(destroy_qp_in)] = {};
644
+
645
+ MLX5_SET(destroy_qp_in, in, opcode, MLX5_CMD_OP_DESTROY_QP);
646
+ MLX5_SET(destroy_qp_in, in, qpn, conn->qp.qpn);
647
+ mlx5_cmd_exec_in(dev, destroy_qp, in);
648
+
660649 mlx5_fpga_conn_free_recv_bufs(conn);
661650 mlx5_fpga_conn_flush_send_bufs(conn);
662651 kvfree(conn->qp.sq.bufs);
....@@ -664,30 +653,29 @@
664653 mlx5_wq_destroy(&conn->qp.wq_ctrl);
665654 }
666655
667
-static inline int mlx5_fpga_conn_reset_qp(struct mlx5_fpga_conn *conn)
656
+static int mlx5_fpga_conn_reset_qp(struct mlx5_fpga_conn *conn)
668657 {
669658 struct mlx5_core_dev *mdev = conn->fdev->mdev;
659
+ u32 in[MLX5_ST_SZ_DW(qp_2rst_in)] = {};
670660
671
- mlx5_fpga_dbg(conn->fdev, "Modifying QP %u to RST\n", conn->qp.mqp.qpn);
661
+ mlx5_fpga_dbg(conn->fdev, "Modifying QP %u to RST\n", conn->qp.qpn);
672662
673
- return mlx5_core_qp_modify(mdev, MLX5_CMD_OP_2RST_QP, 0, NULL,
674
- &conn->qp.mqp);
663
+ MLX5_SET(qp_2rst_in, in, opcode, MLX5_CMD_OP_2RST_QP);
664
+ MLX5_SET(qp_2rst_in, in, qpn, conn->qp.qpn);
665
+
666
+ return mlx5_cmd_exec_in(mdev, qp_2rst, in);
675667 }
676668
677
-static inline int mlx5_fpga_conn_init_qp(struct mlx5_fpga_conn *conn)
669
+static int mlx5_fpga_conn_init_qp(struct mlx5_fpga_conn *conn)
678670 {
671
+ u32 in[MLX5_ST_SZ_DW(rst2init_qp_in)] = {};
679672 struct mlx5_fpga_device *fdev = conn->fdev;
680673 struct mlx5_core_dev *mdev = fdev->mdev;
681
- u32 *qpc = NULL;
682
- int err;
674
+ u32 *qpc;
683675
684
- mlx5_fpga_dbg(conn->fdev, "Modifying QP %u to INIT\n", conn->qp.mqp.qpn);
676
+ mlx5_fpga_dbg(conn->fdev, "Modifying QP %u to INIT\n", conn->qp.qpn);
685677
686
- qpc = kzalloc(MLX5_ST_SZ_BYTES(qpc), GFP_KERNEL);
687
- if (!qpc) {
688
- err = -ENOMEM;
689
- goto out;
690
- }
678
+ qpc = MLX5_ADDR_OF(rst2init_qp_in, in, qpc);
691679
692680 MLX5_SET(qpc, qpc, st, MLX5_QP_ST_RC);
693681 MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED);
....@@ -698,32 +686,22 @@
698686 MLX5_SET(qpc, qpc, cqn_rcv, conn->cq.mcq.cqn);
699687 MLX5_SET64(qpc, qpc, dbr_addr, conn->qp.wq_ctrl.db.dma);
700688
701
- err = mlx5_core_qp_modify(mdev, MLX5_CMD_OP_RST2INIT_QP, 0, qpc,
702
- &conn->qp.mqp);
703
- if (err) {
704
- mlx5_fpga_warn(fdev, "qp_modify RST2INIT failed: %d\n", err);
705
- goto out;
706
- }
689
+ MLX5_SET(rst2init_qp_in, in, opcode, MLX5_CMD_OP_RST2INIT_QP);
690
+ MLX5_SET(rst2init_qp_in, in, qpn, conn->qp.qpn);
707691
708
-out:
709
- kfree(qpc);
710
- return err;
692
+ return mlx5_cmd_exec_in(mdev, rst2init_qp, in);
711693 }
712694
713
-static inline int mlx5_fpga_conn_rtr_qp(struct mlx5_fpga_conn *conn)
695
+static int mlx5_fpga_conn_rtr_qp(struct mlx5_fpga_conn *conn)
714696 {
697
+ u32 in[MLX5_ST_SZ_DW(init2rtr_qp_in)] = {};
715698 struct mlx5_fpga_device *fdev = conn->fdev;
716699 struct mlx5_core_dev *mdev = fdev->mdev;
717
- u32 *qpc = NULL;
718
- int err;
700
+ u32 *qpc;
719701
720702 mlx5_fpga_dbg(conn->fdev, "QP RTR\n");
721703
722
- qpc = kzalloc(MLX5_ST_SZ_BYTES(qpc), GFP_KERNEL);
723
- if (!qpc) {
724
- err = -ENOMEM;
725
- goto out;
726
- }
704
+ qpc = MLX5_ADDR_OF(init2rtr_qp_in, in, qpc);
727705
728706 MLX5_SET(qpc, qpc, mtu, MLX5_QPC_MTU_1K_BYTES);
729707 MLX5_SET(qpc, qpc, log_msg_max, (u8)MLX5_CAP_GEN(mdev, log_max_msg));
....@@ -743,33 +721,22 @@
743721 MLX5_ADDR_OF(fpga_qpc, conn->fpga_qpc, fpga_ip),
744722 MLX5_FLD_SZ_BYTES(qpc, primary_address_path.rgid_rip));
745723
746
- err = mlx5_core_qp_modify(mdev, MLX5_CMD_OP_INIT2RTR_QP, 0, qpc,
747
- &conn->qp.mqp);
748
- if (err) {
749
- mlx5_fpga_warn(fdev, "qp_modify RST2INIT failed: %d\n", err);
750
- goto out;
751
- }
724
+ MLX5_SET(init2rtr_qp_in, in, opcode, MLX5_CMD_OP_INIT2RTR_QP);
725
+ MLX5_SET(init2rtr_qp_in, in, qpn, conn->qp.qpn);
752726
753
-out:
754
- kfree(qpc);
755
- return err;
727
+ return mlx5_cmd_exec_in(mdev, init2rtr_qp, in);
756728 }
757729
758
-static inline int mlx5_fpga_conn_rts_qp(struct mlx5_fpga_conn *conn)
730
+static int mlx5_fpga_conn_rts_qp(struct mlx5_fpga_conn *conn)
759731 {
760732 struct mlx5_fpga_device *fdev = conn->fdev;
733
+ u32 in[MLX5_ST_SZ_DW(rtr2rts_qp_in)] = {};
761734 struct mlx5_core_dev *mdev = fdev->mdev;
762
- u32 *qpc = NULL;
763
- u32 opt_mask;
764
- int err;
735
+ u32 *qpc;
765736
766737 mlx5_fpga_dbg(conn->fdev, "QP RTS\n");
767738
768
- qpc = kzalloc(MLX5_ST_SZ_BYTES(qpc), GFP_KERNEL);
769
- if (!qpc) {
770
- err = -ENOMEM;
771
- goto out;
772
- }
739
+ qpc = MLX5_ADDR_OF(rtr2rts_qp_in, in, qpc);
773740
774741 MLX5_SET(qpc, qpc, log_ack_req_freq, 8);
775742 MLX5_SET(qpc, qpc, min_rnr_nak, 0x12);
....@@ -779,17 +746,11 @@
779746 MLX5_SET(qpc, qpc, retry_count, 7);
780747 MLX5_SET(qpc, qpc, rnr_retry, 7); /* Infinite retry if RNR NACK */
781748
782
- opt_mask = MLX5_QP_OPTPAR_RNR_TIMEOUT;
783
- err = mlx5_core_qp_modify(mdev, MLX5_CMD_OP_RTR2RTS_QP, opt_mask, qpc,
784
- &conn->qp.mqp);
785
- if (err) {
786
- mlx5_fpga_warn(fdev, "qp_modify RST2INIT failed: %d\n", err);
787
- goto out;
788
- }
749
+ MLX5_SET(rtr2rts_qp_in, in, opcode, MLX5_CMD_OP_RTR2RTS_QP);
750
+ MLX5_SET(rtr2rts_qp_in, in, qpn, conn->qp.qpn);
751
+ MLX5_SET(rtr2rts_qp_in, in, opt_param_mask, MLX5_QP_OPTPAR_RNR_TIMEOUT);
789752
790
-out:
791
- kfree(qpc);
792
- return err;
753
+ return mlx5_cmd_exec_in(mdev, rtr2rts_qp, in);
793754 }
794755
795756 static int mlx5_fpga_conn_connect(struct mlx5_fpga_conn *conn)
....@@ -869,7 +830,7 @@
869830 conn->cb_arg = attr->cb_arg;
870831
871832 remote_mac = MLX5_ADDR_OF(fpga_qpc, conn->fpga_qpc, remote_mac_47_32);
872
- err = mlx5_query_nic_vport_mac_address(fdev->mdev, 0, remote_mac);
833
+ err = mlx5_query_mac_address(fdev->mdev, remote_mac);
873834 if (err) {
874835 mlx5_fpga_err(fdev, "Failed to query local MAC: %d\n", err);
875836 ret = ERR_PTR(err);
....@@ -929,7 +890,7 @@
929890 MLX5_SET(fpga_qpc, conn->fpga_qpc, next_rcv_psn, 1);
930891 MLX5_SET(fpga_qpc, conn->fpga_qpc, next_send_psn, 0);
931892 MLX5_SET(fpga_qpc, conn->fpga_qpc, pkey, MLX5_FPGA_PKEY);
932
- MLX5_SET(fpga_qpc, conn->fpga_qpc, remote_qpn, conn->qp.mqp.qpn);
893
+ MLX5_SET(fpga_qpc, conn->fpga_qpc, remote_qpn, conn->qp.qpn);
933894 MLX5_SET(fpga_qpc, conn->fpga_qpc, rnr_retry, 7);
934895 MLX5_SET(fpga_qpc, conn->fpga_qpc, retry_count, 7);
935896
....@@ -970,19 +931,11 @@
970931
971932 void mlx5_fpga_conn_destroy(struct mlx5_fpga_conn *conn)
972933 {
973
- struct mlx5_fpga_device *fdev = conn->fdev;
974
- struct mlx5_core_dev *mdev = fdev->mdev;
975
- int err = 0;
976
-
977934 conn->qp.active = false;
978935 tasklet_disable(&conn->cq.tasklet);
979936 synchronize_irq(conn->cq.mcq.irqn);
980937
981938 mlx5_fpga_destroy_qp(conn->fdev->mdev, conn->fpga_qpn);
982
- err = mlx5_core_qp_modify(mdev, MLX5_CMD_OP_2ERR_QP, 0, NULL,
983
- &conn->qp.mqp);
984
- if (err)
985
- mlx5_fpga_warn(fdev, "qp_modify 2ERR failed: %d\n", err);
986939 mlx5_fpga_conn_destroy_qp(conn);
987940 mlx5_fpga_conn_destroy_cq(conn);
988941