Hi I will pick the series shortly
Michael On Wed, Sep 24, 2025 at 6:20 AM Mikhail Kshevetskiy <[email protected]> wrote: > > Some nand flashes (like spi-nand one) are registered with mtd > subsystem only, thus nand command can't be used to work with > such flashes. As result some functionality is missing. > > This patch implements 'nand markbad' functionality for mtd command. > > Signed-off-by: Mikhail Kshevetskiy <[email protected]> > Reviewed-by: Miquel Raynal <[email protected]> > --- > cmd/Kconfig | 8 ++++++++ > cmd/mtd.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 66 insertions(+) > > diff --git a/cmd/Kconfig b/cmd/Kconfig > index 29de857ba7c..8f2a35d780b 100644 > --- a/cmd/Kconfig > +++ b/cmd/Kconfig > @@ -1511,6 +1511,14 @@ config CMD_MTD_OTP > help > MTD commands for OTP access. > > +config CMD_MTD_MARKBAD > + bool "mtd markbad" > + depends on CMD_MTD > + help > + MTD markbad command support. > + > + This is a clone of "nand markbad" command, but for 'mtd' subsystem. > + > config CMD_MUX > bool "mux" > depends on MULTIPLEXER > diff --git a/cmd/mtd.c b/cmd/mtd.c > index 2520b89eed2..95e4be9863d 100644 > --- a/cmd/mtd.c > +++ b/cmd/mtd.c > @@ -711,6 +711,57 @@ out_put_mtd: > return ret; > } > > +#ifdef CONFIG_CMD_MTD_MARKBAD > +static int do_mtd_markbad(struct cmd_tbl *cmdtp, int flag, int argc, > + char *const argv[]) > +{ > + struct mtd_info *mtd; > + loff_t off; > + int ret = 0; > + > + if (argc < 3) > + return CMD_RET_USAGE; > + > + mtd = get_mtd_by_name(argv[1]); > + if (IS_ERR_OR_NULL(mtd)) > + return CMD_RET_FAILURE; > + > + if (!mtd_can_have_bb(mtd)) { > + printf("Only NAND-based devices can have bad blocks\n"); > + goto out_put_mtd; > + } > + > + argc -= 2; > + argv += 2; > + while (argc > 0) { > + off = hextoul(argv[0], NULL); > + if (!mtd_is_aligned_with_block_size(mtd, off)) { > + printf("Offset not aligned with a block (0x%x)\n", > + mtd->erasesize); > + ret = CMD_RET_FAILURE; > + goto out_put_mtd; > + } > + > + ret = mtd_block_markbad(mtd, off); > + if (ret) { > + printf("block 0x%08llx NOT marked as bad! ERROR %d\n", > + off, ret); > + ret = CMD_RET_FAILURE; > + } else { > + printf("block 0x%08llx successfully marked as bad\n", > + off); > + } > + --argc; > + ++argv; > + } > + > +out_put_mtd: > + put_mtd_device(mtd); > + > + return ret; > +} > +#endif > + > static int do_mtd_bad(struct cmd_tbl *cmdtp, int flag, int argc, > char *const argv[]) > { > @@ -793,6 +844,9 @@ U_BOOT_LONGHELP(mtd, > "mtd otpwrite <name> <off> <hex string>\n" > "mtd otplock <name> <off> <size>\n" > "mtd otpinfo <name> [u|f]\n" > +#endif > +#if CONFIG_IS_ENABLED(CMD_MTD_MARKBAD) > + "mtd markbad <name> <off> [<off> > ...]\n" > #endif > "\n" > "With:\n" > @@ -827,5 +881,9 @@ U_BOOT_CMD_WITH_SUBCMDS(mtd, "MTD utils", mtd_help_text, > mtd_name_complete), > U_BOOT_SUBCMD_MKENT_COMPLETE(erase, 4, 0, do_mtd_erase, > mtd_name_complete), > +#if CONFIG_IS_ENABLED(CMD_MTD_MARKBAD) > + U_BOOT_SUBCMD_MKENT_COMPLETE(markbad, 20, 0, do_mtd_markbad, > + mtd_name_complete), > +#endif > U_BOOT_SUBCMD_MKENT_COMPLETE(bad, 2, 1, do_mtd_bad, > mtd_name_complete)); > -- > 2.51.0 > -- Michael Nazzareno Trimarchi Co-Founder & Chief Executive Officer M. +39 347 913 2170 [email protected] __________________________________ Amarula Solutions BV Joop Geesinkweg 125, 1114 AB, Amsterdam, NL T. +31 (0)85 111 9172 [email protected] www.amarulasolutions.com

