0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _MVPP2_PRS_H_
0010 #define _MVPP2_PRS_H_
0011
0012 #include <linux/kernel.h>
0013 #include <linux/netdevice.h>
0014 #include <linux/platform_device.h>
0015
0016 #include "mvpp2.h"
0017
0018
0019 #define MVPP2_PRS_TCAM_SRAM_SIZE 256
0020 #define MVPP2_PRS_TCAM_WORDS 6
0021 #define MVPP2_PRS_SRAM_WORDS 4
0022 #define MVPP2_PRS_FLOW_ID_SIZE 64
0023 #define MVPP2_PRS_FLOW_ID_MASK 0x3f
0024 #define MVPP2_PRS_TCAM_ENTRY_INVALID 1
0025 #define MVPP2_PRS_TCAM_DSA_TAGGED_BIT BIT(5)
0026 #define MVPP2_PRS_IPV4_HEAD 0x40
0027 #define MVPP2_PRS_IPV4_HEAD_MASK 0xf0
0028 #define MVPP2_PRS_IPV4_MC 0xe0
0029 #define MVPP2_PRS_IPV4_MC_MASK 0xf0
0030 #define MVPP2_PRS_IPV4_BC_MASK 0xff
0031 #define MVPP2_PRS_IPV4_IHL_MIN 0x5
0032 #define MVPP2_PRS_IPV4_IHL_MAX 0xf
0033 #define MVPP2_PRS_IPV4_IHL_MASK 0xf
0034 #define MVPP2_PRS_IPV6_MC 0xff
0035 #define MVPP2_PRS_IPV6_MC_MASK 0xff
0036 #define MVPP2_PRS_IPV6_HOP_MASK 0xff
0037 #define MVPP2_PRS_TCAM_PROTO_MASK 0xff
0038 #define MVPP2_PRS_TCAM_PROTO_MASK_L 0x3f
0039 #define MVPP2_PRS_DBL_VLANS_MAX 100
0040 #define MVPP2_PRS_CAST_MASK BIT(0)
0041 #define MVPP2_PRS_MCAST_VAL BIT(0)
0042 #define MVPP2_PRS_UCAST_VAL 0x0
0043
0044
0045
0046
0047
0048
0049
0050
0051 #define MVPP2_PRS_AI_BITS 8
0052 #define MVPP2_PRS_AI_MASK 0xff
0053 #define MVPP2_PRS_PORT_MASK 0xff
0054 #define MVPP2_PRS_LU_MASK 0xf
0055
0056
0057 #define MVPP2_PRS_BYTE_TO_WORD(byte) ((byte) / 2)
0058 #define MVPP2_PRS_BYTE_IN_WORD(byte) ((byte) % 2)
0059
0060 #define MVPP2_PRS_TCAM_EN(data) ((data) << 16)
0061 #define MVPP2_PRS_TCAM_AI_WORD 4
0062 #define MVPP2_PRS_TCAM_AI(ai) (ai)
0063 #define MVPP2_PRS_TCAM_AI_EN(ai) MVPP2_PRS_TCAM_EN(MVPP2_PRS_TCAM_AI(ai))
0064 #define MVPP2_PRS_TCAM_PORT_WORD 4
0065 #define MVPP2_PRS_TCAM_PORT(p) ((p) << 8)
0066 #define MVPP2_PRS_TCAM_PORT_EN(p) MVPP2_PRS_TCAM_EN(MVPP2_PRS_TCAM_PORT(p))
0067 #define MVPP2_PRS_TCAM_LU_WORD 5
0068 #define MVPP2_PRS_TCAM_LU(lu) (lu)
0069 #define MVPP2_PRS_TCAM_LU_EN(lu) MVPP2_PRS_TCAM_EN(MVPP2_PRS_TCAM_LU(lu))
0070 #define MVPP2_PRS_TCAM_INV_WORD 5
0071
0072 #define MVPP2_PRS_VID_TCAM_BYTE 2
0073
0074
0075
0076
0077
0078
0079 #define MVPP2_PRS_MAC_UC_MC_FILT_MAX 25
0080 #define MVPP2_PRS_MAC_RANGE_SIZE 80
0081
0082
0083 #define MVPP2_PRS_MAC_UC_FILT_MAX 4
0084 #define MVPP2_PRS_MAC_MC_FILT_MAX (MVPP2_PRS_MAC_UC_MC_FILT_MAX - \
0085 MVPP2_PRS_MAC_UC_FILT_MAX)
0086
0087
0088
0089
0090
0091
0092 #define MVPP2_PRS_VLAN_FILT_MAX 11
0093 #define MVPP2_PRS_VLAN_FILT_RANGE_SIZE 33
0094
0095 #define MVPP2_PRS_VLAN_FILT_MAX_ENTRY (MVPP2_PRS_VLAN_FILT_MAX - 2)
0096 #define MVPP2_PRS_VLAN_FILT_DFLT_ENTRY (MVPP2_PRS_VLAN_FILT_MAX - 1)
0097
0098
0099 #define MVPP2_PE_DROP_ALL 0
0100 #define MVPP2_PE_FIRST_FREE_TID 1
0101
0102
0103 #define MVPP2_PE_MAC_RANGE_END (MVPP2_PE_VID_FILT_RANGE_START - 1)
0104 #define MVPP2_PE_MAC_RANGE_START (MVPP2_PE_MAC_RANGE_END - \
0105 MVPP2_PRS_MAC_RANGE_SIZE + 1)
0106
0107 #define MVPP2_PE_VID_FILT_RANGE_END (MVPP2_PRS_TCAM_SRAM_SIZE - 32)
0108 #define MVPP2_PE_VID_FILT_RANGE_START (MVPP2_PE_VID_FILT_RANGE_END - \
0109 MVPP2_PRS_VLAN_FILT_RANGE_SIZE + 1)
0110 #define MVPP2_PE_LAST_FREE_TID (MVPP2_PE_MAC_RANGE_START - 1)
0111 #define MVPP2_PE_MH_SKIP_PRS (MVPP2_PRS_TCAM_SRAM_SIZE - 31)
0112 #define MVPP2_PE_IP6_EXT_PROTO_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 30)
0113 #define MVPP2_PE_IP6_ADDR_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 29)
0114 #define MVPP2_PE_IP4_ADDR_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 28)
0115 #define MVPP2_PE_LAST_DEFAULT_FLOW (MVPP2_PRS_TCAM_SRAM_SIZE - 27)
0116 #define MVPP2_PE_FIRST_DEFAULT_FLOW (MVPP2_PRS_TCAM_SRAM_SIZE - 22)
0117 #define MVPP2_PE_EDSA_TAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 21)
0118 #define MVPP2_PE_EDSA_UNTAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 20)
0119 #define MVPP2_PE_DSA_TAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 19)
0120 #define MVPP2_PE_DSA_UNTAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 18)
0121 #define MVPP2_PE_ETYPE_EDSA_TAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 17)
0122 #define MVPP2_PE_ETYPE_EDSA_UNTAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 16)
0123 #define MVPP2_PE_ETYPE_DSA_TAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 15)
0124 #define MVPP2_PE_ETYPE_DSA_UNTAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 14)
0125 #define MVPP2_PE_MH_DEFAULT (MVPP2_PRS_TCAM_SRAM_SIZE - 13)
0126 #define MVPP2_PE_DSA_DEFAULT (MVPP2_PRS_TCAM_SRAM_SIZE - 12)
0127 #define MVPP2_PE_IP6_PROTO_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 11)
0128 #define MVPP2_PE_IP4_PROTO_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 10)
0129 #define MVPP2_PE_ETH_TYPE_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 9)
0130 #define MVPP2_PE_VID_FLTR_DEFAULT (MVPP2_PRS_TCAM_SRAM_SIZE - 8)
0131 #define MVPP2_PE_VID_EDSA_FLTR_DEFAULT (MVPP2_PRS_TCAM_SRAM_SIZE - 7)
0132 #define MVPP2_PE_VLAN_DBL (MVPP2_PRS_TCAM_SRAM_SIZE - 6)
0133 #define MVPP2_PE_VLAN_NONE (MVPP2_PRS_TCAM_SRAM_SIZE - 5)
0134 #define MVPP2_PE_FC_DROP (MVPP2_PRS_TCAM_SRAM_SIZE - 4)
0135 #define MVPP2_PE_MAC_MC_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 3)
0136 #define MVPP2_PE_MAC_UC_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 2)
0137 #define MVPP2_PE_MAC_NON_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 1)
0138
0139 #define MVPP2_PRS_VID_PORT_FIRST(port) (MVPP2_PE_VID_FILT_RANGE_START + \
0140 ((port) * MVPP2_PRS_VLAN_FILT_MAX))
0141 #define MVPP2_PRS_VID_PORT_LAST(port) (MVPP2_PRS_VID_PORT_FIRST(port) \
0142 + MVPP2_PRS_VLAN_FILT_MAX_ENTRY)
0143
0144 #define MVPP2_PRS_VID_PORT_DFLT(port) (MVPP2_PRS_VID_PORT_FIRST(port) \
0145 + MVPP2_PRS_VLAN_FILT_DFLT_ENTRY)
0146
0147
0148
0149
0150 #define MVPP2_PRS_SRAM_RI_OFFS 0
0151 #define MVPP2_PRS_SRAM_RI_WORD 0
0152 #define MVPP2_PRS_SRAM_RI_CTRL_OFFS 32
0153 #define MVPP2_PRS_SRAM_RI_CTRL_WORD 1
0154 #define MVPP2_PRS_SRAM_RI_CTRL_BITS 32
0155 #define MVPP2_PRS_SRAM_SHIFT_OFFS 64
0156 #define MVPP2_PRS_SRAM_SHIFT_SIGN_BIT 72
0157 #define MVPP2_PRS_SRAM_SHIFT_MASK 0xff
0158 #define MVPP2_PRS_SRAM_UDF_OFFS 73
0159 #define MVPP2_PRS_SRAM_UDF_BITS 8
0160 #define MVPP2_PRS_SRAM_UDF_MASK 0xff
0161 #define MVPP2_PRS_SRAM_UDF_SIGN_BIT 81
0162 #define MVPP2_PRS_SRAM_UDF_TYPE_OFFS 82
0163 #define MVPP2_PRS_SRAM_UDF_TYPE_MASK 0x7
0164 #define MVPP2_PRS_SRAM_UDF_TYPE_L3 1
0165 #define MVPP2_PRS_SRAM_UDF_TYPE_L4 4
0166 #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_OFFS 85
0167 #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_MASK 0x3
0168 #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD 1
0169 #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_IP4_ADD 2
0170 #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_IP6_ADD 3
0171 #define MVPP2_PRS_SRAM_OP_SEL_UDF_OFFS 87
0172 #define MVPP2_PRS_SRAM_OP_SEL_UDF_BITS 2
0173 #define MVPP2_PRS_SRAM_OP_SEL_UDF_MASK 0x3
0174 #define MVPP2_PRS_SRAM_OP_SEL_UDF_ADD 0
0175 #define MVPP2_PRS_SRAM_OP_SEL_UDF_IP4_ADD 2
0176 #define MVPP2_PRS_SRAM_OP_SEL_UDF_IP6_ADD 3
0177 #define MVPP2_PRS_SRAM_OP_SEL_BASE_OFFS 89
0178 #define MVPP2_PRS_SRAM_AI_OFFS 90
0179 #define MVPP2_PRS_SRAM_AI_CTRL_OFFS 98
0180 #define MVPP2_PRS_SRAM_AI_CTRL_BITS 8
0181 #define MVPP2_PRS_SRAM_AI_MASK 0xff
0182 #define MVPP2_PRS_SRAM_NEXT_LU_OFFS 106
0183 #define MVPP2_PRS_SRAM_NEXT_LU_MASK 0xf
0184 #define MVPP2_PRS_SRAM_LU_DONE_BIT 110
0185 #define MVPP2_PRS_SRAM_LU_GEN_BIT 111
0186
0187
0188 #define MVPP2_PRS_RI_MAC_ME_MASK 0x1
0189 #define MVPP2_PRS_RI_DSA_MASK 0x2
0190 #define MVPP2_PRS_RI_VLAN_MASK (BIT(2) | BIT(3))
0191 #define MVPP2_PRS_RI_VLAN_NONE 0x0
0192 #define MVPP2_PRS_RI_VLAN_SINGLE BIT(2)
0193 #define MVPP2_PRS_RI_VLAN_DOUBLE BIT(3)
0194 #define MVPP2_PRS_RI_VLAN_TRIPLE (BIT(2) | BIT(3))
0195 #define MVPP2_PRS_RI_CPU_CODE_MASK 0x70
0196 #define MVPP2_PRS_RI_CPU_CODE_RX_SPEC BIT(4)
0197 #define MVPP2_PRS_RI_L2_CAST_MASK (BIT(9) | BIT(10))
0198 #define MVPP2_PRS_RI_L2_UCAST 0x0
0199 #define MVPP2_PRS_RI_L2_MCAST BIT(9)
0200 #define MVPP2_PRS_RI_L2_BCAST BIT(10)
0201 #define MVPP2_PRS_RI_PPPOE_MASK 0x800
0202 #define MVPP2_PRS_RI_L3_PROTO_MASK (BIT(12) | BIT(13) | BIT(14))
0203 #define MVPP2_PRS_RI_L3_UN 0x0
0204 #define MVPP2_PRS_RI_L3_IP4 BIT(12)
0205 #define MVPP2_PRS_RI_L3_IP4_OPT BIT(13)
0206 #define MVPP2_PRS_RI_L3_IP4_OTHER (BIT(12) | BIT(13))
0207 #define MVPP2_PRS_RI_L3_IP6 BIT(14)
0208 #define MVPP2_PRS_RI_L3_IP6_EXT (BIT(12) | BIT(14))
0209 #define MVPP2_PRS_RI_L3_ARP (BIT(13) | BIT(14))
0210 #define MVPP2_PRS_RI_L3_ADDR_MASK (BIT(15) | BIT(16))
0211 #define MVPP2_PRS_RI_L3_UCAST 0x0
0212 #define MVPP2_PRS_RI_L3_MCAST BIT(15)
0213 #define MVPP2_PRS_RI_L3_BCAST (BIT(15) | BIT(16))
0214 #define MVPP2_PRS_RI_IP_FRAG_MASK 0x20000
0215 #define MVPP2_PRS_RI_IP_FRAG_TRUE BIT(17)
0216 #define MVPP2_PRS_RI_UDF3_MASK 0x300000
0217 #define MVPP2_PRS_RI_UDF3_RX_SPECIAL BIT(21)
0218 #define MVPP2_PRS_RI_L4_PROTO_MASK 0x1c00000
0219 #define MVPP2_PRS_RI_L4_TCP BIT(22)
0220 #define MVPP2_PRS_RI_L4_UDP BIT(23)
0221 #define MVPP2_PRS_RI_L4_OTHER (BIT(22) | BIT(23))
0222 #define MVPP2_PRS_RI_UDF7_MASK 0x60000000
0223 #define MVPP2_PRS_RI_UDF7_IP6_LITE BIT(29)
0224 #define MVPP2_PRS_RI_DROP_MASK 0x80000000
0225
0226 #define MVPP2_PRS_IP_MASK (MVPP2_PRS_RI_L3_PROTO_MASK | \
0227 MVPP2_PRS_RI_IP_FRAG_MASK | \
0228 MVPP2_PRS_RI_L4_PROTO_MASK)
0229
0230
0231 #define MVPP2_PRS_IPV4_DIP_AI_BIT BIT(0)
0232 #define MVPP2_PRS_IPV6_NO_EXT_AI_BIT BIT(0)
0233 #define MVPP2_PRS_IPV6_EXT_AI_BIT BIT(1)
0234 #define MVPP2_PRS_IPV6_EXT_AH_AI_BIT BIT(2)
0235 #define MVPP2_PRS_IPV6_EXT_AH_LEN_AI_BIT BIT(3)
0236 #define MVPP2_PRS_IPV6_EXT_AH_L4_AI_BIT BIT(4)
0237 #define MVPP2_PRS_SINGLE_VLAN_AI 0
0238 #define MVPP2_PRS_DBL_VLAN_AI_BIT BIT(7)
0239 #define MVPP2_PRS_EDSA_VID_AI_BIT BIT(0)
0240
0241
0242 #define MVPP2_PRS_TAGGED true
0243 #define MVPP2_PRS_UNTAGGED false
0244 #define MVPP2_PRS_EDSA true
0245 #define MVPP2_PRS_DSA false
0246
0247
0248 enum mvpp2_prs_udf {
0249 MVPP2_PRS_UDF_MAC_DEF,
0250 MVPP2_PRS_UDF_MAC_RANGE,
0251 MVPP2_PRS_UDF_L2_DEF,
0252 MVPP2_PRS_UDF_L2_DEF_COPY,
0253 MVPP2_PRS_UDF_L2_USER,
0254 };
0255
0256
0257 enum mvpp2_prs_lookup {
0258 MVPP2_PRS_LU_MH,
0259 MVPP2_PRS_LU_MAC,
0260 MVPP2_PRS_LU_DSA,
0261 MVPP2_PRS_LU_VLAN,
0262 MVPP2_PRS_LU_VID,
0263 MVPP2_PRS_LU_L2,
0264 MVPP2_PRS_LU_PPPOE,
0265 MVPP2_PRS_LU_IP4,
0266 MVPP2_PRS_LU_IP6,
0267 MVPP2_PRS_LU_FLOWS,
0268 MVPP2_PRS_LU_LAST,
0269 };
0270
0271 struct mvpp2_prs_entry {
0272 u32 index;
0273 u32 tcam[MVPP2_PRS_TCAM_WORDS];
0274 u32 sram[MVPP2_PRS_SRAM_WORDS];
0275 };
0276
0277 struct mvpp2_prs_result_info {
0278 u32 ri;
0279 u32 ri_mask;
0280 };
0281
0282 struct mvpp2_prs_shadow {
0283 bool valid;
0284 bool finish;
0285
0286
0287 int lu;
0288
0289
0290 int udf;
0291
0292
0293 u32 ri;
0294 u32 ri_mask;
0295 };
0296
0297 int mvpp2_prs_default_init(struct platform_device *pdev, struct mvpp2 *priv);
0298
0299 int mvpp2_prs_init_from_hw(struct mvpp2 *priv, struct mvpp2_prs_entry *pe,
0300 int tid);
0301
0302 unsigned int mvpp2_prs_tcam_port_map_get(struct mvpp2_prs_entry *pe);
0303
0304 void mvpp2_prs_tcam_data_byte_get(struct mvpp2_prs_entry *pe,
0305 unsigned int offs, unsigned char *byte,
0306 unsigned char *enable);
0307
0308 int mvpp2_prs_mac_da_accept(struct mvpp2_port *port, const u8 *da, bool add);
0309
0310 int mvpp2_prs_tag_mode_set(struct mvpp2 *priv, int port, int type);
0311
0312 int mvpp2_prs_add_flow(struct mvpp2 *priv, int flow, u32 ri, u32 ri_mask);
0313
0314 int mvpp2_prs_def_flow(struct mvpp2_port *port);
0315
0316 void mvpp2_prs_vid_enable_filtering(struct mvpp2_port *port);
0317
0318 void mvpp2_prs_vid_disable_filtering(struct mvpp2_port *port);
0319
0320 int mvpp2_prs_vid_entry_add(struct mvpp2_port *port, u16 vid);
0321
0322 void mvpp2_prs_vid_entry_remove(struct mvpp2_port *port, u16 vid);
0323
0324 void mvpp2_prs_vid_remove_all(struct mvpp2_port *port);
0325
0326 void mvpp2_prs_mac_promisc_set(struct mvpp2 *priv, int port,
0327 enum mvpp2_prs_l2_cast l2_cast, bool add);
0328
0329 void mvpp2_prs_mac_del_all(struct mvpp2_port *port);
0330
0331 int mvpp2_prs_update_mac_da(struct net_device *dev, const u8 *da);
0332
0333 int mvpp2_prs_hits(struct mvpp2 *priv, int index);
0334
0335 #endif