Pick patches with several fixes and improvements, preparation for upcoming WED (TX) [1] as well as basic XDP support [2] with MediaTek's Filogic SoCs to the mtk_eth_soc driver. Also pick follow-up patch fixing Ethernet on MT7621 [3]. Tested on Bananapi BPi-R3 (MT7986), Bananapi BPi-R64 (MT7622), Bananapi BPi-R2 (MT7623), MikroTik RouterBoard M11G (MT7621). [1]: https://patchwork.kernel.org/project/netdevbpf/list/?series=662108&state=* [2]: https://patchwork.kernel.org/project/netdevbpf/list/?series=675368&state=* (the first part of the series adding wed nodes to mt7986a.dtsi was applied to the copy of mt7986a.dtsi in our tree) [3]: https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/commit/?id=5e69163d3b9931098922b3fc2f8e786af8c1f37e Signed-off-by: Daniel Golle <daniel@makrotopia.org>
		
			
				
	
	
		
			200 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From patchwork Thu Sep  8 19:33:38 2022
 | 
						|
Content-Type: text/plain; charset="utf-8"
 | 
						|
MIME-Version: 1.0
 | 
						|
Content-Transfer-Encoding: 7bit
 | 
						|
X-Patchwork-Submitter: Lorenzo Bianconi <lorenzo@kernel.org>
 | 
						|
X-Patchwork-Id: 12970557
 | 
						|
X-Patchwork-Delegate: kuba@kernel.org
 | 
						|
From: Lorenzo Bianconi <lorenzo@kernel.org>
 | 
						|
To: netdev@vger.kernel.org
 | 
						|
Cc: nbd@nbd.name, john@phrozen.org, sean.wang@mediatek.com,
 | 
						|
        Mark-MC.Lee@mediatek.com, davem@davemloft.net, edumazet@google.com,
 | 
						|
        kuba@kernel.org, pabeni@redhat.com, matthias.bgg@gmail.com,
 | 
						|
        linux-mediatek@lists.infradead.org, lorenzo.bianconi@redhat.com,
 | 
						|
        Bo.Jiao@mediatek.com, sujuan.chen@mediatek.com,
 | 
						|
        ryder.Lee@mediatek.com, evelyn.tsai@mediatek.com,
 | 
						|
        devicetree@vger.kernel.org, robh@kernel.org
 | 
						|
Subject: [PATCH net-next 04/12] net: ethernet: mtk_eth_soc: move ppe table
 | 
						|
 hash offset to mtk_soc_data structure
 | 
						|
Date: Thu,  8 Sep 2022 21:33:38 +0200
 | 
						|
Message-Id: 
 | 
						|
 <cc263ffeaa3e1d7314e36a4f941e96d38e41a6bf.1662661555.git.lorenzo@kernel.org>
 | 
						|
X-Mailer: git-send-email 2.37.3
 | 
						|
In-Reply-To: <cover.1662661555.git.lorenzo@kernel.org>
 | 
						|
References: <cover.1662661555.git.lorenzo@kernel.org>
 | 
						|
MIME-Version: 1.0
 | 
						|
Precedence: bulk
 | 
						|
List-ID: <netdev.vger.kernel.org>
 | 
						|
X-Mailing-List: netdev@vger.kernel.org
 | 
						|
X-Patchwork-Delegate: kuba@kernel.org
 | 
						|
 | 
						|
This is a preliminary patch to introduce mt7986 hw packet engine.
 | 
						|
 | 
						|
Co-developed-by: Bo Jiao <Bo.Jiao@mediatek.com>
 | 
						|
Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
 | 
						|
Co-developed-by: Sujuan Chen <sujuan.chen@mediatek.com>
 | 
						|
Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
 | 
						|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
 | 
						|
---
 | 
						|
 drivers/net/ethernet/mediatek/mtk_eth_soc.c |  4 ++++
 | 
						|
 drivers/net/ethernet/mediatek/mtk_eth_soc.h |  2 ++
 | 
						|
 drivers/net/ethernet/mediatek/mtk_ppe.c     | 24 +++++++++++++++------
 | 
						|
 drivers/net/ethernet/mediatek/mtk_ppe.h     |  2 +-
 | 
						|
 4 files changed, 25 insertions(+), 7 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | 
						|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | 
						|
@@ -4150,6 +4150,7 @@ static const struct mtk_soc_data mt7621_
 | 
						|
 	.required_clks = MT7621_CLKS_BITMAP,
 | 
						|
 	.required_pctl = false,
 | 
						|
 	.offload_version = 2,
 | 
						|
