162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Marvell RVU Admin Function driver 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2018 Marvell. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef NPC_H 962306a36Sopenharmony_ci#define NPC_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define NPC_KEX_CHAN_MASK 0xFFFULL 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define SET_KEX_LD(intf, lid, ltype, ld, cfg) \ 1462306a36Sopenharmony_ci rvu_write64(rvu, blkaddr, \ 1562306a36Sopenharmony_ci NPC_AF_INTFX_LIDX_LTX_LDX_CFG(intf, lid, ltype, ld), cfg) 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define SET_KEX_LDFLAGS(intf, ld, flags, cfg) \ 1862306a36Sopenharmony_ci rvu_write64(rvu, blkaddr, \ 1962306a36Sopenharmony_ci NPC_AF_INTFX_LDATAX_FLAGSX_CFG(intf, ld, flags), cfg) 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cienum NPC_LID_E { 2262306a36Sopenharmony_ci NPC_LID_LA = 0, 2362306a36Sopenharmony_ci NPC_LID_LB, 2462306a36Sopenharmony_ci NPC_LID_LC, 2562306a36Sopenharmony_ci NPC_LID_LD, 2662306a36Sopenharmony_ci NPC_LID_LE, 2762306a36Sopenharmony_ci NPC_LID_LF, 2862306a36Sopenharmony_ci NPC_LID_LG, 2962306a36Sopenharmony_ci NPC_LID_LH, 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define NPC_LT_NA 0 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cienum npc_kpu_la_ltype { 3562306a36Sopenharmony_ci NPC_LT_LA_8023 = 1, 3662306a36Sopenharmony_ci NPC_LT_LA_ETHER, 3762306a36Sopenharmony_ci NPC_LT_LA_IH_NIX_ETHER, 3862306a36Sopenharmony_ci NPC_LT_LA_HIGIG2_ETHER = 7, 3962306a36Sopenharmony_ci NPC_LT_LA_IH_NIX_HIGIG2_ETHER, 4062306a36Sopenharmony_ci NPC_LT_LA_CUSTOM_L2_90B_ETHER, 4162306a36Sopenharmony_ci NPC_LT_LA_CPT_HDR, 4262306a36Sopenharmony_ci NPC_LT_LA_CUSTOM_L2_24B_ETHER, 4362306a36Sopenharmony_ci NPC_LT_LA_CUSTOM_PRE_L2_ETHER, 4462306a36Sopenharmony_ci NPC_LT_LA_CUSTOM0 = 0xE, 4562306a36Sopenharmony_ci NPC_LT_LA_CUSTOM1 = 0xF, 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cienum npc_kpu_lb_ltype { 4962306a36Sopenharmony_ci NPC_LT_LB_ETAG = 1, 5062306a36Sopenharmony_ci NPC_LT_LB_CTAG, 5162306a36Sopenharmony_ci NPC_LT_LB_STAG_QINQ, 5262306a36Sopenharmony_ci NPC_LT_LB_BTAG, 5362306a36Sopenharmony_ci NPC_LT_LB_PPPOE, 5462306a36Sopenharmony_ci NPC_LT_LB_DSA, 5562306a36Sopenharmony_ci NPC_LT_LB_DSA_VLAN, 5662306a36Sopenharmony_ci NPC_LT_LB_EDSA, 5762306a36Sopenharmony_ci NPC_LT_LB_EDSA_VLAN, 5862306a36Sopenharmony_ci NPC_LT_LB_EXDSA, 5962306a36Sopenharmony_ci NPC_LT_LB_EXDSA_VLAN, 6062306a36Sopenharmony_ci NPC_LT_LB_FDSA, 6162306a36Sopenharmony_ci NPC_LT_LB_VLAN_EXDSA, 6262306a36Sopenharmony_ci NPC_LT_LB_CUSTOM0 = 0xE, 6362306a36Sopenharmony_ci NPC_LT_LB_CUSTOM1 = 0xF, 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cienum npc_kpu_lc_ltype { 6762306a36Sopenharmony_ci NPC_LT_LC_IP = 1, 6862306a36Sopenharmony_ci NPC_LT_LC_IP_OPT, 6962306a36Sopenharmony_ci NPC_LT_LC_IP6, 7062306a36Sopenharmony_ci NPC_LT_LC_IP6_EXT, 7162306a36Sopenharmony_ci NPC_LT_LC_ARP, 7262306a36Sopenharmony_ci NPC_LT_LC_RARP, 7362306a36Sopenharmony_ci NPC_LT_LC_MPLS, 7462306a36Sopenharmony_ci NPC_LT_LC_NSH, 7562306a36Sopenharmony_ci NPC_LT_LC_PTP, 7662306a36Sopenharmony_ci NPC_LT_LC_FCOE, 7762306a36Sopenharmony_ci NPC_LT_LC_NGIO, 7862306a36Sopenharmony_ci NPC_LT_LC_CUSTOM0 = 0xE, 7962306a36Sopenharmony_ci NPC_LT_LC_CUSTOM1 = 0xF, 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/* Don't modify Ltypes upto SCTP, otherwise it will 8362306a36Sopenharmony_ci * effect flow tag calculation and thus RSS. 8462306a36Sopenharmony_ci */ 8562306a36Sopenharmony_cienum npc_kpu_ld_ltype { 8662306a36Sopenharmony_ci NPC_LT_LD_TCP = 1, 8762306a36Sopenharmony_ci NPC_LT_LD_UDP, 8862306a36Sopenharmony_ci NPC_LT_LD_ICMP, 8962306a36Sopenharmony_ci NPC_LT_LD_SCTP, 9062306a36Sopenharmony_ci NPC_LT_LD_ICMP6, 9162306a36Sopenharmony_ci NPC_LT_LD_CUSTOM0, 9262306a36Sopenharmony_ci NPC_LT_LD_CUSTOM1, 9362306a36Sopenharmony_ci NPC_LT_LD_IGMP = 8, 9462306a36Sopenharmony_ci NPC_LT_LD_AH, 9562306a36Sopenharmony_ci NPC_LT_LD_GRE, 9662306a36Sopenharmony_ci NPC_LT_LD_NVGRE, 9762306a36Sopenharmony_ci NPC_LT_LD_NSH, 9862306a36Sopenharmony_ci NPC_LT_LD_TU_MPLS_IN_NSH, 9962306a36Sopenharmony_ci NPC_LT_LD_TU_MPLS_IN_IP, 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cienum npc_kpu_le_ltype { 10362306a36Sopenharmony_ci NPC_LT_LE_VXLAN = 1, 10462306a36Sopenharmony_ci NPC_LT_LE_GENEVE, 10562306a36Sopenharmony_ci NPC_LT_LE_ESP, 10662306a36Sopenharmony_ci NPC_LT_LE_GTPU = 4, 10762306a36Sopenharmony_ci NPC_LT_LE_VXLANGPE, 10862306a36Sopenharmony_ci NPC_LT_LE_GTPC, 10962306a36Sopenharmony_ci NPC_LT_LE_NSH, 11062306a36Sopenharmony_ci NPC_LT_LE_TU_MPLS_IN_GRE, 11162306a36Sopenharmony_ci NPC_LT_LE_TU_NSH_IN_GRE, 11262306a36Sopenharmony_ci NPC_LT_LE_TU_MPLS_IN_UDP, 11362306a36Sopenharmony_ci NPC_LT_LE_CUSTOM0 = 0xE, 11462306a36Sopenharmony_ci NPC_LT_LE_CUSTOM1 = 0xF, 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_cienum npc_kpu_lf_ltype { 11862306a36Sopenharmony_ci NPC_LT_LF_TU_ETHER = 1, 11962306a36Sopenharmony_ci NPC_LT_LF_TU_PPP, 12062306a36Sopenharmony_ci NPC_LT_LF_TU_MPLS_IN_VXLANGPE, 12162306a36Sopenharmony_ci NPC_LT_LF_TU_NSH_IN_VXLANGPE, 12262306a36Sopenharmony_ci NPC_LT_LF_TU_MPLS_IN_NSH, 12362306a36Sopenharmony_ci NPC_LT_LF_TU_3RD_NSH, 12462306a36Sopenharmony_ci NPC_LT_LF_CUSTOM0 = 0xE, 12562306a36Sopenharmony_ci NPC_LT_LF_CUSTOM1 = 0xF, 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cienum npc_kpu_lg_ltype { 12962306a36Sopenharmony_ci NPC_LT_LG_TU_IP = 1, 13062306a36Sopenharmony_ci NPC_LT_LG_TU_IP6, 13162306a36Sopenharmony_ci NPC_LT_LG_TU_ARP, 13262306a36Sopenharmony_ci NPC_LT_LG_TU_ETHER_IN_NSH, 13362306a36Sopenharmony_ci NPC_LT_LG_CUSTOM0 = 0xE, 13462306a36Sopenharmony_ci NPC_LT_LG_CUSTOM1 = 0xF, 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci/* Don't modify Ltypes upto SCTP, otherwise it will 13862306a36Sopenharmony_ci * effect flow tag calculation and thus RSS. 13962306a36Sopenharmony_ci */ 14062306a36Sopenharmony_cienum npc_kpu_lh_ltype { 14162306a36Sopenharmony_ci NPC_LT_LH_TU_TCP = 1, 14262306a36Sopenharmony_ci NPC_LT_LH_TU_UDP, 14362306a36Sopenharmony_ci NPC_LT_LH_TU_ICMP, 14462306a36Sopenharmony_ci NPC_LT_LH_TU_SCTP, 14562306a36Sopenharmony_ci NPC_LT_LH_TU_ICMP6, 14662306a36Sopenharmony_ci NPC_LT_LH_TU_IGMP = 8, 14762306a36Sopenharmony_ci NPC_LT_LH_TU_ESP, 14862306a36Sopenharmony_ci NPC_LT_LH_TU_AH, 14962306a36Sopenharmony_ci NPC_LT_LH_CUSTOM0 = 0xE, 15062306a36Sopenharmony_ci NPC_LT_LH_CUSTOM1 = 0xF, 15162306a36Sopenharmony_ci}; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci/* NPC port kind defines how the incoming or outgoing packets 15462306a36Sopenharmony_ci * are processed. NPC accepts packets from up to 64 pkinds. 15562306a36Sopenharmony_ci * Software assigns pkind for each incoming port such as CGX 15662306a36Sopenharmony_ci * Ethernet interfaces, LBK interfaces, etc. 15762306a36Sopenharmony_ci */ 15862306a36Sopenharmony_ci#define NPC_UNRESERVED_PKIND_COUNT NPC_RX_CUSTOM_PRE_L2_PKIND 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_cienum npc_pkind_type { 16162306a36Sopenharmony_ci NPC_RX_LBK_PKIND = 0ULL, 16262306a36Sopenharmony_ci NPC_RX_CUSTOM_PRE_L2_PKIND = 55ULL, 16362306a36Sopenharmony_ci NPC_RX_VLAN_EXDSA_PKIND = 56ULL, 16462306a36Sopenharmony_ci NPC_RX_CHLEN24B_PKIND = 57ULL, 16562306a36Sopenharmony_ci NPC_RX_CPT_HDR_PKIND, 16662306a36Sopenharmony_ci NPC_RX_CHLEN90B_PKIND, 16762306a36Sopenharmony_ci NPC_TX_HIGIG_PKIND, 16862306a36Sopenharmony_ci NPC_RX_HIGIG_PKIND, 16962306a36Sopenharmony_ci NPC_RX_EDSA_PKIND, 17062306a36Sopenharmony_ci NPC_TX_DEF_PKIND, /* NIX-TX PKIND */ 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cienum npc_interface_type { 17462306a36Sopenharmony_ci NPC_INTF_MODE_DEF, 17562306a36Sopenharmony_ci}; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci/* list of known and supported fields in packet header and 17862306a36Sopenharmony_ci * fields present in key structure. 17962306a36Sopenharmony_ci */ 18062306a36Sopenharmony_cienum key_fields { 18162306a36Sopenharmony_ci NPC_DMAC, 18262306a36Sopenharmony_ci NPC_SMAC, 18362306a36Sopenharmony_ci NPC_ETYPE, 18462306a36Sopenharmony_ci NPC_VLAN_ETYPE_CTAG, /* 0x8100 */ 18562306a36Sopenharmony_ci NPC_VLAN_ETYPE_STAG, /* 0x88A8 */ 18662306a36Sopenharmony_ci NPC_OUTER_VID, 18762306a36Sopenharmony_ci NPC_INNER_VID, 18862306a36Sopenharmony_ci NPC_TOS, 18962306a36Sopenharmony_ci NPC_IPFRAG_IPV4, 19062306a36Sopenharmony_ci NPC_SIP_IPV4, 19162306a36Sopenharmony_ci NPC_DIP_IPV4, 19262306a36Sopenharmony_ci NPC_IPFRAG_IPV6, 19362306a36Sopenharmony_ci NPC_SIP_IPV6, 19462306a36Sopenharmony_ci NPC_DIP_IPV6, 19562306a36Sopenharmony_ci NPC_IPPROTO_TCP, 19662306a36Sopenharmony_ci NPC_IPPROTO_UDP, 19762306a36Sopenharmony_ci NPC_IPPROTO_SCTP, 19862306a36Sopenharmony_ci NPC_IPPROTO_AH, 19962306a36Sopenharmony_ci NPC_IPPROTO_ESP, 20062306a36Sopenharmony_ci NPC_IPPROTO_ICMP, 20162306a36Sopenharmony_ci NPC_IPPROTO_ICMP6, 20262306a36Sopenharmony_ci NPC_SPORT_TCP, 20362306a36Sopenharmony_ci NPC_DPORT_TCP, 20462306a36Sopenharmony_ci NPC_SPORT_UDP, 20562306a36Sopenharmony_ci NPC_DPORT_UDP, 20662306a36Sopenharmony_ci NPC_SPORT_SCTP, 20762306a36Sopenharmony_ci NPC_DPORT_SCTP, 20862306a36Sopenharmony_ci NPC_IPSEC_SPI, 20962306a36Sopenharmony_ci NPC_HEADER_FIELDS_MAX, 21062306a36Sopenharmony_ci NPC_CHAN = NPC_HEADER_FIELDS_MAX, /* Valid when Rx */ 21162306a36Sopenharmony_ci NPC_PF_FUNC, /* Valid when Tx */ 21262306a36Sopenharmony_ci NPC_ERRLEV, 21362306a36Sopenharmony_ci NPC_ERRCODE, 21462306a36Sopenharmony_ci NPC_LXMB, 21562306a36Sopenharmony_ci NPC_EXACT_RESULT, 21662306a36Sopenharmony_ci NPC_LA, 21762306a36Sopenharmony_ci NPC_LB, 21862306a36Sopenharmony_ci NPC_LC, 21962306a36Sopenharmony_ci NPC_LD, 22062306a36Sopenharmony_ci NPC_LE, 22162306a36Sopenharmony_ci NPC_LF, 22262306a36Sopenharmony_ci NPC_LG, 22362306a36Sopenharmony_ci NPC_LH, 22462306a36Sopenharmony_ci /* Ethertype for untagged frame */ 22562306a36Sopenharmony_ci NPC_ETYPE_ETHER, 22662306a36Sopenharmony_ci /* Ethertype for single tagged frame */ 22762306a36Sopenharmony_ci NPC_ETYPE_TAG1, 22862306a36Sopenharmony_ci /* Ethertype for double tagged frame */ 22962306a36Sopenharmony_ci NPC_ETYPE_TAG2, 23062306a36Sopenharmony_ci /* outer vlan tci for single tagged frame */ 23162306a36Sopenharmony_ci NPC_VLAN_TAG1, 23262306a36Sopenharmony_ci /* outer vlan tci for double tagged frame */ 23362306a36Sopenharmony_ci NPC_VLAN_TAG2, 23462306a36Sopenharmony_ci /* inner vlan tci for double tagged frame */ 23562306a36Sopenharmony_ci NPC_VLAN_TAG3, 23662306a36Sopenharmony_ci /* other header fields programmed to extract but not of our interest */ 23762306a36Sopenharmony_ci NPC_UNKNOWN, 23862306a36Sopenharmony_ci NPC_KEY_FIELDS_MAX, 23962306a36Sopenharmony_ci}; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistruct npc_kpu_profile_cam { 24262306a36Sopenharmony_ci u8 state; 24362306a36Sopenharmony_ci u8 state_mask; 24462306a36Sopenharmony_ci u16 dp0; 24562306a36Sopenharmony_ci u16 dp0_mask; 24662306a36Sopenharmony_ci u16 dp1; 24762306a36Sopenharmony_ci u16 dp1_mask; 24862306a36Sopenharmony_ci u16 dp2; 24962306a36Sopenharmony_ci u16 dp2_mask; 25062306a36Sopenharmony_ci} __packed; 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_cistruct npc_kpu_profile_action { 25362306a36Sopenharmony_ci u8 errlev; 25462306a36Sopenharmony_ci u8 errcode; 25562306a36Sopenharmony_ci u8 dp0_offset; 25662306a36Sopenharmony_ci u8 dp1_offset; 25762306a36Sopenharmony_ci u8 dp2_offset; 25862306a36Sopenharmony_ci u8 bypass_count; 25962306a36Sopenharmony_ci u8 parse_done; 26062306a36Sopenharmony_ci u8 next_state; 26162306a36Sopenharmony_ci u8 ptr_advance; 26262306a36Sopenharmony_ci u8 cap_ena; 26362306a36Sopenharmony_ci u8 lid; 26462306a36Sopenharmony_ci u8 ltype; 26562306a36Sopenharmony_ci u8 flags; 26662306a36Sopenharmony_ci u8 offset; 26762306a36Sopenharmony_ci u8 mask; 26862306a36Sopenharmony_ci u8 right; 26962306a36Sopenharmony_ci u8 shift; 27062306a36Sopenharmony_ci} __packed; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_cistruct npc_kpu_profile { 27362306a36Sopenharmony_ci int cam_entries; 27462306a36Sopenharmony_ci int action_entries; 27562306a36Sopenharmony_ci struct npc_kpu_profile_cam *cam; 27662306a36Sopenharmony_ci struct npc_kpu_profile_action *action; 27762306a36Sopenharmony_ci}; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci/* NPC KPU register formats */ 28062306a36Sopenharmony_cistruct npc_kpu_cam { 28162306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 28262306a36Sopenharmony_ci u64 rsvd_63_56 : 8; 28362306a36Sopenharmony_ci u64 state : 8; 28462306a36Sopenharmony_ci u64 dp2_data : 16; 28562306a36Sopenharmony_ci u64 dp1_data : 16; 28662306a36Sopenharmony_ci u64 dp0_data : 16; 28762306a36Sopenharmony_ci#else 28862306a36Sopenharmony_ci u64 dp0_data : 16; 28962306a36Sopenharmony_ci u64 dp1_data : 16; 29062306a36Sopenharmony_ci u64 dp2_data : 16; 29162306a36Sopenharmony_ci u64 state : 8; 29262306a36Sopenharmony_ci u64 rsvd_63_56 : 8; 29362306a36Sopenharmony_ci#endif 29462306a36Sopenharmony_ci}; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cistruct npc_kpu_action0 { 29762306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 29862306a36Sopenharmony_ci u64 rsvd_63_57 : 7; 29962306a36Sopenharmony_ci u64 byp_count : 3; 30062306a36Sopenharmony_ci u64 capture_ena : 1; 30162306a36Sopenharmony_ci u64 parse_done : 1; 30262306a36Sopenharmony_ci u64 next_state : 8; 30362306a36Sopenharmony_ci u64 rsvd_43 : 1; 30462306a36Sopenharmony_ci u64 capture_lid : 3; 30562306a36Sopenharmony_ci u64 capture_ltype : 4; 30662306a36Sopenharmony_ci u64 capture_flags : 8; 30762306a36Sopenharmony_ci u64 ptr_advance : 8; 30862306a36Sopenharmony_ci u64 var_len_offset : 8; 30962306a36Sopenharmony_ci u64 var_len_mask : 8; 31062306a36Sopenharmony_ci u64 var_len_right : 1; 31162306a36Sopenharmony_ci u64 var_len_shift : 3; 31262306a36Sopenharmony_ci#else 31362306a36Sopenharmony_ci u64 var_len_shift : 3; 31462306a36Sopenharmony_ci u64 var_len_right : 1; 31562306a36Sopenharmony_ci u64 var_len_mask : 8; 31662306a36Sopenharmony_ci u64 var_len_offset : 8; 31762306a36Sopenharmony_ci u64 ptr_advance : 8; 31862306a36Sopenharmony_ci u64 capture_flags : 8; 31962306a36Sopenharmony_ci u64 capture_ltype : 4; 32062306a36Sopenharmony_ci u64 capture_lid : 3; 32162306a36Sopenharmony_ci u64 rsvd_43 : 1; 32262306a36Sopenharmony_ci u64 next_state : 8; 32362306a36Sopenharmony_ci u64 parse_done : 1; 32462306a36Sopenharmony_ci u64 capture_ena : 1; 32562306a36Sopenharmony_ci u64 byp_count : 3; 32662306a36Sopenharmony_ci u64 rsvd_63_57 : 7; 32762306a36Sopenharmony_ci#endif 32862306a36Sopenharmony_ci}; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_cistruct npc_kpu_action1 { 33162306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 33262306a36Sopenharmony_ci u64 rsvd_63_36 : 28; 33362306a36Sopenharmony_ci u64 errlev : 4; 33462306a36Sopenharmony_ci u64 errcode : 8; 33562306a36Sopenharmony_ci u64 dp2_offset : 8; 33662306a36Sopenharmony_ci u64 dp1_offset : 8; 33762306a36Sopenharmony_ci u64 dp0_offset : 8; 33862306a36Sopenharmony_ci#else 33962306a36Sopenharmony_ci u64 dp0_offset : 8; 34062306a36Sopenharmony_ci u64 dp1_offset : 8; 34162306a36Sopenharmony_ci u64 dp2_offset : 8; 34262306a36Sopenharmony_ci u64 errcode : 8; 34362306a36Sopenharmony_ci u64 errlev : 4; 34462306a36Sopenharmony_ci u64 rsvd_63_36 : 28; 34562306a36Sopenharmony_ci#endif 34662306a36Sopenharmony_ci}; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_cistruct npc_kpu_pkind_cpi_def { 34962306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 35062306a36Sopenharmony_ci u64 ena : 1; 35162306a36Sopenharmony_ci u64 rsvd_62_59 : 4; 35262306a36Sopenharmony_ci u64 lid : 3; 35362306a36Sopenharmony_ci u64 ltype_match : 4; 35462306a36Sopenharmony_ci u64 ltype_mask : 4; 35562306a36Sopenharmony_ci u64 flags_match : 8; 35662306a36Sopenharmony_ci u64 flags_mask : 8; 35762306a36Sopenharmony_ci u64 add_offset : 8; 35862306a36Sopenharmony_ci u64 add_mask : 8; 35962306a36Sopenharmony_ci u64 rsvd_15 : 1; 36062306a36Sopenharmony_ci u64 add_shift : 3; 36162306a36Sopenharmony_ci u64 rsvd_11_10 : 2; 36262306a36Sopenharmony_ci u64 cpi_base : 10; 36362306a36Sopenharmony_ci#else 36462306a36Sopenharmony_ci u64 cpi_base : 10; 36562306a36Sopenharmony_ci u64 rsvd_11_10 : 2; 36662306a36Sopenharmony_ci u64 add_shift : 3; 36762306a36Sopenharmony_ci u64 rsvd_15 : 1; 36862306a36Sopenharmony_ci u64 add_mask : 8; 36962306a36Sopenharmony_ci u64 add_offset : 8; 37062306a36Sopenharmony_ci u64 flags_mask : 8; 37162306a36Sopenharmony_ci u64 flags_match : 8; 37262306a36Sopenharmony_ci u64 ltype_mask : 4; 37362306a36Sopenharmony_ci u64 ltype_match : 4; 37462306a36Sopenharmony_ci u64 lid : 3; 37562306a36Sopenharmony_ci u64 rsvd_62_59 : 4; 37662306a36Sopenharmony_ci u64 ena : 1; 37762306a36Sopenharmony_ci#endif 37862306a36Sopenharmony_ci}; 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_cistruct nix_rx_action { 38162306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 38262306a36Sopenharmony_ci u64 rsvd_63_61 :3; 38362306a36Sopenharmony_ci u64 flow_key_alg :5; 38462306a36Sopenharmony_ci u64 match_id :16; 38562306a36Sopenharmony_ci u64 index :20; 38662306a36Sopenharmony_ci u64 pf_func :16; 38762306a36Sopenharmony_ci u64 op :4; 38862306a36Sopenharmony_ci#else 38962306a36Sopenharmony_ci u64 op :4; 39062306a36Sopenharmony_ci u64 pf_func :16; 39162306a36Sopenharmony_ci u64 index :20; 39262306a36Sopenharmony_ci u64 match_id :16; 39362306a36Sopenharmony_ci u64 flow_key_alg :5; 39462306a36Sopenharmony_ci u64 rsvd_63_61 :3; 39562306a36Sopenharmony_ci#endif 39662306a36Sopenharmony_ci}; 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci/* NPC_AF_INTFX_KEX_CFG field masks */ 39962306a36Sopenharmony_ci#define NPC_EXACT_NIBBLE_START 40 40062306a36Sopenharmony_ci#define NPC_EXACT_NIBBLE_END 43 40162306a36Sopenharmony_ci#define NPC_EXACT_NIBBLE GENMASK_ULL(43, 40) 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci/* NPC_EXACT_KEX_S nibble definitions for each field */ 40462306a36Sopenharmony_ci#define NPC_EXACT_NIBBLE_HIT BIT_ULL(40) 40562306a36Sopenharmony_ci#define NPC_EXACT_NIBBLE_OPC BIT_ULL(40) 40662306a36Sopenharmony_ci#define NPC_EXACT_NIBBLE_WAY BIT_ULL(40) 40762306a36Sopenharmony_ci#define NPC_EXACT_NIBBLE_INDEX GENMASK_ULL(43, 41) 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci#define NPC_EXACT_RESULT_HIT BIT_ULL(0) 41062306a36Sopenharmony_ci#define NPC_EXACT_RESULT_OPC GENMASK_ULL(2, 1) 41162306a36Sopenharmony_ci#define NPC_EXACT_RESULT_WAY GENMASK_ULL(4, 3) 41262306a36Sopenharmony_ci#define NPC_EXACT_RESULT_IDX GENMASK_ULL(15, 5) 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci/* NPC_AF_INTFX_KEX_CFG field masks */ 41562306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE GENMASK_ULL(30, 0) 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci/* NPC_PARSE_KEX_S nibble definitions for each field */ 41862306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_CHAN GENMASK_ULL(2, 0) 41962306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_ERRLEV BIT_ULL(3) 42062306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_ERRCODE GENMASK_ULL(5, 4) 42162306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_L2L3_BCAST BIT_ULL(6) 42262306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LA_FLAGS GENMASK_ULL(8, 7) 42362306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LA_LTYPE BIT_ULL(9) 42462306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LB_FLAGS GENMASK_ULL(11, 10) 42562306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LB_LTYPE BIT_ULL(12) 42662306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LC_FLAGS GENMASK_ULL(14, 13) 42762306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LC_LTYPE BIT_ULL(15) 42862306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LD_FLAGS GENMASK_ULL(17, 16) 42962306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LD_LTYPE BIT_ULL(18) 43062306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LE_FLAGS GENMASK_ULL(20, 19) 43162306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LE_LTYPE BIT_ULL(21) 43262306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LF_FLAGS GENMASK_ULL(23, 22) 43362306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LF_LTYPE BIT_ULL(24) 43462306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LG_FLAGS GENMASK_ULL(26, 25) 43562306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LG_LTYPE BIT_ULL(27) 43662306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LH_FLAGS GENMASK_ULL(29, 28) 43762306a36Sopenharmony_ci#define NPC_PARSE_NIBBLE_LH_LTYPE BIT_ULL(30) 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_cistruct nix_tx_action { 44062306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 44162306a36Sopenharmony_ci u64 rsvd_63_48 :16; 44262306a36Sopenharmony_ci u64 match_id :16; 44362306a36Sopenharmony_ci u64 index :20; 44462306a36Sopenharmony_ci u64 rsvd_11_8 :8; 44562306a36Sopenharmony_ci u64 op :4; 44662306a36Sopenharmony_ci#else 44762306a36Sopenharmony_ci u64 op :4; 44862306a36Sopenharmony_ci u64 rsvd_11_8 :8; 44962306a36Sopenharmony_ci u64 index :20; 45062306a36Sopenharmony_ci u64 match_id :16; 45162306a36Sopenharmony_ci u64 rsvd_63_48 :16; 45262306a36Sopenharmony_ci#endif 45362306a36Sopenharmony_ci}; 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci/* NIX Receive Vtag Action Structure */ 45662306a36Sopenharmony_ci#define RX_VTAG0_VALID_BIT BIT_ULL(15) 45762306a36Sopenharmony_ci#define RX_VTAG0_TYPE_MASK GENMASK_ULL(14, 12) 45862306a36Sopenharmony_ci#define RX_VTAG0_LID_MASK GENMASK_ULL(10, 8) 45962306a36Sopenharmony_ci#define RX_VTAG0_RELPTR_MASK GENMASK_ULL(7, 0) 46062306a36Sopenharmony_ci#define RX_VTAG1_VALID_BIT BIT_ULL(47) 46162306a36Sopenharmony_ci#define RX_VTAG1_TYPE_MASK GENMASK_ULL(46, 44) 46262306a36Sopenharmony_ci#define RX_VTAG1_LID_MASK GENMASK_ULL(42, 40) 46362306a36Sopenharmony_ci#define RX_VTAG1_RELPTR_MASK GENMASK_ULL(39, 32) 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci/* NIX Transmit Vtag Action Structure */ 46662306a36Sopenharmony_ci#define TX_VTAG0_DEF_MASK GENMASK_ULL(25, 16) 46762306a36Sopenharmony_ci#define TX_VTAG0_OP_MASK GENMASK_ULL(13, 12) 46862306a36Sopenharmony_ci#define TX_VTAG0_LID_MASK GENMASK_ULL(10, 8) 46962306a36Sopenharmony_ci#define TX_VTAG0_RELPTR_MASK GENMASK_ULL(7, 0) 47062306a36Sopenharmony_ci#define TX_VTAG1_DEF_MASK GENMASK_ULL(57, 48) 47162306a36Sopenharmony_ci#define TX_VTAG1_OP_MASK GENMASK_ULL(45, 44) 47262306a36Sopenharmony_ci#define TX_VTAG1_LID_MASK GENMASK_ULL(42, 40) 47362306a36Sopenharmony_ci#define TX_VTAG1_RELPTR_MASK GENMASK_ULL(39, 32) 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci/* NPC MCAM reserved entry index per nixlf */ 47662306a36Sopenharmony_ci#define NIXLF_UCAST_ENTRY 0 47762306a36Sopenharmony_ci#define NIXLF_BCAST_ENTRY 1 47862306a36Sopenharmony_ci#define NIXLF_ALLMULTI_ENTRY 2 47962306a36Sopenharmony_ci#define NIXLF_PROMISC_ENTRY 3 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_cistruct npc_coalesced_kpu_prfl { 48262306a36Sopenharmony_ci#define NPC_SIGN 0x00666f727063706e 48362306a36Sopenharmony_ci#define NPC_PRFL_NAME "npc_prfls_array" 48462306a36Sopenharmony_ci#define NPC_NAME_LEN 32 48562306a36Sopenharmony_ci __le64 signature; /* "npcprof\0" (8 bytes/ASCII characters) */ 48662306a36Sopenharmony_ci u8 name[NPC_NAME_LEN]; /* KPU Profile name */ 48762306a36Sopenharmony_ci u64 version; /* KPU firmware/profile version */ 48862306a36Sopenharmony_ci u8 num_prfl; /* No of NPC profiles. */ 48962306a36Sopenharmony_ci u16 prfl_sz[]; 49062306a36Sopenharmony_ci}; 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_cistruct npc_mcam_kex { 49362306a36Sopenharmony_ci /* MKEX Profle Header */ 49462306a36Sopenharmony_ci u64 mkex_sign; /* "mcam-kex-profile" (8 bytes/ASCII characters) */ 49562306a36Sopenharmony_ci u8 name[MKEX_NAME_LEN]; /* MKEX Profile name */ 49662306a36Sopenharmony_ci u64 cpu_model; /* Format as profiled by CPU hardware */ 49762306a36Sopenharmony_ci u64 kpu_version; /* KPU firmware/profile version */ 49862306a36Sopenharmony_ci u64 reserved; /* Reserved for extension */ 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci /* MKEX Profle Data */ 50162306a36Sopenharmony_ci u64 keyx_cfg[NPC_MAX_INTF]; /* NPC_AF_INTF(0..1)_KEX_CFG */ 50262306a36Sopenharmony_ci /* NPC_AF_KEX_LDATA(0..1)_FLAGS_CFG */ 50362306a36Sopenharmony_ci u64 kex_ld_flags[NPC_MAX_LD]; 50462306a36Sopenharmony_ci /* NPC_AF_INTF(0..1)_LID(0..7)_LT(0..15)_LD(0..1)_CFG */ 50562306a36Sopenharmony_ci u64 intf_lid_lt_ld[NPC_MAX_INTF][NPC_MAX_LID][NPC_MAX_LT][NPC_MAX_LD]; 50662306a36Sopenharmony_ci /* NPC_AF_INTF(0..1)_LDATA(0..1)_FLAGS(0..15)_CFG */ 50762306a36Sopenharmony_ci u64 intf_ld_flags[NPC_MAX_INTF][NPC_MAX_LD][NPC_MAX_LFL]; 50862306a36Sopenharmony_ci} __packed; 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_cistruct npc_kpu_fwdata { 51162306a36Sopenharmony_ci int entries; 51262306a36Sopenharmony_ci /* What follows is: 51362306a36Sopenharmony_ci * struct npc_kpu_profile_cam[entries]; 51462306a36Sopenharmony_ci * struct npc_kpu_profile_action[entries]; 51562306a36Sopenharmony_ci */ 51662306a36Sopenharmony_ci u8 data[]; 51762306a36Sopenharmony_ci} __packed; 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_cistruct npc_lt_def { 52062306a36Sopenharmony_ci u8 ltype_mask; 52162306a36Sopenharmony_ci u8 ltype_match; 52262306a36Sopenharmony_ci u8 lid; 52362306a36Sopenharmony_ci} __packed; 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_cistruct npc_lt_def_ipsec { 52662306a36Sopenharmony_ci u8 ltype_mask; 52762306a36Sopenharmony_ci u8 ltype_match; 52862306a36Sopenharmony_ci u8 lid; 52962306a36Sopenharmony_ci u8 spi_offset; 53062306a36Sopenharmony_ci u8 spi_nz; 53162306a36Sopenharmony_ci} __packed; 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_cistruct npc_lt_def_apad { 53462306a36Sopenharmony_ci u8 ltype_mask; 53562306a36Sopenharmony_ci u8 ltype_match; 53662306a36Sopenharmony_ci u8 lid; 53762306a36Sopenharmony_ci u8 valid; 53862306a36Sopenharmony_ci} __packed; 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_cistruct npc_lt_def_color { 54162306a36Sopenharmony_ci u8 ltype_mask; 54262306a36Sopenharmony_ci u8 ltype_match; 54362306a36Sopenharmony_ci u8 lid; 54462306a36Sopenharmony_ci u8 noffset; 54562306a36Sopenharmony_ci u8 offset; 54662306a36Sopenharmony_ci} __packed; 54762306a36Sopenharmony_ci 54862306a36Sopenharmony_cistruct npc_lt_def_et { 54962306a36Sopenharmony_ci u8 ltype_mask; 55062306a36Sopenharmony_ci u8 ltype_match; 55162306a36Sopenharmony_ci u8 lid; 55262306a36Sopenharmony_ci u8 valid; 55362306a36Sopenharmony_ci u8 offset; 55462306a36Sopenharmony_ci} __packed; 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_cistruct npc_lt_def_cfg { 55762306a36Sopenharmony_ci struct npc_lt_def rx_ol2; 55862306a36Sopenharmony_ci struct npc_lt_def rx_oip4; 55962306a36Sopenharmony_ci struct npc_lt_def rx_iip4; 56062306a36Sopenharmony_ci struct npc_lt_def rx_oip6; 56162306a36Sopenharmony_ci struct npc_lt_def rx_iip6; 56262306a36Sopenharmony_ci struct npc_lt_def rx_otcp; 56362306a36Sopenharmony_ci struct npc_lt_def rx_itcp; 56462306a36Sopenharmony_ci struct npc_lt_def rx_oudp; 56562306a36Sopenharmony_ci struct npc_lt_def rx_iudp; 56662306a36Sopenharmony_ci struct npc_lt_def rx_osctp; 56762306a36Sopenharmony_ci struct npc_lt_def rx_isctp; 56862306a36Sopenharmony_ci struct npc_lt_def_ipsec rx_ipsec[2]; 56962306a36Sopenharmony_ci struct npc_lt_def pck_ol2; 57062306a36Sopenharmony_ci struct npc_lt_def pck_oip4; 57162306a36Sopenharmony_ci struct npc_lt_def pck_oip6; 57262306a36Sopenharmony_ci struct npc_lt_def pck_iip4; 57362306a36Sopenharmony_ci struct npc_lt_def_apad rx_apad0; 57462306a36Sopenharmony_ci struct npc_lt_def_apad rx_apad1; 57562306a36Sopenharmony_ci struct npc_lt_def_color ovlan; 57662306a36Sopenharmony_ci struct npc_lt_def_color ivlan; 57762306a36Sopenharmony_ci struct npc_lt_def_color rx_gen0_color; 57862306a36Sopenharmony_ci struct npc_lt_def_color rx_gen1_color; 57962306a36Sopenharmony_ci struct npc_lt_def_et rx_et[2]; 58062306a36Sopenharmony_ci} __packed; 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_ci/* Loadable KPU profile firmware data */ 58362306a36Sopenharmony_cistruct npc_kpu_profile_fwdata { 58462306a36Sopenharmony_ci#define KPU_SIGN 0x00666f727075706b 58562306a36Sopenharmony_ci#define KPU_NAME_LEN 32 58662306a36Sopenharmony_ci/** Maximum number of custom KPU entries supported by the built-in profile. */ 58762306a36Sopenharmony_ci#define KPU_MAX_CST_ENT 6 58862306a36Sopenharmony_ci /* KPU Profle Header */ 58962306a36Sopenharmony_ci __le64 signature; /* "kpuprof\0" (8 bytes/ASCII characters) */ 59062306a36Sopenharmony_ci u8 name[KPU_NAME_LEN]; /* KPU Profile name */ 59162306a36Sopenharmony_ci __le64 version; /* KPU profile version */ 59262306a36Sopenharmony_ci u8 kpus; 59362306a36Sopenharmony_ci u8 reserved[7]; 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_ci /* Default MKEX profile to be used with this KPU profile. May be 59662306a36Sopenharmony_ci * overridden with mkex_profile module parameter. Format is same as for 59762306a36Sopenharmony_ci * the MKEX profile to streamline processing. 59862306a36Sopenharmony_ci */ 59962306a36Sopenharmony_ci struct npc_mcam_kex mkex; 60062306a36Sopenharmony_ci /* LTYPE values for specific HW offloaded protocols. */ 60162306a36Sopenharmony_ci struct npc_lt_def_cfg lt_def; 60262306a36Sopenharmony_ci /* Dynamically sized data: 60362306a36Sopenharmony_ci * Custom KPU CAM and ACTION configuration entries. 60462306a36Sopenharmony_ci * struct npc_kpu_fwdata kpu[kpus]; 60562306a36Sopenharmony_ci */ 60662306a36Sopenharmony_ci u8 data[]; 60762306a36Sopenharmony_ci} __packed; 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_cistruct rvu_npc_mcam_rule { 61062306a36Sopenharmony_ci struct flow_msg packet; 61162306a36Sopenharmony_ci struct flow_msg mask; 61262306a36Sopenharmony_ci u8 intf; 61362306a36Sopenharmony_ci union { 61462306a36Sopenharmony_ci struct nix_tx_action tx_action; 61562306a36Sopenharmony_ci struct nix_rx_action rx_action; 61662306a36Sopenharmony_ci }; 61762306a36Sopenharmony_ci u64 vtag_action; 61862306a36Sopenharmony_ci struct list_head list; 61962306a36Sopenharmony_ci u64 features; 62062306a36Sopenharmony_ci u16 owner; 62162306a36Sopenharmony_ci u16 entry; 62262306a36Sopenharmony_ci u16 cntr; 62362306a36Sopenharmony_ci bool has_cntr; 62462306a36Sopenharmony_ci u8 default_rule; 62562306a36Sopenharmony_ci bool enable; 62662306a36Sopenharmony_ci bool vfvlan_cfg; 62762306a36Sopenharmony_ci u16 chan; 62862306a36Sopenharmony_ci u16 chan_mask; 62962306a36Sopenharmony_ci u8 lxmb; 63062306a36Sopenharmony_ci}; 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci#endif /* NPC_H */ 633