100-10-cmd-mtd-add-markbad-subcommand-for-NMBM-testing.patch 2.3 KB

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