+	.hash_offset = 2,
 | 
						|
 	.txrx = {
 | 
						|
 		.txd_size = sizeof(struct mtk_tx_dma),
 | 
						|
 		.rxd_size = sizeof(struct mtk_rx_dma),
 | 
						|
@@ -4168,6 +4169,7 @@ static const struct mtk_soc_data mt7622_
 | 
						|
 	.required_clks = MT7622_CLKS_BITMAP,
 | 
						|
 	.required_pctl = false,
 | 
						|
 	.offload_version = 2,
 | 
						|
+	.hash_offset = 2,
 | 
						|
 	.txrx = {
 | 
						|
 		.txd_size = sizeof(struct mtk_tx_dma),
 | 
						|
 		.rxd_size = sizeof(struct mtk_rx_dma),
 | 
						|
@@ -4185,6 +4187,7 @@ static const struct mtk_soc_data mt7623_
 | 
						|
 	.required_clks = MT7623_CLKS_BITMAP,
 | 
						|
 	.required_pctl = true,
 | 
						|
 	.offload_version = 2,
 | 
						|
+	.hash_offset = 2,
 | 
						|
 	.txrx = {
 | 
						|
 		.txd_size = sizeof(struct mtk_tx_dma),
 | 
						|
 		.rxd_size = sizeof(struct mtk_rx_dma),
 | 
						|
@@ -4218,6 +4221,7 @@ static const struct mtk_soc_data mt7986_
 | 
						|
 	.caps = MT7986_CAPS,
 | 
						|
 	.required_clks = MT7986_CLKS_BITMAP,
 | 
						|
 	.required_pctl = false,
 | 
						|
+	.hash_offset = 4,
 | 
						|
 	.txrx = {
 | 
						|
 		.txd_size = sizeof(struct mtk_tx_dma_v2),
 | 
						|
 		.rxd_size = sizeof(struct mtk_rx_dma_v2),
 | 
						|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 | 
						|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 | 
						|
@@ -966,6 +966,7 @@ struct mtk_reg_map {
 | 
						|
  *				the target SoC
 | 
						|
  * @required_pctl		A bool value to show whether the SoC requires
 | 
						|
  *				the extra setup for those pins used by GMAC.
 | 
						|
+ * @hash_offset			Flow table hash offset.
 | 
						|
  * @txd_size			Tx DMA descriptor size.
 | 
						|
  * @rxd_size			Rx DMA descriptor size.
 | 
						|
  * @rx_irq_done_mask		Rx irq done register mask.
 | 
						|
@@ -980,6 +981,7 @@ struct mtk_soc_data {
 | 
						|
 	u32		required_clks;
 | 
						|
 	bool		required_pctl;
 | 
						|
 	u8		offload_version;
 | 
						|
+	u8		hash_offset;
 | 
						|
 	netdev_features_t hw_features;
 | 
						|
 	struct {
 | 
						|
 		u32	txd_size;
 | 
						|
--- a/drivers/net/ethernet/mediatek/mtk_ppe.c
 | 
						|
+++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
 | 
						|
@@ -88,7 +88,7 @@ static void mtk_ppe_cache_enable(struct
 | 
						|
 		enable * MTK_PPE_CACHE_CTL_EN);
 | 
						|
 }
 | 
						|
 
 | 
						|
-static u32 mtk_ppe_hash_entry(struct mtk_foe_entry *e)
 | 
						|
+static u32 mtk_ppe_hash_entry(struct mtk_eth *eth, struct mtk_foe_entry *e)
 | 
						|
 {
 | 
						|
 	u32 hv1, hv2, hv3;
 | 
						|
 	u32 hash;
 | 
						|
@@ -122,7 +122,7 @@ static u32 mtk_ppe_hash_entry(struct mtk
 | 
						|
 	hash = (hash >> 24) | ((hash & 0xffffff) << 8);
 | 
						|
 	hash ^= hv1 ^ hv2 ^ hv3;
 | 
						|
 	hash ^= hash >> 16;
 | 
						|
-	hash <<= 1;
 | 
						|
+	hash <<= (ffs(eth->soc->hash_offset) - 1);
 | 
						|
 	hash &= MTK_PPE_ENTRIES - 1;
 | 
						|
 
 | 
						|
 	return hash;
 | 
						|
@@ -540,15 +540,16 @@ mtk_foe_entry_commit_l2(struct mtk_ppe *
 | 
						|
 int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry)
 | 
						|
 {
 | 
						|
 	int type = FIELD_GET(MTK_FOE_IB1_PACKET_TYPE, entry->data.ib1);
 | 
						|
+	const struct mtk_soc_data *soc = ppe->eth->soc;
 | 
						|
 	u32 hash;
 | 
						|
 
 | 
						|
 	if (type == MTK_PPE_PKT_TYPE_BRIDGE)
 | 
						|
 		return mtk_foe_entry_commit_l2(ppe, entry);
 | 
						|
 
 | 
						|
-	hash = mtk_ppe_hash_entry(&entry->data);
 | 
						|
+	hash = mtk_ppe_hash_entry(ppe->eth, &entry->data);
 | 
						|
 	entry->hash = 0xffff;
 | 
						|
 	spin_lock_bh(&ppe_lock);
 | 
						|
-	hlist_add_head(&entry->list, &ppe->foe_flow[hash / 2]);
 | 
						|
+	hlist_add_head(&entry->list, &ppe->foe_flow[hash / soc->hash_offset]);
 | 
						|
 	spin_unlock_bh(&ppe_lock);
 | 
						|
 
 | 
						|
 	return 0;
 | 
						|
@@ -558,6 +559,7 @@ static void
 | 
						|
 mtk_foe_entry_commit_subflow(struct mtk_ppe *ppe, struct mtk_flow_entry *entry,
 | 
						|
 			     u16 hash)
 | 
						|
 {
 | 
						|
+	const struct mtk_soc_data *soc = ppe->eth->soc;
 | 
						|
 	struct mtk_flow_entry *flow_info;
 | 
						|
 	struct mtk_foe_entry foe, *hwe;
 | 
						|
 	struct mtk_foe_mac_info *l2;
 | 
						|
@@ -572,7 +574,8 @@ mtk_foe_entry_commit_subflow(struct mtk_
 | 
						|
 	flow_info->l2_data.base_flow = entry;
 | 
						|
 	flow_info->type = MTK_FLOW_TYPE_L2_SUBFLOW;
 | 
						|
 	flow_info->hash = hash;
 | 
						|
-	hlist_add_head(&flow_info->list, &ppe->foe_flow[hash / 2]);
 | 
						|
+	hlist_add_head(&flow_info->list,
 | 
						|
+		       &ppe->foe_flow[hash / soc->hash_offset]);
 | 
						|
 	hlist_add_head(&flow_info->l2_data.list, &entry->l2_flows);
 | 
						|
 
 | 
						|
 	hwe = &ppe->foe_table[hash];
 | 
						|
@@ -596,7 +599,8 @@ mtk_foe_entry_commit_subflow(struct mtk_
 | 
						|
 
 | 
						|
 void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash)
 | 
						|
 {
 | 
						|
-	struct hlist_head *head = &ppe->foe_flow[hash / 2];
 | 
						|
+	const struct mtk_soc_data *soc = ppe->eth->soc;
 | 
						|
+	struct hlist_head *head = &ppe->foe_flow[hash / soc->hash_offset];
 | 
						|
 	struct mtk_foe_entry *hwe = &ppe->foe_table[hash];
 | 
						|
 	struct mtk_flow_entry *entry;
 | 
						|
 	struct mtk_foe_bridge key = {};
 | 
						|
@@ -680,9 +684,11 @@ int mtk_foe_entry_idle_time(struct mtk_p
 | 
						|
 struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base,
 | 
						|
 		 int version)
 | 
						|
 {
 | 
						|
+	const struct mtk_soc_data *soc = eth->soc;
 | 
						|
 	struct device *dev = eth->dev;
 | 
						|
 	struct mtk_foe_entry *foe;
 | 
						|
 	struct mtk_ppe *ppe;
 | 
						|
+	u32 foe_flow_size;
 | 
						|
 
 | 
						|
 	ppe = devm_kzalloc(dev, sizeof(*ppe), GFP_KERNEL);
 | 
						|
 	if (!ppe)
 | 
						|
@@ -705,6 +711,12 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_
 | 
						|
 
 | 
						|
 	ppe->foe_table = foe;
 | 
						|
 
 | 
						|
+	foe_flow_size = (MTK_PPE_ENTRIES / soc->hash_offset) *
 | 
						|
+			sizeof(*ppe->foe_flow);
 | 
						|
+	ppe->foe_flow = devm_kzalloc(dev, foe_flow_size, GFP_KERNEL);
 | 
						|
+	if (!ppe->foe_flow)
 | 
						|
+		return NULL;
 | 
						|
+
 | 
						|
 	mtk_ppe_debugfs_init(ppe);
 | 
						|
 
 | 
						|
 	return ppe;
 | 
						|
--- a/drivers/net/ethernet/mediatek/mtk_ppe.h
 | 
						|
+++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
 | 
						|
@@ -270,7 +270,7 @@ struct mtk_ppe {
 | 
						|
 	dma_addr_t foe_phys;
 | 
						|
 
 | 
						|
 	u16 foe_check_time[MTK_PPE_ENTRIES];
 | 
						|
-	struct hlist_head foe_flow[MTK_PPE_ENTRIES / 2];
 | 
						|
+	struct hlist_head *foe_flow;
 | 
						|
 
 | 
						|
 	struct rhashtable l2_flows;
 | 
						|
 
 |