Re: [PATCHv2] dmaengine: at_hdmac: fix sparse '__iomem' cast warning in memset helpers

Frank Li <[email protected]>
Newsgroups org.kernel.vger.dmaengine,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel
Message-ID <an-EvmZ2BtoKW8kX@lizhi-Precision-Tower-5810>
On Fri, Jul 24, 2026 at 03:59:58PM -0700, Rosen Penev wrote:
> Both atc_prep_dma_memset() and atc_prep_dma_memset_sg() declare vaddr
> as 'void __iomem *' but assign the return of dma_pool_alloc(), which
> returns 'void *' (not iomem memory). This causes sparse to warn about
> a cast removing the __iomem address space at the dereference site.
>
> The struct field memset_vaddr is also typed as 'int *', which is
> neither the type returned by dma_pool_alloc() nor the type used for
> the actual writes.
>
> Fix by declaring vaddr as 'u32 *' in both functions and changing
> memset_vaddr in struct at_desc from 'int *' to 'u32 *'. This matches
> the actual usage and eliminates the need for the (u32 *) cast.
>
> Fixes: 5d8c5bea0da9 ("dmaengine: at_hdmac: add COMPILE_TEST support")
> Reported-by: kernel test robot <[email protected]>
> Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
> Assisted-by: opencode:big-pickle
> Signed-off-by: Rosen Penev <[email protected]>
> ---

Reviewed-by: Frank Li <[email protected]>

>  v2: remove extra cast
>  drivers/dma/at_hdmac.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
> index 7b6aa9bbc3c8..f24e64219fb5 100644
> --- a/drivers/dma/at_hdmac.c
> +++ b/drivers/dma/at_hdmac.c
> @@ -244,7 +244,7 @@ struct at_desc {
>  	/* Memset temporary buffer */
>  	bool				memset_buffer;
>  	dma_addr_t			memset_paddr;
> -	int				*memset_vaddr;
> +	u32				*memset_vaddr;
>  	struct atdma_sg			sg[] __counted_by(sglen);
>  };
>
> @@ -1097,7 +1097,7 @@ atc_prep_dma_memset(struct dma_chan *chan, dma_addr_t dest, int value,
>  	struct at_dma_chan	*atchan = to_at_dma_chan(chan);
>  	struct at_dma		*atdma = to_at_dma(chan->device);
>  	struct at_desc		*desc;
> -	void __iomem		*vaddr;
> +	u32			*vaddr;
>  	dma_addr_t		paddr;
>  	char			fill_pattern;
>  	int			ret;
> @@ -1126,10 +1126,10 @@ atc_prep_dma_memset(struct dma_chan *chan, dma_addr_t dest, int value,
>  	/* Only the first byte of value is to be used according to dmaengine */
>  	fill_pattern = (char)value;
>
> -	*(u32*)vaddr = (fill_pattern << 24) |
> -		       (fill_pattern << 16) |
> -		       (fill_pattern << 8) |
> -		       fill_pattern;
> +	*vaddr = (fill_pattern << 24) |
> +		 (fill_pattern << 16) |
> +		 (fill_pattern << 8) |
> +		  fill_pattern;
>
>  	desc = kzalloc_flex(*desc, sg, 1, GFP_ATOMIC);
>  	if (!desc)
> @@ -1168,7 +1168,7 @@ atc_prep_dma_memset_sg(struct dma_chan *chan,
>  	struct at_dma		*atdma = to_at_dma(chan->device);
>  	struct at_desc		*desc;
>  	struct scatterlist	*sg;
> -	void __iomem		*vaddr;
> +	u32			*vaddr;
>  	dma_addr_t		paddr;
>  	size_t			total_len = 0;
>  	int			i;
> @@ -1189,7 +1189,7 @@ atc_prep_dma_memset_sg(struct dma_chan *chan,
>  			__func__);
>  		return NULL;
>  	}
> -	*(u32*)vaddr = value;
> +	*vaddr = value;
>
>  	desc = kzalloc_flex(*desc, sg, sg_len, GFP_ATOMIC);
>  	if (!desc)
> --
> 2.55.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.