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