blob: b9b8295bbecdac3e95bc3747074e56216a5e5d42 [file] [log] [blame]
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