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