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