[U-Boot] [PATCH] cmd: mtd: solve bad block support in erase command

Patrick DELAUNAY patrick.delaunay at st.com
Thu Sep 26 09:31:46 UTC 2019

Hi Stefan,

> From: Stefan Roese <sr at denx.de>
> Sent: vendredi 20 septembre 2019 11:20
> Hi Patrick,
> On 20.09.19 09:20, Patrick Delaunay wrote:
> > This patch modify the loop in mtd erase command to erase one by one
> > the blocks in the requested area.
> >
> > It solves issue on "mtd erase" command on nand with existing bad
> > block, the command is interrupted on the first bad block with the trace:
> > 	"Skipping bad block at 0xffffffffffffffff"
> >
> > In MTD driver (nand/raw), when a bad block is present on the MTD
> > device, the erase_op.fail_addr is not updated and we have the initial
> > value MTD_FAIL_ADDR_UNKNOWN = (ULL)-1.
> So here is the difference? I remember testing this on a board with SPI NAND and
> here it worked correctly. But your test case is with RAW NAND?

Yes with RAW nand.

it is the difference the U-Boot code, for SPI nan use:
	int nanddev_mtd_erase()

the fail address is always updated 
	=> einfo->fail_addr = nanddev_pos_to_offs(nand, &pos);

> Do you have a change to also test this on a board with SPI NAND?

I do the test  a SPI-NAND today.

The mtd erase command was functional on SPI-ANND before my patch : 
I create 2 bad block manually and they are correctly skipped.

STM32MP> mtd list  
List of MTD devices:
* spi-nand0
  - device: spi-nand at 0
  - parent: qspi at 58003000
  - driver: spi_nand
  - type: NAND flash
  - block size: 0x20000 bytes
  - min I/O: 0x800 bytes
  - OOB size: 128 bytes
  - OOB available: 62 bytes
  - 0x000000000000-0x000010000000 : "spi-nand0"
	  - 0x000000000000-0x000000200000 : "fsbl"
	  - 0x000000200000-0x000000400000 : "ssbl1"
	  - 0x000000400000-0x000000600000 : "ssbl2"
	  - 0x000000600000-0x000010000000 : "UBI"

STM32MP> mtd erase spi-nand0 0x00000000 0x10000000            
Erasing 0x00000000 ... 0x0fffffff (2048 eraseblock(s))
0x0fd00000: bad block
0x0fd20000: bad block
attempt to erase a bad/reserved block @fd00000
Skipping bad block at 0x0fd00000
attempt to erase a bad/reserved block @fd20000
Skipping bad block at 0x0fd20000
0x0fd00000: bad block
0x0fd20000: bad block

> Thanks,
> Stefan

What it is the better solution for you ?

 update the MTD command (my patch) or allign the behavior of the 2 MTD devices 
- MTD RAW NAND (nand_base.c:: nand_erase_nand)
- MTD SPI NAND (core.c:: nanddev_mtd_erase)

Best regards 


More information about the U-Boot mailing list