xref: /dpdk/drivers/common/cnxk/roc_npc_priv.h (revision 29a8df5cb664feb6f182c07868c49c0f5c9a4c46)
12199f5cdSKiran Kumar K /* SPDX-License-Identifier: BSD-3-Clause
22199f5cdSKiran Kumar K  * Copyright(C) 2021 Marvell.
32199f5cdSKiran Kumar K  */
42199f5cdSKiran Kumar K 
52199f5cdSKiran Kumar K #ifndef _ROC_NPC_PRIV_H_
62199f5cdSKiran Kumar K #define _ROC_NPC_PRIV_H_
72199f5cdSKiran Kumar K 
82199f5cdSKiran Kumar K #define NPC_IH_LENGTH	     8
92199f5cdSKiran Kumar K #define NPC_TPID_LENGTH	     2
102199f5cdSKiran Kumar K #define NPC_HIGIG2_LENGTH    16
11612ce5cfSSatheesh Paul #define NPC_MAX_RAW_ITEM_LEN 16
122199f5cdSKiran Kumar K #define NPC_COUNTER_NONE     (-1)
132199f5cdSKiran Kumar K 
142199f5cdSKiran Kumar K #define NPC_RSS_GRPS 8
152199f5cdSKiran Kumar K 
162199f5cdSKiran Kumar K #define NPC_ACTION_FLAG_DEFAULT 0xffff
172199f5cdSKiran Kumar K 
182199f5cdSKiran Kumar K #define NPC_PFVF_FUNC_MASK 0x3FF
192199f5cdSKiran Kumar K 
202199f5cdSKiran Kumar K /* 32 bytes from LDATA_CFG & 32 bytes from FLAGS_CFG */
212199f5cdSKiran Kumar K #define NPC_MAX_EXTRACT_DATA_LEN (64)
222199f5cdSKiran Kumar K #define NPC_MAX_EXTRACT_HW_LEN	 (4 * NPC_MAX_EXTRACT_DATA_LEN)
232199f5cdSKiran Kumar K #define NPC_LDATA_LFLAG_LEN	 (16)
242199f5cdSKiran Kumar K #define NPC_MAX_KEY_NIBBLES	 (31)
252199f5cdSKiran Kumar K 
262199f5cdSKiran Kumar K /* Nibble offsets */
272199f5cdSKiran Kumar K #define NPC_LAYER_KEYX_SZ	  (3)
282199f5cdSKiran Kumar K #define NPC_PARSE_KEX_S_LA_OFFSET (7)
292199f5cdSKiran Kumar K #define NPC_PARSE_KEX_S_LID_OFFSET(lid)                                        \
302199f5cdSKiran Kumar K 	((((lid) - (NPC_LID_LA)) * NPC_LAYER_KEYX_SZ) +                        \
312199f5cdSKiran Kumar K 	 NPC_PARSE_KEX_S_LA_OFFSET)
322199f5cdSKiran Kumar K 
332199f5cdSKiran Kumar K /* This mark value indicates flag action */
342199f5cdSKiran Kumar K #define NPC_FLOW_FLAG_VAL (0xffff)
352199f5cdSKiran Kumar K 
362199f5cdSKiran Kumar K #define NPC_RX_ACT_MATCH_OFFSET (40)
372199f5cdSKiran Kumar K #define NPC_RX_ACT_MATCH_MASK	(0xFFFF)
382199f5cdSKiran Kumar K 
392199f5cdSKiran Kumar K #define NPC_RSS_ACT_GRP_OFFSET (20)
402199f5cdSKiran Kumar K #define NPC_RSS_ACT_ALG_OFFSET (56)
412199f5cdSKiran Kumar K #define NPC_RSS_ACT_GRP_MASK   (0xFFFFF)
422199f5cdSKiran Kumar K #define NPC_RSS_ACT_ALG_MASK   (0x1F)
432199f5cdSKiran Kumar K 
442199f5cdSKiran Kumar K #define NPC_MCAM_KEX_FIELD_MAX	  23
452199f5cdSKiran Kumar K #define NPC_MCAM_MAX_PROTO_FIELDS (NPC_MCAM_KEX_FIELD_MAX + 1)
462199f5cdSKiran Kumar K #define NPC_MCAM_KEY_X4_WORDS	  7 /* Number of 64-bit words */
472199f5cdSKiran Kumar K 
482199f5cdSKiran Kumar K #define NPC_RVUPF_MAX_9XXX 0x10 /* HRM: RVU_PRIV_CONST */
498b9f07b8SHarman Kalra #define NPC_RVUPF_MAX_98XX 0x18 /* HRM: RVU_PRIV_CONST */
502199f5cdSKiran Kumar K #define NPC_RVUPF_MAX_10XX 0x20 /* HRM: RVU_PRIV_CONST */
512199f5cdSKiran Kumar K #define NPC_NIXLF_MAX	   0x80 /* HRM: NIX_AF_CONST2 */
529869c399SSatheesh Paul #define NPC_MCAME_PER_PF   3	/* DRV: RSVD_MCAM_ENTRIES_PER_PF */
532199f5cdSKiran Kumar K #define NPC_MCAME_PER_LF   1	/* DRV: RSVD_MCAM_ENTRIES_PER_NIXLF */
548b9f07b8SHarman Kalra #define NPC_NIXLF_MAX_98XX (2 * NPC_NIXLF_MAX) /*2 NIXLFs */
552199f5cdSKiran Kumar K #define NPC_MCAME_RESVD_9XXX                                                   \
562199f5cdSKiran Kumar K 	(NPC_NIXLF_MAX * NPC_MCAME_PER_LF +                                    \
572199f5cdSKiran Kumar K 	 (NPC_RVUPF_MAX_9XXX - 1) * NPC_MCAME_PER_PF)
582199f5cdSKiran Kumar K 
592199f5cdSKiran Kumar K #define NPC_MCAME_RESVD_10XX                                                   \
602199f5cdSKiran Kumar K 	(NPC_NIXLF_MAX * NPC_MCAME_PER_LF +                                    \
612199f5cdSKiran Kumar K 	 (NPC_RVUPF_MAX_10XX - 1) * NPC_MCAME_PER_PF)
622199f5cdSKiran Kumar K 
638b9f07b8SHarman Kalra #define NPC_MCAME_RESVD_98XX                                                   \
648b9f07b8SHarman Kalra 	(NPC_NIXLF_MAX_98XX * NPC_MCAME_PER_LF +                               \
658b9f07b8SHarman Kalra 	 (NPC_RVUPF_MAX_98XX - 1) * NPC_MCAME_PER_PF)
668b9f07b8SHarman Kalra 
678ca851cdSSatheesh Paul #define NPC_ACTION_MAX_VLAN_PARAMS    3
688ca851cdSSatheesh Paul #define NPC_ACTION_MAX_VLANS_STRIPPED 2
698ca851cdSSatheesh Paul 
70b8ac8b08SSatheesh Paul #define NPC_LTYPE_OFFSET_START 7
71b8ac8b08SSatheesh Paul /* LB OFFSET : START + LA (2b flags + 1b ltype) + LB (2b flags) */
72b8ac8b08SSatheesh Paul #define NPC_LTYPE_LB_OFFSET (NPC_LTYPE_OFFSET_START + 5)
73b8ac8b08SSatheesh Paul #define NPC_LFLAG_LB_OFFSET (NPC_LTYPE_OFFSET_START + 3)
74474e275bSSatheesh Paul /* LC OFFSET : START + LA (2b flags + 1b ltype) + LB (2b flags + 1b ltype) + LC
75474e275bSSatheesh Paul  * (2b flags)
76474e275bSSatheesh Paul  */
77474e275bSSatheesh Paul #define NPC_LFLAG_LC_OFFSET (NPC_LTYPE_OFFSET_START + 6)
78474e275bSSatheesh Paul #define NPC_LTYPE_LC_OFFSET (NPC_LTYPE_OFFSET_START + 8)
79b8ac8b08SSatheesh Paul 
80b182b227SSatheesh Paul #define CN10K_SDP_CH_START 0x80
81b182b227SSatheesh Paul #define CN10K_SDP_CH_MASK  0xF80
82b182b227SSatheesh Paul 
838ca851cdSSatheesh Paul struct npc_action_vtag_info {
848ca851cdSSatheesh Paul 	uint16_t vlan_id;
858ca851cdSSatheesh Paul 	uint16_t vlan_ethtype;
868ca851cdSSatheesh Paul 	uint8_t vlan_pcp;
878ca851cdSSatheesh Paul };
888ca851cdSSatheesh Paul 
892199f5cdSKiran Kumar K enum npc_err_status {
902199f5cdSKiran Kumar K 	NPC_ERR_PARAM = -1024,
912199f5cdSKiran Kumar K 	NPC_ERR_NO_MEM,
922199f5cdSKiran Kumar K 	NPC_ERR_INVALID_SPEC,
932199f5cdSKiran Kumar K 	NPC_ERR_INVALID_MASK,
942199f5cdSKiran Kumar K 	NPC_ERR_INVALID_RANGE,
952199f5cdSKiran Kumar K 	NPC_ERR_INVALID_KEX,
962199f5cdSKiran Kumar K 	NPC_ERR_INVALID_SIZE,
972199f5cdSKiran Kumar K 	NPC_ERR_INTERNAL,
982199f5cdSKiran Kumar K 	NPC_ERR_MCAM_ALLOC,
992199f5cdSKiran Kumar K 	NPC_ERR_ACTION_NOTSUP,
1002199f5cdSKiran Kumar K 	NPC_ERR_PATTERN_NOTSUP,
1012199f5cdSKiran Kumar K };
1022199f5cdSKiran Kumar K 
1032199f5cdSKiran Kumar K enum npc_mcam_intf { NPC_MCAM_RX, NPC_MCAM_TX };
1042199f5cdSKiran Kumar K 
1052199f5cdSKiran Kumar K typedef union npc_kex_cap_terms_t {
10673fc72e1SSatheesh Paul 	/** Packet Matching Rule term fields */
1072199f5cdSKiran Kumar K 	struct {
1082199f5cdSKiran Kumar K 		/** Total length of received packet */
1092199f5cdSKiran Kumar K 		uint64_t len : 1;
1102199f5cdSKiran Kumar K 		/** Initial (outer) Ethertype only */
1112199f5cdSKiran Kumar K 		uint64_t ethtype_0 : 1;
1122199f5cdSKiran Kumar K 		/** Ethertype of most inner VLAN tag */
1132199f5cdSKiran Kumar K 		uint64_t ethtype_x : 1;
1142199f5cdSKiran Kumar K 		/** First VLAN ID (outer) */
1152199f5cdSKiran Kumar K 		uint64_t vlan_id_0 : 1;
1162199f5cdSKiran Kumar K 		/** Last VLAN ID (inner) */
1172199f5cdSKiran Kumar K 		uint64_t vlan_id_x : 1;
11873fc72e1SSatheesh Paul 		/** PCP in the first VLAN header */
11973fc72e1SSatheesh Paul 		uint64_t vlan_pcp_0 : 1;
1202199f5cdSKiran Kumar K 		/** destination MAC address */
1212199f5cdSKiran Kumar K 		uint64_t dmac : 1;
1222199f5cdSKiran Kumar K 		/** IP Protocol or IPv6 Next Header */
1232199f5cdSKiran Kumar K 		uint64_t ip_proto : 1;
12473fc72e1SSatheesh Paul 		/** DSCP in IP header */
12573fc72e1SSatheesh Paul 		uint64_t ip_dscp : 1;
1262199f5cdSKiran Kumar K 		/** Destination UDP port, implies IPPROTO=17 */
1272199f5cdSKiran Kumar K 		uint64_t udp_dport : 1;
1282199f5cdSKiran Kumar K 		/** Destination TCP port implies IPPROTO=6 */
1292199f5cdSKiran Kumar K 		uint64_t tcp_dport : 1;
1302199f5cdSKiran Kumar K 		/** Source UDP Port */
1312199f5cdSKiran Kumar K 		uint64_t udp_sport : 1;
1322199f5cdSKiran Kumar K 		/** Source TCP port */
1332199f5cdSKiran Kumar K 		uint64_t tcp_sport : 1;
1342199f5cdSKiran Kumar K 		/** Source IP address */
1352199f5cdSKiran Kumar K 		uint64_t sip_addr : 1;
1362199f5cdSKiran Kumar K 		/** Destination IP address */
1372199f5cdSKiran Kumar K 		uint64_t dip_addr : 1;
1382199f5cdSKiran Kumar K 		/** Source IP address */
1392199f5cdSKiran Kumar K 		uint64_t sip6_addr : 1;
1402199f5cdSKiran Kumar K 		/** Destination IP address */
1412199f5cdSKiran Kumar K 		uint64_t dip6_addr : 1;
1422199f5cdSKiran Kumar K 		/** IPsec session identifier */
1432199f5cdSKiran Kumar K 		uint64_t ipsec_spi : 1;
1442199f5cdSKiran Kumar K 		/** NVGRE/VXLAN network identifier */
1452199f5cdSKiran Kumar K 		uint64_t ld_vni : 1;
1462199f5cdSKiran Kumar K 		/** Custom frame match rule. PMR offset is counted from
1472199f5cdSKiran Kumar K 		 *  the start of the packet.
1482199f5cdSKiran Kumar K 		 */
1492199f5cdSKiran Kumar K 		uint64_t custom_frame : 1;
1502199f5cdSKiran Kumar K 		/** Custom layer 3 match rule. PMR offset is counted from
1512199f5cdSKiran Kumar K 		 *  the start of layer 3 in the packet.
1522199f5cdSKiran Kumar K 		 */
1532199f5cdSKiran Kumar K 		uint64_t custom_l3 : 1;
1542199f5cdSKiran Kumar K 		/** IGMP Group address */
1552199f5cdSKiran Kumar K 		uint64_t igmp_grp_addr : 1;
1562199f5cdSKiran Kumar K 		/** ICMP identifier */
1572199f5cdSKiran Kumar K 		uint64_t icmp_id : 1;
1582199f5cdSKiran Kumar K 		/** ICMP type */
1592199f5cdSKiran Kumar K 		uint64_t icmp_type : 1;
1602199f5cdSKiran Kumar K 		/** ICMP code */
1612199f5cdSKiran Kumar K 		uint64_t icmp_code : 1;
1622199f5cdSKiran Kumar K 		/** Source SCTP port */
1632199f5cdSKiran Kumar K 		uint64_t sctp_sport : 1;
1642199f5cdSKiran Kumar K 		/** Destination SCTP port */
1652199f5cdSKiran Kumar K 		uint64_t sctp_dport : 1;
16673fc72e1SSatheesh Paul 		/** GTPv1 tunnel endpoint identifier */
16773fc72e1SSatheesh Paul 		uint64_t gtpv1_teid : 1;
1682199f5cdSKiran Kumar K 	} bit;
16973fc72e1SSatheesh Paul 
1702199f5cdSKiran Kumar K 	/** All bits of the bit field structure */
1712199f5cdSKiran Kumar K 	uint64_t all_bits;
17273fc72e1SSatheesh Paul 
1732199f5cdSKiran Kumar K } npc_kex_cap_terms_t;
1742199f5cdSKiran Kumar K 
1752199f5cdSKiran Kumar K struct npc_parse_item_info {
1762199f5cdSKiran Kumar K 	const void *def_mask; /* default mask */
1772199f5cdSKiran Kumar K 	void *hw_mask;	      /* hardware supported mask */
1782199f5cdSKiran Kumar K 	int len;	      /* length of item */
1792199f5cdSKiran Kumar K 	const void *spec;     /* spec to use, NULL implies match any */
1802199f5cdSKiran Kumar K 	const void *mask;     /* mask to use */
1812199f5cdSKiran Kumar K 	uint8_t hw_hdr_len;   /* Extra data len at each layer*/
1822199f5cdSKiran Kumar K };
1832199f5cdSKiran Kumar K 
1842199f5cdSKiran Kumar K struct npc_parse_state {
1852199f5cdSKiran Kumar K 	struct npc *npc;
1862199f5cdSKiran Kumar K 	const struct roc_npc_item_info *pattern;
1872199f5cdSKiran Kumar K 	const struct roc_npc_item_info *last_pattern;
1882199f5cdSKiran Kumar K 	struct roc_npc_flow *flow;
1892199f5cdSKiran Kumar K 	uint8_t nix_intf;
1902199f5cdSKiran Kumar K 	uint8_t tunnel;
1912199f5cdSKiran Kumar K 	uint8_t terminate;
1922199f5cdSKiran Kumar K 	uint8_t layer_mask;
1932199f5cdSKiran Kumar K 	uint8_t lt[NPC_MAX_LID];
1942199f5cdSKiran Kumar K 	uint8_t flags[NPC_MAX_LID];
1952199f5cdSKiran Kumar K 	uint8_t *mcam_data; /* point to flow->mcam_data + key_len */
1962199f5cdSKiran Kumar K 	uint8_t *mcam_mask; /* point to flow->mcam_mask + key_len */
1972199f5cdSKiran Kumar K 	bool is_vf;
198b8ac8b08SSatheesh Paul 	/* adjust ltype in MCAM to match at least one vlan */
199b8ac8b08SSatheesh Paul 	bool set_vlan_ltype_mask;
200474e275bSSatheesh Paul 	bool set_ipv6ext_ltype_mask;
2014968b362SSatheesh Paul 	bool is_second_pass_rule;
20278c78d87SKiran Kumar K 	bool has_eth_type;
203b7fff4e4SSatheesh Paul 	uint16_t nb_tx_queues;
204b7eb0e0cSSatheesh Paul 	uint16_t dst_pf_func;
2052199f5cdSKiran Kumar K };
2062199f5cdSKiran Kumar K 
2072199f5cdSKiran Kumar K enum npc_kpu_parser_flag {
2082199f5cdSKiran Kumar K 	NPC_F_NA = 0,
2092199f5cdSKiran Kumar K 	NPC_F_PKI,
2102199f5cdSKiran Kumar K 	NPC_F_PKI_VLAN,
2112199f5cdSKiran Kumar K 	NPC_F_PKI_ETAG,
2122199f5cdSKiran Kumar K 	NPC_F_PKI_ITAG,
2132199f5cdSKiran Kumar K 	NPC_F_PKI_MPLS,
2142199f5cdSKiran Kumar K 	NPC_F_PKI_NSH,
2152199f5cdSKiran Kumar K 	NPC_F_ETYPE_UNK,
2162199f5cdSKiran Kumar K 	NPC_F_ETHER_VLAN,
2172199f5cdSKiran Kumar K 	NPC_F_ETHER_ETAG,
2182199f5cdSKiran Kumar K 	NPC_F_ETHER_ITAG,
2192199f5cdSKiran Kumar K 	NPC_F_ETHER_MPLS,
2202199f5cdSKiran Kumar K 	NPC_F_ETHER_NSH,
2212199f5cdSKiran Kumar K 	NPC_F_STAG_CTAG,
2222199f5cdSKiran Kumar K 	NPC_F_STAG_CTAG_UNK,
2232199f5cdSKiran Kumar K 	NPC_F_STAG_STAG_CTAG,
2242199f5cdSKiran Kumar K 	NPC_F_STAG_STAG_STAG,
2252199f5cdSKiran Kumar K 	NPC_F_QINQ_CTAG,
2262199f5cdSKiran Kumar K 	NPC_F_QINQ_CTAG_UNK,
2272199f5cdSKiran Kumar K 	NPC_F_QINQ_QINQ_CTAG,
2282199f5cdSKiran Kumar K 	NPC_F_QINQ_QINQ_QINQ,
2292199f5cdSKiran Kumar K 	NPC_F_BTAG_ITAG,
2302199f5cdSKiran Kumar K 	NPC_F_BTAG_ITAG_STAG,
2312199f5cdSKiran Kumar K 	NPC_F_BTAG_ITAG_CTAG,
2322199f5cdSKiran Kumar K 	NPC_F_BTAG_ITAG_UNK,
2332199f5cdSKiran Kumar K 	NPC_F_ETAG_CTAG,
2342199f5cdSKiran Kumar K 	NPC_F_ETAG_BTAG_ITAG,
2352199f5cdSKiran Kumar K 	NPC_F_ETAG_STAG,
2362199f5cdSKiran Kumar K 	NPC_F_ETAG_QINQ,
2372199f5cdSKiran Kumar K 	NPC_F_ETAG_ITAG,
2382199f5cdSKiran Kumar K 	NPC_F_ETAG_ITAG_STAG,
2392199f5cdSKiran Kumar K 	NPC_F_ETAG_ITAG_CTAG,
2402199f5cdSKiran Kumar K 	NPC_F_ETAG_ITAG_UNK,
2412199f5cdSKiran Kumar K 	NPC_F_ITAG_STAG_CTAG,
2422199f5cdSKiran Kumar K 	NPC_F_ITAG_STAG,
2432199f5cdSKiran Kumar K 	NPC_F_ITAG_CTAG,
2442199f5cdSKiran Kumar K 	NPC_F_MPLS_4_LABELS,
2452199f5cdSKiran Kumar K 	NPC_F_MPLS_3_LABELS,
2462199f5cdSKiran Kumar K 	NPC_F_MPLS_2_LABELS,
2472199f5cdSKiran Kumar K 	NPC_F_IP_HAS_OPTIONS,
2482199f5cdSKiran Kumar K 	NPC_F_IP_IP_IN_IP,
2492199f5cdSKiran Kumar K 	NPC_F_IP_6TO4,
2502199f5cdSKiran Kumar K 	NPC_F_IP_MPLS_IN_IP,
2512199f5cdSKiran Kumar K 	NPC_F_IP_UNK_PROTO,
2522199f5cdSKiran Kumar K 	NPC_F_IP_IP_IN_IP_HAS_OPTIONS,
2532199f5cdSKiran Kumar K 	NPC_F_IP_6TO4_HAS_OPTIONS,
2542199f5cdSKiran Kumar K 	NPC_F_IP_MPLS_IN_IP_HAS_OPTIONS,
2552199f5cdSKiran Kumar K 	NPC_F_IP_UNK_PROTO_HAS_OPTIONS,
2562199f5cdSKiran Kumar K 	NPC_F_IP6_HAS_EXT,
2572199f5cdSKiran Kumar K 	NPC_F_IP6_TUN_IP6,
2582199f5cdSKiran Kumar K 	NPC_F_IP6_MPLS_IN_IP,
2592199f5cdSKiran Kumar K 	NPC_F_TCP_HAS_OPTIONS,
2602199f5cdSKiran Kumar K 	NPC_F_TCP_HTTP,
2612199f5cdSKiran Kumar K 	NPC_F_TCP_HTTPS,
2622199f5cdSKiran Kumar K 	NPC_F_TCP_PPTP,
2632199f5cdSKiran Kumar K 	NPC_F_TCP_UNK_PORT,
2642199f5cdSKiran Kumar K 	NPC_F_TCP_HTTP_HAS_OPTIONS,
2652199f5cdSKiran Kumar K 	NPC_F_TCP_HTTPS_HAS_OPTIONS,
2662199f5cdSKiran Kumar K 	NPC_F_TCP_PPTP_HAS_OPTIONS,
2672199f5cdSKiran Kumar K 	NPC_F_TCP_UNK_PORT_HAS_OPTIONS,
2682199f5cdSKiran Kumar K 	NPC_F_UDP_VXLAN,
2692199f5cdSKiran Kumar K 	NPC_F_UDP_VXLAN_NOVNI,
2702199f5cdSKiran Kumar K 	NPC_F_UDP_VXLAN_NOVNI_NSH,
2712199f5cdSKiran Kumar K 	NPC_F_UDP_VXLANGPE,
2722199f5cdSKiran Kumar K 	NPC_F_UDP_VXLANGPE_NSH,
2732199f5cdSKiran Kumar K 	NPC_F_UDP_VXLANGPE_MPLS,
2742199f5cdSKiran Kumar K 	NPC_F_UDP_VXLANGPE_NOVNI,
2752199f5cdSKiran Kumar K 	NPC_F_UDP_VXLANGPE_NOVNI_NSH,
2762199f5cdSKiran Kumar K 	NPC_F_UDP_VXLANGPE_NOVNI_MPLS,
2772199f5cdSKiran Kumar K 	NPC_F_UDP_VXLANGPE_UNK,
2782199f5cdSKiran Kumar K 	NPC_F_UDP_VXLANGPE_NONP,
2792199f5cdSKiran Kumar K 	NPC_F_UDP_GTP_GTPC,
2802199f5cdSKiran Kumar K 	NPC_F_UDP_GTP_GTPU_G_PDU,
2812199f5cdSKiran Kumar K 	NPC_F_UDP_GTP_GTPU_UNK,
2822199f5cdSKiran Kumar K 	NPC_F_UDP_UNK_PORT,
2832199f5cdSKiran Kumar K 	NPC_F_UDP_GENEVE,
2842199f5cdSKiran Kumar K 	NPC_F_UDP_GENEVE_OAM,
2852199f5cdSKiran Kumar K 	NPC_F_UDP_GENEVE_CRI_OPT,
2862199f5cdSKiran Kumar K 	NPC_F_UDP_GENEVE_OAM_CRI_OPT,
2872199f5cdSKiran Kumar K 	NPC_F_GRE_NVGRE,
2882199f5cdSKiran Kumar K 	NPC_F_GRE_HAS_SRE,
2892199f5cdSKiran Kumar K 	NPC_F_GRE_HAS_CSUM,
2902199f5cdSKiran Kumar K 	NPC_F_GRE_HAS_KEY,
2912199f5cdSKiran Kumar K 	NPC_F_GRE_HAS_SEQ,
2922199f5cdSKiran Kumar K 	NPC_F_GRE_HAS_CSUM_KEY,
2932199f5cdSKiran Kumar K 	NPC_F_GRE_HAS_CSUM_SEQ,
2942199f5cdSKiran Kumar K 	NPC_F_GRE_HAS_KEY_SEQ,
2952199f5cdSKiran Kumar K 	NPC_F_GRE_HAS_CSUM_KEY_SEQ,
2962199f5cdSKiran Kumar K 	NPC_F_GRE_HAS_ROUTE,
2972199f5cdSKiran Kumar K 	NPC_F_GRE_UNK_PROTO,
2982199f5cdSKiran Kumar K 	NPC_F_GRE_VER1,
2992199f5cdSKiran Kumar K 	NPC_F_GRE_VER1_HAS_SEQ,
3002199f5cdSKiran Kumar K 	NPC_F_GRE_VER1_HAS_ACK,
3012199f5cdSKiran Kumar K 	NPC_F_GRE_VER1_HAS_SEQ_ACK,
3022199f5cdSKiran Kumar K 	NPC_F_GRE_VER1_UNK_PROTO,
3032199f5cdSKiran Kumar K 	NPC_F_TU_ETHER_UNK,
3042199f5cdSKiran Kumar K 	NPC_F_TU_ETHER_CTAG,
3052199f5cdSKiran Kumar K 	NPC_F_TU_ETHER_CTAG_UNK,
3062199f5cdSKiran Kumar K 	NPC_F_TU_ETHER_STAG_CTAG,
3072199f5cdSKiran Kumar K 	NPC_F_TU_ETHER_STAG_CTAG_UNK,
3082199f5cdSKiran Kumar K 	NPC_F_TU_ETHER_STAG,
3092199f5cdSKiran Kumar K 	NPC_F_TU_ETHER_STAG_UNK,
3102199f5cdSKiran Kumar K 	NPC_F_TU_ETHER_QINQ_CTAG,
3112199f5cdSKiran Kumar K 	NPC_F_TU_ETHER_QINQ_CTAG_UNK,
3122199f5cdSKiran Kumar K 	NPC_F_TU_ETHER_QINQ,
3132199f5cdSKiran Kumar K 	NPC_F_TU_ETHER_QINQ_UNK,
3142199f5cdSKiran Kumar K 	NPC_F_LAST /* has to be the last item */
3152199f5cdSKiran Kumar K };
3162199f5cdSKiran Kumar K 
3172199f5cdSKiran Kumar K #define NPC_ACTION_TERM                                                        \
3182199f5cdSKiran Kumar K 	(ROC_NPC_ACTION_TYPE_DROP | ROC_NPC_ACTION_TYPE_QUEUE |                \
3192199f5cdSKiran Kumar K 	 ROC_NPC_ACTION_TYPE_RSS | ROC_NPC_ACTION_TYPE_DUP |                   \
3202199f5cdSKiran Kumar K 	 ROC_NPC_ACTION_TYPE_SEC)
3212199f5cdSKiran Kumar K 
3222199f5cdSKiran Kumar K struct npc_xtract_info {
3232199f5cdSKiran Kumar K 	/* Length in bytes of pkt data extracted. len = 0
3242199f5cdSKiran Kumar K 	 * indicates that extraction is disabled.
3252199f5cdSKiran Kumar K 	 */
3262199f5cdSKiran Kumar K 	uint8_t len;
3272199f5cdSKiran Kumar K 	uint8_t hdr_off;      /* Byte offset of proto hdr: extract_src */
3282199f5cdSKiran Kumar K 	uint8_t key_off;      /* Byte offset in MCAM key where data is placed */
3292199f5cdSKiran Kumar K 	uint8_t enable;	      /* Extraction enabled or disabled */
3302199f5cdSKiran Kumar K 	uint8_t flags_enable; /* Flags extraction enabled */
331e3315630SSatheesh Paul 	uint8_t use_hash;     /* Use field hash */
3322199f5cdSKiran Kumar K };
3332199f5cdSKiran Kumar K 
3342199f5cdSKiran Kumar K /* Information for a given {LAYER, LTYPE} */
3352199f5cdSKiran Kumar K struct npc_lid_lt_xtract_info {
3362199f5cdSKiran Kumar K 	/* Info derived from parser configuration */
3372199f5cdSKiran Kumar K 	uint16_t npc_proto;	    /* Network protocol identified */
3382199f5cdSKiran Kumar K 	uint8_t valid_flags_mask;   /* Flags applicable */
3392199f5cdSKiran Kumar K 	uint8_t is_terminating : 1; /* No more parsing */
3402199f5cdSKiran Kumar K 	struct npc_xtract_info xtract[NPC_MAX_LD];
3412199f5cdSKiran Kumar K };
3422199f5cdSKiran Kumar K 
3432199f5cdSKiran Kumar K union npc_kex_ldata_flags_cfg {
3442199f5cdSKiran Kumar K 	struct {
3452199f5cdSKiran Kumar K 		uint64_t lid : 3;
3462199f5cdSKiran Kumar K 		uint64_t rvsd_62_1 : 61;
3472199f5cdSKiran Kumar K 	} s;
3482199f5cdSKiran Kumar K 
3492199f5cdSKiran Kumar K 	uint64_t i;
3502199f5cdSKiran Kumar K };
3512199f5cdSKiran Kumar K 
3522199f5cdSKiran Kumar K typedef struct npc_lid_lt_xtract_info npc_dxcfg_t[NPC_MAX_INTF][NPC_MAX_LID]
3532199f5cdSKiran Kumar K 						 [NPC_MAX_LT];
3542199f5cdSKiran Kumar K typedef struct npc_lid_lt_xtract_info npc_fxcfg_t[NPC_MAX_INTF][NPC_MAX_LD]
3552199f5cdSKiran Kumar K 						 [NPC_MAX_LFL];
3562199f5cdSKiran Kumar K typedef union npc_kex_ldata_flags_cfg npc_ld_flags_t[NPC_MAX_LD];
3572199f5cdSKiran Kumar K 
3582199f5cdSKiran Kumar K /* MBOX_MSG_NPC_GET_DATAX_CFG Response */
3592199f5cdSKiran Kumar K struct npc_get_datax_cfg {
3602199f5cdSKiran Kumar K 	/* NPC_AF_KEX_LDATA(0..1)_FLAGS_CFG */
3612199f5cdSKiran Kumar K 	union npc_kex_ldata_flags_cfg ld_flags[NPC_MAX_LD];
3622199f5cdSKiran Kumar K 	/* Extract information indexed with [LID][LTYPE] */
3632199f5cdSKiran Kumar K 	struct npc_lid_lt_xtract_info lid_lt_xtract[NPC_MAX_LID][NPC_MAX_LT];
3642199f5cdSKiran Kumar K 	/* Flags based extract indexed with [LDATA][FLAGS_LOWER_NIBBLE]
3652199f5cdSKiran Kumar K 	 * Fields flags_ena_ld0, flags_ena_ld1 in
3662199f5cdSKiran Kumar K 	 * struct npc_lid_lt_xtract_info indicate if this is applicable
3672199f5cdSKiran Kumar K 	 * for a given {LAYER, LTYPE}
3682199f5cdSKiran Kumar K 	 */
3692199f5cdSKiran Kumar K 	struct npc_xtract_info flag_xtract[NPC_MAX_LD][NPC_MAX_LT];
3702199f5cdSKiran Kumar K };
3712199f5cdSKiran Kumar K 
3722199f5cdSKiran Kumar K TAILQ_HEAD(npc_flow_list, roc_npc_flow);
3732199f5cdSKiran Kumar K 
3741f669198SSatheesh Paul struct npc_prio_flow_entry {
3751f669198SSatheesh Paul 	struct roc_npc_flow *flow;
3761f669198SSatheesh Paul 	TAILQ_ENTRY(npc_prio_flow_entry) next;
3772199f5cdSKiran Kumar K };
3782199f5cdSKiran Kumar K 
3791f669198SSatheesh Paul TAILQ_HEAD(npc_prio_flow_list_head, npc_prio_flow_entry);
3801f669198SSatheesh Paul 
381357f5ebcSAnkur Dwivedi struct npc_age_flow_entry {
382357f5ebcSAnkur Dwivedi 	struct roc_npc_flow *flow;
383357f5ebcSAnkur Dwivedi 	TAILQ_ENTRY(npc_age_flow_entry) next;
384357f5ebcSAnkur Dwivedi };
385357f5ebcSAnkur Dwivedi 
386357f5ebcSAnkur Dwivedi TAILQ_HEAD(npc_age_flow_list_head, npc_age_flow_entry);
387357f5ebcSAnkur Dwivedi 
3882199f5cdSKiran Kumar K struct npc {
3892199f5cdSKiran Kumar K 	struct mbox *mbox;			/* Mbox */
3902199f5cdSKiran Kumar K 	uint32_t keyx_supp_nmask[NPC_MAX_INTF]; /* nibble mask */
391e3315630SSatheesh Paul 	uint8_t hash_extract_cap;		/* hash extract support */
3922199f5cdSKiran Kumar K 	uint8_t profile_name[MKEX_NAME_LEN];	/* KEX profile name */
3932199f5cdSKiran Kumar K 	uint32_t keyx_len[NPC_MAX_INTF];	/* per intf key len in bits */
3942199f5cdSKiran Kumar K 	uint32_t datax_len[NPC_MAX_INTF];	/* per intf data len in bits */
3952199f5cdSKiran Kumar K 	uint32_t keyw[NPC_MAX_INTF];		/* max key + data len bits */
3962199f5cdSKiran Kumar K 	uint32_t mcam_entries;			/* mcam entries supported */
3972199f5cdSKiran Kumar K 	uint16_t channel;			/* RX Channel number */
398f1375663SSatheesh Paul 	bool is_sdp_link;
399f1375663SSatheesh Paul 	uint16_t sdp_channel;
400f1375663SSatheesh Paul 	uint16_t sdp_channel_mask;
4012199f5cdSKiran Kumar K 	uint32_t rss_grps;			/* rss groups supported */
4022199f5cdSKiran Kumar K 	uint16_t flow_prealloc_size;		/* Pre allocated mcam size */
4032199f5cdSKiran Kumar K 	uint16_t flow_max_priority;		/* Max priority for flow */
4047be78d02SJosh Soref 	uint16_t switch_header_type; /* Supported switch header type */
4058a44b2a5SHanumanth Pothula 	uint32_t mark_actions;
4068ca851cdSSatheesh Paul 	uint32_t vtag_strip_actions; /* vtag insert/strip actions */
4072199f5cdSKiran Kumar K 	uint16_t pf_func;	     /* pf_func of device */
4082199f5cdSKiran Kumar K 	npc_dxcfg_t prx_dxcfg;	     /* intf, lid, lt, extract */
4092199f5cdSKiran Kumar K 	npc_fxcfg_t prx_fxcfg;	     /* Flag extract */
4102199f5cdSKiran Kumar K 	npc_ld_flags_t prx_lfcfg;    /* KEX LD_Flags CFG */
4112199f5cdSKiran Kumar K 	struct npc_flow_list *flow_list;
4121f669198SSatheesh Paul 	struct npc_prio_flow_list_head *prio_flow_list;
413357f5ebcSAnkur Dwivedi 	struct npc_age_flow_list_head age_flow_list;
4142199f5cdSKiran Kumar K 	struct plt_bitmap *rss_grp_entries;
415df5cf15fSKiran Kumar K 	struct npc_flow_list ipsec_list;
416a9064972SNithin Dabilpuram 	uint8_t exact_match_ena;
4172199f5cdSKiran Kumar K };
4182199f5cdSKiran Kumar K 
419e3315630SSatheesh Paul #define NPC_HASH_FIELD_LEN 16
420e3315630SSatheesh Paul 
421e3315630SSatheesh Paul struct npc_hash_cfg {
422e3315630SSatheesh Paul 	uint64_t secret_key[3];
423e3315630SSatheesh Paul 	/* NPC_AF_INTF(0..1)_HASH(0..1)_MASK(0..1) */
424e3315630SSatheesh Paul 	uint64_t hash_mask[NPC_MAX_INTF][NPC_MAX_HASH][NPC_MAX_HASH_MASK];
425e3315630SSatheesh Paul 	/* NPC_AF_INTF(0..1)_HASH(0..1)_RESULT_CTRL */
426e3315630SSatheesh Paul 	uint64_t hash_ctrl[NPC_MAX_INTF][NPC_MAX_HASH];
427e3315630SSatheesh Paul };
428e3315630SSatheesh Paul 
4292199f5cdSKiran Kumar K static inline struct npc *
4302199f5cdSKiran Kumar K roc_npc_to_npc_priv(struct roc_npc *npc)
4312199f5cdSKiran Kumar K {
4322199f5cdSKiran Kumar K 	return (struct npc *)npc->reserved;
4332199f5cdSKiran Kumar K }
434665b6a74SKiran Kumar K 
435df29c91cSHarman Kalra int npc_mcam_alloc_counter(struct mbox *mbox, uint16_t *ctr);
436df5cf15fSKiran Kumar K int npc_mcam_free_counter(struct mbox *mbox, uint16_t ctr_id);
437df5cf15fSKiran Kumar K int npc_mcam_read_counter(struct mbox *mbox, uint32_t ctr_id, uint64_t *count);
438df5cf15fSKiran Kumar K int npc_mcam_clear_counter(struct mbox *mbox, uint32_t ctr_id);
439df5cf15fSKiran Kumar K int npc_mcam_free_entry(struct mbox *mbox, uint32_t entry);
440f9af9080SKiran Kumar K int npc_mcam_free_all_entries(struct npc *npc);
441f9af9080SKiran Kumar K int npc_mcam_alloc_and_write(struct npc *npc, struct roc_npc_flow *flow,
442f9af9080SKiran Kumar K 			     struct npc_parse_state *pst);
443f9af9080SKiran Kumar K int npc_mcam_alloc_entry(struct npc *npc, struct roc_npc_flow *mcam,
444f9af9080SKiran Kumar K 			 struct roc_npc_flow *ref_mcam, int prio,
445f9af9080SKiran Kumar K 			 int *resp_count);
446df5cf15fSKiran Kumar K int npc_mcam_alloc_entries(struct mbox *mbox, int ref_mcam, int *alloc_entry, int req_count,
447df5cf15fSKiran Kumar K 			   int prio, int *resp_count, bool is_conti);
448f9af9080SKiran Kumar K 
44947412486SSatheesh Paul int npc_mcam_ena_dis_entry(struct npc *npc, struct roc_npc_flow *mcam, bool enable);
450df5cf15fSKiran Kumar K int npc_mcam_write_entry(struct mbox *mbox, struct roc_npc_flow *mcam);
451fbc0fa74SKiran Kumar K int npc_flow_enable_all_entries(struct npc *npc, bool enable);
45247412486SSatheesh Paul int npc_update_parse_state(struct npc_parse_state *pst, struct npc_parse_item_info *info, int lid,
45347412486SSatheesh Paul 			   int lt, uint8_t flags);
45447412486SSatheesh Paul void npc_get_hw_supp_mask(struct npc_parse_state *pst, struct npc_parse_item_info *info, int lid,
45547412486SSatheesh Paul 			  int lt);
45647412486SSatheesh Paul int npc_mask_is_supported(const char *mask, const char *hw_mask, int len);
45747412486SSatheesh Paul int npc_parse_item_basic(const struct roc_npc_item_info *item, struct npc_parse_item_info *info);
458c34ea71bSKiran Kumar K int npc_parse_meta_items(struct npc_parse_state *pst);
4594968b362SSatheesh Paul int npc_parse_mark_item(struct npc_parse_state *pst);
460296e9040SKiran Kumar K int npc_parse_port_representor_id(struct npc_parse_state *pst);
461296e9040SKiran Kumar K int npc_parse_represented_port_id(struct npc_parse_state *pst);
46284d2ea9dSKiran Kumar K int npc_parse_pre_l2(struct npc_parse_state *pst);
463c34ea71bSKiran Kumar K int npc_parse_higig2_hdr(struct npc_parse_state *pst);
464c34ea71bSKiran Kumar K int npc_parse_cpt_hdr(struct npc_parse_state *pst);
465b7fff4e4SSatheesh Paul int npc_parse_tx_queue(struct npc_parse_state *pst);
466c34ea71bSKiran Kumar K int npc_parse_la(struct npc_parse_state *pst);
467c34ea71bSKiran Kumar K int npc_parse_lb(struct npc_parse_state *pst);
468c34ea71bSKiran Kumar K int npc_parse_lc(struct npc_parse_state *pst);
469c34ea71bSKiran Kumar K int npc_parse_ld(struct npc_parse_state *pst);
470c34ea71bSKiran Kumar K int npc_parse_le(struct npc_parse_state *pst);
471c34ea71bSKiran Kumar K int npc_parse_lf(struct npc_parse_state *pst);
472c34ea71bSKiran Kumar K int npc_parse_lg(struct npc_parse_state *pst);
473c34ea71bSKiran Kumar K int npc_parse_lh(struct npc_parse_state *pst);
474f9af9080SKiran Kumar K int npc_mcam_fetch_kex_cfg(struct npc *npc);
475e3315630SSatheesh Paul int npc_mcam_fetch_hw_cap(struct npc *npc, uint8_t *npc_hw_cap);
476e3315630SSatheesh Paul int npc_get_free_mcam_entry(struct mbox *mbox, struct roc_npc_flow *flow, struct npc *npc);
4771f669198SSatheesh Paul void npc_delete_prio_list_entry(struct npc *npc, struct roc_npc_flow *flow);
478f9af9080SKiran Kumar K int npc_flow_free_all_resources(struct npc *npc);
479c34ea71bSKiran Kumar K const struct roc_npc_item_info *
480c34ea71bSKiran Kumar K npc_parse_skip_void_and_any_items(const struct roc_npc_item_info *pattern);
481e3315630SSatheesh Paul int npc_program_mcam(struct npc *npc, struct npc_parse_state *pst, bool mcam_alloc);
482f9af9080SKiran Kumar K uint64_t npc_get_kex_capability(struct npc *npc);
483e3315630SSatheesh Paul int npc_process_ipv6_field_hash(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
484e3315630SSatheesh Paul 				const struct roc_npc_flow_item_ipv6 *ipv6_mask,
4850a6a4437SSatheesh Paul 				struct npc_parse_state *pst, uint8_t type);
486e3315630SSatheesh Paul int npc_rss_action_configure(struct roc_npc *roc_npc, const struct roc_npc_action_rss *rss,
487*29a8df5cSHarman Kalra 			     uint8_t *alg_idx, uint32_t *rss_grp, uint32_t mcam_id,
488*29a8df5cSHarman Kalra 			     uint16_t rss_repte_pf_func);
489e3315630SSatheesh Paul int npc_rss_action_program(struct roc_npc *roc_npc, const struct roc_npc_action actions[],
49051dc6a80SSatheesh Paul 			   struct roc_npc_flow *flow);
49151dc6a80SSatheesh Paul int npc_rss_group_free(struct npc *npc, struct roc_npc_flow *flow);
49222d9d348SSatheesh Paul int npc_mcam_init(struct npc *npc, struct roc_npc_flow *flow, int mcam_id);
49322d9d348SSatheesh Paul int npc_mcam_move(struct mbox *mbox, uint16_t old_ent, uint16_t new_ent);
494357f5ebcSAnkur Dwivedi void npc_age_flow_list_entry_add(struct roc_npc *npc, struct roc_npc_flow *flow);
495357f5ebcSAnkur Dwivedi void npc_age_flow_list_entry_delete(struct roc_npc *npc, struct roc_npc_flow *flow);
496357f5ebcSAnkur Dwivedi uint32_t npc_aged_flows_get(void *args);
497357f5ebcSAnkur Dwivedi int npc_aged_flows_bitmap_alloc(struct roc_npc *roc_npc);
498357f5ebcSAnkur Dwivedi void npc_aged_flows_bitmap_free(struct roc_npc *roc_npc);
499209188d1SSatheesh Paul int npc_aging_ctrl_thread_create(struct roc_npc *roc_npc, const struct roc_npc_action_age *age,
500357f5ebcSAnkur Dwivedi 				 struct roc_npc_flow *flow);
501357f5ebcSAnkur Dwivedi void npc_aging_ctrl_thread_destroy(struct roc_npc *roc_npc);
502df29c91cSHarman Kalra int npc_rss_free_grp_get(struct npc *npc, uint32_t *pos);
5032199f5cdSKiran Kumar K #endif /* _ROC_NPC_PRIV_H_ */
504