--- a/plat/mediatek/mt7622/bl2_boot_snand.c +++ b/plat/mediatek/mt7622/bl2_boot_snand.c @@ -21,6 +21,10 @@ #define FIP_BASE 0x80000 #define FIP_SIZE 0x200000 +#ifndef NMBM +#define SNAND_MAX_BAD_BLOCK 3 +#endif + struct snfi_gpio_mux_info { const uint32_t *pins; uint32_t count; @@ -45,12 +49,26 @@ static size_t snand_read_range(int lba, size_t sizeremain = size, chunksize; uint64_t off = lba * cinfo.pagesize; uint8_t *ptr = (uint8_t *)buf; + struct mtk_snand_chip_info info; + unsigned int bad_blocks = 0; int ret = 0; if (!snf) return 0; + ret = mtk_snand_get_chip_info(snf, &info); + if (ret) + return 0; + while (sizeremain) { + while (mtk_snand_block_isbad(snf, off)) { + if (bad_blocks > SNAND_MAX_BAD_BLOCK) + return size - sizeremain; + + off += info.blocksize; + ++bad_blocks; + } + chunksize = cinfo.pagesize; if (chunksize > sizeremain) chunksize = sizeremain;