3ad10c793308e6ee9c5a49a3bd6bb943c1bcd9b1
[linux-2.6-microblaze.git] / drivers / net / ethernet / mediatek / mtk_ppe.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright (C) 2020 Felix Fietkau <nbd@nbd.name> */
3
4 #include <linux/kernel.h>
5 #include <linux/io.h>
6 #include <linux/iopoll.h>
7 #include <linux/etherdevice.h>
8 #include <linux/platform_device.h>
9 #include "mtk_ppe.h"
10 #include "mtk_ppe_regs.h"
11
12 static void ppe_w32(struct mtk_ppe *ppe, u32 reg, u32 val)
13 {
14         writel(val, ppe->base + reg);
15 }
16
17 static u32 ppe_r32(struct mtk_ppe *ppe, u32 reg)
18 {
19         return readl(ppe->base + reg);
20 }
21
22 static u32 ppe_m32(struct mtk_ppe *ppe, u32 reg, u32 mask, u32 set)
23 {
24         u32 val;
25
26         val = ppe_r32(ppe, reg);
27         val &= ~mask;
28         val |= set;
29         ppe_w32(ppe, reg, val);
30
31         return val;
32 }
33
34 static u32 ppe_set(struct mtk_ppe *ppe, u32 reg, u32 val)
35 {
36         return ppe_m32(ppe, reg, 0, val);
37 }
38
39 static u32 ppe_clear(struct mtk_ppe *ppe, u32 reg, u32 val)
40 {
41         return ppe_m32(ppe, reg, val, 0);
42 }
43
44 static int mtk_ppe_wait_busy(struct mtk_ppe *ppe)
45 {
46         int ret;
47         u32 val;
48
49         ret = readl_poll_timeout(ppe->base + MTK_PPE_GLO_CFG, val,
50                                  !(val & MTK_PPE_GLO_CFG_BUSY),
51                                  20, MTK_PPE_WAIT_TIMEOUT_US);
52
53         if (ret)
54                 dev_err(ppe->dev, "PPE table busy");
55
56         return ret;
57 }
58
59 static void mtk_ppe_cache_clear(struct mtk_ppe *ppe)
60 {
61         ppe_set(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR);
62         ppe_clear(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR);
63 }
64
65 static void mtk_ppe_cache_enable(struct mtk_ppe *ppe, bool enable)
66 {
67         mtk_ppe_cache_clear(ppe);
68
69         ppe_m32(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_EN,
70                 enable * MTK_PPE_CACHE_CTL_EN);
71 }
72
73 static u32 mtk_ppe_hash_entry(struct mtk_foe_entry *e)
74 {
75         u32 hv1, hv2, hv3;
76         u32 hash;
77
78         switch (FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, e->ib1)) {
79                 case MTK_PPE_PKT_TYPE_BRIDGE:
80                         hv1 = e->bridge.src_mac_lo;
81                         hv1 ^= ((e->bridge.src_mac_hi & 0xffff) << 16);
82                         hv2 = e->bridge.src_mac_hi >> 16;
83                         hv2 ^= e->bridge.dest_mac_lo;
84                         hv3 = e->bridge.dest_mac_hi;
85                         break;
86                 case MTK_PPE_PKT_TYPE_IPV4_ROUTE:
87                 case MTK_PPE_PKT_TYPE_IPV4_HNAPT:
88                         hv1 = e->ipv4.orig.ports;
89                         hv2 = e->ipv4.orig.dest_ip;
90                         hv3 = e->ipv4.orig.src_ip;
91                         break;
92                 case MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T:
93                 case MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T:
94                         hv1 = e->ipv6.src_ip[3] ^ e->ipv6.dest_ip[3];
95                         hv1 ^= e->ipv6.ports;
96
97                         hv2 = e->ipv6.src_ip[2] ^ e->ipv6.dest_ip[2];
98                         hv2 ^= e->ipv6.dest_ip[0];
99
100                         hv3 = e->ipv6.src_ip[1] ^ e->ipv6.dest_ip[1];
101                         hv3 ^= e->ipv6.src_ip[0];
102                         break;
103                 case MTK_PPE_PKT_TYPE_IPV4_DSLITE:
104                 case MTK_PPE_PKT_TYPE_IPV6_6RD:
105                 default:
106                         WARN_ON_ONCE(1);
107                         return MTK_PPE_HASH_MASK;
108         }
109
110         hash = (hv1 & hv2) | ((~hv1) & hv3);
111         hash = (hash >> 24) | ((hash & 0xffffff) << 8);
112         hash ^= hv1 ^ hv2 ^ hv3;
113         hash ^= hash >> 16;
114         hash <<= 1;
115         hash &= MTK_PPE_ENTRIES - 1;
116
117         return hash;
118 }
119
120 static inline struct mtk_foe_mac_info *
121 mtk_foe_entry_l2(struct mtk_foe_entry *entry)
122 {
123         int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
124
125         if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE)
126                 return &entry->ipv6.l2;
127
128         return &entry->ipv4.l2;
129 }
130
131 static inline u32 *
132 mtk_foe_entry_ib2(struct mtk_foe_entry *entry)
133 {
134         int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
135
136         if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE)
137                 return &entry->ipv6.ib2;
138
139         return &entry->ipv4.ib2;
140 }
141
142 int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto,
143                           u8 pse_port, u8 *src_mac, u8 *dest_mac)
144 {
145         struct mtk_foe_mac_info *l2;
146         u32 ports_pad, val;
147
148         memset(entry, 0, sizeof(*entry));
149
150         val = FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND) |
151               FIELD_PREP(MTK_FOE_IB1_PACKET_TYPE, type) |
152               FIELD_PREP(MTK_FOE_IB1_UDP, l4proto == IPPROTO_UDP) |
153               MTK_FOE_IB1_BIND_TTL |
154               MTK_FOE_IB1_BIND_CACHE;
155         entry->ib1 = val;
156
157         val = FIELD_PREP(MTK_FOE_IB2_PORT_MG, 0x3f) |
158               FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0x1f) |
159               FIELD_PREP(MTK_FOE_IB2_DEST_PORT, pse_port);
160
161         if (is_multicast_ether_addr(dest_mac))
162                 val |= MTK_FOE_IB2_MULTICAST;
163
164         ports_pad = 0xa5a5a500 | (l4proto & 0xff);
165         if (type == MTK_PPE_PKT_TYPE_IPV4_ROUTE)
166                 entry->ipv4.orig.ports = ports_pad;
167         if (type == MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T)
168                 entry->ipv6.ports = ports_pad;
169
170         if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) {
171                 entry->ipv6.ib2 = val;
172                 l2 = &entry->ipv6.l2;
173         } else {
174                 entry->ipv4.ib2 = val;
175                 l2 = &entry->ipv4.l2;
176         }
177
178         l2->dest_mac_hi = get_unaligned_be32(dest_mac);
179         l2->dest_mac_lo = get_unaligned_be16(dest_mac + 4);
180         l2->src_mac_hi = get_unaligned_be32(src_mac);
181         l2->src_mac_lo = get_unaligned_be16(src_mac + 4);
182
183         if (type >= MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T)
184                 l2->etype = ETH_P_IPV6;
185         else
186                 l2->etype = ETH_P_IP;
187
188         return 0;
189 }
190
191 int mtk_foe_entry_set_pse_port(struct mtk_foe_entry *entry, u8 port)
192 {
193         u32 *ib2 = mtk_foe_entry_ib2(entry);
194         u32 val;
195
196         val = *ib2;
197         val &= ~MTK_FOE_IB2_DEST_PORT;
198         val |= FIELD_PREP(MTK_FOE_IB2_DEST_PORT, port);
199         *ib2 = val;
200
201         return 0;
202 }
203
204 int mtk_foe_entry_set_ipv4_tuple(struct mtk_foe_entry *entry, bool egress,
205                                  __be32 src_addr, __be16 src_port,
206                                  __be32 dest_addr, __be16 dest_port)
207 {
208         int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
209         struct mtk_ipv4_tuple *t;
210
211         switch (type) {
212         case MTK_PPE_PKT_TYPE_IPV4_HNAPT:
213                 if (egress) {
214                         t = &entry->ipv4.new;
215                         break;
216                 }
217                 fallthrough;
218         case MTK_PPE_PKT_TYPE_IPV4_DSLITE:
219         case MTK_PPE_PKT_TYPE_IPV4_ROUTE:
220                 t = &entry->ipv4.orig;
221                 break;
222         case MTK_PPE_PKT_TYPE_IPV6_6RD:
223                 entry->ipv6_6rd.tunnel_src_ip = be32_to_cpu(src_addr);
224                 entry->ipv6_6rd.tunnel_dest_ip = be32_to_cpu(dest_addr);
225                 return 0;
226         default:
227                 WARN_ON_ONCE(1);
228                 return -EINVAL;
229         }
230
231         t->src_ip = be32_to_cpu(src_addr);
232         t->dest_ip = be32_to_cpu(dest_addr);
233
234         if (type == MTK_PPE_PKT_TYPE_IPV4_ROUTE)
235                 return 0;
236
237         t->src_port = be16_to_cpu(src_port);
238         t->dest_port = be16_to_cpu(dest_port);
239
240         return 0;
241 }
242
243 int mtk_foe_entry_set_ipv6_tuple(struct mtk_foe_entry *entry,
244                                  __be32 *src_addr, __be16 src_port,
245                                  __be32 *dest_addr, __be16 dest_port)
246 {
247         int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
248         u32 *src, *dest;
249         int i;
250
251         switch (type) {
252         case MTK_PPE_PKT_TYPE_IPV4_DSLITE:
253                 src = entry->dslite.tunnel_src_ip;
254                 dest = entry->dslite.tunnel_dest_ip;
255                 break;
256         case MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T:
257         case MTK_PPE_PKT_TYPE_IPV6_6RD:
258                 entry->ipv6.src_port = be16_to_cpu(src_port);
259                 entry->ipv6.dest_port = be16_to_cpu(dest_port);
260                 fallthrough;
261         case MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T:
262                 src = entry->ipv6.src_ip;
263                 dest = entry->ipv6.dest_ip;
264                 break;
265         default:
266                 WARN_ON_ONCE(1);
267                 return -EINVAL;
268         }
269
270         for (i = 0; i < 4; i++)
271                 src[i] = be32_to_cpu(src_addr[i]);
272         for (i = 0; i < 4; i++)
273                 dest[i] = be32_to_cpu(dest_addr[i]);
274
275         return 0;
276 }
277
278 int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port)
279 {
280         struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry);
281
282         l2->etype = BIT(port);
283
284         if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_LAYER))
285                 entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1);
286         else
287                 l2->etype |= BIT(8);
288
289         entry->ib1 &= ~MTK_FOE_IB1_BIND_VLAN_TAG;
290
291         return 0;
292 }
293
294 int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid)
295 {
296         struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry);
297
298         switch (FIELD_GET(MTK_FOE_IB1_BIND_VLAN_LAYER, entry->ib1)) {
299         case 0:
300                 entry->ib1 |= MTK_FOE_IB1_BIND_VLAN_TAG |
301                               FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1);
302                 l2->vlan1 = vid;
303                 return 0;
304         case 1:
305                 if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_TAG)) {
306                         l2->vlan1 = vid;
307                         l2->etype |= BIT(8);
308                 } else {
309                         l2->vlan2 = vid;
310                         entry->ib1 += FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1);
311                 }
312                 return 0;
313         default:
314                 return -ENOSPC;
315         }
316 }
317
318 int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid)
319 {
320         struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry);
321
322         if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_LAYER) ||
323             (entry->ib1 & MTK_FOE_IB1_BIND_VLAN_TAG))
324                 l2->etype = ETH_P_PPP_SES;
325
326         entry->ib1 |= MTK_FOE_IB1_BIND_PPPOE;
327         l2->pppoe_id = sid;
328
329         return 0;
330 }
331
332 static inline bool mtk_foe_entry_usable(struct mtk_foe_entry *entry)
333 {
334         return !(entry->ib1 & MTK_FOE_IB1_STATIC) &&
335                FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1) != MTK_FOE_STATE_BIND;
336 }
337
338 int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry,
339                          u16 timestamp)
340 {
341         struct mtk_foe_entry *hwe;
342         u32 hash;
343
344         timestamp &= MTK_FOE_IB1_BIND_TIMESTAMP;
345         entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP;
346         entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_TIMESTAMP, timestamp);
347
348         hash = mtk_ppe_hash_entry(entry);
349         hwe = &ppe->foe_table[hash];
350         if (!mtk_foe_entry_usable(hwe)) {
351                 hwe++;
352                 hash++;
353
354                 if (!mtk_foe_entry_usable(hwe))
355                         return -ENOSPC;
356         }
357
358         memcpy(&hwe->data, &entry->data, sizeof(hwe->data));
359         wmb();
360         hwe->ib1 = entry->ib1;
361
362         dma_wmb();
363
364         mtk_ppe_cache_clear(ppe);
365
366         return hash;
367 }
368
369 int mtk_ppe_init(struct mtk_ppe *ppe, struct device *dev, void __iomem *base,
370                  int version)
371 {
372         struct mtk_foe_entry *foe;
373
374         /* need to allocate a separate device, since it PPE DMA access is
375          * not coherent.
376          */
377         ppe->base = base;
378         ppe->dev = dev;
379         ppe->version = version;
380
381         foe = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*foe),
382                                   &ppe->foe_phys, GFP_KERNEL);
383         if (!foe)
384                 return -ENOMEM;
385
386         ppe->foe_table = foe;
387
388         mtk_ppe_debugfs_init(ppe);
389
390         return 0;
391 }
392
393 static void mtk_ppe_init_foe_table(struct mtk_ppe *ppe)
394 {
395         static const u8 skip[] = { 12, 25, 38, 51, 76, 89, 102 };
396         int i, k;
397
398         memset(ppe->foe_table, 0, MTK_PPE_ENTRIES * sizeof(ppe->foe_table));
399
400         if (!IS_ENABLED(CONFIG_SOC_MT7621))
401                 return;
402
403         /* skip all entries that cross the 1024 byte boundary */
404         for (i = 0; i < MTK_PPE_ENTRIES; i += 128)
405                 for (k = 0; k < ARRAY_SIZE(skip); k++)
406                         ppe->foe_table[i + skip[k]].ib1 |= MTK_FOE_IB1_STATIC;
407 }
408
409 int mtk_ppe_start(struct mtk_ppe *ppe)
410 {
411         u32 val;
412
413         mtk_ppe_init_foe_table(ppe);
414         ppe_w32(ppe, MTK_PPE_TB_BASE, ppe->foe_phys);
415
416         val = MTK_PPE_TB_CFG_ENTRY_80B |
417               MTK_PPE_TB_CFG_AGE_NON_L4 |
418               MTK_PPE_TB_CFG_AGE_UNBIND |
419               MTK_PPE_TB_CFG_AGE_TCP |
420               MTK_PPE_TB_CFG_AGE_UDP |
421               MTK_PPE_TB_CFG_AGE_TCP_FIN |
422               FIELD_PREP(MTK_PPE_TB_CFG_SEARCH_MISS,
423                          MTK_PPE_SEARCH_MISS_ACTION_FORWARD_BUILD) |
424               FIELD_PREP(MTK_PPE_TB_CFG_KEEPALIVE,
425                          MTK_PPE_KEEPALIVE_DISABLE) |
426               FIELD_PREP(MTK_PPE_TB_CFG_HASH_MODE, 1) |
427               FIELD_PREP(MTK_PPE_TB_CFG_SCAN_MODE,
428                          MTK_PPE_SCAN_MODE_KEEPALIVE_AGE) |
429               FIELD_PREP(MTK_PPE_TB_CFG_ENTRY_NUM,
430                          MTK_PPE_ENTRIES_SHIFT);
431         ppe_w32(ppe, MTK_PPE_TB_CFG, val);
432
433         ppe_w32(ppe, MTK_PPE_IP_PROTO_CHK,
434                 MTK_PPE_IP_PROTO_CHK_IPV4 | MTK_PPE_IP_PROTO_CHK_IPV6);
435
436         mtk_ppe_cache_enable(ppe, true);
437
438         val = MTK_PPE_FLOW_CFG_IP4_TCP_FRAG |
439               MTK_PPE_FLOW_CFG_IP4_UDP_FRAG |
440               MTK_PPE_FLOW_CFG_IP6_3T_ROUTE |
441               MTK_PPE_FLOW_CFG_IP6_5T_ROUTE |
442               MTK_PPE_FLOW_CFG_IP6_6RD |
443               MTK_PPE_FLOW_CFG_IP4_NAT |
444               MTK_PPE_FLOW_CFG_IP4_NAPT |
445               MTK_PPE_FLOW_CFG_IP4_DSLITE |
446               MTK_PPE_FLOW_CFG_L2_BRIDGE |
447               MTK_PPE_FLOW_CFG_IP4_NAT_FRAG;
448         ppe_w32(ppe, MTK_PPE_FLOW_CFG, val);
449
450         val = FIELD_PREP(MTK_PPE_UNBIND_AGE_MIN_PACKETS, 1000) |
451               FIELD_PREP(MTK_PPE_UNBIND_AGE_DELTA, 3);
452         ppe_w32(ppe, MTK_PPE_UNBIND_AGE, val);
453
454         val = FIELD_PREP(MTK_PPE_BIND_AGE0_DELTA_UDP, 12) |
455               FIELD_PREP(MTK_PPE_BIND_AGE0_DELTA_NON_L4, 1);
456         ppe_w32(ppe, MTK_PPE_BIND_AGE0, val);
457
458         val = FIELD_PREP(MTK_PPE_BIND_AGE1_DELTA_TCP_FIN, 1) |
459               FIELD_PREP(MTK_PPE_BIND_AGE1_DELTA_TCP, 7);
460         ppe_w32(ppe, MTK_PPE_BIND_AGE1, val);
461
462         val = MTK_PPE_BIND_LIMIT0_QUARTER | MTK_PPE_BIND_LIMIT0_HALF;
463         ppe_w32(ppe, MTK_PPE_BIND_LIMIT0, val);
464
465         val = MTK_PPE_BIND_LIMIT1_FULL |
466               FIELD_PREP(MTK_PPE_BIND_LIMIT1_NON_L4, 1);
467         ppe_w32(ppe, MTK_PPE_BIND_LIMIT1, val);
468
469         val = FIELD_PREP(MTK_PPE_BIND_RATE_BIND, 30) |
470               FIELD_PREP(MTK_PPE_BIND_RATE_PREBIND, 1);
471         ppe_w32(ppe, MTK_PPE_BIND_RATE, val);
472
473         /* enable PPE */
474         val = MTK_PPE_GLO_CFG_EN |
475               MTK_PPE_GLO_CFG_IP4_L4_CS_DROP |
476               MTK_PPE_GLO_CFG_IP4_CS_DROP |
477               MTK_PPE_GLO_CFG_FLOW_DROP_UPDATE;
478         ppe_w32(ppe, MTK_PPE_GLO_CFG, val);
479
480         ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT, 0);
481
482         return 0;
483 }
484
485 int mtk_ppe_stop(struct mtk_ppe *ppe)
486 {
487         u32 val;
488         int i;
489
490         for (i = 0; i < MTK_PPE_ENTRIES; i++)
491                 ppe->foe_table[i].ib1 = FIELD_PREP(MTK_FOE_IB1_STATE,
492                                                    MTK_FOE_STATE_INVALID);
493
494         mtk_ppe_cache_enable(ppe, false);
495
496         /* disable offload engine */
497         ppe_clear(ppe, MTK_PPE_GLO_CFG, MTK_PPE_GLO_CFG_EN);
498         ppe_w32(ppe, MTK_PPE_FLOW_CFG, 0);
499
500         /* disable aging */
501         val = MTK_PPE_TB_CFG_AGE_NON_L4 |
502               MTK_PPE_TB_CFG_AGE_UNBIND |
503               MTK_PPE_TB_CFG_AGE_TCP |
504               MTK_PPE_TB_CFG_AGE_UDP |
505               MTK_PPE_TB_CFG_AGE_TCP_FIN;
506         ppe_clear(ppe, MTK_PPE_TB_CFG, val);
507
508         return mtk_ppe_wait_busy(ppe);
509 }