12320f0cedca5bfd7376a598317b19ec61fc0eb5
[dpdk.git] / drivers / common / cnxk / roc_npc_priv.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4
5 #ifndef _ROC_NPC_PRIV_H_
6 #define _ROC_NPC_PRIV_H_
7
8 #define NPC_IH_LENGTH        8
9 #define NPC_TPID_LENGTH      2
10 #define NPC_HIGIG2_LENGTH    16
11 #define NPC_MAX_RAW_ITEM_LEN 16
12 #define NPC_COUNTER_NONE     (-1)
13
14 #define NPC_RSS_GRPS 8
15
16 #define NPC_ACTION_FLAG_DEFAULT 0xffff
17
18 #define NPC_PFVF_FUNC_MASK 0x3FF
19
20 /* 32 bytes from LDATA_CFG & 32 bytes from FLAGS_CFG */
21 #define NPC_MAX_EXTRACT_DATA_LEN (64)
22 #define NPC_MAX_EXTRACT_HW_LEN   (4 * NPC_MAX_EXTRACT_DATA_LEN)
23 #define NPC_LDATA_LFLAG_LEN      (16)
24 #define NPC_MAX_KEY_NIBBLES      (31)
25
26 /* Nibble offsets */
27 #define NPC_LAYER_KEYX_SZ         (3)
28 #define NPC_PARSE_KEX_S_LA_OFFSET (7)
29 #define NPC_PARSE_KEX_S_LID_OFFSET(lid)                                        \
30         ((((lid) - (NPC_LID_LA)) * NPC_LAYER_KEYX_SZ) +                        \
31          NPC_PARSE_KEX_S_LA_OFFSET)
32
33 /* This mark value indicates flag action */
34 #define NPC_FLOW_FLAG_VAL (0xffff)
35
36 #define NPC_RX_ACT_MATCH_OFFSET (40)
37 #define NPC_RX_ACT_MATCH_MASK   (0xFFFF)
38
39 #define NPC_RSS_ACT_GRP_OFFSET (20)
40 #define NPC_RSS_ACT_ALG_OFFSET (56)
41 #define NPC_RSS_ACT_GRP_MASK   (0xFFFFF)
42 #define NPC_RSS_ACT_ALG_MASK   (0x1F)
43
44 #define NPC_MCAM_KEX_FIELD_MAX    23
45 #define NPC_MCAM_MAX_PROTO_FIELDS (NPC_MCAM_KEX_FIELD_MAX + 1)
46 #define NPC_MCAM_KEY_X4_WORDS     7 /* Number of 64-bit words */
47
48 #define NPC_RVUPF_MAX_9XXX 0x10 /* HRM: RVU_PRIV_CONST */
49 #define NPC_RVUPF_MAX_98XX 0x18 /* HRM: RVU_PRIV_CONST */
50 #define NPC_RVUPF_MAX_10XX 0x20 /* HRM: RVU_PRIV_CONST */
51 #define NPC_NIXLF_MAX      0x80 /* HRM: NIX_AF_CONST2 */
52 #define NPC_MCAME_PER_PF   3    /* DRV: RSVD_MCAM_ENTRIES_PER_PF */
53 #define NPC_MCAME_PER_LF   1    /* DRV: RSVD_MCAM_ENTRIES_PER_NIXLF */
54 #define NPC_NIXLF_MAX_98XX (2 * NPC_NIXLF_MAX) /*2 NIXLFs */
55 #define NPC_MCAME_RESVD_9XXX                                                   \
56         (NPC_NIXLF_MAX * NPC_MCAME_PER_LF +                                    \
57          (NPC_RVUPF_MAX_9XXX - 1) * NPC_MCAME_PER_PF)
58
59 #define NPC_MCAME_RESVD_10XX                                                   \
60         (NPC_NIXLF_MAX * NPC_MCAME_PER_LF +                                    \
61          (NPC_RVUPF_MAX_10XX - 1) * NPC_MCAME_PER_PF)
62
63 #define NPC_MCAME_RESVD_98XX                                                   \
64         (NPC_NIXLF_MAX_98XX * NPC_MCAME_PER_LF +                               \
65          (NPC_RVUPF_MAX_98XX - 1) * NPC_MCAME_PER_PF)
66
67 #define NPC_ACTION_MAX_VLAN_PARAMS    3
68 #define NPC_ACTION_MAX_VLANS_STRIPPED 2
69
70 #define NPC_LTYPE_OFFSET_START 7
71 /* LB OFFSET : START + LA (2b flags + 1b ltype) + LB (2b flags) */
72 #define NPC_LTYPE_LB_OFFSET (NPC_LTYPE_OFFSET_START + 5)
73 #define NPC_LFLAG_LB_OFFSET (NPC_LTYPE_OFFSET_START + 3)
74
75 struct npc_action_vtag_info {
76         uint16_t vlan_id;
77         uint16_t vlan_ethtype;
78         uint8_t vlan_pcp;
79 };
80
81 enum npc_err_status {
82         NPC_ERR_PARAM = -1024,
83         NPC_ERR_NO_MEM,
84         NPC_ERR_INVALID_SPEC,
85         NPC_ERR_INVALID_MASK,
86         NPC_ERR_INVALID_RANGE,
87         NPC_ERR_INVALID_KEX,
88         NPC_ERR_INVALID_SIZE,
89         NPC_ERR_INTERNAL,
90         NPC_ERR_MCAM_ALLOC,
91         NPC_ERR_ACTION_NOTSUP,
92         NPC_ERR_PATTERN_NOTSUP,
93 };
94
95 enum npc_mcam_intf { NPC_MCAM_RX, NPC_MCAM_TX };
96
97 typedef union npc_kex_cap_terms_t {
98         struct {
99                 /** Total length of received packet */
100                 uint64_t len : 1;
101                 /** Initial (outer) Ethertype only */
102                 uint64_t ethtype_0 : 1;
103                 /** Ethertype of most inner VLAN tag */
104                 uint64_t ethtype_x : 1;
105                 /** First VLAN ID (outer) */
106                 uint64_t vlan_id_0 : 1;
107                 /** Last VLAN ID (inner) */
108                 uint64_t vlan_id_x : 1;
109                 /** destination MAC address */
110                 uint64_t dmac : 1;
111                 /** IP Protocol or IPv6 Next Header */
112                 uint64_t ip_proto : 1;
113                 /** Destination UDP port, implies IPPROTO=17 */
114                 uint64_t udp_dport : 1;
115                 /** Destination TCP port implies IPPROTO=6 */
116                 uint64_t tcp_dport : 1;
117                 /** Source UDP Port */
118                 uint64_t udp_sport : 1;
119                 /** Source TCP port */
120                 uint64_t tcp_sport : 1;
121                 /** Source IP address */
122                 uint64_t sip_addr : 1;
123                 /** Destination IP address */
124                 uint64_t dip_addr : 1;
125                 /** Source IP address */
126                 uint64_t sip6_addr : 1;
127                 /** Destination IP address */
128                 uint64_t dip6_addr : 1;
129                 /** IPsec session identifier */
130                 uint64_t ipsec_spi : 1;
131                 /** NVGRE/VXLAN network identifier */
132                 uint64_t ld_vni : 1;
133                 /** Custom frame match rule. PMR offset is counted from
134                  *  the start of the packet.
135                  */
136                 uint64_t custom_frame : 1;
137                 /** Custom layer 3 match rule. PMR offset is counted from
138                  *  the start of layer 3 in the packet.
139                  */
140                 uint64_t custom_l3 : 1;
141                 /** IGMP Group address */
142                 uint64_t igmp_grp_addr : 1;
143                 /** ICMP identifier */
144                 uint64_t icmp_id : 1;
145                 /** ICMP type */
146                 uint64_t icmp_type : 1;
147                 /** ICMP code */
148                 uint64_t icmp_code : 1;
149                 /** Source SCTP port */
150                 uint64_t sctp_sport : 1;
151                 /** Destination SCTP port */
152                 uint64_t sctp_dport : 1;
153                 /** GTPU Tunnel endpoint identifier */
154                 uint64_t gtpu_teid : 1;
155
156         } bit;
157         /** All bits of the bit field structure */
158         uint64_t all_bits;
159 } npc_kex_cap_terms_t;
160
161 struct npc_parse_item_info {
162         const void *def_mask; /* default mask */
163         void *hw_mask;        /* hardware supported mask */
164         int len;              /* length of item */
165         const void *spec;     /* spec to use, NULL implies match any */
166         const void *mask;     /* mask to use */
167         uint8_t hw_hdr_len;   /* Extra data len at each layer*/
168 };
169
170 struct npc_parse_state {
171         struct npc *npc;
172         const struct roc_npc_item_info *pattern;
173         const struct roc_npc_item_info *last_pattern;
174         struct roc_npc_flow *flow;
175         uint8_t nix_intf;
176         uint8_t tunnel;
177         uint8_t terminate;
178         uint8_t layer_mask;
179         uint8_t lt[NPC_MAX_LID];
180         uint8_t flags[NPC_MAX_LID];
181         uint8_t *mcam_data; /* point to flow->mcam_data + key_len */
182         uint8_t *mcam_mask; /* point to flow->mcam_mask + key_len */
183         bool is_vf;
184         /* adjust ltype in MCAM to match at least one vlan */
185         bool set_vlan_ltype_mask;
186 };
187
188 enum npc_kpu_parser_flag {
189         NPC_F_NA = 0,
190         NPC_F_PKI,
191         NPC_F_PKI_VLAN,
192         NPC_F_PKI_ETAG,
193         NPC_F_PKI_ITAG,
194         NPC_F_PKI_MPLS,
195         NPC_F_PKI_NSH,
196         NPC_F_ETYPE_UNK,
197         NPC_F_ETHER_VLAN,
198         NPC_F_ETHER_ETAG,
199         NPC_F_ETHER_ITAG,
200         NPC_F_ETHER_MPLS,
201         NPC_F_ETHER_NSH,
202         NPC_F_STAG_CTAG,
203         NPC_F_STAG_CTAG_UNK,
204         NPC_F_STAG_STAG_CTAG,
205         NPC_F_STAG_STAG_STAG,
206         NPC_F_QINQ_CTAG,
207         NPC_F_QINQ_CTAG_UNK,
208         NPC_F_QINQ_QINQ_CTAG,
209         NPC_F_QINQ_QINQ_QINQ,
210         NPC_F_BTAG_ITAG,
211         NPC_F_BTAG_ITAG_STAG,
212         NPC_F_BTAG_ITAG_CTAG,
213         NPC_F_BTAG_ITAG_UNK,
214         NPC_F_ETAG_CTAG,
215         NPC_F_ETAG_BTAG_ITAG,
216         NPC_F_ETAG_STAG,
217         NPC_F_ETAG_QINQ,
218         NPC_F_ETAG_ITAG,
219         NPC_F_ETAG_ITAG_STAG,
220         NPC_F_ETAG_ITAG_CTAG,
221         NPC_F_ETAG_ITAG_UNK,
222         NPC_F_ITAG_STAG_CTAG,
223         NPC_F_ITAG_STAG,
224         NPC_F_ITAG_CTAG,
225         NPC_F_MPLS_4_LABELS,
226         NPC_F_MPLS_3_LABELS,
227         NPC_F_MPLS_2_LABELS,
228         NPC_F_IP_HAS_OPTIONS,
229         NPC_F_IP_IP_IN_IP,
230         NPC_F_IP_6TO4,
231         NPC_F_IP_MPLS_IN_IP,
232         NPC_F_IP_UNK_PROTO,
233         NPC_F_IP_IP_IN_IP_HAS_OPTIONS,
234         NPC_F_IP_6TO4_HAS_OPTIONS,
235         NPC_F_IP_MPLS_IN_IP_HAS_OPTIONS,
236         NPC_F_IP_UNK_PROTO_HAS_OPTIONS,
237         NPC_F_IP6_HAS_EXT,
238         NPC_F_IP6_TUN_IP6,
239         NPC_F_IP6_MPLS_IN_IP,
240         NPC_F_TCP_HAS_OPTIONS,
241         NPC_F_TCP_HTTP,
242         NPC_F_TCP_HTTPS,
243         NPC_F_TCP_PPTP,
244         NPC_F_TCP_UNK_PORT,
245         NPC_F_TCP_HTTP_HAS_OPTIONS,
246         NPC_F_TCP_HTTPS_HAS_OPTIONS,
247         NPC_F_TCP_PPTP_HAS_OPTIONS,
248         NPC_F_TCP_UNK_PORT_HAS_OPTIONS,
249         NPC_F_UDP_VXLAN,
250         NPC_F_UDP_VXLAN_NOVNI,
251         NPC_F_UDP_VXLAN_NOVNI_NSH,
252         NPC_F_UDP_VXLANGPE,
253         NPC_F_UDP_VXLANGPE_NSH,
254         NPC_F_UDP_VXLANGPE_MPLS,
255         NPC_F_UDP_VXLANGPE_NOVNI,
256         NPC_F_UDP_VXLANGPE_NOVNI_NSH,
257         NPC_F_UDP_VXLANGPE_NOVNI_MPLS,
258         NPC_F_UDP_VXLANGPE_UNK,
259         NPC_F_UDP_VXLANGPE_NONP,
260         NPC_F_UDP_GTP_GTPC,
261         NPC_F_UDP_GTP_GTPU_G_PDU,
262         NPC_F_UDP_GTP_GTPU_UNK,
263         NPC_F_UDP_UNK_PORT,
264         NPC_F_UDP_GENEVE,
265         NPC_F_UDP_GENEVE_OAM,
266         NPC_F_UDP_GENEVE_CRI_OPT,
267         NPC_F_UDP_GENEVE_OAM_CRI_OPT,
268         NPC_F_GRE_NVGRE,
269         NPC_F_GRE_HAS_SRE,
270         NPC_F_GRE_HAS_CSUM,
271         NPC_F_GRE_HAS_KEY,
272         NPC_F_GRE_HAS_SEQ,
273         NPC_F_GRE_HAS_CSUM_KEY,
274         NPC_F_GRE_HAS_CSUM_SEQ,
275         NPC_F_GRE_HAS_KEY_SEQ,
276         NPC_F_GRE_HAS_CSUM_KEY_SEQ,
277         NPC_F_GRE_HAS_ROUTE,
278         NPC_F_GRE_UNK_PROTO,
279         NPC_F_GRE_VER1,
280         NPC_F_GRE_VER1_HAS_SEQ,
281         NPC_F_GRE_VER1_HAS_ACK,
282         NPC_F_GRE_VER1_HAS_SEQ_ACK,
283         NPC_F_GRE_VER1_UNK_PROTO,
284         NPC_F_TU_ETHER_UNK,
285         NPC_F_TU_ETHER_CTAG,
286         NPC_F_TU_ETHER_CTAG_UNK,
287         NPC_F_TU_ETHER_STAG_CTAG,
288         NPC_F_TU_ETHER_STAG_CTAG_UNK,
289         NPC_F_TU_ETHER_STAG,
290         NPC_F_TU_ETHER_STAG_UNK,
291         NPC_F_TU_ETHER_QINQ_CTAG,
292         NPC_F_TU_ETHER_QINQ_CTAG_UNK,
293         NPC_F_TU_ETHER_QINQ,
294         NPC_F_TU_ETHER_QINQ_UNK,
295         NPC_F_LAST /* has to be the last item */
296 };
297
298 #define NPC_ACTION_TERM                                                        \
299         (ROC_NPC_ACTION_TYPE_DROP | ROC_NPC_ACTION_TYPE_QUEUE |                \
300          ROC_NPC_ACTION_TYPE_RSS | ROC_NPC_ACTION_TYPE_DUP |                   \
301          ROC_NPC_ACTION_TYPE_SEC)
302
303 struct npc_xtract_info {
304         /* Length in bytes of pkt data extracted. len = 0
305          * indicates that extraction is disabled.
306          */
307         uint8_t len;
308         uint8_t hdr_off;      /* Byte offset of proto hdr: extract_src */
309         uint8_t key_off;      /* Byte offset in MCAM key where data is placed */
310         uint8_t enable;       /* Extraction enabled or disabled */
311         uint8_t flags_enable; /* Flags extraction enabled */
312 };
313
314 /* Information for a given {LAYER, LTYPE} */
315 struct npc_lid_lt_xtract_info {
316         /* Info derived from parser configuration */
317         uint16_t npc_proto;         /* Network protocol identified */
318         uint8_t valid_flags_mask;   /* Flags applicable */
319         uint8_t is_terminating : 1; /* No more parsing */
320         struct npc_xtract_info xtract[NPC_MAX_LD];
321 };
322
323 union npc_kex_ldata_flags_cfg {
324         struct {
325                 uint64_t lid : 3;
326                 uint64_t rvsd_62_1 : 61;
327         } s;
328
329         uint64_t i;
330 };
331
332 typedef struct npc_lid_lt_xtract_info npc_dxcfg_t[NPC_MAX_INTF][NPC_MAX_LID]
333                                                  [NPC_MAX_LT];
334 typedef struct npc_lid_lt_xtract_info npc_fxcfg_t[NPC_MAX_INTF][NPC_MAX_LD]
335                                                  [NPC_MAX_LFL];
336 typedef union npc_kex_ldata_flags_cfg npc_ld_flags_t[NPC_MAX_LD];
337
338 /* MBOX_MSG_NPC_GET_DATAX_CFG Response */
339 struct npc_get_datax_cfg {
340         /* NPC_AF_KEX_LDATA(0..1)_FLAGS_CFG */
341         union npc_kex_ldata_flags_cfg ld_flags[NPC_MAX_LD];
342         /* Extract information indexed with [LID][LTYPE] */
343         struct npc_lid_lt_xtract_info lid_lt_xtract[NPC_MAX_LID][NPC_MAX_LT];
344         /* Flags based extract indexed with [LDATA][FLAGS_LOWER_NIBBLE]
345          * Fields flags_ena_ld0, flags_ena_ld1 in
346          * struct npc_lid_lt_xtract_info indicate if this is applicable
347          * for a given {LAYER, LTYPE}
348          */
349         struct npc_xtract_info flag_xtract[NPC_MAX_LD][NPC_MAX_LT];
350 };
351
352 TAILQ_HEAD(npc_flow_list, roc_npc_flow);
353
354 struct npc_prio_flow_entry {
355         struct roc_npc_flow *flow;
356         TAILQ_ENTRY(npc_prio_flow_entry) next;
357 };
358
359 TAILQ_HEAD(npc_prio_flow_list_head, npc_prio_flow_entry);
360
361 struct npc {
362         struct mbox *mbox;                      /* Mbox */
363         uint32_t keyx_supp_nmask[NPC_MAX_INTF]; /* nibble mask */
364         uint8_t profile_name[MKEX_NAME_LEN];    /* KEX profile name */
365         uint32_t keyx_len[NPC_MAX_INTF];        /* per intf key len in bits */
366         uint32_t datax_len[NPC_MAX_INTF];       /* per intf data len in bits */
367         uint32_t keyw[NPC_MAX_INTF];            /* max key + data len bits */
368         uint32_t mcam_entries;                  /* mcam entries supported */
369         uint16_t channel;                       /* RX Channel number */
370         bool is_sdp_link;
371         uint16_t sdp_channel;
372         uint16_t sdp_channel_mask;
373         uint32_t rss_grps;                      /* rss groups supported */
374         uint16_t flow_prealloc_size;            /* Pre allocated mcam size */
375         uint16_t flow_max_priority;             /* Max priority for flow */
376         uint16_t switch_header_type; /* Supported switch header type */
377         uint32_t mark_actions;       /* Number of mark actions */
378         uint32_t vtag_strip_actions; /* vtag insert/strip actions */
379         uint16_t pf_func;            /* pf_func of device */
380         npc_dxcfg_t prx_dxcfg;       /* intf, lid, lt, extract */
381         npc_fxcfg_t prx_fxcfg;       /* Flag extract */
382         npc_ld_flags_t prx_lfcfg;    /* KEX LD_Flags CFG */
383         struct npc_flow_list *flow_list;
384         struct npc_prio_flow_list_head *prio_flow_list;
385         struct plt_bitmap *rss_grp_entries;
386 };
387
388 static inline struct npc *
389 roc_npc_to_npc_priv(struct roc_npc *npc)
390 {
391         return (struct npc *)npc->reserved;
392 }
393
394 int npc_mcam_free_counter(struct npc *npc, uint16_t ctr_id);
395 int npc_mcam_read_counter(struct npc *npc, uint32_t ctr_id, uint64_t *count);
396 int npc_mcam_clear_counter(struct npc *npc, uint32_t ctr_id);
397 int npc_mcam_free_entry(struct npc *npc, uint32_t entry);
398 int npc_mcam_free_all_entries(struct npc *npc);
399 int npc_mcam_alloc_and_write(struct npc *npc, struct roc_npc_flow *flow,
400                              struct npc_parse_state *pst);
401 int npc_mcam_alloc_entry(struct npc *npc, struct roc_npc_flow *mcam,
402                          struct roc_npc_flow *ref_mcam, int prio,
403                          int *resp_count);
404 int npc_mcam_alloc_entries(struct npc *npc, int ref_mcam, int *alloc_entry,
405                            int req_count, int prio, int *resp_count);
406
407 int npc_mcam_ena_dis_entry(struct npc *npc, struct roc_npc_flow *mcam,
408                            bool enable);
409 int npc_mcam_write_entry(struct npc *npc, struct roc_npc_flow *mcam);
410 int npc_update_parse_state(struct npc_parse_state *pst,
411                            struct npc_parse_item_info *info, int lid, int lt,
412                            uint8_t flags);
413 void npc_get_hw_supp_mask(struct npc_parse_state *pst,
414                           struct npc_parse_item_info *info, int lid, int lt);
415 int npc_parse_item_basic(const struct roc_npc_item_info *item,
416                          struct npc_parse_item_info *info);
417 int npc_parse_meta_items(struct npc_parse_state *pst);
418 int npc_parse_pre_l2(struct npc_parse_state *pst);
419 int npc_parse_higig2_hdr(struct npc_parse_state *pst);
420 int npc_parse_cpt_hdr(struct npc_parse_state *pst);
421 int npc_parse_la(struct npc_parse_state *pst);
422 int npc_parse_lb(struct npc_parse_state *pst);
423 int npc_parse_lc(struct npc_parse_state *pst);
424 int npc_parse_ld(struct npc_parse_state *pst);
425 int npc_parse_le(struct npc_parse_state *pst);
426 int npc_parse_lf(struct npc_parse_state *pst);
427 int npc_parse_lg(struct npc_parse_state *pst);
428 int npc_parse_lh(struct npc_parse_state *pst);
429 int npc_mcam_fetch_kex_cfg(struct npc *npc);
430 int npc_get_free_mcam_entry(struct mbox *mbox, struct roc_npc_flow *flow,
431                             struct npc *npc);
432 void npc_delete_prio_list_entry(struct npc *npc, struct roc_npc_flow *flow);
433 int npc_flow_free_all_resources(struct npc *npc);
434 const struct roc_npc_item_info *
435 npc_parse_skip_void_and_any_items(const struct roc_npc_item_info *pattern);
436 int npc_program_mcam(struct npc *npc, struct npc_parse_state *pst,
437                      bool mcam_alloc);
438 uint64_t npc_get_kex_capability(struct npc *npc);
439 int npc_rss_free_grp_get(struct npc *npc, uint32_t *grp);
440 int npc_rss_action_configure(struct roc_npc *roc_npc,
441                              const struct roc_npc_action_rss *rss,
442                              uint8_t *alg_idx, uint32_t *rss_grp,
443                              uint32_t mcam_id);
444 int npc_rss_action_program(struct roc_npc *roc_npc,
445                            const struct roc_npc_action actions[],
446                            struct roc_npc_flow *flow);
447 int npc_rss_group_free(struct npc *npc, struct roc_npc_flow *flow);
448 #endif /* _ROC_NPC_PRIV_H_ */