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
>