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 | |