407 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/* Copyright (C) 2020 Felix Fietkau <nbd@nbd.name> */3 4#ifndef __MTK_PPE_H5#define __MTK_PPE_H6 7#include <linux/kernel.h>8#include <linux/bitfield.h>9#include <linux/rhashtable.h>10 11#define MTK_PPE_ENTRIES_SHIFT 412#define MTK_PPE_ENTRIES (1024 << MTK_PPE_ENTRIES_SHIFT)13#define MTK_PPE_HASH_MASK (MTK_PPE_ENTRIES - 1)14#define MTK_PPE_WAIT_TIMEOUT_US 100000015 16#define MTK_FOE_IB1_UNBIND_TIMESTAMP GENMASK(7, 0)17#define MTK_FOE_IB1_UNBIND_PACKETS GENMASK(23, 8)18#define MTK_FOE_IB1_UNBIND_PREBIND BIT(24)19 20#define MTK_FOE_IB1_BIND_TIMESTAMP GENMASK(14, 0)21#define MTK_FOE_IB1_BIND_KEEPALIVE BIT(15)22#define MTK_FOE_IB1_BIND_VLAN_LAYER GENMASK(18, 16)23#define MTK_FOE_IB1_BIND_PPPOE BIT(19)24#define MTK_FOE_IB1_BIND_VLAN_TAG BIT(20)25#define MTK_FOE_IB1_BIND_PKT_SAMPLE BIT(21)26#define MTK_FOE_IB1_BIND_CACHE BIT(22)27#define MTK_FOE_IB1_BIND_TUNNEL_DECAP BIT(23)28#define MTK_FOE_IB1_BIND_TTL BIT(24)29 30#define MTK_FOE_IB1_PACKET_TYPE GENMASK(27, 25)31#define MTK_FOE_IB1_STATE GENMASK(29, 28)32#define MTK_FOE_IB1_UDP BIT(30)33#define MTK_FOE_IB1_STATIC BIT(31)34 35/* CONFIG_MEDIATEK_NETSYS_V2 */36#define MTK_FOE_IB1_BIND_TIMESTAMP_V2 GENMASK(7, 0)37#define MTK_FOE_IB1_BIND_VLAN_LAYER_V2 GENMASK(16, 14)38#define MTK_FOE_IB1_BIND_PPPOE_V2 BIT(17)39#define MTK_FOE_IB1_BIND_VLAN_TAG_V2 BIT(18)40#define MTK_FOE_IB1_BIND_CACHE_V2 BIT(20)41#define MTK_FOE_IB1_BIND_TTL_V2 BIT(22)42#define MTK_FOE_IB1_PACKET_TYPE_V2 GENMASK(27, 23)43 44enum {45 MTK_PPE_PKT_TYPE_IPV4_HNAPT = 0,46 MTK_PPE_PKT_TYPE_IPV4_ROUTE = 1,47 MTK_PPE_PKT_TYPE_BRIDGE = 2,48 MTK_PPE_PKT_TYPE_IPV4_DSLITE = 3,49 MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T = 4,50 MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T = 5,51 MTK_PPE_PKT_TYPE_IPV6_6RD = 7,52};53 54#define MTK_FOE_IB2_QID GENMASK(3, 0)55#define MTK_FOE_IB2_PSE_QOS BIT(4)56#define MTK_FOE_IB2_DEST_PORT GENMASK(7, 5)57#define MTK_FOE_IB2_MULTICAST BIT(8)58#define MTK_FOE_IB2_MIB_CNT BIT(10)59 60#define MTK_FOE_IB2_WDMA_QID2 GENMASK(13, 12)61#define MTK_FOE_IB2_MIB_CNT_V2 BIT(15)62#define MTK_FOE_IB2_WDMA_DEVIDX BIT(16)63#define MTK_FOE_IB2_WDMA_WINFO BIT(17)64 65#define MTK_FOE_IB2_PORT_MG GENMASK(17, 12)66 67#define MTK_FOE_IB2_RX_IDX GENMASK(18, 17)68#define MTK_FOE_IB2_PORT_AG GENMASK(23, 18)69 70#define MTK_FOE_IB2_DSCP GENMASK(31, 24)71 72/* CONFIG_MEDIATEK_NETSYS_V2 */73#define MTK_FOE_IB2_QID_V2 GENMASK(6, 0)74#define MTK_FOE_IB2_PORT_MG_V2 BIT(7)75#define MTK_FOE_IB2_PSE_QOS_V2 BIT(8)76#define MTK_FOE_IB2_DEST_PORT_V2 GENMASK(12, 9)77#define MTK_FOE_IB2_MULTICAST_V2 BIT(13)78#define MTK_FOE_IB2_WDMA_WINFO_V2 BIT(19)79#define MTK_FOE_IB2_PORT_AG_V2 GENMASK(23, 20)80 81#define MTK_FOE_VLAN2_WINFO_BSS GENMASK(5, 0)82#define MTK_FOE_VLAN2_WINFO_WCID GENMASK(13, 6)83#define MTK_FOE_VLAN2_WINFO_RING GENMASK(15, 14)84 85#define MTK_FOE_WINFO_BSS GENMASK(5, 0)86#define MTK_FOE_WINFO_WCID GENMASK(15, 6)87 88#define MTK_FOE_WINFO_BSS_V3 GENMASK(23, 16)89#define MTK_FOE_WINFO_WCID_V3 GENMASK(15, 0)90 91#define MTK_FOE_WINFO_AMSDU_USR_INFO GENMASK(15, 0)92#define MTK_FOE_WINFO_AMSDU_TID GENMASK(19, 16)93#define MTK_FOE_WINFO_AMSDU_IS_FIXEDRATE BIT(20)94#define MTK_FOE_WINFO_AMSDU_IS_PRIOR BIT(21)95#define MTK_FOE_WINFO_AMSDU_IS_SP BIT(22)96#define MTK_FOE_WINFO_AMSDU_HF BIT(23)97#define MTK_FOE_WINFO_AMSDU_EN BIT(24)98 99enum {100 MTK_FOE_STATE_INVALID,101 MTK_FOE_STATE_UNBIND,102 MTK_FOE_STATE_BIND,103 MTK_FOE_STATE_FIN104};105 106struct mtk_foe_mac_info {107 u16 vlan1;108 u16 etype;109 110 u32 dest_mac_hi;111 112 u16 vlan2;113 u16 dest_mac_lo;114 115 u32 src_mac_hi;116 117 u16 pppoe_id;118 u16 src_mac_lo;119 120 /* netsys_v2 */121 u16 minfo;122 u16 winfo;123 124 /* netsys_v3 */125 u32 w3info;126 u32 amsdu;127};128 129/* software-only entry type */130struct mtk_foe_bridge {131 u8 dest_mac[ETH_ALEN];132 u8 src_mac[ETH_ALEN];133 u16 vlan;134 135 struct {} key_end;136 137 u32 ib2;138 139 struct mtk_foe_mac_info l2;140};141 142struct mtk_ipv4_tuple {143 u32 src_ip;144 u32 dest_ip;145 union {146 struct {147 u16 dest_port;148 u16 src_port;149 };150 struct {151 u8 protocol;152 u8 _pad[3]; /* fill with 0xa5a5a5 */153 };154 u32 ports;155 };156};157 158struct mtk_foe_ipv4 {159 struct mtk_ipv4_tuple orig;160 161 u32 ib2;162 163 struct mtk_ipv4_tuple new;164 165 u16 timestamp;166 u16 _rsv0[3];167 168 u32 udf_tsid;169 170 struct mtk_foe_mac_info l2;171};172 173struct mtk_foe_ipv4_dslite {174 struct mtk_ipv4_tuple ip4;175 176 u32 tunnel_src_ip[4];177 u32 tunnel_dest_ip[4];178 179 u8 flow_label[3];180 u8 priority;181 182 u32 udf_tsid;183 184 u32 ib2;185 186 struct mtk_foe_mac_info l2;187};188 189struct mtk_foe_ipv6 {190 u32 src_ip[4];191 u32 dest_ip[4];192 193 union {194 struct {195 u8 protocol;196 u8 _pad[3]; /* fill with 0xa5a5a5 */197 }; /* 3-tuple */198 struct {199 u16 dest_port;200 u16 src_port;201 }; /* 5-tuple */202 u32 ports;203 };204 205 u32 _rsv[3];206 207 u32 udf;208 209 u32 ib2;210 struct mtk_foe_mac_info l2;211};212 213struct mtk_foe_ipv6_6rd {214 u32 src_ip[4];215 u32 dest_ip[4];216 u16 dest_port;217 u16 src_port;218 219 u32 tunnel_src_ip;220 u32 tunnel_dest_ip;221 222 u16 hdr_csum;223 u8 dscp;224 u8 ttl;225 226 u8 flag;227 u8 pad;228 u8 per_flow_6rd_id;229 u8 pad2;230 231 u32 ib2;232 struct mtk_foe_mac_info l2;233};234 235#define MTK_FOE_ENTRY_V1_SIZE 80236#define MTK_FOE_ENTRY_V2_SIZE 96237#define MTK_FOE_ENTRY_V3_SIZE 128238 239struct mtk_foe_entry {240 u32 ib1;241 242 union {243 struct mtk_foe_bridge bridge;244 struct mtk_foe_ipv4 ipv4;245 struct mtk_foe_ipv4_dslite dslite;246 struct mtk_foe_ipv6 ipv6;247 struct mtk_foe_ipv6_6rd ipv6_6rd;248 u32 data[31];249 };250};251 252enum {253 MTK_PPE_CPU_REASON_TTL_EXCEEDED = 0x02,254 MTK_PPE_CPU_REASON_OPTION_HEADER = 0x03,255 MTK_PPE_CPU_REASON_NO_FLOW = 0x07,256 MTK_PPE_CPU_REASON_IPV4_FRAG = 0x08,257 MTK_PPE_CPU_REASON_IPV4_DSLITE_FRAG = 0x09,258 MTK_PPE_CPU_REASON_IPV4_DSLITE_NO_TCP_UDP = 0x0a,259 MTK_PPE_CPU_REASON_IPV6_6RD_NO_TCP_UDP = 0x0b,260 MTK_PPE_CPU_REASON_TCP_FIN_SYN_RST = 0x0c,261 MTK_PPE_CPU_REASON_UN_HIT = 0x0d,262 MTK_PPE_CPU_REASON_HIT_UNBIND = 0x0e,263 MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f,264 MTK_PPE_CPU_REASON_HIT_BIND_TCP_FIN = 0x10,265 MTK_PPE_CPU_REASON_HIT_TTL_1 = 0x11,266 MTK_PPE_CPU_REASON_HIT_BIND_VLAN_VIOLATION = 0x12,267 MTK_PPE_CPU_REASON_KEEPALIVE_UC_OLD_HDR = 0x13,268 MTK_PPE_CPU_REASON_KEEPALIVE_MC_NEW_HDR = 0x14,269 MTK_PPE_CPU_REASON_KEEPALIVE_DUP_OLD_HDR = 0x15,270 MTK_PPE_CPU_REASON_HIT_BIND_FORCE_CPU = 0x16,271 MTK_PPE_CPU_REASON_TUNNEL_OPTION_HEADER = 0x17,272 MTK_PPE_CPU_REASON_MULTICAST_TO_CPU = 0x18,273 MTK_PPE_CPU_REASON_MULTICAST_TO_GMAC1_CPU = 0x19,274 MTK_PPE_CPU_REASON_HIT_PRE_BIND = 0x1a,275 MTK_PPE_CPU_REASON_PACKET_SAMPLING = 0x1b,276 MTK_PPE_CPU_REASON_EXCEED_MTU = 0x1c,277 MTK_PPE_CPU_REASON_PPE_BYPASS = 0x1e,278 MTK_PPE_CPU_REASON_INVALID = 0x1f,279};280 281enum {282 MTK_FLOW_TYPE_L4,283 MTK_FLOW_TYPE_L2,284 MTK_FLOW_TYPE_L2_SUBFLOW,285};286 287struct mtk_flow_entry {288 union {289 struct hlist_node list;290 struct {291 struct rhash_head l2_node;292 struct hlist_head l2_flows;293 };294 };295 u8 type;296 s8 wed_index;297 u8 ppe_index;298 u16 hash;299 union {300 struct mtk_foe_entry data;301 struct {302 struct mtk_flow_entry *base_flow;303 struct hlist_node list;304 } l2_data;305 };306 struct rhash_head node;307 unsigned long cookie;308};309 310struct mtk_mib_entry {311 u32 byt_cnt_l;312 u16 byt_cnt_h;313 u32 pkt_cnt_l;314 u8 pkt_cnt_h;315 u8 _rsv0;316 u32 _rsv1;317} __packed;318 319struct mtk_foe_accounting {320 u64 bytes;321 u64 packets;322};323 324struct mtk_ppe {325 struct mtk_eth *eth;326 struct device *dev;327 void __iomem *base;328 int version;329 char dirname[5];330 bool accounting;331 332 void *foe_table;333 dma_addr_t foe_phys;334 335 struct mtk_mib_entry *mib_table;336 dma_addr_t mib_phys;337 338 u16 foe_check_time[MTK_PPE_ENTRIES];339 struct hlist_head *foe_flow;340 341 struct rhashtable l2_flows;342 343 void *acct_table;344};345 346struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int index);347 348void mtk_ppe_deinit(struct mtk_eth *eth);349void mtk_ppe_start(struct mtk_ppe *ppe);350int mtk_ppe_stop(struct mtk_ppe *ppe);351int mtk_ppe_prepare_reset(struct mtk_ppe *ppe);352 353void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash);354 355static inline void356mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash)357{358 u16 now, diff;359 360 if (!ppe)361 return;362 363 if (hash > MTK_PPE_HASH_MASK)364 return;365 366 now = (u16)jiffies;367 diff = now - ppe->foe_check_time[hash];368 if (diff < HZ / 10)369 return;370 371 ppe->foe_check_time[hash] = now;372 __mtk_ppe_check_skb(ppe, skb, hash);373}374 375int mtk_foe_entry_prepare(struct mtk_eth *eth, struct mtk_foe_entry *entry,376 int type, int l4proto, u8 pse_port, u8 *src_mac,377 u8 *dest_mac);378int mtk_foe_entry_set_pse_port(struct mtk_eth *eth,379 struct mtk_foe_entry *entry, u8 port);380int mtk_foe_entry_set_ipv4_tuple(struct mtk_eth *eth,381 struct mtk_foe_entry *entry, bool orig,382 __be32 src_addr, __be16 src_port,383 __be32 dest_addr, __be16 dest_port);384int mtk_foe_entry_set_ipv6_tuple(struct mtk_eth *eth,385 struct mtk_foe_entry *entry,386 __be32 *src_addr, __be16 src_port,387 __be32 *dest_addr, __be16 dest_port);388int mtk_foe_entry_set_dsa(struct mtk_eth *eth, struct mtk_foe_entry *entry,389 int port);390int mtk_foe_entry_set_vlan(struct mtk_eth *eth, struct mtk_foe_entry *entry,391 int vid);392int mtk_foe_entry_set_pppoe(struct mtk_eth *eth, struct mtk_foe_entry *entry,393 int sid);394int mtk_foe_entry_set_wdma(struct mtk_eth *eth, struct mtk_foe_entry *entry,395 int wdma_idx, int txq, int bss, int wcid,396 bool amsdu_en);397int mtk_foe_entry_set_queue(struct mtk_eth *eth, struct mtk_foe_entry *entry,398 unsigned int queue);399int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);400void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);401int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);402int mtk_ppe_debugfs_init(struct mtk_ppe *ppe, int index);403struct mtk_foe_accounting *mtk_foe_entry_get_mib(struct mtk_ppe *ppe, u32 index,404 struct mtk_foe_accounting *diff);405 406#endif407