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);