Commit c16339b6 authored by Mark Zhang's avatar Mark Zhang Committed by Jason Gunthorpe

IB/mlx5: Support extended number of strides for Striding RQ

Extends the minimum single WQE strides from 64 to 8, which is exposed
by the "min_single_wqe_log_num_of_strides" field of striding_rq_caps.
Choose right number of strides based on FW capability.

Link: https://lore.kernel.org/r/20191115154555.247856-1-leon@kernel.orgSigned-off-by: default avatarMark Zhang <markz@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent ff3195b3
...@@ -1149,8 +1149,14 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, ...@@ -1149,8 +1149,14 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES; MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES;
resp.striding_rq_caps.max_single_stride_log_num_of_bytes = resp.striding_rq_caps.max_single_stride_log_num_of_bytes =
MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES; MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES;
resp.striding_rq_caps.min_single_wqe_log_num_of_strides = if (MLX5_CAP_GEN(dev->mdev, ext_stride_num_range))
MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES; resp.striding_rq_caps
.min_single_wqe_log_num_of_strides =
MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES;
else
resp.striding_rq_caps
.min_single_wqe_log_num_of_strides =
MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES;
resp.striding_rq_caps.max_single_wqe_log_num_of_strides = resp.striding_rq_caps.max_single_wqe_log_num_of_strides =
MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES; MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES;
resp.striding_rq_caps.supported_qpts = resp.striding_rq_caps.supported_qpts =
......
...@@ -291,6 +291,7 @@ enum mlx5_ib_wq_flags { ...@@ -291,6 +291,7 @@ enum mlx5_ib_wq_flags {
#define MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES 16 #define MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES 16
#define MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES 6 #define MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES 6
#define MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES 13 #define MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES 13
#define MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES 3
struct mlx5_ib_rwq { struct mlx5_ib_rwq {
struct ib_wq ibwq; struct ib_wq ibwq;
......
...@@ -5957,12 +5957,21 @@ static int create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd, ...@@ -5957,12 +5957,21 @@ static int create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,
} }
MLX5_SET(wq, wq, log_wq_stride, rwq->log_rq_stride); MLX5_SET(wq, wq, log_wq_stride, rwq->log_rq_stride);
if (rwq->create_flags & MLX5_IB_WQ_FLAGS_STRIDING_RQ) { if (rwq->create_flags & MLX5_IB_WQ_FLAGS_STRIDING_RQ) {
/*
* In Firmware number of strides in each WQE is:
* "512 * 2^single_wqe_log_num_of_strides"
* Values 3 to 8 are accepted as 10 to 15, 9 to 18 are
* accepted as 0 to 9
*/
static const u8 fw_map[] = { 10, 11, 12, 13, 14, 15, 0, 1,
2, 3, 4, 5, 6, 7, 8, 9 };
MLX5_SET(wq, wq, two_byte_shift_en, rwq->two_byte_shift_en); MLX5_SET(wq, wq, two_byte_shift_en, rwq->two_byte_shift_en);
MLX5_SET(wq, wq, log_wqe_stride_size, MLX5_SET(wq, wq, log_wqe_stride_size,
rwq->single_stride_log_num_of_bytes - rwq->single_stride_log_num_of_bytes -
MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES); MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES);
MLX5_SET(wq, wq, log_wqe_num_of_strides, rwq->log_num_strides - MLX5_SET(wq, wq, log_wqe_num_of_strides,
MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES); fw_map[rwq->log_num_strides -
MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES]);
} }
MLX5_SET(wq, wq, log_wq_sz, rwq->log_rq_size); MLX5_SET(wq, wq, log_wq_sz, rwq->log_rq_size);
MLX5_SET(wq, wq, pd, to_mpd(pd)->pdn); MLX5_SET(wq, wq, pd, to_mpd(pd)->pdn);
...@@ -6037,6 +6046,19 @@ static int set_user_rq_size(struct mlx5_ib_dev *dev, ...@@ -6037,6 +6046,19 @@ static int set_user_rq_size(struct mlx5_ib_dev *dev,
return 0; return 0;
} }
static bool log_of_strides_valid(struct mlx5_ib_dev *dev, u32 log_num_strides)
{
if ((log_num_strides > MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES) ||
(log_num_strides < MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES))
return false;
if (!MLX5_CAP_GEN(dev->mdev, ext_stride_num_range) &&
(log_num_strides < MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES))
return false;
return true;
}
static int prepare_user_rq(struct ib_pd *pd, static int prepare_user_rq(struct ib_pd *pd,
struct ib_wq_init_attr *init_attr, struct ib_wq_init_attr *init_attr,
struct ib_udata *udata, struct ib_udata *udata,
...@@ -6084,14 +6106,16 @@ static int prepare_user_rq(struct ib_pd *pd, ...@@ -6084,14 +6106,16 @@ static int prepare_user_rq(struct ib_pd *pd,
MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES); MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES);
return -EINVAL; return -EINVAL;
} }
if ((ucmd.single_wqe_log_num_of_strides > if (!log_of_strides_valid(dev,
MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES) || ucmd.single_wqe_log_num_of_strides)) {
(ucmd.single_wqe_log_num_of_strides < mlx5_ib_dbg(
MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES)) { dev,
mlx5_ib_dbg(dev, "Invalid log num strides (%u. Range is %u - %u)\n", "Invalid log num strides (%u. Range is %u - %u)\n",
ucmd.single_wqe_log_num_of_strides, ucmd.single_wqe_log_num_of_strides,
MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES, MLX5_CAP_GEN(dev->mdev, ext_stride_num_range) ?
MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES); MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES :
MLX5_MIN_SINGLE_WQE_LOG_NUM_STRIDES,
MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES);
return -EINVAL; return -EINVAL;
} }
rwq->single_stride_log_num_of_bytes = rwq->single_stride_log_num_of_bytes =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment