[PATCH net-next v2 2/2] net: airoha: Add the capability to allocate hw buffers in SRAM
Simon Horman
horms at kernel.org
Mon May 12 06:33:42 PDT 2025
On Fri, May 09, 2025 at 04:51:34PM +0200, Lorenzo Bianconi wrote:
> In order to improve packet processing and packet forwarding
> performances, EN7581 SoC supports allocating buffers for hw forwarding
> queues in SRAM instead of DRAM if available on the system.
> Rely on SRAM for buffers allocation if available on the system and use
> DRAM as fallback.
>
> Signed-off-by: Lorenzo Bianconi <lorenzo at kernel.org>
Reviewed-by: Simon Horman <horms at kernel.org>
> ---
> drivers/net/ethernet/airoha/airoha_eth.c | 57 +++++++++++++++++++++++++++-----
> 1 file changed, 48 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/ethernet/airoha/airoha_eth.c b/drivers/net/ethernet/airoha/airoha_eth.c
...
> @@ -1088,12 +1091,45 @@ static int airoha_qdma_init_hfwd_queues(struct airoha_qdma *qdma)
>
> airoha_qdma_wr(qdma, REG_FWD_DSCP_BASE, dma_addr);
>
> - size = AIROHA_MAX_PACKET_SIZE * HW_DSCP_NUM;
> - qdma->hfwd.q = dmam_alloc_coherent(eth->dev, size, &dma_addr,
> - GFP_KERNEL);
> - if (!qdma->hfwd.q)
> + name = devm_kasprintf(eth->dev, GFP_KERNEL, "qdma%d-buf", id);
> + if (!name)
> return -ENOMEM;
>
> + index = of_property_match_string(eth->dev->of_node,
> + "memory-region-names", name);
> + if (index >= 0) { /* buffers in sram */
> + struct reserved_mem *rmem;
> + struct device_node *np;
> + void *q;
> +
> + np = of_parse_phandle(eth->dev->of_node, "memory-region",
> + index);
> + if (!np)
> + return -ENODEV;
> +
> + rmem = of_reserved_mem_lookup(np);
> + of_node_put(np);
> +
> + /* SRAM is actual memory and supports transparent access just
> + * like DRAM. Hence we don't require __iomem being set and
> + * we don't need to use accessor routines to read from or write
> + * to SRAM.
> + */
Thanks for this comment. IMHO It is really useful.
> + q = (void __force *)devm_ioremap(eth->dev, rmem->base,
> + rmem->size);
> + if (!q)
> + return -ENOMEM;
> +
> + qdma->hfwd.q = q;
> + dma_addr = rmem->base;
> + } else {
> + size = AIROHA_MAX_PACKET_SIZE * HW_DSCP_NUM;
> + qdma->hfwd.q = dmam_alloc_coherent(eth->dev, size, &dma_addr,
> + GFP_KERNEL);
> + if (!qdma->hfwd.q)
> + return -ENOMEM;
> + }
> +
> airoha_qdma_wr(qdma, REG_FWD_BUF_BASE, dma_addr);
>
> airoha_qdma_rmw(qdma, REG_HW_FWD_DSCP_CFG,
...
More information about the Linux-mediatek
mailing list