| From e917fdd9042787edd43e4070c3480baf0dfb8d33 Mon Sep 17 00:00:00 2001 |
| From: Bo-Cun Chen <bc-bocun.chen@mediatek.com> |
| Date: Mon, 18 Mar 2024 16:57:13 +0800 |
| Subject: [PATCH 22/24] |
| 999-3022-mediatek-ethernet-add-multiple-ppe-allocatiion.patch |
| |
| --- |
| arch/arm64/boot/dts/mediatek/mt7988.dtsi | 1 + |
| drivers/net/ethernet/mediatek/mtk_eth_soc.c | 22 ++++++++++++++++--- |
| drivers/net/ethernet/mediatek/mtk_eth_soc.h | 3 +++ |
| .../net/ethernet/mediatek/mtk_ppe_offload.c | 10 +++++++++ |
| 4 files changed, 33 insertions(+), 3 deletions(-) |
| |
| diff --git a/arch/arm64/boot/dts/mediatek/mt7988.dtsi b/arch/arm64/boot/dts/mediatek/mt7988.dtsi |
| index 4a1a446..57b27f8 100644 |
| --- a/arch/arm64/boot/dts/mediatek/mt7988.dtsi |
| +++ b/arch/arm64/boot/dts/mediatek/mt7988.dtsi |
| @@ -942,6 +942,7 @@ |
| mediatek,infracfg = <&topmisc>; |
| mediatek,toprgu = <&watchdog>; |
| mediatek,hwver = <&hwver>; |
| + mtketh-ppe-num = <3>; |
| #reset-cells = <1>; |
| #address-cells = <1>; |
| #size-cells = <0>; |
| diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
| index 291afdc..c0f4ade 100644 |
| --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
| +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
| @@ -2349,6 +2349,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, |
| u8 *data, *new_data; |
| struct mtk_rx_dma_v2 *rxd, trxd; |
| int done = 0; |
| + int i; |
| |
| if (unlikely(!ring)) |
| goto rx_done; |
| @@ -2463,8 +2464,10 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, |
| } |
| #endif |
| |
| - if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) |
| - mtk_ppe_check_skb(eth->ppe[0], skb, hash); |
| + if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED) { |
| + i = eth->mac[mac]->ppe_idx; |
| + mtk_ppe_check_skb(eth->ppe[i], skb, hash); |
| + } |
| |
| if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) { |
| if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_RX_V2)) { |
| @@ -4113,7 +4116,19 @@ static int mtk_open(struct net_device *dev) |
| SGMSYS_QPHY_PWR_STATE_CTRL, 0); |
| |
| if (eth->soc->offload_version) { |
| - gdm_config = MTK_GDMA_TO_PPE0; |
| +#if defined(CONFIG_MEDIATEK_NETSYS_V2) || defined(CONFIG_MEDIATEK_NETSYS_V3) |
| + if (eth->ppe_num >= 3 && mac->id == 2) { |
| + mac->ppe_idx = 2; |
| + gdm_config = MTK_GDMA_TO_PPE2; |
| + } else if (eth->ppe_num >= 2 && mac->id == 1) { |
| + mac->ppe_idx = 1; |
| + gdm_config = MTK_GDMA_TO_PPE1; |
| + } else |
| +#endif |
| + { |
| + mac->ppe_idx = 0; |
| + gdm_config = MTK_GDMA_TO_PPE0; |
| + } |
| |
| for (i = 0; i < eth->ppe_num; i++) |
| mtk_ppe_start(eth->ppe[i]); |
| @@ -5129,6 +5144,7 @@ static const struct net_device_ops mtk_netdev_ops = { |
| .ndo_poll_controller = mtk_poll_controller, |
| #endif |
| .ndo_setup_tc = mtk_eth_setup_tc, |
| + .ndo_fill_receive_path = mtk_eth_fill_receive_path, |
| }; |
| |
| static void mux_poll(struct work_struct *work) |
| diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
| index 8454361..d958aec 100644 |
| --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
| +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
| @@ -1978,6 +1978,7 @@ struct mtk_mac { |
| phy_interface_t interface; |
| unsigned int mode; |
| unsigned int type; |
| + unsigned int ppe_idx; |
| int speed; |
| struct device_node *of_node; |
| struct phylink *phylink; |
| @@ -2079,6 +2080,8 @@ int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type, |
| void *type_data); |
| int mtk_eth_setup_tc_block(struct net_device *dev, struct flow_block_offload *f, |
| struct mtk_eth *eth); |
| +int mtk_eth_fill_receive_path(struct net_device_path_ctx *ctx, |
| + struct net_device_path *path); |
| void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev); |
| u32 mtk_rss_indr_table(struct mtk_rss_params *rss_params, int index); |
| |
| diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c |
| index 402f1e3..3bfbec8 100644 |
| --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c |
| +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c |
| @@ -828,6 +828,16 @@ int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type, |
| } |
| } |
| |
| +int mtk_eth_fill_receive_path(struct net_device_path_ctx *ctx, |
| + struct net_device_path *path) |
| +{ |
| + struct mtk_mac *mac = netdev_priv(ctx->dev); |
| + |
| + path->mtk_wdma.wdma_idx = mac->ppe_idx; |
| + |
| + return 0; |
| +} |
| + |
| int mtk_eth_offload_init(struct mtk_eth *eth, int id) |
| { |
| if (!eth->ppe[id] || !eth->ppe[id]->foe_table) |
| -- |
| 2.18.0 |
| |