1e0632940SVladimir Oltean /* SPDX-License-Identifier: (GPL-2.0 OR MIT) 2e0632940SVladimir Oltean * Microsemi Ocelot Switch driver 3e0632940SVladimir Oltean * Copyright (c) 2019 Microsemi Corporation 4e0632940SVladimir Oltean */ 5e0632940SVladimir Oltean 6e0632940SVladimir Oltean #ifndef _OCELOT_VCAP_H_ 7e0632940SVladimir Oltean #define _OCELOT_VCAP_H_ 8e0632940SVladimir Oltean 9c1c3993eSVladimir Oltean #include <soc/mscc/ocelot.h> 10c1c3993eSVladimir Oltean 11c518afecSVladimir Oltean /* Cookie definitions for private VCAP filters installed by the driver. 12c518afecSVladimir Oltean * Must be unique per VCAP block. 13c518afecSVladimir Oltean */ 14c518afecSVladimir Oltean #define OCELOT_VCAP_ES0_TAG_8021Q_RXVLAN(ocelot, port) (port) 15c518afecSVladimir Oltean #define OCELOT_VCAP_IS1_TAG_8021Q_TXVLAN(ocelot, port) (port) 16c518afecSVladimir Oltean #define OCELOT_VCAP_IS2_TAG_8021Q_TXVLAN(ocelot, port) (port) 1785ea0daaSVladimir Oltean #define OCELOT_VCAP_IS2_MRP_REDIRECT(ocelot, port) ((ocelot)->num_phys_ports + (port)) 1899348004SVladimir Oltean #define OCELOT_VCAP_IS2_MRP_TRAP(ocelot) ((ocelot)->num_phys_ports * 2) 1985ea0daaSVladimir Oltean #define OCELOT_VCAP_IS2_L2_PTP_TRAP(ocelot) ((ocelot)->num_phys_ports * 2 + 1) 2085ea0daaSVladimir Oltean #define OCELOT_VCAP_IS2_IPV4_GEN_PTP_TRAP(ocelot) ((ocelot)->num_phys_ports * 2 + 2) 2185ea0daaSVladimir Oltean #define OCELOT_VCAP_IS2_IPV4_EV_PTP_TRAP(ocelot) ((ocelot)->num_phys_ports * 2 + 3) 2285ea0daaSVladimir Oltean #define OCELOT_VCAP_IS2_IPV6_GEN_PTP_TRAP(ocelot) ((ocelot)->num_phys_ports * 2 + 4) 2385ea0daaSVladimir Oltean #define OCELOT_VCAP_IS2_IPV6_EV_PTP_TRAP(ocelot) ((ocelot)->num_phys_ports * 2 + 5) 24c518afecSVladimir Oltean 25e0632940SVladimir Oltean /* ================================================================= 26e0632940SVladimir Oltean * VCAP Common 27e0632940SVladimir Oltean * ================================================================= 28e0632940SVladimir Oltean */ 29e0632940SVladimir Oltean 308551cdebSVladimir Oltean enum { 31e3aea296SVladimir Oltean VCAP_ES0, 32a61e365dSVladimir Oltean VCAP_IS1, 338551cdebSVladimir Oltean VCAP_IS2, 3420968054SVladimir Oltean __VCAP_COUNT, 358551cdebSVladimir Oltean }; 368551cdebSVladimir Oltean 3720968054SVladimir Oltean #define OCELOT_NUM_VCAP_BLOCKS __VCAP_COUNT 3820968054SVladimir Oltean 398551cdebSVladimir Oltean struct vcap_props { 408551cdebSVladimir Oltean u16 tg_width; /* Type-group width (in bits) */ 418551cdebSVladimir Oltean u16 sw_count; /* Sub word count */ 428551cdebSVladimir Oltean u16 entry_count; /* Entry count */ 438551cdebSVladimir Oltean u16 entry_words; /* Number of entry words */ 448551cdebSVladimir Oltean u16 entry_width; /* Entry width (in bits) */ 458551cdebSVladimir Oltean u16 action_count; /* Action count */ 468551cdebSVladimir Oltean u16 action_words; /* Number of action words */ 478551cdebSVladimir Oltean u16 action_width; /* Action width (in bits) */ 488551cdebSVladimir Oltean u16 action_type_width; /* Action type width (in bits) */ 498551cdebSVladimir Oltean struct { 508551cdebSVladimir Oltean u16 width; /* Action type width (in bits) */ 518551cdebSVladimir Oltean u16 count; /* Action type sub word count */ 528551cdebSVladimir Oltean } action_table[2]; 538551cdebSVladimir Oltean u16 counter_words; /* Number of counter words */ 548551cdebSVladimir Oltean u16 counter_width; /* Counter width (in bits) */ 55c1c3993eSVladimir Oltean 56c1c3993eSVladimir Oltean enum ocelot_target target; 57c1c3993eSVladimir Oltean 58c1c3993eSVladimir Oltean const struct vcap_field *keys; 59c1c3993eSVladimir Oltean const struct vcap_field *actions; 608551cdebSVladimir Oltean }; 618551cdebSVladimir Oltean 62e0632940SVladimir Oltean /* VCAP Type-Group values */ 63e0632940SVladimir Oltean #define VCAP_TG_NONE 0 /* Entry is invalid */ 64e0632940SVladimir Oltean #define VCAP_TG_FULL 1 /* Full entry */ 65e0632940SVladimir Oltean #define VCAP_TG_HALF 2 /* Half entry */ 66e0632940SVladimir Oltean #define VCAP_TG_QUARTER 3 /* Quarter entry */ 67e0632940SVladimir Oltean 68c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_UPDATE_CMD(x) (((x) << 22) & GENMASK(24, 22)) 69c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_UPDATE_CMD_M GENMASK(24, 22) 70c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_UPDATE_CMD_X(x) (((x) & GENMASK(24, 22)) >> 22) 71c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_UPDATE_ENTRY_DIS BIT(21) 72c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_UPDATE_ACTION_DIS BIT(20) 73c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_UPDATE_CNT_DIS BIT(19) 74c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_UPDATE_ADDR(x) (((x) << 3) & GENMASK(18, 3)) 75c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_UPDATE_ADDR_M GENMASK(18, 3) 76c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_UPDATE_ADDR_X(x) (((x) & GENMASK(18, 3)) >> 3) 77c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_UPDATE_SHOT BIT(2) 78c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_CLEAR_CACHE BIT(1) 79c1c3993eSVladimir Oltean #define VCAP_CORE_UPDATE_CTRL_MV_TRAFFIC_IGN BIT(0) 80c1c3993eSVladimir Oltean 81c1c3993eSVladimir Oltean #define VCAP_CORE_MV_CFG_MV_NUM_POS(x) (((x) << 16) & GENMASK(31, 16)) 82c1c3993eSVladimir Oltean #define VCAP_CORE_MV_CFG_MV_NUM_POS_M GENMASK(31, 16) 83c1c3993eSVladimir Oltean #define VCAP_CORE_MV_CFG_MV_NUM_POS_X(x) (((x) & GENMASK(31, 16)) >> 16) 84c1c3993eSVladimir Oltean #define VCAP_CORE_MV_CFG_MV_SIZE(x) ((x) & GENMASK(15, 0)) 85c1c3993eSVladimir Oltean #define VCAP_CORE_MV_CFG_MV_SIZE_M GENMASK(15, 0) 86c1c3993eSVladimir Oltean 87c1c3993eSVladimir Oltean #define VCAP_CACHE_ENTRY_DAT_RSZ 0x4 88c1c3993eSVladimir Oltean 89c1c3993eSVladimir Oltean #define VCAP_CACHE_MASK_DAT_RSZ 0x4 90c1c3993eSVladimir Oltean 91c1c3993eSVladimir Oltean #define VCAP_CACHE_ACTION_DAT_RSZ 0x4 92c1c3993eSVladimir Oltean 93c1c3993eSVladimir Oltean #define VCAP_CACHE_CNT_DAT_RSZ 0x4 94c1c3993eSVladimir Oltean 95c1c3993eSVladimir Oltean #define VCAP_STICKY_VCAP_ROW_DELETED_STICKY BIT(0) 96c1c3993eSVladimir Oltean 97c1c3993eSVladimir Oltean #define TCAM_BIST_CTRL_TCAM_BIST BIT(1) 98c1c3993eSVladimir Oltean #define TCAM_BIST_CTRL_TCAM_INIT BIT(0) 99c1c3993eSVladimir Oltean 100c1c3993eSVladimir Oltean #define TCAM_BIST_CFG_TCAM_BIST_SOE_ENA BIT(8) 101c1c3993eSVladimir Oltean #define TCAM_BIST_CFG_TCAM_HCG_DIS BIT(7) 102c1c3993eSVladimir Oltean #define TCAM_BIST_CFG_TCAM_CG_DIS BIT(6) 103c1c3993eSVladimir Oltean #define TCAM_BIST_CFG_TCAM_BIAS(x) ((x) & GENMASK(5, 0)) 104c1c3993eSVladimir Oltean #define TCAM_BIST_CFG_TCAM_BIAS_M GENMASK(5, 0) 105c1c3993eSVladimir Oltean 106c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_RT_ERR BIT(15) 107c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_PENC_ERR BIT(14) 108c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_COMP_ERR BIT(13) 109c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_ADDR_ERR BIT(12) 110c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_BL1E_ERR BIT(11) 111c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_BL1_ERR BIT(10) 112c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_BL0E_ERR BIT(9) 113c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_BL0_ERR BIT(8) 114c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_PH1_ERR BIT(7) 115c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_PH0_ERR BIT(6) 116c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_PV1_ERR BIT(5) 117c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_PV0_ERR BIT(4) 118c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_RUN BIT(3) 119c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_ERR BIT(2) 120c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_BIST_BUSY BIT(1) 121c1c3993eSVladimir Oltean #define TCAM_BIST_STAT_TCAM_RDY BIT(0) 122c1c3993eSVladimir Oltean 123e0632940SVladimir Oltean /* ================================================================= 124e0632940SVladimir Oltean * VCAP IS2 125e0632940SVladimir Oltean * ================================================================= 126e0632940SVladimir Oltean */ 127e0632940SVladimir Oltean 128e0632940SVladimir Oltean /* IS2 half key types */ 129e0632940SVladimir Oltean #define IS2_TYPE_ETYPE 0 130e0632940SVladimir Oltean #define IS2_TYPE_LLC 1 131e0632940SVladimir Oltean #define IS2_TYPE_SNAP 2 132e0632940SVladimir Oltean #define IS2_TYPE_ARP 3 133e0632940SVladimir Oltean #define IS2_TYPE_IP_UDP_TCP 4 134e0632940SVladimir Oltean #define IS2_TYPE_IP_OTHER 5 135e0632940SVladimir Oltean #define IS2_TYPE_IPV6 6 136e0632940SVladimir Oltean #define IS2_TYPE_OAM 7 137e0632940SVladimir Oltean #define IS2_TYPE_SMAC_SIP6 8 138e0632940SVladimir Oltean #define IS2_TYPE_ANY 100 /* Pseudo type */ 139e0632940SVladimir Oltean 140e0632940SVladimir Oltean /* IS2 half key type mask for matching any IP */ 141e0632940SVladimir Oltean #define IS2_TYPE_MASK_IP_ANY 0xe 142e0632940SVladimir Oltean 1438551cdebSVladimir Oltean enum { 1448551cdebSVladimir Oltean IS2_ACTION_TYPE_NORMAL, 1458551cdebSVladimir Oltean IS2_ACTION_TYPE_SMAC_SIP, 1468551cdebSVladimir Oltean IS2_ACTION_TYPE_MAX, 1478551cdebSVladimir Oltean }; 148e0632940SVladimir Oltean 149e0632940SVladimir Oltean /* IS2 MASK_MODE values */ 150e0632940SVladimir Oltean #define IS2_ACT_MASK_MODE_NONE 0 151e0632940SVladimir Oltean #define IS2_ACT_MASK_MODE_FILTER 1 152e0632940SVladimir Oltean #define IS2_ACT_MASK_MODE_POLICY 2 153e0632940SVladimir Oltean #define IS2_ACT_MASK_MODE_REDIR 3 154e0632940SVladimir Oltean 155e0632940SVladimir Oltean /* IS2 REW_OP values */ 156e0632940SVladimir Oltean #define IS2_ACT_REW_OP_NONE 0 157e0632940SVladimir Oltean #define IS2_ACT_REW_OP_PTP_ONE 2 158e0632940SVladimir Oltean #define IS2_ACT_REW_OP_PTP_TWO 3 159e0632940SVladimir Oltean #define IS2_ACT_REW_OP_SPECIAL 8 160e0632940SVladimir Oltean #define IS2_ACT_REW_OP_PTP_ORG 9 161e0632940SVladimir Oltean #define IS2_ACT_REW_OP_PTP_ONE_SUB_DELAY_1 (IS2_ACT_REW_OP_PTP_ONE | (1 << 3)) 162e0632940SVladimir Oltean #define IS2_ACT_REW_OP_PTP_ONE_SUB_DELAY_2 (IS2_ACT_REW_OP_PTP_ONE | (2 << 3)) 163e0632940SVladimir Oltean #define IS2_ACT_REW_OP_PTP_ONE_ADD_DELAY (IS2_ACT_REW_OP_PTP_ONE | (1 << 5)) 164e0632940SVladimir Oltean #define IS2_ACT_REW_OP_PTP_ONE_ADD_SUB BIT(7) 165e0632940SVladimir Oltean 166e0632940SVladimir Oltean #define VCAP_PORT_WIDTH 4 167e0632940SVladimir Oltean 168e0632940SVladimir Oltean /* IS2 quarter key - SMAC_SIP4 */ 169e0632940SVladimir Oltean #define IS2_QKO_IGR_PORT 0 170e0632940SVladimir Oltean #define IS2_QKL_IGR_PORT VCAP_PORT_WIDTH 171e0632940SVladimir Oltean #define IS2_QKO_L2_SMAC (IS2_QKO_IGR_PORT + IS2_QKL_IGR_PORT) 172e0632940SVladimir Oltean #define IS2_QKL_L2_SMAC 48 173e0632940SVladimir Oltean #define IS2_QKO_L3_IP4_SIP (IS2_QKO_L2_SMAC + IS2_QKL_L2_SMAC) 174e0632940SVladimir Oltean #define IS2_QKL_L3_IP4_SIP 32 175e0632940SVladimir Oltean 176e0632940SVladimir Oltean enum vcap_is2_half_key_field { 177e0632940SVladimir Oltean /* Common */ 178e0632940SVladimir Oltean VCAP_IS2_TYPE, 179e0632940SVladimir Oltean VCAP_IS2_HK_FIRST, 180e0632940SVladimir Oltean VCAP_IS2_HK_PAG, 181e0632940SVladimir Oltean VCAP_IS2_HK_RSV1, 182e0632940SVladimir Oltean VCAP_IS2_HK_IGR_PORT_MASK, 183e0632940SVladimir Oltean VCAP_IS2_HK_RSV2, 184e0632940SVladimir Oltean VCAP_IS2_HK_HOST_MATCH, 185e0632940SVladimir Oltean VCAP_IS2_HK_L2_MC, 186e0632940SVladimir Oltean VCAP_IS2_HK_L2_BC, 187e0632940SVladimir Oltean VCAP_IS2_HK_VLAN_TAGGED, 188e0632940SVladimir Oltean VCAP_IS2_HK_VID, 189e0632940SVladimir Oltean VCAP_IS2_HK_DEI, 190e0632940SVladimir Oltean VCAP_IS2_HK_PCP, 191e0632940SVladimir Oltean /* MAC_ETYPE / MAC_LLC / MAC_SNAP / OAM common */ 192e0632940SVladimir Oltean VCAP_IS2_HK_L2_DMAC, 193e0632940SVladimir Oltean VCAP_IS2_HK_L2_SMAC, 194e0632940SVladimir Oltean /* MAC_ETYPE (TYPE=000) */ 195e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ETYPE_ETYPE, 196e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ETYPE_L2_PAYLOAD0, 197e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ETYPE_L2_PAYLOAD1, 198e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ETYPE_L2_PAYLOAD2, 199e0632940SVladimir Oltean /* MAC_LLC (TYPE=001) */ 200e0632940SVladimir Oltean VCAP_IS2_HK_MAC_LLC_DMAC, 201e0632940SVladimir Oltean VCAP_IS2_HK_MAC_LLC_SMAC, 202e0632940SVladimir Oltean VCAP_IS2_HK_MAC_LLC_L2_LLC, 203e0632940SVladimir Oltean /* MAC_SNAP (TYPE=010) */ 204e0632940SVladimir Oltean VCAP_IS2_HK_MAC_SNAP_SMAC, 205e0632940SVladimir Oltean VCAP_IS2_HK_MAC_SNAP_DMAC, 206e0632940SVladimir Oltean VCAP_IS2_HK_MAC_SNAP_L2_SNAP, 207e0632940SVladimir Oltean /* MAC_ARP (TYPE=011) */ 208e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ARP_SMAC, 209e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ARP_ADDR_SPACE_OK, 210e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ARP_PROTO_SPACE_OK, 211e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ARP_LEN_OK, 212e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ARP_TARGET_MATCH, 213e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ARP_SENDER_MATCH, 214e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ARP_OPCODE_UNKNOWN, 215e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ARP_OPCODE, 216e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ARP_L3_IP4_DIP, 217e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ARP_L3_IP4_SIP, 218e0632940SVladimir Oltean VCAP_IS2_HK_MAC_ARP_DIP_EQ_SIP, 219e0632940SVladimir Oltean /* IP4_TCP_UDP / IP4_OTHER common */ 220e0632940SVladimir Oltean VCAP_IS2_HK_IP4, 221e0632940SVladimir Oltean VCAP_IS2_HK_L3_FRAGMENT, 222e0632940SVladimir Oltean VCAP_IS2_HK_L3_FRAG_OFS_GT0, 223e0632940SVladimir Oltean VCAP_IS2_HK_L3_OPTIONS, 224e0632940SVladimir Oltean VCAP_IS2_HK_IP4_L3_TTL_GT0, 225e0632940SVladimir Oltean VCAP_IS2_HK_L3_TOS, 226e0632940SVladimir Oltean VCAP_IS2_HK_L3_IP4_DIP, 227e0632940SVladimir Oltean VCAP_IS2_HK_L3_IP4_SIP, 228e0632940SVladimir Oltean VCAP_IS2_HK_DIP_EQ_SIP, 229e0632940SVladimir Oltean /* IP4_TCP_UDP (TYPE=100) */ 230e0632940SVladimir Oltean VCAP_IS2_HK_TCP, 231e0632940SVladimir Oltean VCAP_IS2_HK_L4_SPORT, 232e0632940SVladimir Oltean VCAP_IS2_HK_L4_DPORT, 233e0632940SVladimir Oltean VCAP_IS2_HK_L4_RNG, 234e0632940SVladimir Oltean VCAP_IS2_HK_L4_SPORT_EQ_DPORT, 235e0632940SVladimir Oltean VCAP_IS2_HK_L4_SEQUENCE_EQ0, 236e0632940SVladimir Oltean VCAP_IS2_HK_L4_URG, 237e0632940SVladimir Oltean VCAP_IS2_HK_L4_ACK, 238e0632940SVladimir Oltean VCAP_IS2_HK_L4_PSH, 239e0632940SVladimir Oltean VCAP_IS2_HK_L4_RST, 240e0632940SVladimir Oltean VCAP_IS2_HK_L4_SYN, 241e0632940SVladimir Oltean VCAP_IS2_HK_L4_FIN, 242e0632940SVladimir Oltean VCAP_IS2_HK_L4_1588_DOM, 243e0632940SVladimir Oltean VCAP_IS2_HK_L4_1588_VER, 244e0632940SVladimir Oltean /* IP4_OTHER (TYPE=101) */ 245e0632940SVladimir Oltean VCAP_IS2_HK_IP4_L3_PROTO, 246e0632940SVladimir Oltean VCAP_IS2_HK_L3_PAYLOAD, 247e0632940SVladimir Oltean /* IP6_STD (TYPE=110) */ 248e0632940SVladimir Oltean VCAP_IS2_HK_IP6_L3_TTL_GT0, 249e0632940SVladimir Oltean VCAP_IS2_HK_IP6_L3_PROTO, 250e0632940SVladimir Oltean VCAP_IS2_HK_L3_IP6_SIP, 251e0632940SVladimir Oltean /* OAM (TYPE=111) */ 252e0632940SVladimir Oltean VCAP_IS2_HK_OAM_MEL_FLAGS, 253e0632940SVladimir Oltean VCAP_IS2_HK_OAM_VER, 254e0632940SVladimir Oltean VCAP_IS2_HK_OAM_OPCODE, 255e0632940SVladimir Oltean VCAP_IS2_HK_OAM_FLAGS, 256e0632940SVladimir Oltean VCAP_IS2_HK_OAM_MEPID, 257e0632940SVladimir Oltean VCAP_IS2_HK_OAM_CCM_CNTS_EQ0, 258e0632940SVladimir Oltean VCAP_IS2_HK_OAM_IS_Y1731, 259e0632940SVladimir Oltean }; 260e0632940SVladimir Oltean 261e0632940SVladimir Oltean struct vcap_field { 262e0632940SVladimir Oltean int offset; 263e0632940SVladimir Oltean int length; 264e0632940SVladimir Oltean }; 265e0632940SVladimir Oltean 266e0632940SVladimir Oltean enum vcap_is2_action_field { 267e0632940SVladimir Oltean VCAP_IS2_ACT_HIT_ME_ONCE, 268e0632940SVladimir Oltean VCAP_IS2_ACT_CPU_COPY_ENA, 269e0632940SVladimir Oltean VCAP_IS2_ACT_CPU_QU_NUM, 270e0632940SVladimir Oltean VCAP_IS2_ACT_MASK_MODE, 271e0632940SVladimir Oltean VCAP_IS2_ACT_MIRROR_ENA, 272e0632940SVladimir Oltean VCAP_IS2_ACT_LRN_DIS, 273e0632940SVladimir Oltean VCAP_IS2_ACT_POLICE_ENA, 274e0632940SVladimir Oltean VCAP_IS2_ACT_POLICE_IDX, 275e0632940SVladimir Oltean VCAP_IS2_ACT_POLICE_VCAP_ONLY, 276e0632940SVladimir Oltean VCAP_IS2_ACT_PORT_MASK, 277e0632940SVladimir Oltean VCAP_IS2_ACT_REW_OP, 278e0632940SVladimir Oltean VCAP_IS2_ACT_SMAC_REPLACE_ENA, 279e0632940SVladimir Oltean VCAP_IS2_ACT_RSV, 280e0632940SVladimir Oltean VCAP_IS2_ACT_ACL_ID, 281e0632940SVladimir Oltean VCAP_IS2_ACT_HIT_CNT, 282e0632940SVladimir Oltean }; 283e0632940SVladimir Oltean 284a61e365dSVladimir Oltean /* ================================================================= 285a61e365dSVladimir Oltean * VCAP IS1 286a61e365dSVladimir Oltean * ================================================================= 287a61e365dSVladimir Oltean */ 288a61e365dSVladimir Oltean 289a61e365dSVladimir Oltean /* IS1 half key types */ 290a61e365dSVladimir Oltean #define IS1_TYPE_S1_NORMAL 0 291a61e365dSVladimir Oltean #define IS1_TYPE_S1_5TUPLE_IP4 1 292a61e365dSVladimir Oltean 293a61e365dSVladimir Oltean /* IS1 full key types */ 294a61e365dSVladimir Oltean #define IS1_TYPE_S1_NORMAL_IP6 0 295a61e365dSVladimir Oltean #define IS1_TYPE_S1_7TUPLE 1 296a61e365dSVladimir Oltean #define IS2_TYPE_S1_5TUPLE_IP6 2 297a61e365dSVladimir Oltean 298a61e365dSVladimir Oltean enum { 299a61e365dSVladimir Oltean IS1_ACTION_TYPE_NORMAL, 300a61e365dSVladimir Oltean IS1_ACTION_TYPE_MAX, 301a61e365dSVladimir Oltean }; 302a61e365dSVladimir Oltean 303a61e365dSVladimir Oltean enum vcap_is1_half_key_field { 304a61e365dSVladimir Oltean VCAP_IS1_HK_TYPE, 305a61e365dSVladimir Oltean VCAP_IS1_HK_LOOKUP, 306a61e365dSVladimir Oltean VCAP_IS1_HK_IGR_PORT_MASK, 307a61e365dSVladimir Oltean VCAP_IS1_HK_RSV, 308a61e365dSVladimir Oltean VCAP_IS1_HK_OAM_Y1731, 309a61e365dSVladimir Oltean VCAP_IS1_HK_L2_MC, 310a61e365dSVladimir Oltean VCAP_IS1_HK_L2_BC, 311a61e365dSVladimir Oltean VCAP_IS1_HK_IP_MC, 312a61e365dSVladimir Oltean VCAP_IS1_HK_VLAN_TAGGED, 313a61e365dSVladimir Oltean VCAP_IS1_HK_VLAN_DBL_TAGGED, 314a61e365dSVladimir Oltean VCAP_IS1_HK_TPID, 315a61e365dSVladimir Oltean VCAP_IS1_HK_VID, 316a61e365dSVladimir Oltean VCAP_IS1_HK_DEI, 317a61e365dSVladimir Oltean VCAP_IS1_HK_PCP, 318a61e365dSVladimir Oltean /* Specific Fields for IS1 Half Key S1_NORMAL */ 319a61e365dSVladimir Oltean VCAP_IS1_HK_L2_SMAC, 320a61e365dSVladimir Oltean VCAP_IS1_HK_ETYPE_LEN, 321a61e365dSVladimir Oltean VCAP_IS1_HK_ETYPE, 322a61e365dSVladimir Oltean VCAP_IS1_HK_IP_SNAP, 323a61e365dSVladimir Oltean VCAP_IS1_HK_IP4, 324a61e365dSVladimir Oltean VCAP_IS1_HK_L3_FRAGMENT, 325a61e365dSVladimir Oltean VCAP_IS1_HK_L3_FRAG_OFS_GT0, 326a61e365dSVladimir Oltean VCAP_IS1_HK_L3_OPTIONS, 327a61e365dSVladimir Oltean VCAP_IS1_HK_L3_DSCP, 328a61e365dSVladimir Oltean VCAP_IS1_HK_L3_IP4_SIP, 329a61e365dSVladimir Oltean VCAP_IS1_HK_TCP_UDP, 330a61e365dSVladimir Oltean VCAP_IS1_HK_TCP, 331a61e365dSVladimir Oltean VCAP_IS1_HK_L4_SPORT, 332a61e365dSVladimir Oltean VCAP_IS1_HK_L4_RNG, 333a61e365dSVladimir Oltean /* Specific Fields for IS1 Half Key S1_5TUPLE_IP4 */ 334a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_INNER_TPID, 335a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_INNER_VID, 336a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_INNER_DEI, 337a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_INNER_PCP, 338a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_IP4, 339a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_L3_FRAGMENT, 340a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_L3_FRAG_OFS_GT0, 341a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_L3_OPTIONS, 342a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_L3_DSCP, 343a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_L3_IP4_DIP, 344a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_L3_IP4_SIP, 345a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_L3_PROTO, 346a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_TCP_UDP, 347a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_TCP, 348a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_L4_RNG, 349a61e365dSVladimir Oltean VCAP_IS1_HK_IP4_IP_PAYLOAD_S1_5TUPLE, 350a61e365dSVladimir Oltean }; 351a61e365dSVladimir Oltean 352a61e365dSVladimir Oltean enum vcap_is1_action_field { 353a61e365dSVladimir Oltean VCAP_IS1_ACT_DSCP_ENA, 354a61e365dSVladimir Oltean VCAP_IS1_ACT_DSCP_VAL, 355a61e365dSVladimir Oltean VCAP_IS1_ACT_QOS_ENA, 356a61e365dSVladimir Oltean VCAP_IS1_ACT_QOS_VAL, 357a61e365dSVladimir Oltean VCAP_IS1_ACT_DP_ENA, 358a61e365dSVladimir Oltean VCAP_IS1_ACT_DP_VAL, 359a61e365dSVladimir Oltean VCAP_IS1_ACT_PAG_OVERRIDE_MASK, 360a61e365dSVladimir Oltean VCAP_IS1_ACT_PAG_VAL, 361a61e365dSVladimir Oltean VCAP_IS1_ACT_RSV, 362a61e365dSVladimir Oltean VCAP_IS1_ACT_VID_REPLACE_ENA, 363a61e365dSVladimir Oltean VCAP_IS1_ACT_VID_ADD_VAL, 364a61e365dSVladimir Oltean VCAP_IS1_ACT_FID_SEL, 365a61e365dSVladimir Oltean VCAP_IS1_ACT_FID_VAL, 366a61e365dSVladimir Oltean VCAP_IS1_ACT_PCP_DEI_ENA, 367a61e365dSVladimir Oltean VCAP_IS1_ACT_PCP_VAL, 368a61e365dSVladimir Oltean VCAP_IS1_ACT_DEI_VAL, 369a61e365dSVladimir Oltean VCAP_IS1_ACT_VLAN_POP_CNT_ENA, 370a61e365dSVladimir Oltean VCAP_IS1_ACT_VLAN_POP_CNT, 371a61e365dSVladimir Oltean VCAP_IS1_ACT_CUSTOM_ACE_TYPE_ENA, 372a61e365dSVladimir Oltean VCAP_IS1_ACT_HIT_STICKY, 373a61e365dSVladimir Oltean }; 374a61e365dSVladimir Oltean 375e3aea296SVladimir Oltean /* ================================================================= 376e3aea296SVladimir Oltean * VCAP ES0 377e3aea296SVladimir Oltean * ================================================================= 378e3aea296SVladimir Oltean */ 379e3aea296SVladimir Oltean 380e3aea296SVladimir Oltean enum { 381e3aea296SVladimir Oltean ES0_ACTION_TYPE_NORMAL, 382e3aea296SVladimir Oltean ES0_ACTION_TYPE_MAX, 383e3aea296SVladimir Oltean }; 384e3aea296SVladimir Oltean 385e3aea296SVladimir Oltean enum vcap_es0_key_field { 386e3aea296SVladimir Oltean VCAP_ES0_EGR_PORT, 387e3aea296SVladimir Oltean VCAP_ES0_IGR_PORT, 388e3aea296SVladimir Oltean VCAP_ES0_RSV, 389e3aea296SVladimir Oltean VCAP_ES0_L2_MC, 390e3aea296SVladimir Oltean VCAP_ES0_L2_BC, 391e3aea296SVladimir Oltean VCAP_ES0_VID, 392e3aea296SVladimir Oltean VCAP_ES0_DP, 393e3aea296SVladimir Oltean VCAP_ES0_PCP, 394e3aea296SVladimir Oltean }; 395e3aea296SVladimir Oltean 396e3aea296SVladimir Oltean enum vcap_es0_action_field { 397e3aea296SVladimir Oltean VCAP_ES0_ACT_PUSH_OUTER_TAG, 398e3aea296SVladimir Oltean VCAP_ES0_ACT_PUSH_INNER_TAG, 399e3aea296SVladimir Oltean VCAP_ES0_ACT_TAG_A_TPID_SEL, 400e3aea296SVladimir Oltean VCAP_ES0_ACT_TAG_A_VID_SEL, 401e3aea296SVladimir Oltean VCAP_ES0_ACT_TAG_A_PCP_SEL, 402e3aea296SVladimir Oltean VCAP_ES0_ACT_TAG_A_DEI_SEL, 403e3aea296SVladimir Oltean VCAP_ES0_ACT_TAG_B_TPID_SEL, 404e3aea296SVladimir Oltean VCAP_ES0_ACT_TAG_B_VID_SEL, 405e3aea296SVladimir Oltean VCAP_ES0_ACT_TAG_B_PCP_SEL, 406e3aea296SVladimir Oltean VCAP_ES0_ACT_TAG_B_DEI_SEL, 407e3aea296SVladimir Oltean VCAP_ES0_ACT_VID_A_VAL, 408e3aea296SVladimir Oltean VCAP_ES0_ACT_PCP_A_VAL, 409e3aea296SVladimir Oltean VCAP_ES0_ACT_DEI_A_VAL, 410e3aea296SVladimir Oltean VCAP_ES0_ACT_VID_B_VAL, 411e3aea296SVladimir Oltean VCAP_ES0_ACT_PCP_B_VAL, 412e3aea296SVladimir Oltean VCAP_ES0_ACT_DEI_B_VAL, 413e3aea296SVladimir Oltean VCAP_ES0_ACT_RSV, 414e3aea296SVladimir Oltean VCAP_ES0_ACT_HIT_STICKY, 415e3aea296SVladimir Oltean }; 416e3aea296SVladimir Oltean 4170e9bb4e9SVladimir Oltean struct ocelot_ipv4 { 4180e9bb4e9SVladimir Oltean u8 addr[4]; 4190e9bb4e9SVladimir Oltean }; 4200e9bb4e9SVladimir Oltean 4210e9bb4e9SVladimir Oltean enum ocelot_vcap_bit { 4220e9bb4e9SVladimir Oltean OCELOT_VCAP_BIT_ANY, 4230e9bb4e9SVladimir Oltean OCELOT_VCAP_BIT_0, 4240e9bb4e9SVladimir Oltean OCELOT_VCAP_BIT_1 4250e9bb4e9SVladimir Oltean }; 4260e9bb4e9SVladimir Oltean 4270e9bb4e9SVladimir Oltean struct ocelot_vcap_u8 { 4280e9bb4e9SVladimir Oltean u8 value[1]; 4290e9bb4e9SVladimir Oltean u8 mask[1]; 4300e9bb4e9SVladimir Oltean }; 4310e9bb4e9SVladimir Oltean 4320e9bb4e9SVladimir Oltean struct ocelot_vcap_u16 { 4330e9bb4e9SVladimir Oltean u8 value[2]; 4340e9bb4e9SVladimir Oltean u8 mask[2]; 4350e9bb4e9SVladimir Oltean }; 4360e9bb4e9SVladimir Oltean 4370e9bb4e9SVladimir Oltean struct ocelot_vcap_u24 { 4380e9bb4e9SVladimir Oltean u8 value[3]; 4390e9bb4e9SVladimir Oltean u8 mask[3]; 4400e9bb4e9SVladimir Oltean }; 4410e9bb4e9SVladimir Oltean 4420e9bb4e9SVladimir Oltean struct ocelot_vcap_u32 { 4430e9bb4e9SVladimir Oltean u8 value[4]; 4440e9bb4e9SVladimir Oltean u8 mask[4]; 4450e9bb4e9SVladimir Oltean }; 4460e9bb4e9SVladimir Oltean 4470e9bb4e9SVladimir Oltean struct ocelot_vcap_u40 { 4480e9bb4e9SVladimir Oltean u8 value[5]; 4490e9bb4e9SVladimir Oltean u8 mask[5]; 4500e9bb4e9SVladimir Oltean }; 4510e9bb4e9SVladimir Oltean 4520e9bb4e9SVladimir Oltean struct ocelot_vcap_u48 { 4530e9bb4e9SVladimir Oltean u8 value[6]; 4540e9bb4e9SVladimir Oltean u8 mask[6]; 4550e9bb4e9SVladimir Oltean }; 4560e9bb4e9SVladimir Oltean 4570e9bb4e9SVladimir Oltean struct ocelot_vcap_u64 { 4580e9bb4e9SVladimir Oltean u8 value[8]; 4590e9bb4e9SVladimir Oltean u8 mask[8]; 4600e9bb4e9SVladimir Oltean }; 4610e9bb4e9SVladimir Oltean 4620e9bb4e9SVladimir Oltean struct ocelot_vcap_u128 { 4630e9bb4e9SVladimir Oltean u8 value[16]; 4640e9bb4e9SVladimir Oltean u8 mask[16]; 4650e9bb4e9SVladimir Oltean }; 4660e9bb4e9SVladimir Oltean 4670e9bb4e9SVladimir Oltean struct ocelot_vcap_vid { 4680e9bb4e9SVladimir Oltean u16 value; 4690e9bb4e9SVladimir Oltean u16 mask; 4700e9bb4e9SVladimir Oltean }; 4710e9bb4e9SVladimir Oltean 4720e9bb4e9SVladimir Oltean struct ocelot_vcap_ipv4 { 4730e9bb4e9SVladimir Oltean struct ocelot_ipv4 value; 4740e9bb4e9SVladimir Oltean struct ocelot_ipv4 mask; 4750e9bb4e9SVladimir Oltean }; 4760e9bb4e9SVladimir Oltean 4770e9bb4e9SVladimir Oltean struct ocelot_vcap_udp_tcp { 4780e9bb4e9SVladimir Oltean u16 value; 4790e9bb4e9SVladimir Oltean u16 mask; 4800e9bb4e9SVladimir Oltean }; 4810e9bb4e9SVladimir Oltean 4820e9bb4e9SVladimir Oltean struct ocelot_vcap_port { 4830e9bb4e9SVladimir Oltean u8 value; 4840e9bb4e9SVladimir Oltean u8 mask; 4850e9bb4e9SVladimir Oltean }; 4860e9bb4e9SVladimir Oltean 4870e9bb4e9SVladimir Oltean enum ocelot_vcap_key_type { 4880e9bb4e9SVladimir Oltean OCELOT_VCAP_KEY_ANY, 4890e9bb4e9SVladimir Oltean OCELOT_VCAP_KEY_ETYPE, 4900e9bb4e9SVladimir Oltean OCELOT_VCAP_KEY_LLC, 4910e9bb4e9SVladimir Oltean OCELOT_VCAP_KEY_SNAP, 4920e9bb4e9SVladimir Oltean OCELOT_VCAP_KEY_ARP, 4930e9bb4e9SVladimir Oltean OCELOT_VCAP_KEY_IPV4, 4940e9bb4e9SVladimir Oltean OCELOT_VCAP_KEY_IPV6 4950e9bb4e9SVladimir Oltean }; 4960e9bb4e9SVladimir Oltean 4970e9bb4e9SVladimir Oltean struct ocelot_vcap_key_vlan { 4980e9bb4e9SVladimir Oltean struct ocelot_vcap_vid vid; /* VLAN ID (12 bit) */ 4990e9bb4e9SVladimir Oltean struct ocelot_vcap_u8 pcp; /* PCP (3 bit) */ 5000e9bb4e9SVladimir Oltean enum ocelot_vcap_bit dei; /* DEI */ 5010e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tagged; /* Tagged/untagged frame */ 5020e9bb4e9SVladimir Oltean }; 5030e9bb4e9SVladimir Oltean 5040e9bb4e9SVladimir Oltean struct ocelot_vcap_key_etype { 5050e9bb4e9SVladimir Oltean struct ocelot_vcap_u48 dmac; 5060e9bb4e9SVladimir Oltean struct ocelot_vcap_u48 smac; 5070e9bb4e9SVladimir Oltean struct ocelot_vcap_u16 etype; 5080e9bb4e9SVladimir Oltean struct ocelot_vcap_u16 data; /* MAC data */ 5090e9bb4e9SVladimir Oltean }; 5100e9bb4e9SVladimir Oltean 5110e9bb4e9SVladimir Oltean struct ocelot_vcap_key_llc { 5120e9bb4e9SVladimir Oltean struct ocelot_vcap_u48 dmac; 5130e9bb4e9SVladimir Oltean struct ocelot_vcap_u48 smac; 5140e9bb4e9SVladimir Oltean 5150e9bb4e9SVladimir Oltean /* LLC header: DSAP at byte 0, SSAP at byte 1, Control at byte 2 */ 5160e9bb4e9SVladimir Oltean struct ocelot_vcap_u32 llc; 5170e9bb4e9SVladimir Oltean }; 5180e9bb4e9SVladimir Oltean 5190e9bb4e9SVladimir Oltean struct ocelot_vcap_key_snap { 5200e9bb4e9SVladimir Oltean struct ocelot_vcap_u48 dmac; 5210e9bb4e9SVladimir Oltean struct ocelot_vcap_u48 smac; 5220e9bb4e9SVladimir Oltean 5230e9bb4e9SVladimir Oltean /* SNAP header: Organization Code at byte 0, Type at byte 3 */ 5240e9bb4e9SVladimir Oltean struct ocelot_vcap_u40 snap; 5250e9bb4e9SVladimir Oltean }; 5260e9bb4e9SVladimir Oltean 5270e9bb4e9SVladimir Oltean struct ocelot_vcap_key_arp { 5280e9bb4e9SVladimir Oltean struct ocelot_vcap_u48 smac; 5290e9bb4e9SVladimir Oltean enum ocelot_vcap_bit arp; /* Opcode ARP/RARP */ 5300e9bb4e9SVladimir Oltean enum ocelot_vcap_bit req; /* Opcode request/reply */ 5310e9bb4e9SVladimir Oltean enum ocelot_vcap_bit unknown; /* Opcode unknown */ 5320e9bb4e9SVladimir Oltean enum ocelot_vcap_bit smac_match; /* Sender MAC matches SMAC */ 5330e9bb4e9SVladimir Oltean enum ocelot_vcap_bit dmac_match; /* Target MAC matches DMAC */ 5340e9bb4e9SVladimir Oltean 5350e9bb4e9SVladimir Oltean /**< Protocol addr. length 4, hardware length 6 */ 5360e9bb4e9SVladimir Oltean enum ocelot_vcap_bit length; 5370e9bb4e9SVladimir Oltean 5380e9bb4e9SVladimir Oltean enum ocelot_vcap_bit ip; /* Protocol address type IP */ 5390e9bb4e9SVladimir Oltean enum ocelot_vcap_bit ethernet; /* Hardware address type Ethernet */ 5400e9bb4e9SVladimir Oltean struct ocelot_vcap_ipv4 sip; /* Sender IP address */ 5410e9bb4e9SVladimir Oltean struct ocelot_vcap_ipv4 dip; /* Target IP address */ 5420e9bb4e9SVladimir Oltean }; 5430e9bb4e9SVladimir Oltean 5440e9bb4e9SVladimir Oltean struct ocelot_vcap_key_ipv4 { 5450e9bb4e9SVladimir Oltean enum ocelot_vcap_bit ttl; /* TTL zero */ 5460e9bb4e9SVladimir Oltean enum ocelot_vcap_bit fragment; /* Fragment */ 5470e9bb4e9SVladimir Oltean enum ocelot_vcap_bit options; /* Header options */ 5480e9bb4e9SVladimir Oltean struct ocelot_vcap_u8 ds; 5490e9bb4e9SVladimir Oltean struct ocelot_vcap_u8 proto; /* Protocol */ 5500e9bb4e9SVladimir Oltean struct ocelot_vcap_ipv4 sip; /* Source IP address */ 5510e9bb4e9SVladimir Oltean struct ocelot_vcap_ipv4 dip; /* Destination IP address */ 5520e9bb4e9SVladimir Oltean struct ocelot_vcap_u48 data; /* Not UDP/TCP: IP data */ 5530e9bb4e9SVladimir Oltean struct ocelot_vcap_udp_tcp sport; /* UDP/TCP: Source port */ 5540e9bb4e9SVladimir Oltean struct ocelot_vcap_udp_tcp dport; /* UDP/TCP: Destination port */ 5550e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_fin; 5560e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_syn; 5570e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_rst; 5580e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_psh; 5590e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_ack; 5600e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_urg; 5610e9bb4e9SVladimir Oltean enum ocelot_vcap_bit sip_eq_dip; /* SIP equals DIP */ 5620e9bb4e9SVladimir Oltean enum ocelot_vcap_bit sport_eq_dport; /* SPORT equals DPORT */ 5630e9bb4e9SVladimir Oltean enum ocelot_vcap_bit seq_zero; /* TCP sequence number is zero */ 5640e9bb4e9SVladimir Oltean }; 5650e9bb4e9SVladimir Oltean 5660e9bb4e9SVladimir Oltean struct ocelot_vcap_key_ipv6 { 5670e9bb4e9SVladimir Oltean struct ocelot_vcap_u8 proto; /* IPv6 protocol */ 5680e9bb4e9SVladimir Oltean struct ocelot_vcap_u128 sip; /* IPv6 source (byte 0-7 ignored) */ 5690e9bb4e9SVladimir Oltean struct ocelot_vcap_u128 dip; /* IPv6 destination (byte 0-7 ignored) */ 5700e9bb4e9SVladimir Oltean enum ocelot_vcap_bit ttl; /* TTL zero */ 5710e9bb4e9SVladimir Oltean struct ocelot_vcap_u8 ds; 5720e9bb4e9SVladimir Oltean struct ocelot_vcap_u48 data; /* Not UDP/TCP: IP data */ 5730e9bb4e9SVladimir Oltean struct ocelot_vcap_udp_tcp sport; 5740e9bb4e9SVladimir Oltean struct ocelot_vcap_udp_tcp dport; 5750e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_fin; 5760e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_syn; 5770e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_rst; 5780e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_psh; 5790e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_ack; 5800e9bb4e9SVladimir Oltean enum ocelot_vcap_bit tcp_urg; 5810e9bb4e9SVladimir Oltean enum ocelot_vcap_bit sip_eq_dip; /* SIP equals DIP */ 5820e9bb4e9SVladimir Oltean enum ocelot_vcap_bit sport_eq_dport; /* SPORT equals DPORT */ 5830e9bb4e9SVladimir Oltean enum ocelot_vcap_bit seq_zero; /* TCP sequence number is zero */ 5840e9bb4e9SVladimir Oltean }; 5850e9bb4e9SVladimir Oltean 5860e9bb4e9SVladimir Oltean enum ocelot_mask_mode { 5870e9bb4e9SVladimir Oltean OCELOT_MASK_MODE_NONE, 5880e9bb4e9SVladimir Oltean OCELOT_MASK_MODE_PERMIT_DENY, 5890e9bb4e9SVladimir Oltean OCELOT_MASK_MODE_POLICY, 5900e9bb4e9SVladimir Oltean OCELOT_MASK_MODE_REDIRECT, 5910e9bb4e9SVladimir Oltean }; 5920e9bb4e9SVladimir Oltean 593de5bbb6fSVladimir Oltean enum ocelot_es0_vid_sel { 594de5bbb6fSVladimir Oltean OCELOT_ES0_VID_PLUS_CLASSIFIED_VID = 0, 595de5bbb6fSVladimir Oltean OCELOT_ES0_VID = 1, 596de5bbb6fSVladimir Oltean }; 597de5bbb6fSVladimir Oltean 598de5bbb6fSVladimir Oltean enum ocelot_es0_pcp_sel { 599de5bbb6fSVladimir Oltean OCELOT_CLASSIFIED_PCP = 0, 600de5bbb6fSVladimir Oltean OCELOT_ES0_PCP = 1, 601de5bbb6fSVladimir Oltean }; 602de5bbb6fSVladimir Oltean 6030e9bb4e9SVladimir Oltean enum ocelot_es0_tag { 6040e9bb4e9SVladimir Oltean OCELOT_NO_ES0_TAG, 6050e9bb4e9SVladimir Oltean OCELOT_ES0_TAG, 6060e9bb4e9SVladimir Oltean OCELOT_FORCE_PORT_TAG, 6070e9bb4e9SVladimir Oltean OCELOT_FORCE_UNTAG, 6080e9bb4e9SVladimir Oltean }; 6090e9bb4e9SVladimir Oltean 6100e9bb4e9SVladimir Oltean enum ocelot_tag_tpid_sel { 6110e9bb4e9SVladimir Oltean OCELOT_TAG_TPID_SEL_8021Q, 6120e9bb4e9SVladimir Oltean OCELOT_TAG_TPID_SEL_8021AD, 6130e9bb4e9SVladimir Oltean }; 6140e9bb4e9SVladimir Oltean 6150e9bb4e9SVladimir Oltean struct ocelot_vcap_action { 6160e9bb4e9SVladimir Oltean union { 6170e9bb4e9SVladimir Oltean /* VCAP ES0 */ 6180e9bb4e9SVladimir Oltean struct { 6190e9bb4e9SVladimir Oltean enum ocelot_es0_tag push_outer_tag; 6200e9bb4e9SVladimir Oltean enum ocelot_es0_tag push_inner_tag; 6210e9bb4e9SVladimir Oltean enum ocelot_tag_tpid_sel tag_a_tpid_sel; 6220e9bb4e9SVladimir Oltean int tag_a_vid_sel; 6230e9bb4e9SVladimir Oltean int tag_a_pcp_sel; 6240e9bb4e9SVladimir Oltean u16 vid_a_val; 6250e9bb4e9SVladimir Oltean u8 pcp_a_val; 6260e9bb4e9SVladimir Oltean u8 dei_a_val; 6270e9bb4e9SVladimir Oltean enum ocelot_tag_tpid_sel tag_b_tpid_sel; 6280e9bb4e9SVladimir Oltean int tag_b_vid_sel; 6290e9bb4e9SVladimir Oltean int tag_b_pcp_sel; 6300e9bb4e9SVladimir Oltean u16 vid_b_val; 6310e9bb4e9SVladimir Oltean u8 pcp_b_val; 6320e9bb4e9SVladimir Oltean u8 dei_b_val; 6330e9bb4e9SVladimir Oltean }; 6340e9bb4e9SVladimir Oltean 6350e9bb4e9SVladimir Oltean /* VCAP IS1 */ 6360e9bb4e9SVladimir Oltean struct { 6370e9bb4e9SVladimir Oltean bool vid_replace_ena; 6380e9bb4e9SVladimir Oltean u16 vid; 6390e9bb4e9SVladimir Oltean bool vlan_pop_cnt_ena; 6400e9bb4e9SVladimir Oltean int vlan_pop_cnt; 6410e9bb4e9SVladimir Oltean bool pcp_dei_ena; 6420e9bb4e9SVladimir Oltean u8 pcp; 6430e9bb4e9SVladimir Oltean u8 dei; 6440e9bb4e9SVladimir Oltean bool qos_ena; 6450e9bb4e9SVladimir Oltean u8 qos_val; 6460e9bb4e9SVladimir Oltean u8 pag_override_mask; 6470e9bb4e9SVladimir Oltean u8 pag_val; 6480e9bb4e9SVladimir Oltean }; 6490e9bb4e9SVladimir Oltean 6500e9bb4e9SVladimir Oltean /* VCAP IS2 */ 6510e9bb4e9SVladimir Oltean struct { 6520e9bb4e9SVladimir Oltean bool cpu_copy_ena; 6530e9bb4e9SVladimir Oltean u8 cpu_qu_num; 6540e9bb4e9SVladimir Oltean enum ocelot_mask_mode mask_mode; 6550e9bb4e9SVladimir Oltean unsigned long port_mask; 6560e9bb4e9SVladimir Oltean bool police_ena; 657f2a0e216SVladimir Oltean bool mirror_ena; 6580e9bb4e9SVladimir Oltean struct ocelot_policer pol; 6590e9bb4e9SVladimir Oltean u32 pol_ix; 6600e9bb4e9SVladimir Oltean }; 6610e9bb4e9SVladimir Oltean }; 6620e9bb4e9SVladimir Oltean }; 6630e9bb4e9SVladimir Oltean 6640e9bb4e9SVladimir Oltean struct ocelot_vcap_stats { 6650e9bb4e9SVladimir Oltean u64 bytes; 6660e9bb4e9SVladimir Oltean u64 pkts; 6670e9bb4e9SVladimir Oltean u64 used; 6680e9bb4e9SVladimir Oltean }; 6690e9bb4e9SVladimir Oltean 6700e9bb4e9SVladimir Oltean enum ocelot_vcap_filter_type { 6710e9bb4e9SVladimir Oltean OCELOT_VCAP_FILTER_DUMMY, 6720e9bb4e9SVladimir Oltean OCELOT_VCAP_FILTER_PAG, 6730e9bb4e9SVladimir Oltean OCELOT_VCAP_FILTER_OFFLOAD, 67423e2c506SXiaoliang Yang OCELOT_PSFP_FILTER_OFFLOAD, 6750e9bb4e9SVladimir Oltean }; 6760e9bb4e9SVladimir Oltean 67750c6cc5bSVladimir Oltean struct ocelot_vcap_id { 67850c6cc5bSVladimir Oltean unsigned long cookie; 67950c6cc5bSVladimir Oltean bool tc_offload; 68050c6cc5bSVladimir Oltean }; 68150c6cc5bSVladimir Oltean 6820e9bb4e9SVladimir Oltean struct ocelot_vcap_filter { 6830e9bb4e9SVladimir Oltean struct list_head list; 6840e9bb4e9SVladimir Oltean 6850e9bb4e9SVladimir Oltean enum ocelot_vcap_filter_type type; 6860e9bb4e9SVladimir Oltean int block_id; 6870e9bb4e9SVladimir Oltean int goto_target; 6880e9bb4e9SVladimir Oltean int lookup; 6890e9bb4e9SVladimir Oltean u8 pag; 6900e9bb4e9SVladimir Oltean u16 prio; 69150c6cc5bSVladimir Oltean struct ocelot_vcap_id id; 6920e9bb4e9SVladimir Oltean 6930e9bb4e9SVladimir Oltean struct ocelot_vcap_action action; 6940e9bb4e9SVladimir Oltean struct ocelot_vcap_stats stats; 6950e9bb4e9SVladimir Oltean /* For VCAP IS1 and IS2 */ 6969d75b881SVladimir Oltean bool take_ts; 697*e1846cffSVladimir Oltean bool is_trap; 6980e9bb4e9SVladimir Oltean unsigned long ingress_port_mask; 6990e9bb4e9SVladimir Oltean /* For VCAP ES0 */ 7000e9bb4e9SVladimir Oltean struct ocelot_vcap_port ingress_port; 701f2a0e216SVladimir Oltean /* For VCAP IS2 mirrors and ES0 */ 7020e9bb4e9SVladimir Oltean struct ocelot_vcap_port egress_port; 7030e9bb4e9SVladimir Oltean 7040e9bb4e9SVladimir Oltean enum ocelot_vcap_bit dmac_mc; 7050e9bb4e9SVladimir Oltean enum ocelot_vcap_bit dmac_bc; 7060e9bb4e9SVladimir Oltean struct ocelot_vcap_key_vlan vlan; 7070e9bb4e9SVladimir Oltean 7080e9bb4e9SVladimir Oltean enum ocelot_vcap_key_type key_type; 7090e9bb4e9SVladimir Oltean union { 7100e9bb4e9SVladimir Oltean /* OCELOT_VCAP_KEY_ANY: No specific fields */ 7110e9bb4e9SVladimir Oltean struct ocelot_vcap_key_etype etype; 7120e9bb4e9SVladimir Oltean struct ocelot_vcap_key_llc llc; 7130e9bb4e9SVladimir Oltean struct ocelot_vcap_key_snap snap; 7140e9bb4e9SVladimir Oltean struct ocelot_vcap_key_arp arp; 7150e9bb4e9SVladimir Oltean struct ocelot_vcap_key_ipv4 ipv4; 7160e9bb4e9SVladimir Oltean struct ocelot_vcap_key_ipv6 ipv6; 7170e9bb4e9SVladimir Oltean } key; 7180e9bb4e9SVladimir Oltean }; 7190e9bb4e9SVladimir Oltean 7200e9bb4e9SVladimir Oltean int ocelot_vcap_filter_add(struct ocelot *ocelot, 7210e9bb4e9SVladimir Oltean struct ocelot_vcap_filter *rule, 7220e9bb4e9SVladimir Oltean struct netlink_ext_ack *extack); 7230e9bb4e9SVladimir Oltean int ocelot_vcap_filter_del(struct ocelot *ocelot, 7240e9bb4e9SVladimir Oltean struct ocelot_vcap_filter *rule); 72595706be1SVladimir Oltean int ocelot_vcap_filter_replace(struct ocelot *ocelot, 72695706be1SVladimir Oltean struct ocelot_vcap_filter *filter); 727e21268efSVladimir Oltean struct ocelot_vcap_filter * 728019d9329SVladimir Oltean ocelot_vcap_block_find_filter_by_id(struct ocelot_vcap_block *block, 729019d9329SVladimir Oltean unsigned long cookie, bool tc_offload); 7300e9bb4e9SVladimir Oltean 731e0632940SVladimir Oltean #endif /* _OCELOT_VCAP_H_ */ 732