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 | |
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')
-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; |