blob: d613ce827342f8e4d2c0876c42e28171b031ef40 [file] [log] [blame]
developer58aa0682023-09-18 14:02:26 +08001From 3562f05aedc6c2d793b34b3ee3eb78e8352804c8 Mon Sep 17 00:00:00 2001
developeree39bcf2023-06-16 08:03:30 +08002From: Sujuan Chen <sujuan.chen@mediatek.com>
developer58aa0682023-09-18 14:02:26 +08003Date: Mon, 18 Sep 2023 10:58:32 +0800
4Subject: [PATCH 05/22] ethernet update ppe from mt7622 to mt7986
developeree39bcf2023-06-16 08:03:30 +08005
developeree39bcf2023-06-16 08:03:30 +08006---
developer58aa0682023-09-18 14:02:26 +08007 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 14 ++++-
8 drivers/net/ethernet/mediatek/mtk_eth_soc.h | 7 ++-
9 drivers/net/ethernet/mediatek/mtk_ppe.c | 29 +++++++++--
10 drivers/net/ethernet/mediatek/mtk_ppe.h | 51 +++++++++++++++++++
11 .../net/ethernet/mediatek/mtk_ppe_offload.c | 8 +++
12 drivers/net/ethernet/mediatek/mtk_ppe_regs.h | 10 ++++
13 6 files changed, 113 insertions(+), 6 deletions(-)
developeree39bcf2023-06-16 08:03:30 +080014
15diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
developer58aa0682023-09-18 14:02:26 +080016index 88b38e2..bfda873 100644
developeree39bcf2023-06-16 08:03:30 +080017--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
18+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
developer58aa0682023-09-18 14:02:26 +080019@@ -2285,16 +2285,27 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
developeree39bcf2023-06-16 08:03:30 +080020 skb_checksum_none_assert(skb);
21 skb->protocol = eth_type_trans(skb, netdev);
22
23- hash = trxd.rxd4 & MTK_RXD4_FOE_ENTRY;
24+#if defined(CONFIG_MEDIATEK_NETSYS_RX_V2)
25+ hash = trxd.rxd5 & MTK_RXD5_FOE_ENTRY_V2;
26+#else
27+ hash = trxd.rxd4 & MTK_RXD4_FOE_ENTRY;
28+#endif
29 if (hash != MTK_RXD4_FOE_ENTRY) {
30 hash = jhash_1word(hash, 0);
31 skb_set_hash(skb, hash, PKT_HASH_TYPE_L4);
32 }
33
34+#if defined(CONFIG_MEDIATEK_NETSYS_RX_V2)
35+ reason = FIELD_GET(MTK_RXD5_PPE_CPU_REASON_V2, trxd.rxd5);
36+ if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED)
37+ mtk_ppe_check_skb(eth->ppe, skb,
38+ trxd.rxd5 & MTK_RXD5_FOE_ENTRY_V2);
39+#else
40 reason = FIELD_GET(MTK_RXD4_PPE_CPU_REASON, trxd.rxd4);
41 if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED)
42 mtk_ppe_check_skb(eth->ppe, skb,
43 trxd.rxd4 & MTK_RXD4_FOE_ENTRY);
44+#endif
45
46 if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) {
developer58aa0682023-09-18 14:02:26 +080047 if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_RX_V2)) {
48@@ -5396,6 +5407,7 @@ static const struct mtk_soc_data mt7986_data = {
developeree39bcf2023-06-16 08:03:30 +080049 .required_clks = MT7986_CLKS_BITMAP,
50 .required_pctl = false,
developerc636c892023-08-24 10:09:24 +080051 .has_sram = false,
developeree39bcf2023-06-16 08:03:30 +080052+ .offload_version = 2,
developerd917ed32023-09-14 09:49:46 +080053 .rss_num = 4,
developeree39bcf2023-06-16 08:03:30 +080054 .txrx = {
55 .txd_size = sizeof(struct mtk_tx_dma_v2),
developeree39bcf2023-06-16 08:03:30 +080056diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developer58aa0682023-09-18 14:02:26 +080057index 15337d3..a385df5 100644
developeree39bcf2023-06-16 08:03:30 +080058--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
59+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
developer58aa0682023-09-18 14:02:26 +080060@@ -130,7 +130,7 @@
developeree39bcf2023-06-16 08:03:30 +080061 #define MTK_GDMA_UCS_EN BIT(20)
developer58aa0682023-09-18 14:02:26 +080062 #define MTK_GDMA_STRP_CRC BIT(16)
developeree39bcf2023-06-16 08:03:30 +080063 #define MTK_GDMA_TO_PDMA 0x0
64-#define MTK_GDMA_TO_PPE 0x4444
65+#define MTK_GDMA_TO_PPE 0x3333
66 #define MTK_GDMA_DROP_ALL 0x7777
67
developer58aa0682023-09-18 14:02:26 +080068 /* GDM Egress Control Register */
69@@ -630,6 +630,11 @@
developeree39bcf2023-06-16 08:03:30 +080070 #define MTK_RXD4_SRC_PORT GENMASK(21, 19)
71 #define MTK_RXD4_ALG GENMASK(31, 22)
72
73+/* QDMA descriptor rxd4 */
74+#define MTK_RXD5_FOE_ENTRY_V2 GENMASK(14, 0)
75+#define MTK_RXD5_PPE_CPU_REASON_V2 GENMASK(22, 18)
76+#define MTK_RXD5_SRC_PORT_V2 GENMASK(29, 26)
77+
78 /* QDMA descriptor rxd4 */
79 #define RX_DMA_L4_VALID BIT(24)
80 #define RX_DMA_L4_VALID_PDMA BIT(30) /* when PDMA is used */
81diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c
developer58aa0682023-09-18 14:02:26 +080082index 86741bf..ef8acbc 100755
developeree39bcf2023-06-16 08:03:30 +080083--- a/drivers/net/ethernet/mediatek/mtk_ppe.c
84+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
85@@ -122,7 +122,7 @@ static u32 mtk_ppe_hash_entry(struct mtk_foe_entry *e)
86 hash = (hash >> 24) | ((hash & 0xffffff) << 8);
87 hash ^= hv1 ^ hv2 ^ hv3;
88 hash ^= hash >> 16;
89- hash <<= 1;
90+ hash <<= 2;
91 hash &= MTK_PPE_ENTRIES - 1;
92
93 return hash;
94@@ -171,8 +171,12 @@ int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto,
95 MTK_FOE_IB1_BIND_CACHE;
96 entry->ib1 = val;
developer58aa0682023-09-18 14:02:26 +080097
developeree39bcf2023-06-16 08:03:30 +080098+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
99+ val = FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0xf) |
100+#else
101 val = FIELD_PREP(MTK_FOE_IB2_PORT_MG, 0x3f) |
102 FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0x1f) |
103+#endif
104 FIELD_PREP(MTK_FOE_IB2_DEST_PORT, pse_port);
105
106 if (is_multicast_ether_addr(dest_mac))
developer58aa0682023-09-18 14:02:26 +0800107@@ -359,12 +363,19 @@ int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
developeree39bcf2023-06-16 08:03:30 +0800108
109 *ib2 &= ~MTK_FOE_IB2_PORT_MG;
110 *ib2 |= MTK_FOE_IB2_WDMA_WINFO;
111+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
112+ *ib2 |= FIELD_PREP(MTK_FOE_IB2_RX_IDX, txq);
113+
114+ l2->winfo = FIELD_PREP(MTK_FOE_WINFO_WCID, wcid) |
115+ FIELD_PREP(MTK_FOE_WINFO_BSS, bss);
116+#else
117 if (wdma_idx)
118 *ib2 |= MTK_FOE_IB2_WDMA_DEVIDX;
119
120 l2->vlan2 = FIELD_PREP(MTK_FOE_VLAN2_WINFO_BSS, bss) |
121 FIELD_PREP(MTK_FOE_VLAN2_WINFO_WCID, wcid) |
122 FIELD_PREP(MTK_FOE_VLAN2_WINFO_RING, txq);
123+#endif
124
125 return 0;
126 }
developer58aa0682023-09-18 14:02:26 +0800127@@ -746,6 +757,9 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
developeree39bcf2023-06-16 08:03:30 +0800128 MTK_PPE_TB_CFG_AGE_TCP |
129 MTK_PPE_TB_CFG_AGE_UDP |
130 MTK_PPE_TB_CFG_AGE_TCP_FIN |
131+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
132+ MTK_PPE_TB_CFG_INFO_SEL |
133+#endif
134 FIELD_PREP(MTK_PPE_TB_CFG_SEARCH_MISS,
135 MTK_PPE_SEARCH_MISS_ACTION_FORWARD_BUILD) |
136 FIELD_PREP(MTK_PPE_TB_CFG_KEEPALIVE,
developer58aa0682023-09-18 14:02:26 +0800137@@ -762,15 +776,17 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
developeree39bcf2023-06-16 08:03:30 +0800138
139 mtk_ppe_cache_enable(ppe, true);
140
141- val = MTK_PPE_FLOW_CFG_IP4_TCP_FRAG |
developer58aa0682023-09-18 14:02:26 +0800142- MTK_PPE_FLOW_CFG_IP4_UDP_FRAG |
developeree39bcf2023-06-16 08:03:30 +0800143+ val = MTK_PPE_MD_TOAP_BYP_CRSN0 |
144+ MTK_PPE_MD_TOAP_BYP_CRSN1 |
145+ MTK_PPE_MD_TOAP_BYP_CRSN2 |
developeree39bcf2023-06-16 08:03:30 +0800146 MTK_PPE_FLOW_CFG_IP6_3T_ROUTE |
147 MTK_PPE_FLOW_CFG_IP6_5T_ROUTE |
developer58aa0682023-09-18 14:02:26 +0800148 MTK_PPE_FLOW_CFG_IP6_6RD |
developeree39bcf2023-06-16 08:03:30 +0800149 MTK_PPE_FLOW_CFG_IP4_NAT |
150 MTK_PPE_FLOW_CFG_IP4_NAPT |
151 MTK_PPE_FLOW_CFG_IP4_DSLITE |
152- MTK_PPE_FLOW_CFG_IP4_NAT_FRAG;
153+ MTK_PPE_FLOW_CFG_IP4_NAT_FRAG |
154+ MTK_PPE_FLOW_CFG_IP4_HASH_GRE_KEY;
155 ppe_w32(ppe, MTK_PPE_FLOW_CFG, val);
156
157 val = FIELD_PREP(MTK_PPE_UNBIND_AGE_MIN_PACKETS, 1000) |
developer58aa0682023-09-18 14:02:26 +0800158@@ -806,6 +822,11 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
developeree39bcf2023-06-16 08:03:30 +0800159
160 ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT, 0);
developer58aa0682023-09-18 14:02:26 +0800161
developeree39bcf2023-06-16 08:03:30 +0800162+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
163+ ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT1, 0xcb777);
164+ ppe_w32(ppe, MTK_PPE_SBW_CTRL, 0x7f);
165+#endif
166+
167 return 0;
168 }
169
170diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.h b/drivers/net/ethernet/mediatek/mtk_ppe.h
developer58aa0682023-09-18 14:02:26 +0800171index 1f5cf1c..7012351 100644
developeree39bcf2023-06-16 08:03:30 +0800172--- a/drivers/net/ethernet/mediatek/mtk_ppe.h
173+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
174@@ -8,7 +8,11 @@
175 #include <linux/bitfield.h>
176 #include <linux/rhashtable.h>
developer58aa0682023-09-18 14:02:26 +0800177
developeree39bcf2023-06-16 08:03:30 +0800178+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
179+#define MTK_ETH_PPE_BASE 0x2000
180+#else
181 #define MTK_ETH_PPE_BASE 0xc00
182+#endif
183
184 #define MTK_PPE_ENTRIES_SHIFT 3
185 #define MTK_PPE_ENTRIES (1024 << MTK_PPE_ENTRIES_SHIFT)
developer58aa0682023-09-18 14:02:26 +0800186@@ -16,6 +20,24 @@
developeree39bcf2023-06-16 08:03:30 +0800187 #define MTK_PPE_WAIT_TIMEOUT_US 1000000
188
189 #define MTK_FOE_IB1_UNBIND_TIMESTAMP GENMASK(7, 0)
190+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
191+#define MTK_FOE_IB1_UNBIND_SRC_PORT GENMASK(11, 8)
192+#define MTK_FOE_IB1_UNBIND_PACKETS GENMASK(19, 12)
193+#define MTK_FOE_IB1_UNBIND_PREBIND BIT(22)
194+#define MTK_FOE_IB1_UNBIND_PACKET_TYPE GENMASK(27, 23)
195+#define MTK_FOE_IB1_BIND_TIMESTAMP GENMASK(7, 0)
196+#define MTK_FOE_IB1_BIND_SRC_PORT GENMASK(11, 8)
197+#define MTK_FOE_IB1_BIND_MC BIT(12)
198+#define MTK_FOE_IB1_BIND_KEEPALIVE BIT(13)
199+#define MTK_FOE_IB1_BIND_VLAN_LAYER GENMASK(16, 14)
200+#define MTK_FOE_IB1_BIND_PPPOE BIT(17)
201+#define MTK_FOE_IB1_BIND_VLAN_TAG BIT(18)
202+#define MTK_FOE_IB1_BIND_PKT_SAMPLE BIT(19)
203+#define MTK_FOE_IB1_BIND_CACHE BIT(20)
204+#define MTK_FOE_IB1_BIND_TUNNEL_DECAP BIT(21)
205+#define MTK_FOE_IB1_BIND_TTL BIT(22)
206+#define MTK_FOE_IB1_PACKET_TYPE GENMASK(27, 23)
207+#else
208 #define MTK_FOE_IB1_UNBIND_PACKETS GENMASK(23, 8)
209 #define MTK_FOE_IB1_UNBIND_PREBIND BIT(24)
210
developer58aa0682023-09-18 14:02:26 +0800211@@ -30,6 +52,8 @@
developeree39bcf2023-06-16 08:03:30 +0800212 #define MTK_FOE_IB1_BIND_TTL BIT(24)
213
214 #define MTK_FOE_IB1_PACKET_TYPE GENMASK(27, 25)
215+#endif
216+
217 #define MTK_FOE_IB1_STATE GENMASK(29, 28)
218 #define MTK_FOE_IB1_UDP BIT(30)
219 #define MTK_FOE_IB1_STATIC BIT(31)
developer58aa0682023-09-18 14:02:26 +0800220@@ -44,24 +68,42 @@ enum {
developeree39bcf2023-06-16 08:03:30 +0800221 MTK_PPE_PKT_TYPE_IPV6_6RD = 7,
222 };
223
224+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
225+#define MTK_FOE_IB2_QID GENMASK(6, 0)
226+#define MTK_FOE_IB2_PORT_MG BIT(7)
227+#define MTK_FOE_IB2_PSE_QOS BIT(8)
228+#define MTK_FOE_IB2_DEST_PORT GENMASK(12, 9)
229+#define MTK_FOE_IB2_MULTICAST BIT(13)
230+#define MTK_FOE_IB2_MIB_CNT BIT(15)
231+#define MTK_FOE_IB2_RX_IDX GENMASK(18, 17)
232+#define MTK_FOE_IB2_WDMA_WINFO BIT(19)
233+#define MTK_FOE_IB2_PORT_AG GENMASK(23, 20)
234+#else
235 #define MTK_FOE_IB2_QID GENMASK(3, 0)
236 #define MTK_FOE_IB2_PSE_QOS BIT(4)
237 #define MTK_FOE_IB2_DEST_PORT GENMASK(7, 5)
238 #define MTK_FOE_IB2_MULTICAST BIT(8)
239
240 #define MTK_FOE_IB2_WDMA_QID2 GENMASK(13, 12)
241+#define MTK_FOE_IB2_MIB_CNT BIT(15)
242 #define MTK_FOE_IB2_WDMA_DEVIDX BIT(16)
243 #define MTK_FOE_IB2_WDMA_WINFO BIT(17)
244
245 #define MTK_FOE_IB2_PORT_MG GENMASK(17, 12)
246
247 #define MTK_FOE_IB2_PORT_AG GENMASK(23, 18)
248+#endif
249
250 #define MTK_FOE_IB2_DSCP GENMASK(31, 24)
251
252+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
253+#define MTK_FOE_WINFO_BSS GENMASK(5, 0)
254+#define MTK_FOE_WINFO_WCID GENMASK(15, 6)
255+#else
256 #define MTK_FOE_VLAN2_WINFO_BSS GENMASK(5, 0)
257 #define MTK_FOE_VLAN2_WINFO_WCID GENMASK(13, 6)
258 #define MTK_FOE_VLAN2_WINFO_RING GENMASK(15, 14)
259+#endif
260
261 enum {
262 MTK_FOE_STATE_INVALID,
developer58aa0682023-09-18 14:02:26 +0800263@@ -83,6 +125,11 @@ struct mtk_foe_mac_info {
developeree39bcf2023-06-16 08:03:30 +0800264
265 u16 pppoe_id;
266 u16 src_mac_lo;
267+
268+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
269+ u16 minfo;
270+ u16 winfo;
271+#endif
272 };
273
274 /* software-only entry type */
developer58aa0682023-09-18 14:02:26 +0800275@@ -200,7 +247,11 @@ struct mtk_foe_entry {
developeree39bcf2023-06-16 08:03:30 +0800276 struct mtk_foe_ipv4_dslite dslite;
277 struct mtk_foe_ipv6 ipv6;
278 struct mtk_foe_ipv6_6rd ipv6_6rd;
279+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
280+ u32 data[23];
281+#else
282 u32 data[19];
283+#endif
284 };
285 };
286
287diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developer58aa0682023-09-18 14:02:26 +0800288index 8a28572..77594f3 100644
developeree39bcf2023-06-16 08:03:30 +0800289--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
290+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
developer58aa0682023-09-18 14:02:26 +0800291@@ -193,6 +193,14 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
developeree39bcf2023-06-16 08:03:30 +0800292 mtk_foe_entry_set_wdma(foe, info.wdma_idx, info.queue, info.bss,
293 info.wcid);
294 pse_port = PSE_PPE0_PORT;
295+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
296+ if (info.wdma_idx == 0)
297+ pse_port = PSE_WDMA0_PORT;
298+ else if (info.wdma_idx == 1)
299+ pse_port = PSE_WDMA1_PORT;
300+ else
301+ return -EOPNOTSUPP;
302+#endif
303 *wed_index = info.wdma_idx;
304 goto out;
305 }
306diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_regs.h b/drivers/net/ethernet/mediatek/mtk_ppe_regs.h
developer58aa0682023-09-18 14:02:26 +0800307index 0c45ea0..d319f18 100644
developeree39bcf2023-06-16 08:03:30 +0800308--- a/drivers/net/ethernet/mediatek/mtk_ppe_regs.h
309+++ b/drivers/net/ethernet/mediatek/mtk_ppe_regs.h
310@@ -21,6 +21,9 @@
311 #define MTK_PPE_GLO_CFG_BUSY BIT(31)
312
313 #define MTK_PPE_FLOW_CFG 0x204
314+#define MTK_PPE_MD_TOAP_BYP_CRSN0 BIT(1)
315+#define MTK_PPE_MD_TOAP_BYP_CRSN1 BIT(2)
316+#define MTK_PPE_MD_TOAP_BYP_CRSN2 BIT(3)
317 #define MTK_PPE_FLOW_CFG_IP4_TCP_FRAG BIT(6)
318 #define MTK_PPE_FLOW_CFG_IP4_UDP_FRAG BIT(7)
319 #define MTK_PPE_FLOW_CFG_IP6_3T_ROUTE BIT(8)
320@@ -35,6 +38,8 @@
321 #define MTK_PPE_FLOW_CFG_IP4_HASH_FLOW_LABEL BIT(18)
322 #define MTK_PPE_FLOW_CFG_IP4_HASH_GRE_KEY BIT(19)
323 #define MTK_PPE_FLOW_CFG_IP6_HASH_GRE_KEY BIT(20)
324+#define MTK_PPE_FLOW_CFG_IPV4_MAPE_EN BIT(21)
325+#define MTK_PPE_FLOW_CFG_IPV4_MAPT_EN BIT(22)
326
327 #define MTK_PPE_IP_PROTO_CHK 0x208
328 #define MTK_PPE_IP_PROTO_CHK_IPV4 GENMASK(15, 0)
329@@ -54,6 +59,7 @@
330 #define MTK_PPE_TB_CFG_HASH_MODE GENMASK(15, 14)
331 #define MTK_PPE_TB_CFG_SCAN_MODE GENMASK(17, 16)
332 #define MTK_PPE_TB_CFG_HASH_DEBUG GENMASK(19, 18)
333+#define MTK_PPE_TB_CFG_INFO_SEL BIT(20)
334
335 enum {
336 MTK_PPE_SCAN_MODE_DISABLED,
337@@ -111,6 +117,8 @@ enum {
338
339 #define MTK_PPE_DEFAULT_CPU_PORT 0x248
340 #define MTK_PPE_DEFAULT_CPU_PORT_MASK(_n) (GENMASK(2, 0) << ((_n) * 4))
341+#define MTK_PPE_DEFAULT_CPU_PORT1 0x24C
342+#define MTK_PPE_DEFAULT_CPU_PORT_MASK(_n) (GENMASK(2, 0) << ((_n) * 4))
343
344 #define MTK_PPE_MTU_DROP 0x308
345
346@@ -141,4 +149,6 @@ enum {
347 #define MTK_PPE_MIB_CACHE_CTL_EN BIT(0)
348 #define MTK_PPE_MIB_CACHE_CTL_FLUSH BIT(2)
349
350+#define MTK_PPE_SBW_CTRL 0x374
351+
352 #endif
353--
3542.18.0
355