net/mlx5: Add QP WQ support
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>
This commit is contained in:
parent
4b67379376
commit
3f2b7edd7c
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue