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