cmd: fuse: Add fuse writebuff sub-system command

Add CMD_FUSE_WRITEBUFF config option to add and enable fuse writebuff
sub-system command. Add fuse_writebuff function to be invoked on
writebuff command.

Signed-off-by: Harsha Vardhan V M <h-vm@ti.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
Harsha Vardhan V M 2025-03-19 14:17:12 +05:30 committed by Tom Rini
parent 833c05ea27
commit 578e7882bf
3 changed files with 42 additions and 5 deletions

View file

@ -1236,6 +1236,14 @@ config CMD_FUSE
which control the behaviour of the device. The command uses the
fuse_...() API.
config CMD_FUSE_WRITEBUFF
bool "Support for the fuse writebuff"
depends on CMD_FUSE
help
This allows programming fuses, which control the behaviour of
the device, using a structured buffer in memory. The command
uses the fuse_writebuff() API.
config CMD_GPIO
bool "gpio"
help

View file

@ -43,11 +43,18 @@ static int do_fuse(struct cmd_tbl *cmdtp, int flag, int argc,
argc -= 2 + confirmed;
argv += 2 + confirmed;
if (argc < 2)
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);
bank = simple_strtoul(argv[0], NULL, 0);
word = simple_strtoul(argv[1], NULL, 0);
}
if (!strcmp(op, "read")) {
if (argc == 2)
@ -161,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;
}
@ -186,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 */
);

View file

@ -12,6 +12,7 @@
#define _FUSE_H_
#include <linux/types.h>
#include <linux/errno.h>
/*
* Read/Sense/Program/Override interface:
@ -25,5 +26,13 @@ int fuse_read(u32 bank, u32 word, u32 *val);
int fuse_sense(u32 bank, u32 word, u32 *val);
int fuse_prog(u32 bank, u32 word, u32 val);
int fuse_override(u32 bank, u32 word, u32 val);
#ifdef CONFIG_CMD_FUSE_WRITEBUFF
int fuse_writebuff(ulong addr);
#else
static inline int fuse_writebuff(ulong addr)
{
return -EPERM;
}
#endif /* CONFIG_CMD_FUSE_WRITEBUFF */
#endif /* _FUSE_H_ */