summaryrefslogtreecommitdiff
path: root/cmd/mtd.c
diff options
context:
space:
mode:
authorMikhail Kshevetskiy <[email protected]>2025-09-24 07:20:31 +0300
committerMichael Trimarchi <[email protected]>2025-10-05 20:26:40 +0200
commit21c1098cf443ea225090520cbe3ac7fc9e75cd33 (patch)
treefd1c3e09bf6e990324e79c8edb9db4f68b9ed2d3 /cmd/mtd.c
parente55069fab47407e85171c66ac018456306a5923b (diff)
cmd: mtd: add markbad command support
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]> Signed-off-by: Michael Trimarchi <[email protected]>
Diffstat (limited to 'cmd/mtd.c')
-rw-r--r--cmd/mtd.c58
1 files changed, 58 insertions, 0 deletions
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[])
{
@@ -794,6 +845,9 @@ U_BOOT_LONGHELP(mtd,
"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"
"\t<name>: NAND partition/chip name (or corresponding DM device name or OF path)\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));