uboot-mediatek: update to U-Boot 2023.01
[openwrt/staging/noltari.git] / package / boot / uboot-mediatek / patches / 100-10-cmd-mtd-add-markbad-subcommand-for-NMBM-testing.patch
1 From 6dbbc8affb6ab22f940d13d0e928d5e881127ca4 Mon Sep 17 00:00:00 2001
2 From: Weijie Gao <weijie.gao@mediatek.com>
3 Date: Mon, 25 Jul 2022 11:22:57 +0800
4 Subject: [PATCH 44/71] cmd: mtd: add markbad subcommand for NMBM testing
5
6 This patch adds:
7 * Mark bad block on lower mtd device and erase on upper mtd
8 device, which will trigger remapping:
9 $ mtd markbad spi-nand0 0x20000 (mark block1 as bad)
10 $ mtd erase nmbm0 0x20000 0x20000 (let nmbm detect the bad block and remap it)
11
12 * Clear bad block mark through:
13 $ mtd erase.dontskipbad spi-nand0 0x20000 0x20000
14 (After cleaning bad block mark, we need to rebuild nmbm manage table.)
15
16 Signed-off-by: SkyLake.Huang <skylake.huang@mediatek.com>
17 ---
18 cmd/mtd.c | 39 +++++++++++++++++++++++++++++++++++++++
19 1 file changed, 39 insertions(+)
20
21 --- a/cmd/mtd.c
22 +++ b/cmd/mtd.c
23 @@ -504,6 +504,42 @@ out_put_mtd:
24 return CMD_RET_SUCCESS;
25 }
26
27 +static int do_mtd_markbad(struct cmd_tbl *cmdtp, int flag, int argc,
28 + char * const argv[])
29 +{
30 + struct mtd_info *mtd;
31 + loff_t off;
32 + int ret;
33 +
34 + if (argc < 3)
35 + return CMD_RET_USAGE;
36 +
37 + mtd = get_mtd_by_name(argv[1]);
38 + if (IS_ERR(mtd) || !mtd)
39 + return CMD_RET_FAILURE;
40 +
41 + if (!mtd_can_have_bb(mtd)) {
42 + printf("Only NAND-based devices can have mark blocks\n");
43 + goto out_put_mtd;
44 + }
45 +
46 + off = simple_strtoull(argv[2], NULL, 0);
47 +
48 + ret = mtd_block_markbad(mtd, off);
49 + if (!ret) {
50 + printf("MTD device %s block at 0x%08llx marked bad\n",
51 + mtd->name, off);
52 + } else {
53 + printf("MTD device %s block at 0x%08llx mark bad failed\n",
54 + mtd->name, off);
55 + }
56 +
57 +out_put_mtd:
58 + put_mtd_device(mtd);
59 +
60 + return CMD_RET_SUCCESS;
61 +}
62 +
63 #ifdef CONFIG_AUTO_COMPLETE
64 static int mtd_name_complete(int argc, char *const argv[], char last_char,
65 int maxv, char *cmdv[])
66 @@ -552,6 +588,7 @@ static char mtd_help_text[] =
67 "\n"
68 "Specific functions:\n"
69 "mtd bad <name>\n"
70 + "mtd markbad <name> <off>\n"
71 "\n"
72 "With:\n"
73 "\t<name>: NAND partition/chip name (or corresponding DM device name or OF path)\n"
74 @@ -577,4 +614,6 @@ U_BOOT_CMD_WITH_SUBCMDS(mtd, "MTD utils"
75 U_BOOT_SUBCMD_MKENT_COMPLETE(erase, 4, 0, do_mtd_erase,
76 mtd_name_complete),
77 U_BOOT_SUBCMD_MKENT_COMPLETE(bad, 2, 1, do_mtd_bad,
78 + mtd_name_complete),
79 + U_BOOT_SUBCMD_MKENT_COMPLETE(markbad, 3, 1, do_mtd_markbad,
80 mtd_name_complete));