nandbcb: read boot search count from fuse for imx8qxp
authorHan Xu <han.xu@nxp.com>
Tue, 5 May 2020 14:04:04 +0000 (22:04 +0800)
committerStefano Babic <sbabic@denx.de>
Sun, 10 May 2020 18:55:20 +0000 (20:55 +0200)
add support for imx8qxp to read boot search count from fuse in nandbcb

Signed-off-by: Han Xu <han.xu@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
arch/arm/mach-imx/cmd_nandbcb.c

index ab12b1f1cf2eca5f8dd189cca6813cfac77421e8..94cae146ced0cd186f39cbd988f45ff66479c01e 100644 (file)
@@ -27,6 +27,7 @@
 #include <mxs_nand.h>
 #include <linux/mtd/mtd.h>
 #include <nand.h>
+#include <fuse.h>
 
 #include "../../../cmd/legacy-mtd-utils.h"
 
@@ -1260,6 +1261,35 @@ static bool check_fingerprint(void *data, int fingerprint)
        return (*(int *)(data + off) == fingerprint);
 }
 
+static int fuse_to_search_count(u32 bank, u32 word, u32 mask, u32 off)
+{
+       int err;
+       u32 val;
+       int ret;
+
+       /* by default, the boot search count from fuse should be 2 */
+       err = fuse_read(bank, word, &val);
+       if (err)
+               return 2;
+
+       val = (val & mask) >> off;
+
+       switch (val) {
+               case 0:
+                       ret = 2;
+                       break;
+               case 1:
+               case 2:
+               case 3:
+                       ret = 1 << val;
+                       break;
+               default:
+                       ret = 2;
+       }
+
+       return ret;
+}
+
 static int nandbcb_dump(struct boot_config *boot_cfg)
 {
        int i;
@@ -1459,7 +1489,14 @@ static int do_nandbcb(cmd_tbl_t *cmdtp, int flag, int argc,
                return CMD_RET_FAILURE;
        }
 
-       /* TODO: set the boot search count if need to read from fuse */
+       if (plat_config.misc_flags & BT_SEARCH_CNT_FROM_FUSE) {
+               if (is_imx8qxp()) {
+                       g_boot_search_count = fuse_to_search_count(0, 720,
+                                                                  0xc0, 6);
+                       printf("search count set to %d from fuse\n",
+                              g_boot_search_count);
+               }
+       }
 
        cmd = argv[1];
        --argc;