+ NFC_CTL_PAGE_SIZE(page_size));
+
+ for ( ;dest < end; dest += ecc_page_size, offs += ecc_page_size) {
+ if (nand_read_page(page_size, ecc_strength, ecc_page_size,
+ addr_cycles, offs, (dma_addr_t)dest,
+ syndrome))
+ return -1;
+ }
+
+ return 0;
+}
+
+static int nand_read_buffer(uint32_t offs, unsigned int size, void *dest,
+ int syndrome)
+{
+ const struct {
+ int page_size;
+ int ecc_strength;
+ int ecc_page_size;
+ int addr_cycles;
+ } nand_configs[] = {
+ { 8192, 40, 1024, 5 },
+ { 16384, 56, 1024, 5 },
+ { 8192, 24, 1024, 5 },
+ };
+ static int nand_config = -1;
+ int i;
+
+ if (nand_config == -1) {
+ for (i = 0; i < ARRAY_SIZE(nand_configs); i++) {
+ debug("nand: trying page %d ecc %d / %d addr %d: ",
+ nand_configs[i].page_size,
+ nand_configs[i].ecc_strength,
+ nand_configs[i].ecc_page_size,
+ nand_configs[i].addr_cycles);
+ if (nand_read_ecc(nand_configs[i].page_size,
+ nand_configs[i].ecc_strength,
+ nand_configs[i].ecc_page_size,
+ nand_configs[i].addr_cycles,
+ offs, size, dest, syndrome) == 0) {
+ debug("success\n");
+ nand_config = i;
+ return 0;
+ }
+ debug("failed\n");
+ }
+ return -1;
+ }
+
+ return nand_read_ecc(nand_configs[nand_config].page_size,
+ nand_configs[nand_config].ecc_strength,
+ nand_configs[nand_config].ecc_page_size,
+ nand_configs[nand_config].addr_cycles,
+ offs, size, dest, syndrome);
+}
+
+int nand_spl_load_image(uint32_t offs, unsigned int size, void *dest)
+{
+ const uint32_t boot_offsets[] = {
+ 0 * 1024 * 1024 + CONFIG_SYS_NAND_U_BOOT_OFFS,
+ 1 * 1024 * 1024 + CONFIG_SYS_NAND_U_BOOT_OFFS,
+ 2 * 1024 * 1024 + CONFIG_SYS_NAND_U_BOOT_OFFS,
+ 4 * 1024 * 1024 + CONFIG_SYS_NAND_U_BOOT_OFFS,
+ };
+ int i, syndrome;
+
+ if (CONFIG_SYS_NAND_U_BOOT_OFFS == CONFIG_SPL_PAD_TO)
+ syndrome = 1; /* u-boot-dtb.bin appended to SPL */
+ else
+ syndrome = 0; /* u-boot-dtb.bin on its own partition */
+
+ if (offs == CONFIG_SYS_NAND_U_BOOT_OFFS) {
+ for (i = 0; i < ARRAY_SIZE(boot_offsets); i++) {
+ if (nand_read_buffer(boot_offsets[i], size,
+ dest, syndrome) == 0)
+ return 0;
+ }
+ return -1;