blob: 9ac533a0f95385b25a56bf2fb9bd9bd8855c31a7 [file] [log] [blame]
developer47b4f912023-11-16 11:44:30 +08001From 9c849a6e5a246489c5c91565d4c89a32958cad29 Mon Sep 17 00:00:00 2001
2From: Bo-Cun Chen <bc-bocun.chen@mediatek.com>
3Date: Thu, 16 Nov 2023 11:21:53 +0800
4Subject: [PATCH] 999-3022-mediatek-ethernet-add-multiple-ppe-allocation
5
6---
7 arch/arm64/boot/dts/mediatek/mt7988.dtsi | 1 +
8 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 10 +++++++++-
9 drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 ++
10 drivers/net/ethernet/mediatek/mtk_ppe_offload.c | 10 ++++++++++
11 4 files changed, 22 insertions(+), 1 deletion(-)
12
13diff --git a/arch/arm64/boot/dts/mediatek/mt7988.dtsi b/arch/arm64/boot/dts/mediatek/mt7988.dtsi
14index 8d83f6b..d378a65 100644
15--- a/arch/arm64/boot/dts/mediatek/mt7988.dtsi
16+++ b/arch/arm64/boot/dts/mediatek/mt7988.dtsi
17@@ -950,6 +950,7 @@
18 mediatek,infracfg = <&topmisc>;
19 mediatek,toprgu = <&watchdog>;
20 mediatek,hwver = <&hwver>;
21+ mtketh-ppe-num = <3>;
22 #reset-cells = <1>;
23 #address-cells = <1>;
24 #size-cells = <0>;
25diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
26index de2eac4..55d05fd 100644
27--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
28+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
29@@ -3669,7 +3669,14 @@ static int mtk_open(struct net_device *dev)
30 SGMSYS_QPHY_PWR_STATE_CTRL, 0);
31
32 if (eth->soc->offload_version) {
33- gdm_config = MTK_GDMA_TO_PPE0;
34+#if defined(CONFIG_MEDIATEK_NETSYS_V2) || defined(CONFIG_MEDIATEK_NETSYS_V3)
35+ if (eth->ppe_num >= 3 && mac->id == 2)
36+ gdm_config = MTK_GDMA_TO_PPE2;
37+ else if (eth->ppe_num >=2 && mac->id == 1)
38+ gdm_config = MTK_GDMA_TO_PPE1;
39+ else
40+#endif
41+ gdm_config = MTK_GDMA_TO_PPE0;
42
43 for (i = 0; i < eth->ppe_num; i++)
44 mtk_ppe_start(eth->ppe[i]);
45@@ -4635,6 +4642,7 @@ static const struct net_device_ops mtk_netdev_ops = {
46 .ndo_poll_controller = mtk_poll_controller,
47 #endif
48 .ndo_setup_tc = mtk_eth_setup_tc,
49+ .ndo_fill_receive_path = mtk_eth_fill_receive_path,
50 };
51
52 static void mux_poll(struct work_struct *work)
53diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
54index 50024a2..e0dfc9d 100644
55--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
56+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
57@@ -2041,6 +2041,8 @@ int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
58 void *type_data);
59 int mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f,
60 struct mtk_eth *eth);
61+int mtk_eth_fill_receive_path(struct net_device_path_ctx *ctx,
62+ struct net_device_path *path);
63 void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev);
64 u32 mtk_rss_indr_table(struct mtk_rss_params *rss_params, int index);
65
66diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
67index eab9e9d..e5ff575 100644
68--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
69+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
70@@ -694,6 +694,16 @@ int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
71 }
72 }
73
74+int mtk_eth_fill_receive_path(struct net_device_path_ctx *ctx,
75+ struct net_device_path *path)
76+{
77+ struct mtk_mac *mac = netdev_priv(ctx->dev);
78+
79+ path->mtk_wdma.wdma_idx = mac->id;
80+
81+ return 0;
82+}
83+
84 int mtk_eth_offload_init(struct mtk_eth *eth, int id)
85 {
86 if (!eth->ppe[id] || !eth->ppe[id]->foe_table)
87--
882.18.0
89