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