 8f8d5decc9
			
		
	
	8f8d5decc9
	
	
	
		
			
			Removed because they are upstream:
generic/backport-5.15/704-15-v5.19-net-mtk_eth_soc-move-MAC_MCR-setting-to-mac_finish.patch
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.15.y&id=c5c0760adc260d55265c086b9efb350ea6dda38b
generic/pending-5.15/735-net-mediatek-mtk_eth_soc-release-MAC_MCR_FORCE_LINK-.patch
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.15.y&id=448cc8b5f743985f6d1d98aa4efb386fef4c3bf2
generic/pending-5.15/736-net-ethernet-mtk_eth_soc-fix-PPE-hanging-issue.patch
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.15.y&id=9fcadd125044007351905d40c405fadc2d3bb6d6
Add new configuration symbols for tegra target.
Tested-by: Stijn Segers <foss@volatilesystems.org>
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
(cherry picked from commit fb2c6e9d4d)
		
	
		
			
				
	
	
		
			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
 | |
| @@ -4146,6 +4146,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),
 | |
| @@ -4164,6 +4165,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),
 | |
| @@ -4181,6 +4183,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),
 | |
| @@ -4214,6 +4217,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
 | |
| @@ -967,6 +967,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.
 | |
| @@ -981,6 +982,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;
 | |
|  
 |