|
@@ -754,13 +754,13 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
|
|
|
int err;
|
|
|
|
|
|
ucmdlen = udata->inlen < sizeof(ucmd) ?
|
|
|
- (sizeof(ucmd) - sizeof(ucmd.reserved)) : sizeof(ucmd);
|
|
|
+ (sizeof(ucmd) - sizeof(ucmd.flags)) : sizeof(ucmd);
|
|
|
|
|
|
if (ib_copy_from_udata(&ucmd, udata, ucmdlen))
|
|
|
return -EFAULT;
|
|
|
|
|
|
if (ucmdlen == sizeof(ucmd) &&
|
|
|
- ucmd.reserved != 0)
|
|
|
+ (ucmd.flags & ~(MLX5_IB_CREATE_CQ_FLAGS_CQE_128B_PAD)))
|
|
|
return -EINVAL;
|
|
|
|
|
|
if (ucmd.cqe_size != 64 && ucmd.cqe_size != 128)
|
|
@@ -830,6 +830,19 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
|
|
|
ilog2(ucmd.cqe_comp_res_format));
|
|
|
}
|
|
|
|
|
|
+ if (ucmd.flags & MLX5_IB_CREATE_CQ_FLAGS_CQE_128B_PAD) {
|
|
|
+ if (*cqe_size != 128 ||
|
|
|
+ !MLX5_CAP_GEN(dev->mdev, cqe_128_always)) {
|
|
|
+ err = -EOPNOTSUPP;
|
|
|
+ mlx5_ib_warn(dev,
|
|
|
+ "CQE padding is not supported for CQE size of %dB!\n",
|
|
|
+ *cqe_size);
|
|
|
+ goto err_cqb;
|
|
|
+ }
|
|
|
+
|
|
|
+ cq->private_flags |= MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
err_cqb:
|
|
@@ -989,7 +1002,10 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
|
|
|
cq->cqe_size = cqe_size;
|
|
|
|
|
|
cqc = MLX5_ADDR_OF(create_cq_in, cqb, cq_context);
|
|
|
- MLX5_SET(cqc, cqc, cqe_sz, cqe_sz_to_mlx_sz(cqe_size));
|
|
|
+ MLX5_SET(cqc, cqc, cqe_sz,
|
|
|
+ cqe_sz_to_mlx_sz(cqe_size,
|
|
|
+ cq->private_flags &
|
|
|
+ MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD));
|
|
|
MLX5_SET(cqc, cqc, log_cq_size, ilog2(entries));
|
|
|
MLX5_SET(cqc, cqc, uar_page, index);
|
|
|
MLX5_SET(cqc, cqc, c_eqn, eqn);
|
|
@@ -1339,7 +1355,10 @@ int mlx5_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
|
|
|
|
|
|
MLX5_SET(cqc, cqc, log_page_size,
|
|
|
page_shift - MLX5_ADAPTER_PAGE_SHIFT);
|
|
|
- MLX5_SET(cqc, cqc, cqe_sz, cqe_sz_to_mlx_sz(cqe_size));
|
|
|
+ MLX5_SET(cqc, cqc, cqe_sz,
|
|
|
+ cqe_sz_to_mlx_sz(cqe_size,
|
|
|
+ cq->private_flags &
|
|
|
+ MLX5_IB_CQ_PR_FLAGS_CQE_128_PAD));
|
|
|
MLX5_SET(cqc, cqc, log_cq_size, ilog2(entries));
|
|
|
|
|
|
MLX5_SET(modify_cq_in, in, op_mod, MLX5_CQ_OPMOD_RESIZE);
|