|
@@ -4706,9 +4706,19 @@ static int create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,
|
|
|
MLX5_SET(rqc, rqc, state, MLX5_RQC_STATE_RST);
|
|
|
MLX5_SET(rqc, rqc, flush_in_error_en, 1);
|
|
|
wq = MLX5_ADDR_OF(rqc, rqc, wq);
|
|
|
- MLX5_SET(wq, wq, wq_type, MLX5_WQ_TYPE_CYCLIC);
|
|
|
+ MLX5_SET(wq, wq, wq_type,
|
|
|
+ rwq->create_flags & MLX5_IB_WQ_FLAGS_STRIDING_RQ ?
|
|
|
+ MLX5_WQ_TYPE_CYCLIC_STRIDING_RQ : MLX5_WQ_TYPE_CYCLIC);
|
|
|
MLX5_SET(wq, wq, end_padding_mode, MLX5_WQ_END_PAD_MODE_ALIGN);
|
|
|
MLX5_SET(wq, wq, log_wq_stride, rwq->log_rq_stride);
|
|
|
+ if (rwq->create_flags & MLX5_IB_WQ_FLAGS_STRIDING_RQ) {
|
|
|
+ MLX5_SET(wq, wq, two_byte_shift_en, rwq->two_byte_shift_en);
|
|
|
+ MLX5_SET(wq, wq, log_wqe_stride_size,
|
|
|
+ rwq->single_stride_log_num_of_bytes -
|
|
|
+ MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES);
|
|
|
+ MLX5_SET(wq, wq, log_wqe_num_of_strides, rwq->log_num_strides -
|
|
|
+ MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES);
|
|
|
+ }
|
|
|
MLX5_SET(wq, wq, log_wq_sz, rwq->log_rq_size);
|
|
|
MLX5_SET(wq, wq, pd, to_mpd(pd)->pdn);
|
|
|
MLX5_SET(wq, wq, page_offset, rwq->rq_page_offset);
|
|
@@ -4790,7 +4800,8 @@ static int prepare_user_rq(struct ib_pd *pd,
|
|
|
int err;
|
|
|
size_t required_cmd_sz;
|
|
|
|
|
|
- required_cmd_sz = offsetof(typeof(ucmd), reserved) + sizeof(ucmd.reserved);
|
|
|
+ required_cmd_sz = offsetof(typeof(ucmd), single_stride_log_num_of_bytes)
|
|
|
+ + sizeof(ucmd.single_stride_log_num_of_bytes);
|
|
|
if (udata->inlen < required_cmd_sz) {
|
|
|
mlx5_ib_dbg(dev, "invalid inlen\n");
|
|
|
return -EINVAL;
|
|
@@ -4808,14 +4819,39 @@ static int prepare_user_rq(struct ib_pd *pd,
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
|
- if (ucmd.comp_mask) {
|
|
|
+ if (ucmd.comp_mask & (~MLX5_IB_CREATE_WQ_STRIDING_RQ)) {
|
|
|
mlx5_ib_dbg(dev, "invalid comp mask\n");
|
|
|
return -EOPNOTSUPP;
|
|
|
- }
|
|
|
-
|
|
|
- if (ucmd.reserved) {
|
|
|
- mlx5_ib_dbg(dev, "invalid reserved\n");
|
|
|
- return -EOPNOTSUPP;
|
|
|
+ } else if (ucmd.comp_mask & MLX5_IB_CREATE_WQ_STRIDING_RQ) {
|
|
|
+ if (!MLX5_CAP_GEN(dev->mdev, striding_rq)) {
|
|
|
+ mlx5_ib_dbg(dev, "Striding RQ is not supported\n");
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+ }
|
|
|
+ if ((ucmd.single_stride_log_num_of_bytes <
|
|
|
+ MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES) ||
|
|
|
+ (ucmd.single_stride_log_num_of_bytes >
|
|
|
+ MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES)) {
|
|
|
+ mlx5_ib_dbg(dev, "Invalid log stride size (%u. Range is %u - %u)\n",
|
|
|
+ ucmd.single_stride_log_num_of_bytes,
|
|
|
+ MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES,
|
|
|
+ MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ if ((ucmd.single_wqe_log_num_of_strides >
|
|
|
+ MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES) ||
|
|
|
+ (ucmd.single_wqe_log_num_of_strides <
|
|
|
+ MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES)) {
|
|
|
+ mlx5_ib_dbg(dev, "Invalid log num strides (%u. Range is %u - %u)\n",
|
|
|
+ ucmd.single_wqe_log_num_of_strides,
|
|
|
+ MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES,
|
|
|
+ MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ rwq->single_stride_log_num_of_bytes =
|
|
|
+ ucmd.single_stride_log_num_of_bytes;
|
|
|
+ rwq->log_num_strides = ucmd.single_wqe_log_num_of_strides;
|
|
|
+ rwq->two_byte_shift_en = !!ucmd.two_byte_shift_en;
|
|
|
+ rwq->create_flags |= MLX5_IB_WQ_FLAGS_STRIDING_RQ;
|
|
|
}
|
|
|
|
|
|
err = set_user_rq_size(dev, init_attr, &ucmd, rwq);
|