diff options
author | Tom Rini <trini@konsulko.com> | 2025-04-07 16:40:02 -0600 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2025-04-08 11:43:23 -0600 |
commit | ff61d6bfd1c9534d3fc2397846a5899639f2e55d (patch) | |
tree | dcfe4bc52848a5637c975a3352b57885e5b8a06d /cmd/fuse.c | |
parent | 34820924edbc4ec7803eb89d9852f4b870fa760a (diff) | |
parent | f892a7f397a66d8d09f418d1e0e06dfb48bac27d (diff) |
Merge branch 'next'
Note that this undoes the changes of commit cf6d4535cc4c ("x86:
emulation: Disable bloblist for now") as that was intended only for the
release due to time.
Diffstat (limited to 'cmd/fuse.c')
-rw-r--r-- | cmd/fuse.c | 63 |
1 files changed, 40 insertions, 23 deletions
diff --git a/cmd/fuse.c b/cmd/fuse.c index 598ef496a43..6c42c096809 100644 --- a/cmd/fuse.c +++ b/cmd/fuse.c @@ -15,17 +15,6 @@ #include <vsprintf.h> #include <linux/errno.h> -static int strtou32(const char *str, unsigned int base, u32 *result) -{ - char *ep; - - *result = simple_strtoul(str, &ep, base); - if (ep == str || *ep != '\0') - return -EINVAL; - - return 0; -} - static int confirm_prog(void) { puts("Warning: Programming fuses is an irreversible operation!\n" @@ -54,14 +43,25 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc, argc -= 2 + confirmed; argv += 2 + confirmed; - if (argc < 2 || strtou32(argv[0], 0, &bank) || - strtou32(argv[1], 0, &word)) - return CMD_RET_USAGE; + if (IS_ENABLED(CONFIG_CMD_FUSE_WRITEBUFF) && !strcmp(op, "writebuff")) { + if (argc == 1) + addr = simple_strtoul(argv[0], NULL, 16); + else + return CMD_RET_USAGE; + } else { + if (argc < 2) + return CMD_RET_USAGE; + + bank = simple_strtoul(argv[0], NULL, 0); + word = simple_strtoul(argv[1], NULL, 0); + } if (!strcmp(op, "read")) { if (argc == 2) cnt = 1; - else if (argc != 3 || strtou32(argv[2], 0, &cnt)) + else if (argc == 3) + cnt = simple_strtoul(argv[2], NULL, 0); + else return CMD_RET_USAGE; printf("Reading bank %u:\n", bank); @@ -79,7 +79,9 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc, } else if (!strcmp(op, "readm")) { if (argc == 3) cnt = 1; - else if (argc != 4 || strtou32(argv[3], 0, &cnt)) + else if (argc == 4) + cnt = simple_strtoul(argv[3], NULL, 0); + else return CMD_RET_USAGE; addr = simple_strtoul(argv[2], NULL, 16); @@ -99,7 +101,9 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc, unmap_sysmem(start); } else if (!strcmp(op, "cmp")) { - if (argc != 3 || strtou32(argv[2], 0, &cmp)) + if (argc == 3) + cmp = simple_strtoul(argv[2], NULL, 0); + else return CMD_RET_USAGE; printf("Comparing bank %u:\n", bank); @@ -119,7 +123,9 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc, } else if (!strcmp(op, "sense")) { if (argc == 2) cnt = 1; - else if (argc != 3 || strtou32(argv[2], 0, &cnt)) + else if (argc == 3) + cnt = simple_strtoul(argv[2], NULL, 0); + else return CMD_RET_USAGE; printf("Sensing bank %u:\n", bank); @@ -139,8 +145,7 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc, return CMD_RET_USAGE; for (i = 2; i < argc; i++, word++) { - if (strtou32(argv[i], 16, &val)) - return CMD_RET_USAGE; + val = simple_strtoul(argv[i], NULL, 16); printf("Programming bank %u word 0x%.8x to 0x%.8x...\n", bank, word, val); @@ -155,8 +160,7 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc, return CMD_RET_USAGE; for (i = 2; i < argc; i++, word++) { - if (strtou32(argv[i], 16, &val)) - return CMD_RET_USAGE; + val = simple_strtoul(argv[i], NULL, 16); printf("Overriding bank %u word 0x%.8x with " "0x%.8x...\n", bank, word, val); @@ -164,6 +168,15 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc, if (ret) goto err; } + } else if (IS_ENABLED(CONFIG_CMD_FUSE_WRITEBUFF) && !strcmp(op, "writebuff")) { + printf("Programming fuses using a structured buffer in memory " + "starting at addr 0x%lx\n", addr); + if (!confirmed && !confirm_prog()) + return CMD_RET_FAILURE; + + ret = fuse_writebuff(addr); + if (ret) + goto err; } else { return CMD_RET_USAGE; } @@ -189,5 +202,9 @@ U_BOOT_CMD( "fuse prog [-y] <bank> <word> <hexval> [<hexval>...] - program 1 or\n" " several fuse words, starting at 'word' (PERMANENT)\n" "fuse override <bank> <word> <hexval> [<hexval>...] - override 1 or\n" - " several fuse words, starting at 'word'" + " several fuse words, starting at 'word'\n" +#ifdef CONFIG_CMD_FUSE_WRITEBUFF + "fuse writebuff [-y] <addr> - program fuse data\n" + " using a structured buffer in memory starting at 'addr'\n" +#endif /* CONFIG_CMD_FUSE_WRITEBUFF */ ); |