• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) */
2  /*
3   * Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved.
4   */
5  
6  #ifndef _RDMA_SIGNATURE_H_
7  #define _RDMA_SIGNATURE_H_
8  
9  #include <linux/types.h>
10  
11  enum ib_signature_prot_cap {
12  	IB_PROT_T10DIF_TYPE_1 = 1,
13  	IB_PROT_T10DIF_TYPE_2 = 1 << 1,
14  	IB_PROT_T10DIF_TYPE_3 = 1 << 2,
15  };
16  
17  enum ib_signature_guard_cap {
18  	IB_GUARD_T10DIF_CRC	= 1,
19  	IB_GUARD_T10DIF_CSUM	= 1 << 1,
20  };
21  
22  /**
23   * enum ib_signature_type - Signature types
24   * @IB_SIG_TYPE_NONE: Unprotected.
25   * @IB_SIG_TYPE_T10_DIF: Type T10-DIF
26   */
27  enum ib_signature_type {
28  	IB_SIG_TYPE_NONE,
29  	IB_SIG_TYPE_T10_DIF,
30  };
31  
32  /**
33   * enum ib_t10_dif_bg_type - Signature T10-DIF block-guard types
34   * @IB_T10DIF_CRC: Corresponds to T10-PI mandated CRC checksum rules.
35   * @IB_T10DIF_CSUM: Corresponds to IP checksum rules.
36   */
37  enum ib_t10_dif_bg_type {
38  	IB_T10DIF_CRC,
39  	IB_T10DIF_CSUM,
40  };
41  
42  /**
43   * struct ib_t10_dif_domain - Parameters specific for T10-DIF
44   *     domain.
45   * @bg_type: T10-DIF block guard type (CRC|CSUM)
46   * @pi_interval: protection information interval.
47   * @bg: seed of guard computation.
48   * @app_tag: application tag of guard block
49   * @ref_tag: initial guard block reference tag.
50   * @ref_remap: Indicate wethear the reftag increments each block
51   * @app_escape: Indicate to skip block check if apptag=0xffff
52   * @ref_escape: Indicate to skip block check if reftag=0xffffffff
53   * @apptag_check_mask: check bitmask of application tag.
54   */
55  struct ib_t10_dif_domain {
56  	enum ib_t10_dif_bg_type bg_type;
57  	u16			pi_interval;
58  	u16			bg;
59  	u16			app_tag;
60  	u32			ref_tag;
61  	bool			ref_remap;
62  	bool			app_escape;
63  	bool			ref_escape;
64  	u16			apptag_check_mask;
65  };
66  
67  /**
68   * struct ib_sig_domain - Parameters for signature domain
69   * @sig_type: specific signauture type
70   * @sig: union of all signature domain attributes that may
71   *     be used to set domain layout.
72   */
73  struct ib_sig_domain {
74  	enum ib_signature_type sig_type;
75  	union {
76  		struct ib_t10_dif_domain dif;
77  	} sig;
78  };
79  
80  /**
81   * struct ib_sig_attrs - Parameters for signature handover operation
82   * @check_mask: bitmask for signature byte check (8 bytes)
83   * @mem: memory domain layout descriptor.
84   * @wire: wire domain layout descriptor.
85   * @meta_length: metadata length
86   */
87  struct ib_sig_attrs {
88  	u8			check_mask;
89  	struct ib_sig_domain	mem;
90  	struct ib_sig_domain	wire;
91  	int			meta_length;
92  };
93  
94  enum ib_sig_err_type {
95  	IB_SIG_BAD_GUARD,
96  	IB_SIG_BAD_REFTAG,
97  	IB_SIG_BAD_APPTAG,
98  };
99  
100  /*
101   * Signature check masks (8 bytes in total) according to the T10-PI standard:
102   *  -------- -------- ------------
103   * | GUARD  | APPTAG |   REFTAG   |
104   * |  2B    |  2B    |    4B      |
105   *  -------- -------- ------------
106   */
107  enum {
108  	IB_SIG_CHECK_GUARD = 0xc0,
109  	IB_SIG_CHECK_APPTAG = 0x30,
110  	IB_SIG_CHECK_REFTAG = 0x0f,
111  };
112  
113  /*
114   * struct ib_sig_err - signature error descriptor
115   */
116  struct ib_sig_err {
117  	enum ib_sig_err_type	err_type;
118  	u32			expected;
119  	u32			actual;
120  	u64			sig_err_offset;
121  	u32			key;
122  };
123  
124  #endif /* _RDMA_SIGNATURE_H_ */
125