120-mt7622-bl2_boot_snand-skip-bad-blocks.patch 930 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. --- a/plat/mediatek/mt7622/bl2_boot_snand.c
  2. +++ b/plat/mediatek/mt7622/bl2_boot_snand.c
  3. @@ -21,6 +21,10 @@
  4. #define FIP_BASE 0x80000
  5. #define FIP_SIZE 0x200000
  6. +#ifndef NMBM
  7. +#define SNAND_MAX_BAD_BLOCK 3
  8. +#endif
  9. +
  10. struct snfi_gpio_mux_info {
  11. const uint32_t *pins;
  12. uint32_t count;
  13. @@ -45,12 +49,26 @@ static size_t snand_read_range(int lba,
  14. size_t sizeremain = size, chunksize;
  15. uint64_t off = lba * cinfo.pagesize;
  16. uint8_t *ptr = (uint8_t *)buf;
  17. + struct mtk_snand_chip_info info;
  18. + unsigned int bad_blocks = 0;
  19. int ret = 0;
  20. if (!snf)
  21. return 0;
  22. + ret = mtk_snand_get_chip_info(snf, &info);
  23. + if (ret)
  24. + return 0;
  25. +
  26. while (sizeremain) {
  27. + while (mtk_snand_block_isbad(snf, off)) {
  28. + if (bad_blocks > SNAND_MAX_BAD_BLOCK)
  29. + return size - sizeremain;
  30. +
  31. + off += info.blocksize;
  32. + ++bad_blocks;
  33. + }
  34. +
  35. chunksize = cinfo.pagesize;
  36. if (chunksize > sizeremain)
  37. chunksize = sizeremain;