[PATCH v2 02/24] mtd: rawnand: sunxi_spl: fix pointer from integer without a cast

Andre Przywara andre.przywara at arm.com
Mon Jan 19 12:12:34 CET 2026


Hi,

On 28/10/2025 09:12, Richard Genoud wrote:
> Fix pointer from interget warning when compiling for ARM64
> 
> When compiling for arm64, we get this error:
> error: passing argument 2 of ‘__memcpy_fromio’ makes pointer from
> 			integer without a cast [-Wint-conversion]
> 
> Moreover the copy should be made with dedicated readl(), like for any
> register access on this peripheral, since they are 32bit wide.
> 
> So, instead of memcpy_fromio(), just use a readl() loop.
> Introduce nand_readlcpy() to implement this loop.
> 
> Fixes: 6ddbb1e936c7 ("spl: nand: sunxi: use PIO instead of DMA")
> Suggested-by: Andre Przywara <andre.przywara at arm.com>
> Signed-off-by: Richard Genoud <richard.genoud at bootlin.com>
> ---
>   drivers/mtd/nand/raw/sunxi_nand_spl.c | 14 +++++++++++++-
>   1 file changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/mtd/nand/raw/sunxi_nand_spl.c b/drivers/mtd/nand/raw/sunxi_nand_spl.c
> index 4f1e2d9a5775..a15f54573df2 100644
> --- a/drivers/mtd/nand/raw/sunxi_nand_spl.c
> +++ b/drivers/mtd/nand/raw/sunxi_nand_spl.c
> @@ -251,6 +251,17 @@ static int nand_change_column(u16 column)
>   
>   static const int ecc_bytes[] = {32, 46, 54, 60, 74, 88, 102, 110, 116};
>   
> +static void nand_readlcpy(u32 *dest, u32 * __iomem src, size_t len)
> +{
> +	if (len & 0x3)
> +		printf("length should be multiple of 4 (32bits access), data will be incomplete.\n");

This should not be a message printed on the console. There is only 
one(?) internal user, and the argument is a multiple of 512, if I see 
that correctly. So it's an internal error that wouldn't happen at all in 
the moment. It just blows up the code size, and isn't even very descriptive.

If you *really* want to check that, you could try to use something like 
builtin_constant_p, to create a compile-time error, or maybe use 
debug(). But I would suggest to drop it completely, as it would be 
pointless with the current code anyway.

The rest looks fine, thanks for adding that function.

Cheers,
Andre

> +	len >>= 2;
> +
> +	while (len--)
> +		*dest++ = readl(src++);
> +}
> +
>   static int nand_read_page(const struct nfc_config *conf, u32 offs,
>   			  void *dest, int len)
>   {
> @@ -310,7 +321,8 @@ static int nand_read_page(const struct nfc_config *conf, u32 offs,
>   			return 1;
>   
>   		/* Retrieve the data from SRAM */
> -		memcpy_fromio(data, SUNXI_NFC_BASE + NFC_RAM0_BASE,
> +		nand_readlcpy((u32 *)data,
> +			      (void *)(uintptr_t)SUNXI_NFC_BASE + NFC_RAM0_BASE,
>   			      conf->ecc_size);
>   
>   		/* Stop the ECC engine */



More information about the U-Boot mailing list