| From 1282ae34823d550e4faefe3500a1957d33790321 Mon Sep 17 00:00:00 2001 |
| From: Bo-Cun Chen <bc-bocun.chen@mediatek.com> |
| Date: Tue, 13 Jun 2023 16:57:41 +0800 |
| Subject: [PATCH 02/17] 999-3004-mt7986-internal-changes |
| |
| --- |
| drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 ++ |
| drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 + |
| drivers/net/ethernet/mediatek/mtk_ppe.c | 3 +- |
| drivers/net/ethernet/mediatek/mtk_ppe.h | 2 +- |
| .../net/ethernet/mediatek/mtk_ppe_debugfs.c | 34 +++++++++++++------ |
| .../net/ethernet/mediatek/mtk_ppe_offload.c | 24 ++++++++++++- |
| 6 files changed, 52 insertions(+), 14 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
| index 527e269..0ffb90d 100755 |
| --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
| +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
| @@ -4872,6 +4872,8 @@ static int mtk_probe(struct platform_device *pdev) |
| err = mtk_eth_offload_init(eth); |
| if (err) |
| goto err_free_dev; |
| + |
| + mtk_ppe_debugfs_init(eth); |
| } |
| |
| for (i = 0; i < MTK_MAX_DEVS; i++) { |
| diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
| index 54790df..ec22dc5 100755 |
| --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
| +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
| @@ -1973,5 +1973,6 @@ int mtk_eth_offload_init(struct mtk_eth *eth); |
| int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type, |
| void *type_data); |
| void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev); |
| +int mtk_ppe_debugfs_init(struct mtk_eth *eth); |
| int mtk_rss_set_indr_tbl(struct mtk_eth *eth, int num); |
| #endif /* MTK_ETH_H */ |
| diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.c b/drivers/net/ethernet/mediatek/mtk_ppe.c |
| index de34366..b876411 100644 |
| --- a/drivers/net/ethernet/mediatek/mtk_ppe.c |
| +++ b/drivers/net/ethernet/mediatek/mtk_ppe.c |
| @@ -897,6 +897,7 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int index) |
| ppe->eth = eth; |
| ppe->dev = dev; |
| ppe->version = eth->soc->offload_version; |
| + ppe->id = index; |
| ppe->accounting = accounting; |
| |
| foe = dmam_alloc_coherent(ppe->dev, |
| @@ -930,8 +931,6 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int index) |
| ppe->acct_table = acct; |
| } |
| |
| - mtk_ppe_debugfs_init(ppe, index); |
| - |
| return ppe; |
| } |
| |
| diff --git a/drivers/net/ethernet/mediatek/mtk_ppe.h b/drivers/net/ethernet/mediatek/mtk_ppe.h |
| index 1fdfb93..fd7ece7 100644 |
| --- a/drivers/net/ethernet/mediatek/mtk_ppe.h |
| +++ b/drivers/net/ethernet/mediatek/mtk_ppe.h |
| @@ -307,6 +307,7 @@ struct mtk_ppe { |
| struct device *dev; |
| void __iomem *base; |
| int version; |
| + int id; |
| char dirname[5]; |
| bool accounting; |
| |
| @@ -377,7 +378,6 @@ int mtk_foe_entry_set_queue(struct mtk_eth *eth, struct mtk_foe_entry *entry, |
| unsigned int queue); |
| int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); |
| void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry); |
| -int mtk_ppe_debugfs_init(struct mtk_ppe *ppe, int index); |
| void mtk_foe_entry_get_stats(struct mtk_ppe *ppe, struct mtk_flow_entry *entry, |
| int *idle); |
| |
| diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c |
| index 322b8f4..747062a 100644 |
| --- a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c |
| +++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c |
| @@ -73,11 +73,13 @@ mtk_print_addr_info(struct seq_file *m, struct mtk_flow_addr_info *ai) |
| } |
| |
| static int |
| -mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind) |
| +mtk_ppe_debugfs_foe_show(struct seq_file *m, struct mtk_ppe *ppe, bool bind) |
| { |
| - struct mtk_ppe *ppe = m->private; |
| int i; |
| |
| + if (!ppe) |
| + return -ENOENT; |
| + |
| for (i = 0; i < MTK_PPE_ENTRIES; i++) { |
| struct mtk_foe_entry *entry = mtk_foe_get_entry(ppe, i); |
| struct mtk_foe_mac_info *l2; |
| @@ -125,6 +127,8 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind) |
| break; |
| } |
| |
| + seq_printf(m, " ppe=%d", ppe->id); |
| + |
| seq_printf(m, " orig="); |
| mtk_print_addr_info(m, &ai); |
| |
| @@ -169,13 +173,25 @@ mtk_ppe_debugfs_foe_show(struct seq_file *m, void *private, bool bind) |
| static int |
| mtk_ppe_debugfs_foe_show_all(struct seq_file *m, void *private) |
| { |
| - return mtk_ppe_debugfs_foe_show(m, private, false); |
| + struct mtk_eth *eth = m->private; |
| + int i; |
| + |
| + for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) |
| + mtk_ppe_debugfs_foe_show(m, eth->ppe[i], false); |
| + |
| + return 0; |
| } |
| |
| static int |
| mtk_ppe_debugfs_foe_show_bind(struct seq_file *m, void *private) |
| { |
| - return mtk_ppe_debugfs_foe_show(m, private, true); |
| + struct mtk_eth *eth = m->private; |
| + int i; |
| + |
| + for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) |
| + mtk_ppe_debugfs_foe_show(m, eth->ppe[i], true); |
| + |
| + return 0; |
| } |
| |
| static int |
| @@ -192,7 +208,7 @@ mtk_ppe_debugfs_foe_open_bind(struct inode *inode, struct file *file) |
| inode->i_private); |
| } |
| |
| -int mtk_ppe_debugfs_init(struct mtk_ppe *ppe, int index) |
| +int mtk_ppe_debugfs_init(struct mtk_eth *eth) |
| { |
| static const struct file_operations fops_all = { |
| .open = mtk_ppe_debugfs_foe_open_all, |
| @@ -208,14 +224,12 @@ int mtk_ppe_debugfs_init(struct mtk_ppe *ppe, int index) |
| }; |
| struct dentry *root; |
| |
| - snprintf(ppe->dirname, sizeof(ppe->dirname), "ppe%d", index); |
| - |
| - root = debugfs_create_dir(ppe->dirname, NULL); |
| + root = debugfs_create_dir("mtk_ppe", NULL); |
| if (!root) |
| return -ENOMEM; |
| |
| - debugfs_create_file("entries", S_IRUGO, root, ppe, &fops_all); |
| - debugfs_create_file("bind", S_IRUGO, root, ppe, &fops_bind); |
| + debugfs_create_file("entries", S_IRUGO, root, eth, &fops_all); |
| + debugfs_create_file("bind", S_IRUGO, root, eth, &fops_bind); |
| |
| return 0; |
| } |
| diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c |
| index afe3780..30d2b02 100644 |
| --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c |
| +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c |
| @@ -189,8 +189,10 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f, |
| struct flow_action_entry *act; |
| struct mtk_flow_data data = {}; |
| struct mtk_foe_entry foe; |
| - struct net_device *odev = NULL; |
| + struct net_device *idev = NULL, *odev = NULL; |
| struct mtk_flow_entry *entry; |
| + struct net_device_path_ctx ctx = {}; |
| + struct net_device_path path = {}; |
| int offload_type = 0; |
| int wed_index = -1; |
| u16 addr_type = 0; |
| @@ -205,6 +207,10 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f, |
| struct flow_match_meta match; |
| |
| flow_rule_match_meta(rule, &match); |
| + idev = __dev_get_by_index(&init_net, match.key->ingress_ifindex); |
| + |
| + if (!idev) |
| + pr_info("[%s] idev does not exist !\n", __func__); |
| } else { |
| return -EOPNOTSUPP; |
| } |
| @@ -394,6 +400,22 @@ mtk_flow_offload_replace(struct mtk_eth *eth, struct flow_cls_offload *f, |
| if (!entry) |
| return -ENOMEM; |
| |
| + if (idev && idev->netdev_ops->ndo_fill_receive_path) { |
| + u32 num_ppe; |
| + |
| + ctx.dev = idev; |
| + idev->netdev_ops->ndo_fill_receive_path(&ctx, &path); |
| + num_ppe = MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) ? 2 : 1; |
| + num_ppe = min_t(u32, ARRAY_SIZE(eth->ppe), num_ppe); |
| + ppe_index = path.mtk_wdma.wdma_idx; |
| + if (ppe_index >= num_ppe) { |
| + if (printk_ratelimit()) |
| + pr_info("[%s] PPE%d does not exist !\n", __func__, ppe_index); |
| + |
| + return -EINVAL; |
| + } |
| + } |
| + |
| entry->cookie = f->cookie; |
| memcpy(&entry->data, &foe, sizeof(entry->data)); |
| entry->ppe_index = ppe_index; |
| -- |
| 2.18.0 |
| |