common/cnxk: fix uninitialized pointer read
[dpdk.git] / drivers / common / cnxk / roc_ie_on.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4
5 #ifndef __ROC_IE_ON_H__
6 #define __ROC_IE_ON_H__
7
8 /* CN9K IPsec LA */
9
10 /* CN9K IPsec LA opcodes */
11 #define ROC_IE_ON_MAJOR_OP_WRITE_IPSEC_OUTBOUND   0x20
12 #define ROC_IE_ON_MAJOR_OP_WRITE_IPSEC_INBOUND    0x21
13 #define ROC_IE_ON_MAJOR_OP_PROCESS_OUTBOUND_IPSEC 0x23
14 #define ROC_IE_ON_MAJOR_OP_PROCESS_INBOUND_IPSEC  0x24
15
16 /* Ucode completion codes */
17 enum roc_ie_on_ucc_ipsec {
18         ROC_IE_ON_UCC_SUCCESS = 0,
19         ROC_IE_ON_AUTH_UNSUPPORTED = 0xB0,
20         ROC_IE_ON_ENCRYPT_UNSUPPORTED = 0xB1,
21         /* Software defined completion code for anti-replay failed packets */
22         ROC_IE_ON_SWCC_ANTI_REPLAY = 0xE7,
23 };
24
25 /* Helper macros */
26 #define ROC_IE_ON_INB_RPTR_HDR 0x8
27 #define ROC_IE_ON_MAX_IV_LEN   16
28 #define ROC_IE_ON_PER_PKT_IV   BIT(43)
29
30 enum {
31         ROC_IE_ON_SA_ENC_NULL = 0,
32         ROC_IE_ON_SA_ENC_DES_CBC = 1,
33         ROC_IE_ON_SA_ENC_3DES_CBC = 2,
34         ROC_IE_ON_SA_ENC_AES_CBC = 3,
35         ROC_IE_ON_SA_ENC_AES_CTR = 4,
36         ROC_IE_ON_SA_ENC_AES_GCM = 5,
37         ROC_IE_ON_SA_ENC_AES_CCM = 6,
38 };
39
40 enum {
41         ROC_IE_ON_SA_AUTH_NULL = 0,
42         ROC_IE_ON_SA_AUTH_MD5 = 1,
43         ROC_IE_ON_SA_AUTH_SHA1 = 2,
44         ROC_IE_ON_SA_AUTH_SHA2_224 = 3,
45         ROC_IE_ON_SA_AUTH_SHA2_256 = 4,
46         ROC_IE_ON_SA_AUTH_SHA2_384 = 5,
47         ROC_IE_ON_SA_AUTH_SHA2_512 = 6,
48         ROC_IE_ON_SA_AUTH_AES_GMAC = 7,
49         ROC_IE_ON_SA_AUTH_AES_XCBC_128 = 8,
50 };
51
52 enum {
53         ROC_IE_ON_SA_FRAG_POST = 0,
54         ROC_IE_ON_SA_FRAG_PRE = 1,
55 };
56
57 enum {
58         ROC_IE_ON_SA_ENCAP_NONE = 0,
59         ROC_IE_ON_SA_ENCAP_UDP = 1,
60 };
61
62 enum {
63         ROC_IE_ON_IV_SRC_HW_GEN_DEFAULT = 0,
64         ROC_IE_ON_IV_SRC_FROM_DPTR = 1,
65 };
66
67 struct roc_ie_on_outb_hdr {
68         uint32_t ip_id;
69         uint32_t seq;
70         uint8_t iv[16];
71 };
72
73 union roc_ie_on_bit_perfect_iv {
74         uint8_t aes_iv[16];
75         uint8_t des_iv[8];
76         struct {
77                 uint8_t nonce[4];
78                 uint8_t iv[8];
79                 uint8_t counter[4];
80         } gcm;
81 };
82
83 struct roc_ie_on_traffic_selector {
84         uint16_t src_port[2];
85         uint16_t dst_port[2];
86         union {
87                 struct {
88                         uint32_t src_addr[2];
89                         uint32_t dst_addr[2];
90                 } ipv4;
91                 struct {
92                         uint8_t src_addr[32];
93                         uint8_t dst_addr[32];
94                 } ipv6;
95         };
96 };
97
98 struct roc_ie_on_ip_template {
99         union {
100                 struct {
101                         uint8_t ipv4_hdr[20];
102                         uint16_t udp_src;
103                         uint16_t udp_dst;
104                 } ip4;
105                 struct {
106                         uint8_t ipv6_hdr[40];
107                         uint16_t udp_src;
108                         uint16_t udp_dst;
109                 } ip6;
110         };
111 };
112
113 union roc_on_ipsec_outb_param1 {
114         uint16_t u16;
115         struct {
116                 uint16_t frag_num : 4;
117                 uint16_t rsvd_4_6 : 3;
118                 uint16_t gre_select : 1;
119                 uint16_t dsiv : 1;
120                 uint16_t ikev2 : 1;
121                 uint16_t min_frag_size : 1;
122                 uint16_t per_pkt_iv : 1;
123                 uint16_t tfc_pad_enable : 1;
124                 uint16_t tfc_dummy_pkt : 1;
125                 uint16_t rfc_or_override_mode : 1;
126                 uint16_t custom_hdr_or_p99 : 1;
127         } s;
128 };
129
130 union roc_on_ipsec_inb_param2 {
131         uint16_t u16;
132         struct {
133                 uint16_t rsvd_0_10 : 11;
134                 uint16_t gre_select : 1;
135                 uint16_t ikev2 : 1;
136                 uint16_t udp_cksum : 1;
137                 uint16_t ctx_addr_sel : 1;
138                 uint16_t custom_hdr_or_p99 : 1;
139         } s;
140 };
141
142 struct roc_ie_on_sa_ctl {
143         uint64_t spi : 32;
144         uint64_t exp_proto_inter_frag : 8;
145         uint64_t copy_df : 1;
146         uint64_t frag_type : 1;
147         uint64_t explicit_iv_en : 1;
148         uint64_t esn_en : 1;
149         uint64_t rsvd_45_44 : 2;
150         uint64_t encap_type : 2;
151         uint64_t enc_type : 3;
152         uint64_t rsvd_48 : 1;
153         uint64_t auth_type : 4;
154         uint64_t valid : 1;
155         uint64_t direction : 1;
156         uint64_t outer_ip_ver : 1;
157         uint64_t inner_ip_ver : 1;
158         uint64_t ipsec_mode : 1;
159         uint64_t ipsec_proto : 1;
160         uint64_t aes_key_len : 2;
161 };
162
163 struct roc_ie_on_common_sa {
164         /* w0 */
165         struct roc_ie_on_sa_ctl ctl;
166
167         /* w1-w4 */
168         uint8_t cipher_key[32];
169
170         /* w5-w6 */
171         union roc_ie_on_bit_perfect_iv iv;
172
173         /* w7 */
174         uint32_t esn_hi;
175         uint32_t esn_low;
176 };
177
178 struct roc_ie_on_outb_sa {
179         /* w0 - w7 */
180         struct roc_ie_on_common_sa common_sa;
181
182         /* w8-w55 */
183         union {
184                 struct {
185                         struct roc_ie_on_ip_template template;
186                 } aes_gcm;
187                 struct {
188                         uint8_t hmac_key[24];
189                         uint8_t unused[24];
190                         struct roc_ie_on_ip_template template;
191                 } sha1;
192                 struct {
193                         uint8_t key[16];
194                         uint8_t unused[32];
195                         struct roc_ie_on_ip_template template;
196                 } aes_xcbc;
197                 struct {
198                         uint8_t hmac_key[64];
199                         uint8_t hmac_iv[64];
200                         struct roc_ie_on_ip_template template;
201                 } sha2;
202         };
203 };
204
205 struct roc_ie_on_inb_sa {
206         /* w0 - w7 */
207         struct roc_ie_on_common_sa common_sa;
208
209         /* w8 */
210         uint8_t udp_encap[8];
211
212         /* w9-w33 */
213         union {
214                 struct {
215                         uint8_t hmac_key[48];
216                         struct roc_ie_on_traffic_selector selector;
217                 } sha1_or_gcm;
218                 struct {
219                         uint8_t key[16];
220                         uint8_t unused[32];
221                         struct roc_ie_on_traffic_selector selector;
222                 } aes_xcbc;
223                 struct {
224                         uint8_t hmac_key[64];
225                         uint8_t hmac_iv[64];
226                         struct roc_ie_on_traffic_selector selector;
227                 } sha2;
228         };
229 };
230
231 /* CN9K IPsec FP */
232
233 /* CN9K IPsec FP opcodes */
234 #define ROC_IE_ONF_MAJOR_OP_PROCESS_OUTBOUND_IPSEC 0x25UL
235 #define ROC_IE_ONF_MAJOR_OP_PROCESS_INBOUND_IPSEC  0x26UL
236
237 /* Ucode completion codes */
238 #define ROC_IE_ON_UCC_SUCCESS             0
239 #define ROC_IE_ON_UCC_ENC_TYPE_ERR        0xB1
240 #define ROC_IE_ON_UCC_IP_VER_ERR          0xB2
241 #define ROC_IE_ON_UCC_PROTO_ERR           0xB3
242 #define ROC_IE_ON_UCC_CTX_INVALID         0xB4
243 #define ROC_IE_ON_UCC_CTX_DIR_MISMATCH    0xB5
244 #define ROC_IE_ON_UCC_IP_PAYLOAD_TYPE_ERR 0xB6
245 #define ROC_IE_ON_UCC_CTX_FLAG_MISMATCH   0xB7
246 #define ROC_IE_ON_UCC_SPI_MISMATCH        0xBE
247 #define ROC_IE_ON_UCC_IP_CHKSUM_ERR       0xBF
248 #define ROC_IE_ON_UCC_AUTH_ERR            0xC3
249 #define ROC_IE_ON_UCC_PADDING_INVALID     0xC4
250 #define ROC_IE_ON_UCC_SA_MISMATCH         0xCC
251 #define ROC_IE_ON_UCC_L2_HDR_INFO_ERR     0xCF
252 #define ROC_IE_ON_UCC_L2_HDR_LEN_ERR      0xE0
253
254 struct roc_ie_onf_sa_ctl {
255         uint32_t spi;
256         uint64_t exp_proto_inter_frag : 8;
257         uint64_t rsvd_41_40 : 2;
258         /* Disable SPI, SEQ data in RPTR for Inbound inline */
259         uint64_t spi_seq_dis : 1;
260         uint64_t esn_en : 1;
261         uint64_t rsvd_44_45 : 2;
262         uint64_t encap_type : 2;
263         uint64_t enc_type : 3;
264         uint64_t rsvd_48 : 1;
265         uint64_t auth_type : 4;
266         uint64_t valid : 1;
267         uint64_t direction : 1;
268         uint64_t outer_ip_ver : 1;
269         uint64_t inner_ip_ver : 1;
270         uint64_t ipsec_mode : 1;
271         uint64_t ipsec_proto : 1;
272         uint64_t aes_key_len : 2;
273 };
274
275 struct roc_onf_ipsec_outb_sa {
276         /* w0 */
277         struct roc_ie_onf_sa_ctl ctl;
278
279         /* w1 */
280         uint8_t nonce[4];
281         uint16_t udp_src;
282         uint16_t udp_dst;
283
284         /* w2 */
285         uint32_t ip_src;
286         uint32_t ip_dst;
287
288         /* w3-w6 */
289         uint8_t cipher_key[32];
290
291         /* w7-w12 */
292         uint8_t hmac_key[48];
293 };
294
295 struct roc_onf_ipsec_inb_sa {
296         /* w0 */
297         struct roc_ie_onf_sa_ctl ctl;
298
299         /* w1 */
300         uint8_t nonce[4]; /* Only for AES-GCM */
301         uint32_t unused;
302
303         /* w2 */
304         uint32_t esn_hi;
305         uint32_t esn_low;
306
307         /* w3-w6 */
308         uint8_t cipher_key[32];
309
310         /* w7-w12 */
311         uint8_t hmac_key[48];
312 };
313
314 #define ROC_ONF_IPSEC_INB_MAX_L2_SZ       32UL
315 #define ROC_ONF_IPSEC_OUTB_MAX_L2_SZ      30UL
316 #define ROC_ONF_IPSEC_OUTB_MAX_L2_INFO_SZ (ROC_ONF_IPSEC_OUTB_MAX_L2_SZ + 2)
317
318 #define ROC_ONF_IPSEC_INB_RES_OFF    80
319 #define ROC_ONF_IPSEC_INB_SPI_SEQ_SZ 16
320
321 struct roc_onf_ipsec_outb_hdr {
322         uint32_t ip_id;
323         uint32_t seq;
324         uint8_t iv[16];
325 };
326
327 #endif /* __ROC_IE_ON_H__ */