[U-Boot] [PATCH v2 20/21] cmd: mtd: add 'mtd' command

Miquel Raynal miquel.raynal at bootlin.com
Thu Jul 12 12:51:32 UTC 2018


Hi Boris,

Boris Brezillon <boris.brezillon at bootlin.com> wrote on Thu, 12 Jul 2018
00:42:13 +0200:

> On Wed, 11 Jul 2018 17:25:28 +0200
> Miquel Raynal <miquel.raynal at bootlin.com> wrote:
> 
> > +
> > +static void mtd_show_device(struct mtd_info *mtd)
> > +{
> > +	printf("* %s", mtd->name);  
> 
> Printing the device type might be interesting? And maybe also the size,
> writesize, oobsize and erasesize?

Absolutely.

> 
> > +	if (mtd->dev)
> > +		printf(" [device: %s] [parent: %s] [driver: %s]",
> > +		       mtd->dev->name, mtd->dev->parent->name,
> > +		       mtd->dev->driver->name);
> > +
> > +	printf("\n");
> > +}  

[...]

> > +	} else if (!strcmp(cmd, "erase")) {
> > +		bool scrub = strstr(cmd, ".dontskipbad");
> > +		bool full_erase = strstr(cmd, ".chip");  
> 
> Again, I think .chip extension is not needed. Just consider a full erase
> is requested when offset and length are not provided. Plus, chip is
> misleading since I guess mtd partitions are also exposed as mtd devices,
> and could thus be erased with the .chip extension as well.

".chip" removed.

Default now is mtd->size (the entire MTD device) for erase/read/write,
and mtd->writesize (a page) for a dump.

> 
> > +		struct erase_info erase_op = {};
> > +		u64 off, len;
> > +
> > +		off = argc > 0 ? simple_strtoul(argv[0], NULL, 16) : 0;
> > +		len = argc > 1 ? simple_strtoul(argv[1], NULL, 16) : mtd->erasesize;  
> 
> Hm. Are we sure we want the default to be 1 eraseblock? Shouldn't we
> consider that missing size means "erase up to the MTD device end". Same
> goes for the read/write accesses, but maybe not for dump where dumping
> a single page makes more sense.

See above.

> 
> > +
> > +		if (full_erase) {
> > +			off = 0;
> > +			len = mtd->size;
> > +		}
> > +
> > +		if ((u32)off % mtd->erasesize) {  
> 
> Sounds dangerous. We have 8GB NANDs on sunxi platforms...

[...]

> > +
> > +		if ((u32)len % mtd->erasesize) {  
> 
> Same here. I guess there's a do_div() in uboot.

In both cases I take the less significant bytes of a 64-bit value. The
modulo operation is safe as long as mtd->erasesize is a 32-bit value
too. I don't think there is any danger?

[...]

Thanks,
Miquèl


More information about the U-Boot mailing list