net/mlx5: support connection tracking between two ports
[dpdk.git] / drivers / common / octeontx2 / hw / otx2_npc.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4
5 #ifndef __OTX2_NPC_HW_H__
6 #define __OTX2_NPC_HW_H__
7
8 /* Register offsets */
9
10 #define NPC_AF_CFG                                   (0x0ull)
11 #define NPC_AF_ACTIVE_PC                             (0x10ull)
12 #define NPC_AF_CONST                                 (0x20ull)
13 #define NPC_AF_CONST1                                (0x30ull)
14 #define NPC_AF_BLK_RST                               (0x40ull)
15 #define NPC_AF_MCAM_SCRUB_CTL                        (0xa0ull)
16 #define NPC_AF_KCAM_SCRUB_CTL                        (0xb0ull)
17 #define NPC_AF_KPUX_CFG(a)                           \
18         (0x500ull | (uint64_t)(a) << 3)
19 #define NPC_AF_PCK_CFG                               (0x600ull)
20 #define NPC_AF_PCK_DEF_OL2                           (0x610ull)
21 #define NPC_AF_PCK_DEF_OIP4                          (0x620ull)
22 #define NPC_AF_PCK_DEF_OIP6                          (0x630ull)
23 #define NPC_AF_PCK_DEF_IIP4                          (0x640ull)
24 #define NPC_AF_KEX_LDATAX_FLAGS_CFG(a)               \
25         (0x800ull | (uint64_t)(a) << 3)
26 #define NPC_AF_INTFX_KEX_CFG(a)                      \
27         (0x1010ull | (uint64_t)(a) << 8)
28 #define NPC_AF_PKINDX_ACTION0(a)                     \
29         (0x80000ull | (uint64_t)(a) << 6)
30 #define NPC_AF_PKINDX_ACTION1(a)                     \
31         (0x80008ull | (uint64_t)(a) << 6)
32 #define NPC_AF_PKINDX_CPI_DEFX(a, b)                 \
33         (0x80020ull | (uint64_t)(a) << 6 | (uint64_t)(b) << 3)
34 #define NPC_AF_CHLEN90B_PKIND                        (0x3bull)
35 #define NPC_AF_KPUX_ENTRYX_CAMX(a, b, c)             \
36         (0x100000ull | (uint64_t)(a) << 14 | (uint64_t)(b) << 6 | \
37         (uint64_t)(c) << 3)
38 #define NPC_AF_KPUX_ENTRYX_ACTION0(a, b)             \
39         (0x100020ull | (uint64_t)(a) << 14 | (uint64_t)(b) << 6)
40 #define NPC_AF_KPUX_ENTRYX_ACTION1(a, b)             \
41         (0x100028ull | (uint64_t)(a) << 14 | (uint64_t)(b) << 6)
42 #define NPC_AF_KPUX_ENTRY_DISX(a, b)                 \
43         (0x180000ull | (uint64_t)(a) << 6 | (uint64_t)(b) << 3)
44 #define NPC_AF_CPIX_CFG(a)                           \
45         (0x200000ull | (uint64_t)(a) << 3)
46 #define NPC_AF_INTFX_LIDX_LTX_LDX_CFG(a, b, c, d)    \
47         (0x900000ull | (uint64_t)(a) << 16 | (uint64_t)(b) << 12 | \
48         (uint64_t)(c) << 5 | (uint64_t)(d) << 3)
49 #define NPC_AF_INTFX_LDATAX_FLAGSX_CFG(a, b, c)      \
50         (0x980000ull | (uint64_t)(a) << 16 | (uint64_t)(b) << 12 | \
51         (uint64_t)(c) << 3)
52 #define NPC_AF_MCAMEX_BANKX_CAMX_INTF(a, b, c)       \
53         (0x1000000ull | (uint64_t)(a) << 10 | (uint64_t)(b) << 6 | \
54         (uint64_t)(c) << 3)
55 #define NPC_AF_MCAMEX_BANKX_CAMX_W0(a, b, c)         \
56         (0x1000010ull | (uint64_t)(a) << 10 | (uint64_t)(b) << 6 | \
57         (uint64_t)(c) << 3)
58 #define NPC_AF_MCAMEX_BANKX_CAMX_W1(a, b, c)         \
59         (0x1000020ull | (uint64_t)(a) << 10 | (uint64_t)(b) << 6 | \
60         (uint64_t)(c) << 3)
61 #define NPC_AF_MCAMEX_BANKX_CFG(a, b)                \
62         (0x1800000ull | (uint64_t)(a) << 8 | (uint64_t)(b) << 4)
63 #define NPC_AF_MCAMEX_BANKX_STAT_ACT(a, b)           \
64         (0x1880000ull | (uint64_t)(a) << 8 | (uint64_t)(b) << 4)
65 #define NPC_AF_MATCH_STATX(a)                        \
66         (0x1880008ull | (uint64_t)(a) << 8)
67 #define NPC_AF_INTFX_MISS_STAT_ACT(a)                \
68         (0x1880040ull + (uint64_t)(a) * 0x8)
69 #define NPC_AF_MCAMEX_BANKX_ACTION(a, b)             \
70         (0x1900000ull | (uint64_t)(a) << 8 | (uint64_t)(b) << 4)
71 #define NPC_AF_MCAMEX_BANKX_TAG_ACT(a, b)            \
72         (0x1900008ull | (uint64_t)(a) << 8 | (uint64_t)(b) << 4)
73 #define NPC_AF_INTFX_MISS_ACT(a)                     \
74         (0x1a00000ull | (uint64_t)(a) << 4)
75 #define NPC_AF_INTFX_MISS_TAG_ACT(a)                 \
76         (0x1b00008ull | (uint64_t)(a) << 4)
77 #define NPC_AF_MCAM_BANKX_HITX(a, b)                 \
78         (0x1c80000ull | (uint64_t)(a) << 8 | (uint64_t)(b) << 4)
79 #define NPC_AF_LKUP_CTL                              (0x2000000ull)
80 #define NPC_AF_LKUP_DATAX(a)                         \
81         (0x2000200ull | (uint64_t)(a) << 4)
82 #define NPC_AF_LKUP_RESULTX(a)                       \
83         (0x2000400ull | (uint64_t)(a) << 4)
84 #define NPC_AF_INTFX_STAT(a)                         \
85         (0x2000800ull | (uint64_t)(a) << 4)
86 #define NPC_AF_DBG_CTL                               (0x3000000ull)
87 #define NPC_AF_DBG_STATUS                            (0x3000010ull)
88 #define NPC_AF_KPUX_DBG(a)                           \
89         (0x3000020ull | (uint64_t)(a) << 8)
90 #define NPC_AF_IKPU_ERR_CTL                          (0x3000080ull)
91 #define NPC_AF_KPUX_ERR_CTL(a)                       \
92         (0x30000a0ull | (uint64_t)(a) << 8)
93 #define NPC_AF_MCAM_DBG                              (0x3001000ull)
94 #define NPC_AF_DBG_DATAX(a)                          \
95         (0x3001400ull | (uint64_t)(a) << 4)
96 #define NPC_AF_DBG_RESULTX(a)                        \
97         (0x3001800ull | (uint64_t)(a) << 4)
98
99
100 /* Enum offsets */
101
102 #define NPC_INTF_NIX0_RX    (0x0ull)
103 #define NPC_INTF_NIX0_TX    (0x1ull)
104
105 #define NPC_LKUPOP_PKT      (0x0ull)
106 #define NPC_LKUPOP_KEY      (0x1ull)
107
108 #define NPC_MCAM_KEY_X1     (0x0ull)
109 #define NPC_MCAM_KEY_X2     (0x1ull)
110 #define NPC_MCAM_KEY_X4     (0x2ull)
111
112 enum NPC_ERRLEV_E {
113         NPC_ERRLEV_RE = 0,
114         NPC_ERRLEV_LA = 1,
115         NPC_ERRLEV_LB = 2,
116         NPC_ERRLEV_LC = 3,
117         NPC_ERRLEV_LD = 4,
118         NPC_ERRLEV_LE = 5,
119         NPC_ERRLEV_LF = 6,
120         NPC_ERRLEV_LG = 7,
121         NPC_ERRLEV_LH = 8,
122         NPC_ERRLEV_R9 = 9,
123         NPC_ERRLEV_R10 = 10,
124         NPC_ERRLEV_R11 = 11,
125         NPC_ERRLEV_R12 = 12,
126         NPC_ERRLEV_R13 = 13,
127         NPC_ERRLEV_R14 = 14,
128         NPC_ERRLEV_NIX = 15,
129         NPC_ERRLEV_ENUM_LAST = 16,
130 };
131
132 enum npc_kpu_err_code {
133         NPC_EC_NOERR = 0, /* has to be zero */
134         NPC_EC_UNK,
135         NPC_EC_IH_LENGTH,
136         NPC_EC_EDSA_UNK,
137         NPC_EC_L2_K1,
138         NPC_EC_L2_K2,
139         NPC_EC_L2_K3,
140         NPC_EC_L2_K3_ETYPE_UNK,
141         NPC_EC_L2_K4,
142         NPC_EC_MPLS_2MANY,
143         NPC_EC_MPLS_UNK,
144         NPC_EC_NSH_UNK,
145         NPC_EC_IP_TTL_0,
146         NPC_EC_IP_FRAG_OFFSET_1,
147         NPC_EC_IP_VER,
148         NPC_EC_IP6_HOP_0,
149         NPC_EC_IP6_VER,
150         NPC_EC_TCP_FLAGS_FIN_ONLY,
151         NPC_EC_TCP_FLAGS_ZERO,
152         NPC_EC_TCP_FLAGS_RST_FIN,
153         NPC_EC_TCP_FLAGS_URG_SYN,
154         NPC_EC_TCP_FLAGS_RST_SYN,
155         NPC_EC_TCP_FLAGS_SYN_FIN,
156         NPC_EC_VXLAN,
157         NPC_EC_NVGRE,
158         NPC_EC_GRE,
159         NPC_EC_GRE_VER1,
160         NPC_EC_L4,
161         NPC_EC_OIP4_CSUM,
162         NPC_EC_IIP4_CSUM,
163         NPC_EC_LAST /* has to be the last item */
164 };
165
166 enum NPC_LID_E {
167         NPC_LID_LA = 0,
168         NPC_LID_LB,
169         NPC_LID_LC,
170         NPC_LID_LD,
171         NPC_LID_LE,
172         NPC_LID_LF,
173         NPC_LID_LG,
174         NPC_LID_LH,
175 };
176
177 #define NPC_LT_NA 0
178
179 enum npc_kpu_la_ltype {
180         NPC_LT_LA_8023 = 1,
181         NPC_LT_LA_ETHER,
182         NPC_LT_LA_IH_NIX_ETHER,
183         NPC_LT_LA_IH_8_ETHER,
184         NPC_LT_LA_IH_4_ETHER,
185         NPC_LT_LA_IH_2_ETHER,
186         NPC_LT_LA_HIGIG2_ETHER,
187         NPC_LT_LA_IH_NIX_HIGIG2_ETHER,
188         NPC_LT_LA_CUSTOM_L2_90B_ETHER,
189         NPC_LT_LA_CPT_HDR,
190         NPC_LT_LA_CUSTOM_L2_24B_ETHER,
191         NPC_LT_LA_CUSTOM0 = 0xE,
192         NPC_LT_LA_CUSTOM1 = 0xF,
193 };
194
195 enum npc_kpu_lb_ltype {
196         NPC_LT_LB_ETAG = 1,
197         NPC_LT_LB_CTAG,
198         NPC_LT_LB_STAG_QINQ,
199         NPC_LT_LB_BTAG,
200         NPC_LT_LB_ITAG,
201         NPC_LT_LB_DSA,
202         NPC_LT_LB_DSA_VLAN,
203         NPC_LT_LB_EDSA,
204         NPC_LT_LB_EDSA_VLAN,
205         NPC_LT_LB_EXDSA,
206         NPC_LT_LB_EXDSA_VLAN,
207         NPC_LT_LB_FDSA,
208         NPC_LT_LB_VLAN_EXDSA,
209         NPC_LT_LB_CUSTOM0 = 0xE,
210         NPC_LT_LB_CUSTOM1 = 0xF,
211 };
212
213 enum npc_kpu_lc_ltype {
214         NPC_LT_LC_PTP = 1,
215         NPC_LT_LC_IP,
216         NPC_LT_LC_IP_OPT,
217         NPC_LT_LC_IP6,
218         NPC_LT_LC_IP6_EXT,
219         NPC_LT_LC_ARP,
220         NPC_LT_LC_RARP,
221         NPC_LT_LC_MPLS,
222         NPC_LT_LC_NSH,
223         NPC_LT_LC_FCOE,
224         NPC_LT_LC_NGIO,
225         NPC_LT_LC_CUSTOM0 = 0xE,
226         NPC_LT_LC_CUSTOM1 = 0xF,
227 };
228
229 /* Don't modify Ltypes up to SCTP, otherwise it will
230  * effect flow tag calculation and thus RSS.
231  */
232 enum npc_kpu_ld_ltype {
233         NPC_LT_LD_TCP = 1,
234         NPC_LT_LD_UDP,
235         NPC_LT_LD_ICMP,
236         NPC_LT_LD_SCTP,
237         NPC_LT_LD_ICMP6,
238         NPC_LT_LD_CUSTOM0,
239         NPC_LT_LD_CUSTOM1,
240         NPC_LT_LD_IGMP = 8,
241         NPC_LT_LD_AH,
242         NPC_LT_LD_GRE,
243         NPC_LT_LD_NVGRE,
244         NPC_LT_LD_NSH,
245         NPC_LT_LD_TU_MPLS_IN_NSH,
246         NPC_LT_LD_TU_MPLS_IN_IP,
247 };
248
249 enum npc_kpu_le_ltype {
250         NPC_LT_LE_VXLAN = 1,
251         NPC_LT_LE_GENEVE,
252         NPC_LT_LE_ESP,
253         NPC_LT_LE_GTPU = 4,
254         NPC_LT_LE_VXLANGPE,
255         NPC_LT_LE_GTPC,
256         NPC_LT_LE_NSH,
257         NPC_LT_LE_TU_MPLS_IN_GRE,
258         NPC_LT_LE_TU_NSH_IN_GRE,
259         NPC_LT_LE_TU_MPLS_IN_UDP,
260         NPC_LT_LE_CUSTOM0 = 0xE,
261         NPC_LT_LE_CUSTOM1 = 0xF,
262 };
263
264 enum npc_kpu_lf_ltype {
265         NPC_LT_LF_TU_ETHER = 1,
266         NPC_LT_LF_TU_PPP,
267         NPC_LT_LF_TU_MPLS_IN_VXLANGPE,
268         NPC_LT_LF_TU_NSH_IN_VXLANGPE,
269         NPC_LT_LF_TU_MPLS_IN_NSH,
270         NPC_LT_LF_TU_3RD_NSH,
271         NPC_LT_LF_CUSTOM0 = 0xE,
272         NPC_LT_LF_CUSTOM1 = 0xF,
273 };
274
275 enum npc_kpu_lg_ltype {
276         NPC_LT_LG_TU_IP = 1,
277         NPC_LT_LG_TU_IP6,
278         NPC_LT_LG_TU_ARP,
279         NPC_LT_LG_TU_ETHER_IN_NSH,
280         NPC_LT_LG_CUSTOM0 = 0xE,
281         NPC_LT_LG_CUSTOM1 = 0xF,
282 };
283
284 /* Don't modify Ltypes up to SCTP, otherwise it will
285  * effect flow tag calculation and thus RSS.
286  */
287 enum npc_kpu_lh_ltype {
288         NPC_LT_LH_TU_TCP = 1,
289         NPC_LT_LH_TU_UDP,
290         NPC_LT_LH_TU_ICMP,
291         NPC_LT_LH_TU_SCTP,
292         NPC_LT_LH_TU_ICMP6,
293         NPC_LT_LH_TU_IGMP = 8,
294         NPC_LT_LH_TU_ESP,
295         NPC_LT_LH_TU_AH,
296         NPC_LT_LH_CUSTOM0 = 0xE,
297         NPC_LT_LH_CUSTOM1 = 0xF,
298 };
299
300 /* Structures definitions */
301 struct npc_kpu_profile_cam {
302         uint8_t state;
303         uint8_t state_mask;
304         uint16_t dp0;
305         uint16_t dp0_mask;
306         uint16_t dp1;
307         uint16_t dp1_mask;
308         uint16_t dp2;
309         uint16_t dp2_mask;
310 };
311
312 struct npc_kpu_profile_action {
313         uint8_t errlev;
314         uint8_t errcode;
315         uint8_t dp0_offset;
316         uint8_t dp1_offset;
317         uint8_t dp2_offset;
318         uint8_t bypass_count;
319         uint8_t parse_done;
320         uint8_t next_state;
321         uint8_t ptr_advance;
322         uint8_t cap_ena;
323         uint8_t lid;
324         uint8_t ltype;
325         uint8_t flags;
326         uint8_t offset;
327         uint8_t mask;
328         uint8_t right;
329         uint8_t shift;
330 };
331
332 struct npc_kpu_profile {
333         int cam_entries;
334         int action_entries;
335         struct npc_kpu_profile_cam *cam;
336         struct npc_kpu_profile_action *action;
337 };
338
339 /* NPC KPU register formats */
340 struct npc_kpu_cam {
341         uint64_t dp0_data       : 16;
342         uint64_t dp1_data       : 16;
343         uint64_t dp2_data       : 16;
344         uint64_t state          : 8;
345         uint64_t rsvd_63_56     : 8;
346 };
347
348 struct npc_kpu_action0 {
349         uint64_t var_len_shift  : 3;
350         uint64_t var_len_right  : 1;
351         uint64_t var_len_mask   : 8;
352         uint64_t var_len_offset : 8;
353         uint64_t ptr_advance    : 8;
354         uint64_t capture_flags  : 8;
355         uint64_t capture_ltype  : 4;
356         uint64_t capture_lid    : 3;
357         uint64_t rsvd_43        : 1;
358         uint64_t next_state     : 8;
359         uint64_t parse_done     : 1;
360         uint64_t capture_ena    : 1;
361         uint64_t byp_count      : 3;
362         uint64_t rsvd_63_57     : 7;
363 };
364
365 struct npc_kpu_action1 {
366         uint64_t dp0_offset     : 8;
367         uint64_t dp1_offset     : 8;
368         uint64_t dp2_offset     : 8;
369         uint64_t errcode        : 8;
370         uint64_t errlev         : 4;
371         uint64_t rsvd_63_36     : 28;
372 };
373
374 struct npc_kpu_pkind_cpi_def {
375         uint64_t cpi_base       : 10;
376         uint64_t rsvd_11_10     : 2;
377         uint64_t add_shift      : 3;
378         uint64_t rsvd_15        : 1;
379         uint64_t add_mask       : 8;
380         uint64_t add_offset     : 8;
381         uint64_t flags_mask     : 8;
382         uint64_t flags_match    : 8;
383         uint64_t ltype_mask     : 4;
384         uint64_t ltype_match    : 4;
385         uint64_t lid            : 3;
386         uint64_t rsvd_62_59     : 4;
387         uint64_t ena            : 1;
388 };
389
390 struct nix_rx_action {
391         uint64_t op      :4;
392         uint64_t pf_func     :16;
393         uint64_t index       :20;
394         uint64_t match_id    :16;
395         uint64_t flow_key_alg    :5;
396         uint64_t rsvd_63_61  :3;
397 };
398
399 struct nix_tx_action {
400         uint64_t        op              :4;
401         uint64_t        rsvd_11_4       :8;
402         uint64_t        index           :20;
403         uint64_t        match_id        :16;
404         uint64_t        rsvd_63_48      :16;
405 };
406
407 /* NPC layer parse information structure */
408 struct npc_layer_info_s {
409         uint32_t lptr       : 8;
410         uint32_t flags      : 8;
411         uint32_t ltype      : 4;
412         uint32_t rsvd_31_20 : 12;
413 };
414
415 /* NPC layer mcam search key extract structure */
416 struct npc_layer_kex_s {
417         uint16_t flags      : 8;
418         uint16_t ltype      : 4;
419         uint16_t rsvd_15_12 : 4;
420 };
421
422 /* NPC mcam search key x1 structure */
423 struct npc_mcam_key_x1_s {
424         uint64_t intf         : 2;
425         uint64_t rsvd_63_2    : 62;
426         uint64_t kw0          : 64;  /* W1 */
427         uint64_t kw1          : 48;
428         uint64_t rsvd_191_176 : 16;
429 };
430
431 /* NPC mcam search key x2 structure */
432 struct npc_mcam_key_x2_s {
433         uint64_t intf         : 2;
434         uint64_t rsvd_63_2    : 62;
435         uint64_t kw0          : 64;  /* W1 */
436         uint64_t kw1          : 64;  /* W2 */
437         uint64_t kw2          : 64;  /* W3 */
438         uint64_t kw3          : 32;
439         uint64_t rsvd_319_288 : 32;
440 };
441
442 /* NPC mcam search key x4 structure */
443 struct npc_mcam_key_x4_s {
444         uint64_t intf      : 2;
445         uint64_t rsvd_63_2 : 62;
446         uint64_t kw0       : 64;     /* W1 */
447         uint64_t kw1       : 64;     /* W2 */
448         uint64_t kw2       : 64;     /* W3 */
449         uint64_t kw3       : 64;     /* W4 */
450         uint64_t kw4       : 64;     /* W5 */
451         uint64_t kw5       : 64;     /* W6 */
452         uint64_t kw6       : 64;     /* W7 */
453 };
454
455 /* NPC parse key extract structure */
456 struct npc_parse_kex_s {
457         uint64_t chan         : 12;
458         uint64_t errlev       : 4;
459         uint64_t errcode      : 8;
460         uint64_t l2m          : 1;
461         uint64_t l2b          : 1;
462         uint64_t l3m          : 1;
463         uint64_t l3b          : 1;
464         uint64_t la           : 12;
465         uint64_t lb           : 12;
466         uint64_t lc           : 12;
467         uint64_t ld           : 12;
468         uint64_t le           : 12;
469         uint64_t lf           : 12;
470         uint64_t lg           : 12;
471         uint64_t lh           : 12;
472         uint64_t rsvd_127_124 : 4;
473 };
474
475 /* NPC result structure */
476 struct npc_result_s {
477         uint64_t intf         : 2;
478         uint64_t pkind        : 6;
479         uint64_t chan         : 12;
480         uint64_t errlev       : 4;
481         uint64_t errcode      : 8;
482         uint64_t l2m          : 1;
483         uint64_t l2b          : 1;
484         uint64_t l3m          : 1;
485         uint64_t l3b          : 1;
486         uint64_t eoh_ptr      : 8;
487         uint64_t rsvd_63_44   : 20;
488         uint64_t action       : 64;  /* W1 */
489         uint64_t vtag_action  : 64;  /* W2 */
490         uint64_t la           : 20;
491         uint64_t lb           : 20;
492         uint64_t lc           : 20;
493         uint64_t rsvd_255_252 : 4;
494         uint64_t ld           : 20;
495         uint64_t le           : 20;
496         uint64_t lf           : 20;
497         uint64_t rsvd_319_316 : 4;
498         uint64_t lg           : 20;
499         uint64_t lh           : 20;
500         uint64_t rsvd_383_360 : 24;
501 };
502
503 #endif /* __OTX2_NPC_HW_H__ */