diff options
| author | Sagi Grimberg <sagig@mellanox.com> | 2014-02-23 07:19:11 -0500 |
|---|---|---|
| committer | Roland Dreier <roland@purestorage.com> | 2014-03-07 14:39:51 -0500 |
| commit | e6631814fb3ac454fbbf47ea343c2b9508e4e1ba (patch) | |
| tree | dfe554c9fbe5f3f4f0a37276a74180bf2f4e9fd2 /include/linux/mlx5 | |
| parent | 3bcdb17a5e88288ead90be3c107e754a6075a5b0 (diff) | |
IB/mlx5: Support IB_WR_REG_SIG_MR
This patch implements IB_WR_REG_SIG_MR posted by the user.
Baisically this WR involves 3 WQEs in order to prepare and properly
register the signature layout:
1. post UMR WR to register the sig_mr in one of two possible ways:
* In case the user registered a single MR for data so the UMR data segment
consists of:
- single klm (data MR) passed by the user
- BSF with signature attributes requested by the user.
* In case the user registered 2 MRs, one for data and one for protection,
the UMR consists of:
- strided block format which includes data and protection MRs and
their repetitive block format.
- BSF with signature attributes requested by the user.
2. post SET_PSV in order to set the memory domain initial
signature parameters passed by the user.
SET_PSV is not signaled and solicited CQE.
3. post SET_PSV in order to set the wire domain initial
signature parameters passed by the user.
SET_PSV is not signaled and solicited CQE.
* After this compound WR we place a small fence for next WR to come.
This patch also introduces some helper functions to set the BSF correctly
and determining the signature format selectors.
Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'include/linux/mlx5')
| -rw-r--r-- | include/linux/mlx5/qp.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/include/linux/mlx5/qp.h b/include/linux/mlx5/qp.h index 152756eaa8a3..49af74f90ef9 100644 --- a/include/linux/mlx5/qp.h +++ b/include/linux/mlx5/qp.h | |||
| @@ -38,6 +38,8 @@ | |||
| 38 | 38 | ||
| 39 | #define MLX5_INVALID_LKEY 0x100 | 39 | #define MLX5_INVALID_LKEY 0x100 |
| 40 | #define MLX5_SIG_WQE_SIZE (MLX5_SEND_WQE_BB * 5) | 40 | #define MLX5_SIG_WQE_SIZE (MLX5_SEND_WQE_BB * 5) |
| 41 | #define MLX5_DIF_SIZE 8 | ||
| 42 | #define MLX5_STRIDE_BLOCK_OP 0x400 | ||
| 41 | 43 | ||
| 42 | enum mlx5_qp_optpar { | 44 | enum mlx5_qp_optpar { |
| 43 | MLX5_QP_OPTPAR_ALT_ADDR_PATH = 1 << 0, | 45 | MLX5_QP_OPTPAR_ALT_ADDR_PATH = 1 << 0, |
| @@ -152,6 +154,11 @@ enum { | |||
| 152 | MLX5_SND_DBR = 1, | 154 | MLX5_SND_DBR = 1, |
| 153 | }; | 155 | }; |
| 154 | 156 | ||
| 157 | enum { | ||
| 158 | MLX5_FLAGS_INLINE = 1<<7, | ||
| 159 | MLX5_FLAGS_CHECK_FREE = 1<<5, | ||
| 160 | }; | ||
| 161 | |||
| 155 | struct mlx5_wqe_fmr_seg { | 162 | struct mlx5_wqe_fmr_seg { |
| 156 | __be32 flags; | 163 | __be32 flags; |
| 157 | __be32 mem_key; | 164 | __be32 mem_key; |
| @@ -279,6 +286,60 @@ struct mlx5_wqe_inline_seg { | |||
| 279 | __be32 byte_count; | 286 | __be32 byte_count; |
| 280 | }; | 287 | }; |
| 281 | 288 | ||
| 289 | struct mlx5_bsf { | ||
| 290 | struct mlx5_bsf_basic { | ||
| 291 | u8 bsf_size_sbs; | ||
| 292 | u8 check_byte_mask; | ||
| 293 | union { | ||
| 294 | u8 copy_byte_mask; | ||
| 295 | u8 bs_selector; | ||
| 296 | u8 rsvd_wflags; | ||
| 297 | } wire; | ||
| 298 | union { | ||
| 299 | u8 bs_selector; | ||
| 300 | u8 rsvd_mflags; | ||
| 301 | } mem; | ||
| 302 | __be32 raw_data_size; | ||
| 303 | __be32 w_bfs_psv; | ||
| 304 | __be32 m_bfs_psv; | ||
| 305 | } basic; | ||
| 306 | struct mlx5_bsf_ext { | ||
| 307 | __be32 t_init_gen_pro_size; | ||
| 308 | __be32 rsvd_epi_size; | ||
| 309 | __be32 w_tfs_psv; | ||
| 310 | __be32 m_tfs_psv; | ||
| 311 | } ext; | ||
| 312 | struct mlx5_bsf_inl { | ||
| 313 | __be32 w_inl_vld; | ||
| 314 | __be32 w_rsvd; | ||
| 315 | __be64 w_block_format; | ||
| 316 | __be32 m_inl_vld; | ||
| 317 | __be32 m_rsvd; | ||
| 318 | __be64 m_block_format; | ||
| 319 | } inl; | ||
| 320 | }; | ||
| 321 | |||
| 322 | struct mlx5_klm { | ||
| 323 | __be32 bcount; | ||
| 324 | __be32 key; | ||
| 325 | __be64 va; | ||
| 326 | }; | ||
| 327 | |||
| 328 | struct mlx5_stride_block_entry { | ||
| 329 | __be16 stride; | ||
| 330 | __be16 bcount; | ||
| 331 | __be32 key; | ||
| 332 | __be64 va; | ||
| 333 | }; | ||
| 334 | |||
| 335 | struct mlx5_stride_block_ctrl_seg { | ||
| 336 | __be32 bcount_per_cycle; | ||
| 337 | __be32 op; | ||
| 338 | __be32 repeat_count; | ||
| 339 | u16 rsvd; | ||
| 340 | __be16 num_entries; | ||
| 341 | }; | ||
| 342 | |||
| 282 | struct mlx5_core_qp { | 343 | struct mlx5_core_qp { |
| 283 | void (*event) (struct mlx5_core_qp *, int); | 344 | void (*event) (struct mlx5_core_qp *, int); |
| 284 | int qpn; | 345 | int qpn; |
