[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