Hi, On 28/10/2025 09:12, Richard Genoud wrote:
Fix pointer from interget warning when compiling for ARM64When 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 <[email protected]> Signed-off-by: Richard Genoud <[email protected]> --- 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 */

