Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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 <linux/if_ether.h>
10#include <linux/if_vlan.h>
11#include <net/dsa.h>
12#include "mtk_eth_soc.h"
13#include "mtk_ppe.h"
14#include "mtk_ppe_regs.h"
15
16static DEFINE_SPINLOCK(ppe_lock);
17
18static const struct rhashtable_params mtk_flow_l2_ht_params = {
19 .head_offset = offsetof(struct mtk_flow_entry, l2_node),
20 .key_offset = offsetof(struct mtk_flow_entry, data.bridge),
21 .key_len = offsetof(struct mtk_foe_bridge, key_end),
22 .automatic_shrinking = true,
23};
24
25static void ppe_w32(struct mtk_ppe *ppe, u32 reg, u32 val)
26{
27 writel(val, ppe->base + reg);
28}
29
30static u32 ppe_r32(struct mtk_ppe *ppe, u32 reg)
31{
32 return readl(ppe->base + reg);
33}
34
35static u32 ppe_m32(struct mtk_ppe *ppe, u32 reg, u32 mask, u32 set)
36{
37 u32 val;
38
39 val = ppe_r32(ppe, reg);
40 val &= ~mask;
41 val |= set;
42 ppe_w32(ppe, reg, val);
43
44 return val;
45}
46
47static u32 ppe_set(struct mtk_ppe *ppe, u32 reg, u32 val)
48{
49 return ppe_m32(ppe, reg, 0, val);
50}
51
52static u32 ppe_clear(struct mtk_ppe *ppe, u32 reg, u32 val)
53{
54 return ppe_m32(ppe, reg, val, 0);
55}
56
57static u32 mtk_eth_timestamp(struct mtk_eth *eth)
58{
59 return mtk_r32(eth, 0x0010) & MTK_FOE_IB1_BIND_TIMESTAMP;
60}
61
62static int mtk_ppe_wait_busy(struct mtk_ppe *ppe)
63{
64 int ret;
65 u32 val;
66
67 ret = readl_poll_timeout(ppe->base + MTK_PPE_GLO_CFG, val,
68 !(val & MTK_PPE_GLO_CFG_BUSY),
69 20, MTK_PPE_WAIT_TIMEOUT_US);
70
71 if (ret)
72 dev_err(ppe->dev, "PPE table busy");
73
74 return ret;
75}
76
77static void mtk_ppe_cache_clear(struct mtk_ppe *ppe)
78{
79 ppe_set(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR);
80 ppe_clear(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_CLEAR);
81}
82
83static void mtk_ppe_cache_enable(struct mtk_ppe *ppe, bool enable)
84{
85 mtk_ppe_cache_clear(ppe);
86
87 ppe_m32(ppe, MTK_PPE_CACHE_CTL, MTK_PPE_CACHE_CTL_EN,
88 enable * MTK_PPE_CACHE_CTL_EN);
89}
90
91static u32 mtk_ppe_hash_entry(struct mtk_foe_entry *e)
92{
93 u32 hv1, hv2, hv3;
94 u32 hash;
95
96 switch (FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, e->ib1)) {
97 case MTK_PPE_PKT_TYPE_IPV4_ROUTE:
98 case MTK_PPE_PKT_TYPE_IPV4_HNAPT:
99 hv1 = e->ipv4.orig.ports;
100 hv2 = e->ipv4.orig.dest_ip;
101 hv3 = e->ipv4.orig.src_ip;
102 break;
103 case MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T:
104 case MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T:
105 hv1 = e->ipv6.src_ip[3] ^ e->ipv6.dest_ip[3];
106 hv1 ^= e->ipv6.ports;
107
108 hv2 = e->ipv6.src_ip[2] ^ e->ipv6.dest_ip[2];
109 hv2 ^= e->ipv6.dest_ip[0];
110
111 hv3 = e->ipv6.src_ip[1] ^ e->ipv6.dest_ip[1];
112 hv3 ^= e->ipv6.src_ip[0];
113 break;
114 case MTK_PPE_PKT_TYPE_IPV4_DSLITE:
115 case MTK_PPE_PKT_TYPE_IPV6_6RD:
116 default:
117 WARN_ON_ONCE(1);
118 return MTK_PPE_HASH_MASK;
119 }
120
121 hash = (hv1 & hv2) | ((~hv1) & hv3);
122 hash = (hash >> 24) | ((hash & 0xffffff) << 8);
123 hash ^= hv1 ^ hv2 ^ hv3;
124 hash ^= hash >> 16;
125 hash <<= 1;
126 hash &= MTK_PPE_ENTRIES - 1;
127
128 return hash;
129}
130
131static inline struct mtk_foe_mac_info *
132mtk_foe_entry_l2(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_BRIDGE)
137 return &entry->bridge.l2;
138
139 if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE)
140 return &entry->ipv6.l2;
141
142 return &entry->ipv4.l2;
143}
144
145static inline u32 *
146mtk_foe_entry_ib2(struct mtk_foe_entry *entry)
147{
148 int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
149
150 if (type == MTK_PPE_PKT_TYPE_BRIDGE)
151 return &entry->bridge.ib2;
152
153 if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE)
154 return &entry->ipv6.ib2;
155
156 return &entry->ipv4.ib2;
157}
158
159int mtk_foe_entry_prepare(struct mtk_foe_entry *entry, int type, int l4proto,
160 u8 pse_port, u8 *src_mac, u8 *dest_mac)
161{
162 struct mtk_foe_mac_info *l2;
163 u32 ports_pad, val;
164
165 memset(entry, 0, sizeof(*entry));
166
167 val = FIELD_PREP(MTK_FOE_IB1_STATE, MTK_FOE_STATE_BIND) |
168 FIELD_PREP(MTK_FOE_IB1_PACKET_TYPE, type) |
169 FIELD_PREP(MTK_FOE_IB1_UDP, l4proto == IPPROTO_UDP) |
170 MTK_FOE_IB1_BIND_TTL |
171 MTK_FOE_IB1_BIND_CACHE;
172 entry->ib1 = val;
173
174 val = FIELD_PREP(MTK_FOE_IB2_PORT_MG, 0x3f) |
175 FIELD_PREP(MTK_FOE_IB2_PORT_AG, 0x1f) |
176 FIELD_PREP(MTK_FOE_IB2_DEST_PORT, pse_port);
177
178 if (is_multicast_ether_addr(dest_mac))
179 val |= MTK_FOE_IB2_MULTICAST;
180
181 ports_pad = 0xa5a5a500 | (l4proto & 0xff);
182 if (type == MTK_PPE_PKT_TYPE_IPV4_ROUTE)
183 entry->ipv4.orig.ports = ports_pad;
184 if (type == MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T)
185 entry->ipv6.ports = ports_pad;
186
187 if (type == MTK_PPE_PKT_TYPE_BRIDGE) {
188 ether_addr_copy(entry->bridge.src_mac, src_mac);
189 ether_addr_copy(entry->bridge.dest_mac, dest_mac);
190 entry->bridge.ib2 = val;
191 l2 = &entry->bridge.l2;
192 } else if (type >= MTK_PPE_PKT_TYPE_IPV4_DSLITE) {
193 entry->ipv6.ib2 = val;
194 l2 = &entry->ipv6.l2;
195 } else {
196 entry->ipv4.ib2 = val;
197 l2 = &entry->ipv4.l2;
198 }
199
200 l2->dest_mac_hi = get_unaligned_be32(dest_mac);
201 l2->dest_mac_lo = get_unaligned_be16(dest_mac + 4);
202 l2->src_mac_hi = get_unaligned_be32(src_mac);
203 l2->src_mac_lo = get_unaligned_be16(src_mac + 4);
204
205 if (type >= MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T)
206 l2->etype = ETH_P_IPV6;
207 else
208 l2->etype = ETH_P_IP;
209
210 return 0;
211}
212
213int mtk_foe_entry_set_pse_port(struct mtk_foe_entry *entry, u8 port)
214{
215 u32 *ib2 = mtk_foe_entry_ib2(entry);
216 u32 val;
217
218 val = *ib2;
219 val &= ~MTK_FOE_IB2_DEST_PORT;
220 val |= FIELD_PREP(MTK_FOE_IB2_DEST_PORT, port);
221 *ib2 = val;
222
223 return 0;
224}
225
226int mtk_foe_entry_set_ipv4_tuple(struct mtk_foe_entry *entry, bool egress,
227 __be32 src_addr, __be16 src_port,
228 __be32 dest_addr, __be16 dest_port)
229{
230 int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
231 struct mtk_ipv4_tuple *t;
232
233 switch (type) {
234 case MTK_PPE_PKT_TYPE_IPV4_HNAPT:
235 if (egress) {
236 t = &entry->ipv4.new;
237 break;
238 }
239 fallthrough;
240 case MTK_PPE_PKT_TYPE_IPV4_DSLITE:
241 case MTK_PPE_PKT_TYPE_IPV4_ROUTE:
242 t = &entry->ipv4.orig;
243 break;
244 case MTK_PPE_PKT_TYPE_IPV6_6RD:
245 entry->ipv6_6rd.tunnel_src_ip = be32_to_cpu(src_addr);
246 entry->ipv6_6rd.tunnel_dest_ip = be32_to_cpu(dest_addr);
247 return 0;
248 default:
249 WARN_ON_ONCE(1);
250 return -EINVAL;
251 }
252
253 t->src_ip = be32_to_cpu(src_addr);
254 t->dest_ip = be32_to_cpu(dest_addr);
255
256 if (type == MTK_PPE_PKT_TYPE_IPV4_ROUTE)
257 return 0;
258
259 t->src_port = be16_to_cpu(src_port);
260 t->dest_port = be16_to_cpu(dest_port);
261
262 return 0;
263}
264
265int mtk_foe_entry_set_ipv6_tuple(struct mtk_foe_entry *entry,
266 __be32 *src_addr, __be16 src_port,
267 __be32 *dest_addr, __be16 dest_port)
268{
269 int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->ib1);
270 u32 *src, *dest;
271 int i;
272
273 switch (type) {
274 case MTK_PPE_PKT_TYPE_IPV4_DSLITE:
275 src = entry->dslite.tunnel_src_ip;
276 dest = entry->dslite.tunnel_dest_ip;
277 break;
278 case MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T:
279 case MTK_PPE_PKT_TYPE_IPV6_6RD:
280 entry->ipv6.src_port = be16_to_cpu(src_port);
281 entry->ipv6.dest_port = be16_to_cpu(dest_port);
282 fallthrough;
283 case MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T:
284 src = entry->ipv6.src_ip;
285 dest = entry->ipv6.dest_ip;
286 break;
287 default:
288 WARN_ON_ONCE(1);
289 return -EINVAL;
290 }
291
292 for (i = 0; i < 4; i++)
293 src[i] = be32_to_cpu(src_addr[i]);
294 for (i = 0; i < 4; i++)
295 dest[i] = be32_to_cpu(dest_addr[i]);
296
297 return 0;
298}
299
300int mtk_foe_entry_set_dsa(struct mtk_foe_entry *entry, int port)
301{
302 struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry);
303
304 l2->etype = BIT(port);
305
306 if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_LAYER))
307 entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1);
308 else
309 l2->etype |= BIT(8);
310
311 entry->ib1 &= ~MTK_FOE_IB1_BIND_VLAN_TAG;
312
313 return 0;
314}
315
316int mtk_foe_entry_set_vlan(struct mtk_foe_entry *entry, int vid)
317{
318 struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry);
319
320 switch (FIELD_GET(MTK_FOE_IB1_BIND_VLAN_LAYER, entry->ib1)) {
321 case 0:
322 entry->ib1 |= MTK_FOE_IB1_BIND_VLAN_TAG |
323 FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1);
324 l2->vlan1 = vid;
325 return 0;
326 case 1:
327 if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_TAG)) {
328 l2->vlan1 = vid;
329 l2->etype |= BIT(8);
330 } else {
331 l2->vlan2 = vid;
332 entry->ib1 += FIELD_PREP(MTK_FOE_IB1_BIND_VLAN_LAYER, 1);
333 }
334 return 0;
335 default:
336 return -ENOSPC;
337 }
338}
339
340int mtk_foe_entry_set_pppoe(struct mtk_foe_entry *entry, int sid)
341{
342 struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry);
343
344 if (!(entry->ib1 & MTK_FOE_IB1_BIND_VLAN_LAYER) ||
345 (entry->ib1 & MTK_FOE_IB1_BIND_VLAN_TAG))
346 l2->etype = ETH_P_PPP_SES;
347
348 entry->ib1 |= MTK_FOE_IB1_BIND_PPPOE;
349 l2->pppoe_id = sid;
350
351 return 0;
352}
353
354int mtk_foe_entry_set_wdma(struct mtk_foe_entry *entry, int wdma_idx, int txq,
355 int bss, int wcid)
356{
357 struct mtk_foe_mac_info *l2 = mtk_foe_entry_l2(entry);
358 u32 *ib2 = mtk_foe_entry_ib2(entry);
359
360 *ib2 &= ~MTK_FOE_IB2_PORT_MG;
361 *ib2 |= MTK_FOE_IB2_WDMA_WINFO;
362 if (wdma_idx)
363 *ib2 |= MTK_FOE_IB2_WDMA_DEVIDX;
364
365 l2->vlan2 = FIELD_PREP(MTK_FOE_VLAN2_WINFO_BSS, bss) |
366 FIELD_PREP(MTK_FOE_VLAN2_WINFO_WCID, wcid) |
367 FIELD_PREP(MTK_FOE_VLAN2_WINFO_RING, txq);
368
369 return 0;
370}
371
372static inline bool mtk_foe_entry_usable(struct mtk_foe_entry *entry)
373{
374 return !(entry->ib1 & MTK_FOE_IB1_STATIC) &&
375 FIELD_GET(MTK_FOE_IB1_STATE, entry->ib1) != MTK_FOE_STATE_BIND;
376}
377
378static bool
379mtk_flow_entry_match(struct mtk_flow_entry *entry, struct mtk_foe_entry *data)
380{
381 int type, len;
382
383 if ((data->ib1 ^ entry->data.ib1) & MTK_FOE_IB1_UDP)
384 return false;
385
386 type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->data.ib1);
387 if (type > MTK_PPE_PKT_TYPE_IPV4_DSLITE)
388 len = offsetof(struct mtk_foe_entry, ipv6._rsv);
389 else
390 len = offsetof(struct mtk_foe_entry, ipv4.ib2);
391
392 return !memcmp(&entry->data.data, &data->data, len - 4);
393}
394
395static void
396__mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
397{
398 struct hlist_head *head;
399 struct hlist_node *tmp;
400
401 if (entry->type == MTK_FLOW_TYPE_L2) {
402 rhashtable_remove_fast(&ppe->l2_flows, &entry->l2_node,
403 mtk_flow_l2_ht_params);
404
405 head = &entry->l2_flows;
406 hlist_for_each_entry_safe(entry, tmp, head, l2_data.list)
407 __mtk_foe_entry_clear(ppe, entry);
408 return;
409 }
410
411 hlist_del_init(&entry->list);
412 if (entry->hash != 0xffff) {
413 ppe->foe_table[entry->hash].ib1 &= ~MTK_FOE_IB1_STATE;
414 ppe->foe_table[entry->hash].ib1 |= FIELD_PREP(MTK_FOE_IB1_STATE,
415 MTK_FOE_STATE_BIND);
416 dma_wmb();
417 }
418 entry->hash = 0xffff;
419
420 if (entry->type != MTK_FLOW_TYPE_L2_SUBFLOW)
421 return;
422
423 hlist_del_init(&entry->l2_data.list);
424 kfree(entry);
425}
426
427static int __mtk_foe_entry_idle_time(struct mtk_ppe *ppe, u32 ib1)
428{
429 u16 timestamp;
430 u16 now;
431
432 now = mtk_eth_timestamp(ppe->eth) & MTK_FOE_IB1_BIND_TIMESTAMP;
433 timestamp = ib1 & MTK_FOE_IB1_BIND_TIMESTAMP;
434
435 if (timestamp > now)
436 return MTK_FOE_IB1_BIND_TIMESTAMP + 1 - timestamp + now;
437 else
438 return now - timestamp;
439}
440
441static void
442mtk_flow_entry_update_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
443{
444 struct mtk_flow_entry *cur;
445 struct mtk_foe_entry *hwe;
446 struct hlist_node *tmp;
447 int idle;
448
449 idle = __mtk_foe_entry_idle_time(ppe, entry->data.ib1);
450 hlist_for_each_entry_safe(cur, tmp, &entry->l2_flows, l2_data.list) {
451 int cur_idle;
452 u32 ib1;
453
454 hwe = &ppe->foe_table[cur->hash];
455 ib1 = READ_ONCE(hwe->ib1);
456
457 if (FIELD_GET(MTK_FOE_IB1_STATE, ib1) != MTK_FOE_STATE_BIND) {
458 cur->hash = 0xffff;
459 __mtk_foe_entry_clear(ppe, cur);
460 continue;
461 }
462
463 cur_idle = __mtk_foe_entry_idle_time(ppe, ib1);
464 if (cur_idle >= idle)
465 continue;
466
467 idle = cur_idle;
468 entry->data.ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP;
469 entry->data.ib1 |= hwe->ib1 & MTK_FOE_IB1_BIND_TIMESTAMP;
470 }
471}
472
473static void
474mtk_flow_entry_update(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
475{
476 struct mtk_foe_entry *hwe;
477 struct mtk_foe_entry foe;
478
479 spin_lock_bh(&ppe_lock);
480
481 if (entry->type == MTK_FLOW_TYPE_L2) {
482 mtk_flow_entry_update_l2(ppe, entry);
483 goto out;
484 }
485
486 if (entry->hash == 0xffff)
487 goto out;
488
489 hwe = &ppe->foe_table[entry->hash];
490 memcpy(&foe, hwe, sizeof(foe));
491 if (!mtk_flow_entry_match(entry, &foe)) {
492 entry->hash = 0xffff;
493 goto out;
494 }
495
496 entry->data.ib1 = foe.ib1;
497
498out:
499 spin_unlock_bh(&ppe_lock);
500}
501
502static void
503__mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_foe_entry *entry,
504 u16 hash)
505{
506 struct mtk_foe_entry *hwe;
507 u16 timestamp;
508
509 timestamp = mtk_eth_timestamp(ppe->eth);
510 timestamp &= MTK_FOE_IB1_BIND_TIMESTAMP;
511 entry->ib1 &= ~MTK_FOE_IB1_BIND_TIMESTAMP;
512 entry->ib1 |= FIELD_PREP(MTK_FOE_IB1_BIND_TIMESTAMP, timestamp);
513
514 hwe = &ppe->foe_table[hash];
515 memcpy(&hwe->data, &entry->data, sizeof(hwe->data));
516 wmb();
517 hwe->ib1 = entry->ib1;
518
519 dma_wmb();
520
521 mtk_ppe_cache_clear(ppe);
522}
523
524void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
525{
526 spin_lock_bh(&ppe_lock);
527 __mtk_foe_entry_clear(ppe, entry);
528 spin_unlock_bh(&ppe_lock);
529}
530
531static int
532mtk_foe_entry_commit_l2(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
533{
534 entry->type = MTK_FLOW_TYPE_L2;
535
536 return rhashtable_insert_fast(&ppe->l2_flows, &entry->l2_node,
537 mtk_flow_l2_ht_params);
538}
539
540int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
541{
542 int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->data.ib1);
543 u32 hash;
544
545 if (type == MTK_PPE_PKT_TYPE_BRIDGE)
546 return mtk_foe_entry_commit_l2(ppe, entry);
547
548 hash = mtk_ppe_hash_entry(&entry->data);
549 entry->hash = 0xffff;
550 spin_lock_bh(&ppe_lock);
551 hlist_add_head(&entry->list, &ppe->foe_flow[hash / 2]);
552 spin_unlock_bh(&ppe_lock);
553
554 return 0;
555}
556
557static void
558mtk_foe_entry_commit_subflow(struct mtk_ppe *ppe, struct mtk_flow_entry *entry,
559 u16 hash)
560{
561 struct mtk_flow_entry *flow_info;
562 struct mtk_foe_entry foe, *hwe;
563 struct mtk_foe_mac_info *l2;
564 u32 ib1_mask = MTK_FOE_IB1_PACKET_TYPE | MTK_FOE_IB1_UDP;
565 int type;
566
567 flow_info = kzalloc(offsetof(struct mtk_flow_entry, l2_data.end),
568 GFP_ATOMIC);
569 if (!flow_info)
570 return;
571
572 flow_info->l2_data.base_flow = entry;
573 flow_info->type = MTK_FLOW_TYPE_L2_SUBFLOW;
574 flow_info->hash = hash;
575 hlist_add_head(&flow_info->list, &ppe->foe_flow[hash / 2]);
576 hlist_add_head(&flow_info->l2_data.list, &entry->l2_flows);
577
578 hwe = &ppe->foe_table[hash];
579 memcpy(&foe, hwe, sizeof(foe));
580 foe.ib1 &= ib1_mask;
581 foe.ib1 |= entry->data.ib1 & ~ib1_mask;
582
583 l2 = mtk_foe_entry_l2(&foe);
584 memcpy(l2, &entry->data.bridge.l2, sizeof(*l2));
585
586 type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, foe.ib1);
587 if (type == MTK_PPE_PKT_TYPE_IPV4_HNAPT)
588 memcpy(&foe.ipv4.new, &foe.ipv4.orig, sizeof(foe.ipv4.new));
589 else if (type >= MTK_PPE_PKT_TYPE_IPV6_ROUTE_3T && l2->etype == ETH_P_IP)
590 l2->etype = ETH_P_IPV6;
591
592 *mtk_foe_entry_ib2(&foe) = entry->data.bridge.ib2;
593
594 __mtk_foe_entry_commit(ppe, &foe, hash);
595}
596
597void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash)
598{
599 struct hlist_head *head = &ppe->foe_flow[hash / 2];
600 struct mtk_foe_entry *hwe = &ppe->foe_table[hash];
601 struct mtk_flow_entry *entry;
602 struct mtk_foe_bridge key = {};
603 struct hlist_node *n;
604 struct ethhdr *eh;
605 bool found = false;
606 u8 *tag;
607
608 spin_lock_bh(&ppe_lock);
609
610 if (FIELD_GET(MTK_FOE_IB1_STATE, hwe->ib1) == MTK_FOE_STATE_BIND)
611 goto out;
612
613 hlist_for_each_entry_safe(entry, n, head, list) {
614 if (entry->type == MTK_FLOW_TYPE_L2_SUBFLOW) {
615 if (unlikely(FIELD_GET(MTK_FOE_IB1_STATE, hwe->ib1) ==
616 MTK_FOE_STATE_BIND))
617 continue;
618
619 entry->hash = 0xffff;
620 __mtk_foe_entry_clear(ppe, entry);
621 continue;
622 }
623
624 if (found || !mtk_flow_entry_match(entry, hwe)) {
625 if (entry->hash != 0xffff)
626 entry->hash = 0xffff;
627 continue;
628 }
629
630 entry->hash = hash;
631 __mtk_foe_entry_commit(ppe, &entry->data, hash);
632 found = true;
633 }
634
635 if (found)
636 goto out;
637
638 eh = eth_hdr(skb);
639 ether_addr_copy(key.dest_mac, eh->h_dest);
640 ether_addr_copy(key.src_mac, eh->h_source);
641 tag = skb->data - 2;
642 key.vlan = 0;
643 switch (skb->protocol) {
644#if IS_ENABLED(CONFIG_NET_DSA)
645 case htons(ETH_P_XDSA):
646 if (!netdev_uses_dsa(skb->dev) ||
647 skb->dev->dsa_ptr->tag_ops->proto != DSA_TAG_PROTO_MTK)
648 goto out;
649
650 tag += 4;
651 if (get_unaligned_be16(tag) != ETH_P_8021Q)
652 break;
653
654 fallthrough;
655#endif
656 case htons(ETH_P_8021Q):
657 key.vlan = get_unaligned_be16(tag + 2) & VLAN_VID_MASK;
658 break;
659 default:
660 break;
661 }
662
663 entry = rhashtable_lookup_fast(&ppe->l2_flows, &key, mtk_flow_l2_ht_params);
664 if (!entry)
665 goto out;
666
667 mtk_foe_entry_commit_subflow(ppe, entry, hash);
668
669out:
670 spin_unlock_bh(&ppe_lock);
671}
672
673int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
674{
675 mtk_flow_entry_update(ppe, entry);
676
677 return __mtk_foe_entry_idle_time(ppe, entry->data.ib1);
678}
679
680struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base,
681 int version)
682{
683 struct device *dev = eth->dev;
684 struct mtk_foe_entry *foe;
685 struct mtk_ppe *ppe;
686
687 ppe = devm_kzalloc(dev, sizeof(*ppe), GFP_KERNEL);
688 if (!ppe)
689 return NULL;
690
691 rhashtable_init(&ppe->l2_flows, &mtk_flow_l2_ht_params);
692
693 /* need to allocate a separate device, since it PPE DMA access is
694 * not coherent.
695 */
696 ppe->base = base;
697 ppe->eth = eth;
698 ppe->dev = dev;
699 ppe->version = version;
700
701 foe = dmam_alloc_coherent(ppe->dev, MTK_PPE_ENTRIES * sizeof(*foe),
702 &ppe->foe_phys, GFP_KERNEL);
703 if (!foe)
704 return NULL;
705
706 ppe->foe_table = foe;
707
708 mtk_ppe_debugfs_init(ppe);
709
710 return ppe;
711}
712
713static void mtk_ppe_init_foe_table(struct mtk_ppe *ppe)
714{
715 static const u8 skip[] = { 12, 25, 38, 51, 76, 89, 102 };
716 int i, k;
717
718 memset(ppe->foe_table, 0, MTK_PPE_ENTRIES * sizeof(*ppe->foe_table));
719
720 if (!IS_ENABLED(CONFIG_SOC_MT7621))
721 return;
722
723 /* skip all entries that cross the 1024 byte boundary */
724 for (i = 0; i < MTK_PPE_ENTRIES; i += 128)
725 for (k = 0; k < ARRAY_SIZE(skip); k++)
726 ppe->foe_table[i + skip[k]].ib1 |= MTK_FOE_IB1_STATIC;
727}
728
729int mtk_ppe_start(struct mtk_ppe *ppe)
730{
731 u32 val;
732
733 mtk_ppe_init_foe_table(ppe);
734 ppe_w32(ppe, MTK_PPE_TB_BASE, ppe->foe_phys);
735
736 val = MTK_PPE_TB_CFG_ENTRY_80B |
737 MTK_PPE_TB_CFG_AGE_NON_L4 |
738 MTK_PPE_TB_CFG_AGE_UNBIND |
739 MTK_PPE_TB_CFG_AGE_TCP |
740 MTK_PPE_TB_CFG_AGE_UDP |
741 MTK_PPE_TB_CFG_AGE_TCP_FIN |
742 FIELD_PREP(MTK_PPE_TB_CFG_SEARCH_MISS,
743 MTK_PPE_SEARCH_MISS_ACTION_FORWARD_BUILD) |
744 FIELD_PREP(MTK_PPE_TB_CFG_KEEPALIVE,
745 MTK_PPE_KEEPALIVE_DISABLE) |
746 FIELD_PREP(MTK_PPE_TB_CFG_HASH_MODE, 1) |
747 FIELD_PREP(MTK_PPE_TB_CFG_SCAN_MODE,
748 MTK_PPE_SCAN_MODE_KEEPALIVE_AGE) |
749 FIELD_PREP(MTK_PPE_TB_CFG_ENTRY_NUM,
750 MTK_PPE_ENTRIES_SHIFT);
751 ppe_w32(ppe, MTK_PPE_TB_CFG, val);
752
753 ppe_w32(ppe, MTK_PPE_IP_PROTO_CHK,
754 MTK_PPE_IP_PROTO_CHK_IPV4 | MTK_PPE_IP_PROTO_CHK_IPV6);
755
756 mtk_ppe_cache_enable(ppe, true);
757
758 val = MTK_PPE_FLOW_CFG_IP4_TCP_FRAG |
759 MTK_PPE_FLOW_CFG_IP4_UDP_FRAG |
760 MTK_PPE_FLOW_CFG_IP6_3T_ROUTE |
761 MTK_PPE_FLOW_CFG_IP6_5T_ROUTE |
762 MTK_PPE_FLOW_CFG_IP6_6RD |
763 MTK_PPE_FLOW_CFG_IP4_NAT |
764 MTK_PPE_FLOW_CFG_IP4_NAPT |
765 MTK_PPE_FLOW_CFG_IP4_DSLITE |
766 MTK_PPE_FLOW_CFG_IP4_NAT_FRAG;
767 ppe_w32(ppe, MTK_PPE_FLOW_CFG, val);
768
769 val = FIELD_PREP(MTK_PPE_UNBIND_AGE_MIN_PACKETS, 1000) |
770 FIELD_PREP(MTK_PPE_UNBIND_AGE_DELTA, 3);
771 ppe_w32(ppe, MTK_PPE_UNBIND_AGE, val);
772
773 val = FIELD_PREP(MTK_PPE_BIND_AGE0_DELTA_UDP, 12) |
774 FIELD_PREP(MTK_PPE_BIND_AGE0_DELTA_NON_L4, 1);
775 ppe_w32(ppe, MTK_PPE_BIND_AGE0, val);
776
777 val = FIELD_PREP(MTK_PPE_BIND_AGE1_DELTA_TCP_FIN, 1) |
778 FIELD_PREP(MTK_PPE_BIND_AGE1_DELTA_TCP, 7);
779 ppe_w32(ppe, MTK_PPE_BIND_AGE1, val);
780
781 val = MTK_PPE_BIND_LIMIT0_QUARTER | MTK_PPE_BIND_LIMIT0_HALF;
782 ppe_w32(ppe, MTK_PPE_BIND_LIMIT0, val);
783
784 val = MTK_PPE_BIND_LIMIT1_FULL |
785 FIELD_PREP(MTK_PPE_BIND_LIMIT1_NON_L4, 1);
786 ppe_w32(ppe, MTK_PPE_BIND_LIMIT1, val);
787
788 val = FIELD_PREP(MTK_PPE_BIND_RATE_BIND, 30) |
789 FIELD_PREP(MTK_PPE_BIND_RATE_PREBIND, 1);
790 ppe_w32(ppe, MTK_PPE_BIND_RATE, val);
791
792 /* enable PPE */
793 val = MTK_PPE_GLO_CFG_EN |
794 MTK_PPE_GLO_CFG_IP4_L4_CS_DROP |
795 MTK_PPE_GLO_CFG_IP4_CS_DROP |
796 MTK_PPE_GLO_CFG_FLOW_DROP_UPDATE;
797 ppe_w32(ppe, MTK_PPE_GLO_CFG, val);
798
799 ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT, 0);
800
801 return 0;
802}
803
804int mtk_ppe_stop(struct mtk_ppe *ppe)
805{
806 u32 val;
807 int i;
808
809 for (i = 0; i < MTK_PPE_ENTRIES; i++)
810 ppe->foe_table[i].ib1 = FIELD_PREP(MTK_FOE_IB1_STATE,
811 MTK_FOE_STATE_INVALID);
812
813 mtk_ppe_cache_enable(ppe, false);
814
815 /* disable offload engine */
816 ppe_clear(ppe, MTK_PPE_GLO_CFG, MTK_PPE_GLO_CFG_EN);
817 ppe_w32(ppe, MTK_PPE_FLOW_CFG, 0);
818
819 /* disable aging */
820 val = MTK_PPE_TB_CFG_AGE_NON_L4 |
821 MTK_PPE_TB_CFG_AGE_UNBIND |
822 MTK_PPE_TB_CFG_AGE_TCP |
823 MTK_PPE_TB_CFG_AGE_UDP |
824 MTK_PPE_TB_CFG_AGE_TCP_FIN;
825 ppe_clear(ppe, MTK_PPE_TB_CFG, val);
826
827 return mtk_ppe_wait_busy(ppe);
828}