AM3354: AM3354 U-Boot failed to boot from NAND and solution found

Part Number: AM3354

Tool/software:

The "spl_nand_read" function in "spl_nand.c" use nand_page_size() to get NAND page size, but it's not initialized in SPL.

https://git.ti.com/cgit/ti-u-boot/ti-u-boot/tree/common/spl/spl_nand.c#n62

static ulong spl_nand_read(struct spl_load_info *load, ulong offs, ulong size,
			   void *dst)
{
	int err;
	ulong sector;

	debug("%s: offs %lx, size %lx, dst %p\n",
	      __func__, offs, size, dst);

	sector = *(int *)load->priv;
	offs = sector + nand_spl_adjust_offset(sector, offs - sector);
	err = nand_spl_load_image(offs, size, dst);
	spl_set_bl_len(load, nand_page_size());
	if (err)
		return 0;

	return size;
}

The fix is set "mtd->writesize" to CONFIG_SYS_NAND_PAGE_SIZE in nand_init() from drivers/mtd/nand/raw/am335x_spl_bch.c,

so that nand_page_size() API works in SPL.

diff --git a/drivers/mtd/nand/raw/am335x_spl_bch.c b/drivers/mtd/nand/raw/am335x_spl_bch.c
index 4b50f351d35..cb10fb9ac49 100644
--- a/drivers/mtd/nand/raw/am335x_spl_bch.c
+++ b/drivers/mtd/nand/raw/am335x_spl_bch.c
@@ -209,6 +209,9 @@ void nand_init(void)
                (void  __iomem *)CFG_SYS_NAND_BASE;
        board_nand_init(&nand_chip);
 
+       // Ensure SPL knows the page size, so nand_page_size() works in SPL.
+       mtd->writesize = CONFIG_SYS_NAND_PAGE_SIZE;
+
        if (nand_chip.select_chip)
                nand_chip.select_chip(mtd, 0);