0001
0002
0003
0004 #ifndef __MTK_PPE_H
0005 #define __MTK_PPE_H
0006
0007 #include <linux/kernel.h>
0008 #include <linux/bitfield.h>
0009 #include <linux/rhashtable.h>
0010
0011 #define MTK_ETH_PPE_BASE 0xc00
0012
0013 #define MTK_PPE_ENTRIES_SHIFT 3
0014 #define MTK_PPE_ENTRIES (1024 << MTK_PPE_ENTRIES_SHIFT)
0015 #define MTK_PPE_HASH_MASK (MTK_PPE_ENTRIES - 1)
0016 #define MTK_PPE_WAIT_TIMEOUT_US 1000000
0017
0018 #define MTK_FOE_IB1_UNBIND_TIMESTAMP GENMASK(7, 0)
0019 #define MTK_FOE_IB1_UNBIND_PACKETS GENMASK(23, 8)
0020 #define MTK_FOE_IB1_UNBIND_PREBIND BIT(24)
0021
0022 #define MTK_FOE_IB1_BIND_TIMESTAMP GENMASK(14, 0)
0023 #define MTK_FOE_IB1_BIND_KEEPALIVE BIT(15)
0024 #define MTK_FOE_IB1_BIND_VLAN_LAYER GENMASK(18, 16)
0025 #define MTK_FOE_IB1_BIND_PPPOE BIT(19)
0026 #define MTK_FOE_IB1_BIND_VLAN_TAG BIT(20)
0027 #define MTK_FOE_IB1_BIND_PKT_SAMPLE BIT(21)
0028 #define MTK_FOE_IB1_BIND_CACHE BIT(22)
0029 #define MTK_FOE_IB1_BIND_TUNNEL_DECAP BIT(23)
0030 #define MTK_FOE_IB1_BIND_TTL BIT(24)
0031
0032 #define MTK_FOE_IB1_PACKET_TYPE GENMASK(27, 25)
0033 #define MTK_FOE_IB1_STATE GENMASK(29, 28)
0034 #define MTK_FOE_IB1_UDP BIT(30)
0035 #define MTK_FOE_IB1_STATIC BIT(31)
0036
0037 enum {
0038 MTK_PPE_PKT_TYPE_IPV4_HNAPT = 0,
0039 MTK_PPE_PKT_TYPE_IPV4_ROUTE = 1,
0040 MTK_PPE_PKT_TYPE_BRIDGE = 2,
0041 MTK_PPE_PKT_TYPE_IPV4_DSLITE = 3,
0042 MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T = 4,
0043 MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T = 5,
0044 MTK_PPE_PKT_TYPE_IPV6_6RD = 7,
0045 };
0046
0047 #define MTK_FOE_IB2_QID GENMASK(3, 0)
0048 #define MTK_FOE_IB2_PSE_QOS BIT(4)
0049 #define MTK_FOE_IB2_DEST_PORT GENMASK(7, 5)
0050 #define MTK_FOE_IB2_MULTICAST BIT(8)
0051
0052 #define MTK_FOE_IB2_WDMA_QID2 GENMASK(13, 12)
0053 #define MTK_FOE_IB2_WDMA_DEVIDX BIT(16)
0054 #define MTK_FOE_IB2_WDMA_WINFO BIT(17)
0055
0056 #define MTK_FOE_IB2_PORT_MG GENMASK(17, 12)
0057
0058 #define MTK_FOE_IB2_PORT_AG GENMASK(23, 18)
0059
0060 #define MTK_FOE_IB2_DSCP GENMASK(31, 24)
0061
0062 #define MTK_FOE_VLAN2_WINFO_BSS GENMASK(5, 0)
0063 #define MTK_FOE_VLAN2_WINFO_WCID GENMASK(13, 6)
0064 #define MTK_FOE_VLAN2_WINFO_RING GENMASK(15, 14)
0065
0066 enum {
0067 MTK_FOE_STATE_INVALID,
0068 MTK_FOE_STATE_UNBIND,
0069 MTK_FOE_STATE_BIND,
0070 MTK_FOE_STATE_FIN
0071 };
0072
0073 struct mtk_foe_mac_info {
0074 u16 vlan1;
0075 u16 etype;
0076
0077 u32 dest_mac_hi;
0078
0079 u16 vlan2;
0080 u16 dest_mac_lo;
0081
0082 u32 src_mac_hi;
0083
0084 u16 pppoe_id;
0085 u16 src_mac_lo;
0086 };
0087
0088
0089 struct mtk_foe_bridge {
0090 u8 dest_mac[ETH_ALEN];
0091 u8 src_mac[ETH_ALEN];
0092 u16 vlan;
0093
0094 struct {} key_end;
0095
0096 u32 ib2;
0097
0098 struct mtk_foe_mac_info l2;
0099 };
0100
0101 struct mtk_ipv4_tuple {
0102 u32 src_ip;
0103 u32 dest_ip;
0104 union {
0105 struct {
0106 u16 dest_port;
0107 u16 src_port;
0108 };
0109 struct {
0110 u8 protocol;
0111 u8 _pad[3];
0112 };
0113 u32 ports;
0114 };
0115 };
0116
0117 struct mtk_foe_ipv4 {
0118 struct mtk_ipv4_tuple orig;
0119
0120 u32 ib2;
0121
0122 struct mtk_ipv4_tuple new;
0123
0124 u16 timestamp;
0125 u16 _rsv0[3];
0126
0127 u32 udf_tsid;
0128
0129 struct mtk_foe_mac_info l2;
0130 };
0131
0132 struct mtk_foe_ipv4_dslite {
0133 struct mtk_ipv4_tuple ip4;
0134
0135 u32 tunnel_src_ip[4];
0136 u32 tunnel_dest_ip[4];
0137
0138 u8 flow_label[3];
0139 u8 priority;
0140
0141 u32 udf_tsid;
0142
0143 u32 ib2;
0144
0145 struct mtk_foe_mac_info l2;
0146 };
0147
0148 struct mtk_foe_ipv6 {
0149 u32 src_ip[4];
0150 u32 dest_ip[4];
0151
0152 union {
0153 struct {
0154 u8 protocol;
0155 u8 _pad[3];
0156 };
0157 struct {
0158 u16 dest_port;
0159 u16 src_port;
0160 };
0161 u32 ports;
0162 };
0163
0164 u32 _rsv[3];
0165
0166 u32 udf;
0167
0168 u32 ib2;
0169 struct mtk_foe_mac_info l2;
0170 };
0171
0172 struct mtk_foe_ipv6_6rd {
0173 u32 src_ip[4];
0174 u32 dest_ip[4];
0175 u16 dest_port;
0176 u16 src_port;
0177
0178 u32 tunnel_src_ip;
0179 u32 tunnel_dest_ip;
0180
0181 u16 hdr_csum;
0182 u8 dscp;
0183 u8 ttl;
0184
0185 u8 flag;
0186 u8 pad;
0187 u8 per_flow_6rd_id;
0188 u8 pad2;
0189
0190 u32 ib2;
0191 struct mtk_foe_mac_info l2;
0192 };
0193
0194 struct mtk_foe_entry {
0195 u32 ib1;
0196
0197 union {
0198 struct mtk_foe_bridge bridge;
0199 struct mtk_foe_ipv4 ipv4;
0200 struct mtk_foe_ipv4_dslite dslite;
0201 struct mtk_foe_ipv6 ipv6;
0202 struct mtk_foe_ipv6_6rd ipv6_6rd;
0203 u32 data[19];
0204 };
0205 };
0206
0207 enum {
0208 MTK_PPE_CPU_REASON_TTL_EXCEEDED = 0x02,
0209 MTK_PPE_CPU_REASON_OPTION_HEADER = 0x03,
0210 MTK_PPE_CPU_REASON_NO_FLOW = 0x07,
0211 MTK_PPE_CPU_REASON_IPV4_FRAG = 0x08,
0212 MTK_PPE_CPU_REASON_IPV4_DSLITE_FRAG = 0x09,
0213 MTK_PPE_CPU_REASON_IPV4_DSLITE_NO_TCP_UDP = 0x0a,
0214 MTK_PPE_CPU_REASON_IPV6_6RD_NO_TCP_UDP = 0x0b,
0215 MTK_PPE_CPU_REASON_TCP_FIN_SYN_RST = 0x0c,
0216 MTK_PPE_CPU_REASON_UN_HIT = 0x0d,
0217 MTK_PPE_CPU_REASON_HIT_UNBIND = 0x0e,
0218 MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,
0219 MTK_PPE_CPU_REASON_HIT_BIND_TCP_FIN = 0x10,
0220 MTK_PPE_CPU_REASON_HIT_TTL_1 = 0x11,
0221 MTK_PPE_CPU_REASON_HIT_BIND_VLAN_VIOLATION = 0x12,
0222 MTK_PPE_CPU_REASON_KEEPALIVE_UC_OLD_HDR = 0x13,
0223 MTK_PPE_CPU_REASON_KEEPALIVE_MC_NEW_HDR = 0x14,
0224 MTK_PPE_CPU_REASON_KEEPALIVE_DUP_OLD_HDR = 0x15,
0225 MTK_PPE_CPU_REASON_HIT_BIND_FORCE_CPU = 0x16,
0226 MTK_PPE_CPU_REASON_TUNNEL_OPTION_HEADER = 0x17,
0227 MTK_PPE_CPU_REASON_MULTICAST_TO_CPU = 0x18,
0228 MTK_PPE_CPU_REASON_MULTICAST_TO_GMAC1_CPU = 0x19,
0229 MTK_PPE_CPU_REASON_HIT_PRE_BIND = 0x1a,
0230 MTK_PPE_CPU_REASON_PACKET_SAMPLING = 0x1b,
0231 MTK_PPE_CPU_REASON_EXCEED_MTU = 0x1c,
0232 MTK_PPE_CPU_REASON_PPE_BYPASS = 0x1e,
0233 MTK_PPE_CPU_REASON_INVALID = 0x1f,
0234 };
0235
0236 enum {
0237 MTK_FLOW_TYPE_L4,
0238 MTK_FLOW_TYPE_L2,
0239 MTK_FLOW_TYPE_L2_SUBFLOW,
0240 };
0241
0242 struct mtk_flow_entry {
0243 union {
0244 struct hlist_node list;
0245 struct {
0246 struct rhash_head l2_node;
0247 struct hlist_head l2_flows;
0248 };
0249 };
0250 u8 type;
0251 s8 wed_index;
0252 u16 hash;
0253 union {
0254 struct mtk_foe_entry data;
0255 struct {
0256 struct mtk_flow_entry *base_flow;
0257 struct hlist_node list;
0258 struct {} end;
0259 } l2_data;
0260 };
0261 struct rhash_head node;
0262 unsigned long cookie;
0263 };
0264
0265 struct mtk_ppe {
0266 struct mtk_eth *eth;
0267 struct device *dev;
0268 void __iomem *base;
0269 int version;
0270
0271 struct mtk_foe_entry *foe_table;
0272 dma_addr_t foe_phys;
0273
0274 u16 foe_check_time[MTK_PPE_ENTRIES];
0275 struct hlist_head foe_flow[MTK_PPE_ENTRIES / 2];
0276
0277 struct rhashtable l2_flows;
0278
0279 void *acct_table;
0280 };
0281
0282 struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version);
0283 int mtk_ppe_start(struct mtk_ppe *ppe);
0284 int mtk_ppe_stop(struct mtk_ppe *ppe);
0285
0286 void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash);
0287
0288 static inline void
0289 mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash)
0290 {
0291 u16 now, diff;
0292
0293 if (!ppe)
0294 return;
0295
0296 if (hash > MTK_PPE_HASH_MASK)
0297 return;
0298
0299 now = (u16)jiffies;
0300 diff = now - ppe->foe_check_time[hash];
0301 if (diff < HZ / 10)
0302 return;
0303
0304 ppe->foe_check_time[hash] = now;
0305 __mtk_ppe_check_skb(ppe, skb, hash);
0306 }
0307
0308 static inline int
0309 mtk_foe_entry_timestamp(struct mtk_ppe *ppe, u16 hash)
0310 {
0311 u32 ib1 = READ_ONCE(ppe->foe_table[hash].ib1);
0312
0313 if (FIELD_GET(MTK_FOE_IB1_STATE, ib1) != MTK_FOE_STATE_BIND)
0314 return -1;
0315
0316 return FIELD_GET(MTK_FOE_IB1_BIND_TIMESTAMP, ib1);
0317 }
0318
0319 int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto,
0320 u8 pse_port, u8 *src_mac, u8 *dest_mac);
0321 int mtk_foe_entry_set_pse_port(struct mtk_foe_entry *entry, u8 port);
0322 int mtk_foe_entry_set_ipv4_tuple(struct mtk_foe_entry *entry, bool orig,
0323 __be32 src_addr, __be16 src_port,
0324 __be32 dest_addr, __be16 dest_port);
0325 int mtk_foe_entry_set_ipv6_tuple(struct mtk_foe_entry *entry,
0326 __be32 *src_addr, __be16 src_port,
0327 __be32 *dest_addr, __be16 dest_port);
0328 int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port);
0329 int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid);
0330 int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid);
0331 int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
0332 int bss, int wcid);
0333 int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
0334 void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
0335 int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
0336 int mtk_ppe_debugfs_init(struct mtk_ppe *ppe);
0337
0338 #endif