From nobody Wed Oct 8 05:13:56 2025 Received: from pidgin.makrotopia.org (pidgin.makrotopia.org [185.142.180.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8324818BC3B; Wed, 2 Jul 2025 02:38:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.142.180.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751423886; cv=none; b=k0q5yKUi2HhiEkqTeUkCs7+HrMNbWpRfnawLSlL/mFVffDRYt8h/VLtcuRP6/CGYOiWitK9IQZJdYedItaox9GiMmDbqg7ttmfTpVn9KGcgeYsBQdFEnk1fD125RXc5//N2mzEEHsmQ1FOkhjzclfND5JPPvuboSRFdIW/GBjQI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751423886; c=relaxed/simple; bh=OGabr0my+JeImAbeYx3UeMMb3/osl2h1XS7BApWu55o=; h=Date:From:To:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=UucP+DKKAxK+5tZuSBGXlBhrKl6lZX3AMu/eeV/NAexbHKNrZBzFavHWpe5Bjh6qpZD6SC4bAomkKjRMpervPvcLYYZTKQZhKd1TNMU9kE265YYnTI4zF8hHdr6mSbA06ZEpEFh1b5TKrFOihi8aIGg2Si61wpZA2WSTfVgI2y8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=makrotopia.org; spf=pass smtp.mailfrom=makrotopia.org; arc=none smtp.client-ip=185.142.180.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=makrotopia.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=makrotopia.org Received: from local by pidgin.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.98.2) (envelope-from ) id 1uWnMF-000000005DT-05g0; Wed, 02 Jul 2025 02:37:59 +0000 Date: Wed, 2 Jul 2025 03:37:55 +0100 From: Daniel Golle To: Felix Fietkau , Frank Wunderlich , Eric Woudstra , Elad Yifee , Bo-Cun Chen , Sky Huang , Sean Wang , Lorenzo Bianconi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Matthias Brugger , AngeloGioacchino Del Regno , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: [PATCH net-next v4 1/3] net: ethernet: mtk_eth_soc: improve support for named interrupts Message-ID: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use platform_get_irq_byname_optional() to avoid outputting error messages when using legacy device trees which rely identifying interrupts only by index. Instead, output a warning notifying the user to update their device tree. Signed-off-by: Daniel Golle Reviewed-by: Andrew Lunn --- v4: unchanged v3: unchanged v2: unchanged drivers/net/ethernet/mediatek/mtk_eth_soc.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethe= rnet/mediatek/mtk_eth_soc.c index f8a907747db4..8f55069441f4 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c @@ -3341,17 +3341,22 @@ static int mtk_get_irqs(struct platform_device *pde= v, struct mtk_eth *eth) int i; =20 /* future SoCs beginning with MT7988 should use named IRQs in dts */ - eth->irq[MTK_FE_IRQ_TX] =3D platform_get_irq_byname(pdev, "fe1"); - eth->irq[MTK_FE_IRQ_RX] =3D platform_get_irq_byname(pdev, "fe2"); + eth->irq[MTK_FE_IRQ_TX] =3D platform_get_irq_byname_optional(pdev, "fe1"); + eth->irq[MTK_FE_IRQ_RX] =3D platform_get_irq_byname_optional(pdev, "fe2"); if (eth->irq[MTK_FE_IRQ_TX] >=3D 0 && eth->irq[MTK_FE_IRQ_RX] >=3D 0) return 0; =20 - /* only use legacy mode if platform_get_irq_byname returned -ENXIO */ + /* only use legacy mode if platform_get_irq_byname_optional returned -ENX= IO */ if (eth->irq[MTK_FE_IRQ_TX] !=3D -ENXIO) - return eth->irq[MTK_FE_IRQ_TX]; + return dev_err_probe(&pdev->dev, eth->irq[MTK_FE_IRQ_TX], + "Error requesting FE TX IRQ\n"); =20 if (eth->irq[MTK_FE_IRQ_RX] !=3D -ENXIO) - return eth->irq[MTK_FE_IRQ_RX]; + return dev_err_probe(&pdev->dev, eth->irq[MTK_FE_IRQ_RX], + "Error requesting FE RX IRQ\n"); + + if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT)) + dev_warn(&pdev->dev, "legacy DT: missing interrupt-names."); =20 /* legacy way: * On MTK_SHARED_INT SoCs (MT7621 + MT7628) the first IRQ is taken --=20 2.50.0 From nobody Wed Oct 8 05:13:56 2025 Received: from pidgin.makrotopia.org (pidgin.makrotopia.org [185.142.180.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 286DA18BC3B; Wed, 2 Jul 2025 02:38:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.142.180.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751423893; cv=none; b=U9Z0/dT6pJChELwpdb6WFN0pTKPIdMFHl814PsPxTgv1GvrDjY6H3fJmSsl8r9aQX8p4qt9sYoxX7pRqoYY0qu0cwnV+phljpPfIyfF7s/S8PSTofMz4W/7Q+Ku2Zthxui68QEXSa6x1MnM3I5LnRoeL95j7UAl7J2+yKfTmcOk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751423893; c=relaxed/simple; bh=b5P0OQ9XHcgt0t3xGFlcHNUeH0PqY6jaf5Zfz7gIa6Y=; h=Date:From:To:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=XBC5sNfupOMe5Qh45H/1yaN8g4HFJEWDv3Hm//n+dGDIcmjnCwHVrekNUYmqXvOHM+tpxJ7E439+h8Pi1Dj6c/A8pCRtM6UKelb41h9P7i9fmV9+D7EiPkhgZVR5k//F9phZ0CuYItbHrcn1btfu8kSjQjwpeYL1Y/mBDV/Xs2w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=makrotopia.org; spf=pass smtp.mailfrom=makrotopia.org; arc=none smtp.client-ip=185.142.180.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=makrotopia.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=makrotopia.org Received: from local by pidgin.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.98.2) (envelope-from ) id 1uWnMN-000000005Du-0d2R; Wed, 02 Jul 2025 02:38:07 +0000 Date: Wed, 2 Jul 2025 03:38:04 +0100 From: Daniel Golle To: Felix Fietkau , Frank Wunderlich , Eric Woudstra , Elad Yifee , Bo-Cun Chen , Sky Huang , Sean Wang , Lorenzo Bianconi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Matthias Brugger , AngeloGioacchino Del Regno , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: [PATCH net-next v4 2/3] net: ethernet: mtk_eth_soc: fix kernel-doc comment Message-ID: <748e7de848e45ecdc84fbb78e34e9e13b9aa4329.1751421358.git.daniel@makrotopia.org> References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Fix and add some missing field descriptions to kernel-doc comment of struct mtk_eth. Signed-off-by: Daniel Golle Reviewed-by: Andrew Lunn --- v4: unchanged v3: unchanged v2: unchanged drivers/net/ethernet/mediatek/mtk_eth_soc.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethe= rnet/mediatek/mtk_eth_soc.h index 9261c0e13b59..1ad9075a9b69 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h @@ -1243,8 +1243,9 @@ struct mtk_soc_data { /* struct mtk_eth - This is the main datasructure for holding the state * of the driver * @dev: The device pointer - * @dev: The device pointer used for dma mapping/alloc + * @dma_dev: The device pointer used for dma mapping/alloc * @base: The mapped register i/o base + * @sram_base: The mapped SRAM base * @page_lock: Make sure that register operations are atomic * @tx_irq__lock: Make sure that IRQ register operations are atomic * @rx_irq__lock: Make sure that IRQ register operations are atomic --=20 2.50.0 From nobody Wed Oct 8 05:13:56 2025 Received: from pidgin.makrotopia.org (pidgin.makrotopia.org [185.142.180.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D8C3519CD17; Wed, 2 Jul 2025 02:38:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.142.180.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751423904; cv=none; b=fBhFSTiBSMFnaeTzZHo/kQS6w+Fyr8xnafZ8umco/HNyMzFb3jVZNZ5bWmiNRetR2tNVoYLbqQudpa7gqejoLDZtsLFCTsFX4L+hqUR7OINuKcuiS5fFLQ9Ngzmn04vYPCKBv495z4ByUNef/G0aDlfZZNRlmGpTAg6d5XJw6Zw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751423904; c=relaxed/simple; bh=1U5MD2Vymrx8fgzETXLvIaRXvWJwGgofmPh2t3BCfV8=; h=Date:From:To:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=WZhTLrlYjP1enOt/92YwAuO2ZYPBuEn4kuzQ1nIh1X5bYx/bn+Uvkpqgvislec8hxHB63hQ22ho0XvcEip92/GJTrGtLCJ1M5/QiJsss97nICKOt80TRVRfcBlp2NVml3x1TgbeXySomZBDzyBATgsgti43ofk/FBtAzaqQp38A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=makrotopia.org; spf=pass smtp.mailfrom=makrotopia.org; arc=none smtp.client-ip=185.142.180.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=makrotopia.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=makrotopia.org Received: from local by pidgin.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.98.2) (envelope-from ) id 1uWnMY-000000005EK-0kW2; Wed, 02 Jul 2025 02:38:18 +0000 Date: Wed, 2 Jul 2025 03:38:15 +0100 From: Daniel Golle To: Felix Fietkau , Frank Wunderlich , Eric Woudstra , Elad Yifee , Bo-Cun Chen , Sky Huang , Sean Wang , Lorenzo Bianconi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Matthias Brugger , AngeloGioacchino Del Regno , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: [PATCH net-next v4 3/3] net: ethernet: mtk_eth_soc: use generic allocator for SRAM Message-ID: <88ae2a765ef809d36e153430bf60aac6ce81d6f1.1751421358.git.daniel@makrotopia.org> References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use a dedicated "mmio-sram" node and the generic allocator instead of open-coding SRAM allocation for DMA rings. Keep support for legacy device trees but notify the user via a warning to update, and let the ethernet driver create the gen_pool in this case. Co-developed-by: Frank Wunderlich Signed-off-by: Frank Wunderlich Signed-off-by: Daniel Golle --- v4: always use gen_pool allocator completely replacing the previous approach of hardcoded SRAM offsets added missing Kconfig change v3: fix resource leak on error in mtk_probe() v2: fix return type of mtk_dma_ring_alloc() in case of error drivers/net/ethernet/mediatek/Kconfig | 1 + drivers/net/ethernet/mediatek/mtk_eth_soc.c | 140 +++++++++++--------- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 10 +- 3 files changed, 84 insertions(+), 67 deletions(-) diff --git a/drivers/net/ethernet/mediatek/Kconfig b/drivers/net/ethernet/m= ediatek/Kconfig index 7bfd3f230ff5..2ba361f8ce7d 100644 --- a/drivers/net/ethernet/mediatek/Kconfig +++ b/drivers/net/ethernet/mediatek/Kconfig @@ -17,6 +17,7 @@ config NET_MEDIATEK_SOC select PINCTRL select PHYLINK select DIMLIB + select GENERIC_ALLOCATOR select PAGE_POOL select PAGE_POOL_STATS select PCS_MTK_LYNXI diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethe= rnet/mediatek/mtk_eth_soc.c index 8f55069441f4..6e2aa01aedbd 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c @@ -27,6 +27,7 @@ #include #include #include +#include =20 #include "mtk_eth_soc.h" #include "mtk_wed.h" @@ -1267,6 +1268,34 @@ static void *mtk_max_lro_buf_alloc(gfp_t gfp_mask) return (void *)data; } =20 +static void *mtk_dma_ring_alloc(struct mtk_eth *eth, size_t size, + dma_addr_t *dma_handle, bool use_sram) +{ + void *dma_ring; + + if (use_sram && eth->sram_pool) { + dma_ring =3D (void *)gen_pool_alloc(eth->sram_pool, size); + if (!dma_ring) + return dma_ring; + *dma_handle =3D gen_pool_virt_to_phys(eth->sram_pool, + (unsigned long)dma_ring); + } else { + dma_ring =3D dma_alloc_coherent(eth->dma_dev, size, dma_handle, + GFP_KERNEL); + } + + return dma_ring; +} + +static void mtk_dma_ring_free(struct mtk_eth *eth, size_t size, void *dma_= ring, + dma_addr_t dma_handle, bool in_sram) +{ + if (in_sram && eth->sram_pool) + gen_pool_free(eth->sram_pool, (unsigned long)dma_ring, size); + else + dma_free_coherent(eth->dma_dev, size, dma_ring, dma_handle); +} + /* the qdma core needs scratch memory to be setup */ static int mtk_init_fq_dma(struct mtk_eth *eth) { @@ -1276,13 +1305,8 @@ static int mtk_init_fq_dma(struct mtk_eth *eth) dma_addr_t dma_addr; int i, j, len; =20 - if (MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM)) - eth->scratch_ring =3D eth->sram_base; - else - eth->scratch_ring =3D dma_alloc_coherent(eth->dma_dev, - cnt * soc->tx.desc_size, - ð->phy_scratch_ring, - GFP_KERNEL); + eth->scratch_ring =3D mtk_dma_ring_alloc(eth, cnt * soc->tx.desc_size, + ð->phy_scratch_ring, true); =20 if (unlikely(!eth->scratch_ring)) return -ENOMEM; @@ -2620,14 +2644,7 @@ static int mtk_tx_alloc(struct mtk_eth *eth) if (!ring->buf) goto no_tx_mem; =20 - if (MTK_HAS_CAPS(soc->caps, MTK_SRAM)) { - ring->dma =3D eth->sram_base + soc->tx.fq_dma_size * sz; - ring->phys =3D eth->phy_scratch_ring + soc->tx.fq_dma_size * (dma_addr_t= )sz; - } else { - ring->dma =3D dma_alloc_coherent(eth->dma_dev, ring_size * sz, - &ring->phys, GFP_KERNEL); - } - + ring->dma =3D mtk_dma_ring_alloc(eth, ring_size * sz, &ring->phys, true); if (!ring->dma) goto no_tx_mem; =20 @@ -2726,10 +2743,10 @@ static void mtk_tx_clean(struct mtk_eth *eth) kfree(ring->buf); ring->buf =3D NULL; } - if (!MTK_HAS_CAPS(soc->caps, MTK_SRAM) && ring->dma) { - dma_free_coherent(eth->dma_dev, - ring->dma_size * soc->tx.desc_size, - ring->dma, ring->phys); + + if (ring->dma) { + mtk_dma_ring_free(eth, ring->dma_size * soc->tx.desc_size, + ring->dma, ring->phys, true); ring->dma =3D NULL; } =20 @@ -2788,20 +2805,8 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int rin= g_no, int rx_flag) ring->page_pool =3D pp; } =20 - if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM) || - rx_flag !=3D MTK_RX_FLAGS_NORMAL) { - ring->dma =3D dma_alloc_coherent(eth->dma_dev, - rx_dma_size * eth->soc->rx.desc_size, - &ring->phys, GFP_KERNEL); - } else { - struct mtk_tx_ring *tx_ring =3D ð->tx_ring; - - ring->dma =3D tx_ring->dma + tx_ring_size * - eth->soc->tx.desc_size * (ring_no + 1); - ring->phys =3D tx_ring->phys + tx_ring_size * - eth->soc->tx.desc_size * (ring_no + 1); - } - + ring->dma =3D mtk_dma_ring_alloc(eth, rx_dma_size * eth->soc->rx.desc_siz= e, + &ring->phys, rx_flag =3D=3D MTK_RX_FLAGS_NORMAL); if (!ring->dma) return -ENOMEM; =20 @@ -2916,10 +2921,9 @@ static void mtk_rx_clean(struct mtk_eth *eth, struct= mtk_rx_ring *ring, bool in_ ring->data =3D NULL; } =20 - if (!in_sram && ring->dma) { - dma_free_coherent(eth->dma_dev, - ring->dma_size * eth->soc->rx.desc_size, - ring->dma, ring->phys); + if (ring->dma) { + mtk_dma_ring_free(eth, ring->dma_size * eth->soc->rx.desc_size, + ring->dma, ring->phys, in_sram); ring->dma =3D NULL; } =20 @@ -3287,15 +3291,15 @@ static void mtk_dma_free(struct mtk_eth *eth) netdev_tx_reset_subqueue(eth->netdev[i], j); } =20 - if (!MTK_HAS_CAPS(soc->caps, MTK_SRAM) && eth->scratch_ring) { - dma_free_coherent(eth->dma_dev, - MTK_QDMA_RING_SIZE * soc->tx.desc_size, - eth->scratch_ring, eth->phy_scratch_ring); + if (eth->scratch_ring) { + mtk_dma_ring_free(eth, soc->tx.fq_dma_size * soc->tx.desc_size, + eth->scratch_ring, eth->phy_scratch_ring, true); eth->scratch_ring =3D NULL; eth->phy_scratch_ring =3D 0; } + mtk_tx_clean(eth); - mtk_rx_clean(eth, ð->rx_ring[0], MTK_HAS_CAPS(soc->caps, MTK_SRAM)); + mtk_rx_clean(eth, ð->rx_ring[0], true); mtk_rx_clean(eth, ð->rx_ring_qdma, false); =20 if (eth->hwlro) { @@ -5007,9 +5011,28 @@ static int mtk_sgmii_init(struct mtk_eth *eth) return 0; } =20 +static int mtk_setup_legacy_sram(struct mtk_eth *eth, struct resource *res) +{ + if (res->start + MTK_ETH_SRAM_OFFSET + MTK_ETH_NETSYS_V2_SRAM_SIZE - 1 > + res->end) + return -EINVAL; + + eth->sram_pool =3D devm_gen_pool_create(eth->dev, + const_ilog2(MTK_ETH_SRAM_GRANULARITY), + NUMA_NO_NODE, dev_name(eth->dev)); + + if (IS_ERR(eth->sram_pool)) + return PTR_ERR(eth->sram_pool); + + return gen_pool_add_virt(eth->sram_pool, + (unsigned long)eth->base + MTK_ETH_SRAM_OFFSET, + res->start + MTK_ETH_SRAM_OFFSET, + MTK_ETH_NETSYS_V2_SRAM_SIZE, NUMA_NO_NODE); +} + static int mtk_probe(struct platform_device *pdev) { - struct resource *res =3D NULL, *res_sram; + struct resource *res =3D NULL; struct device_node *mac_np; struct mtk_eth *eth; int err, i; @@ -5029,20 +5052,6 @@ static int mtk_probe(struct platform_device *pdev) if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) eth->ip_align =3D NET_IP_ALIGN; =20 - if (MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM)) { - /* SRAM is actual memory and supports transparent access just like DRAM. - * Hence we don't require __iomem being set and don't need to use access= or - * functions to read from or write to SRAM. - */ - if (mtk_is_netsys_v3_or_greater(eth)) { - eth->sram_base =3D (void __force *)devm_platform_ioremap_resource(pdev,= 1); - if (IS_ERR(eth->sram_base)) - return PTR_ERR(eth->sram_base); - } else { - eth->sram_base =3D (void __force *)eth->base + MTK_ETH_SRAM_OFFSET; - } - } - if (MTK_HAS_CAPS(eth->soc->caps, MTK_36BIT_DMA)) { err =3D dma_set_mask(&pdev->dev, DMA_BIT_MASK(36)); if (!err) @@ -5117,16 +5126,21 @@ static int mtk_probe(struct platform_device *pdev) err =3D -EINVAL; goto err_destroy_sgmii; } + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM)) { - if (mtk_is_netsys_v3_or_greater(eth)) { - res_sram =3D platform_get_resource(pdev, IORESOURCE_MEM, 1); - if (!res_sram) { + eth->sram_pool =3D of_gen_pool_get(pdev->dev.of_node, "sram", 0); + if (!eth->sram_pool) { + if (!mtk_is_netsys_v3_or_greater(eth)) { + err =3D mtk_setup_legacy_sram(eth, res); + if (err) + goto err_destroy_sgmii; + dev_warn(&pdev->dev, + "legacy DT: using hard-coded SRAM offset.\n"); + } else { + dev_err(&pdev->dev, "Could not get SRAM pool\n"); err =3D -EINVAL; goto err_destroy_sgmii; } - eth->phy_scratch_ring =3D res_sram->start; - } else { - eth->phy_scratch_ring =3D res->start + MTK_ETH_SRAM_OFFSET; } } } diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethe= rnet/mediatek/mtk_eth_soc.h index 1ad9075a9b69..0168e2fbc619 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h @@ -141,8 +141,10 @@ #define MTK_GDMA_MAC_ADRH(x) ({ typeof(x) _x =3D (x); (_x =3D=3D MTK_GMAC3= _ID) ? \ 0x54C : 0x50C + (_x * 0x1000); }) =20 -/* Internal SRAM offset */ -#define MTK_ETH_SRAM_OFFSET 0x40000 +/* legacy DT support for internal SRAM */ +#define MTK_ETH_SRAM_OFFSET 0x40000 +#define MTK_ETH_SRAM_GRANULARITY 32 +#define MTK_ETH_NETSYS_V2_SRAM_SIZE 0x40000 =20 /* FE global misc reg*/ #define MTK_FE_GLO_MISC 0x124 @@ -1245,7 +1247,7 @@ struct mtk_soc_data { * @dev: The device pointer * @dma_dev: The device pointer used for dma mapping/alloc * @base: The mapped register i/o base - * @sram_base: The mapped SRAM base + * @sram_pool: Pointer to SRAM pool used for DMA descriptor rings * @page_lock: Make sure that register operations are atomic * @tx_irq__lock: Make sure that IRQ register operations are atomic * @rx_irq__lock: Make sure that IRQ register operations are atomic @@ -1291,7 +1293,7 @@ struct mtk_eth { struct device *dev; struct device *dma_dev; void __iomem *base; - void *sram_base; + struct gen_pool *sram_pool; spinlock_t page_lock; spinlock_t tx_irq_lock; spinlock_t rx_irq_lock; --=20 2.50.0