net/mlx5: Add QP WQ support
authorIlan Tayari <ilant@mellanox.com>
Sun, 26 Mar 2017 14:46:03 +0000 (17:46 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Tue, 27 Jun 2017 13:36:47 +0000 (16:36 +0300)
A QP in ConnectX is a concatenation of RQ and SQ which share a QP-number
and work together.
Add support for allocating and managing the work-queue buffer for a QP, in
a similar way to how SQs and RQs are already supported.

Signed-off-by: Ilan Tayari <ilant@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/wq.c
drivers/net/ethernet/mellanox/mlx5/core/wq.h

index 921673c42bc98b3335ab65ed9b63737fe18f29e1..6bcfc25350f564d39b038a7ba5bf3054994f40c8 100644 (file)
@@ -54,6 +54,12 @@ static u32 mlx5_wq_cyc_get_byte_size(struct mlx5_wq_cyc *wq)
        return mlx5_wq_cyc_get_size(wq) << wq->log_stride;
 }
 
+static u32 mlx5_wq_qp_get_byte_size(struct mlx5_wq_qp *wq)
+{
+       return mlx5_wq_cyc_get_byte_size(&wq->rq) +
+              mlx5_wq_cyc_get_byte_size(&wq->sq);
+}
+
 static u32 mlx5_cqwq_get_byte_size(struct mlx5_cqwq *wq)
 {
        return mlx5_cqwq_get_size(wq) << wq->log_stride;
@@ -99,6 +105,46 @@ err_db_free:
        return err;
 }
 
+int mlx5_wq_qp_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
+                     void *qpc, struct mlx5_wq_qp *wq,
+                     struct mlx5_wq_ctrl *wq_ctrl)
+{
+       int err;
+
+       wq->rq.log_stride = MLX5_GET(qpc, qpc, log_rq_stride) + 4;
+       wq->rq.sz_m1 = (1 << MLX5_GET(qpc, qpc, log_rq_size)) - 1;
+
+       wq->sq.log_stride = ilog2(MLX5_SEND_WQE_BB);
+       wq->sq.sz_m1 = (1 << MLX5_GET(qpc, qpc, log_sq_size)) - 1;
+
+       err = mlx5_db_alloc_node(mdev, &wq_ctrl->db, param->db_numa_node);
+       if (err) {
+               mlx5_core_warn(mdev, "mlx5_db_alloc_node() failed, %d\n", err);
+               return err;
+       }
+
+       err = mlx5_buf_alloc_node(mdev, mlx5_wq_qp_get_byte_size(wq),
+                                 &wq_ctrl->buf, param->buf_numa_node);
+       if (err) {
+               mlx5_core_warn(mdev, "mlx5_buf_alloc_node() failed, %d\n", err);
+               goto err_db_free;
+       }
+
+       wq->rq.buf = wq_ctrl->buf.direct.buf;
+       wq->sq.buf = wq->rq.buf + mlx5_wq_cyc_get_byte_size(&wq->rq);
+       wq->rq.db  = &wq_ctrl->db.db[MLX5_RCV_DBR];
+       wq->sq.db  = &wq_ctrl->db.db[MLX5_SND_DBR];
+
+       wq_ctrl->mdev = mdev;
+
+       return 0;
+
+err_db_free:
+       mlx5_db_free(mdev, &wq_ctrl->db);
+
+       return err;
+}
+
 int mlx5_cqwq_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
                     void *cqc, struct mlx5_cqwq *wq,
                     struct mlx5_frag_wq_ctrl *wq_ctrl)
index 9ded5d40ce6bf47a7c8d6ab3530e7edd81d2d1b7..718589d0cec283c8ef2c94968fa658c57b43170a 100644 (file)
@@ -35,6 +35,7 @@
 
 #include <linux/mlx5/mlx5_ifc.h>
 #include <linux/mlx5/cq.h>
+#include <linux/mlx5/qp.h>
 
 struct mlx5_wq_param {
        int             linear;
@@ -61,6 +62,11 @@ struct mlx5_wq_cyc {
        u8                      log_stride;
 };
 
+struct mlx5_wq_qp {
+       struct mlx5_wq_cyc      rq;
+       struct mlx5_wq_cyc      sq;
+};
+
 struct mlx5_cqwq {
        struct mlx5_frag_buf    frag_buf;
        __be32                  *db;
@@ -88,6 +94,10 @@ int mlx5_wq_cyc_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
                       struct mlx5_wq_ctrl *wq_ctrl);
 u32 mlx5_wq_cyc_get_size(struct mlx5_wq_cyc *wq);
 
+int mlx5_wq_qp_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
+                     void *qpc, struct mlx5_wq_qp *wq,
+                     struct mlx5_wq_ctrl *wq_ctrl);
+
 int mlx5_cqwq_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
                     void *cqc, struct mlx5_cqwq *wq,
                     struct mlx5_frag_wq_ctrl *wq_ctrl);