Message ID | 20211005120002.1147482-1-adeep@lexina.in |
---|---|
State | Deferred |
Delegated to: | Tom Rini |
Headers | show |
Series | ARM: amlogic: add sm efuse write support and cmd for read/write efuse | expand |
On 05/10/2021 14:00, Vyacheslav Bocharov wrote: > This adds support for amlogic efuse write and provides two subcommands > of "sm" command: "efuseread" and "efusewrite" to read/write bytes between > memory and efuse. > > Signed-off-by: Vyacheslav Bocharov <adeep@lexina.in> > --- > arch/arm/mach-meson/sm.c | 68 +++++++++++++++++++++++++++++++++++++++- > 1 file changed, 67 insertions(+), 1 deletion(-) > > diff --git a/arch/arm/mach-meson/sm.c b/arch/arm/mach-meson/sm.c > index 1a8f23cb1fa..fb437b94d14 100644 > --- a/arch/arm/mach-meson/sm.c > +++ b/arch/arm/mach-meson/sm.c > @@ -68,6 +68,26 @@ ssize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size) > return regs.regs[0]; > } > > +ssize_t meson_sm_write_efuse(uintptr_t offset, void *buffer, size_t size) > +{ > + struct pt_regs regs; > + > + meson_init_shmem(); > + > + memcpy(shmem_input, buffer, size); > + > + regs.regs[0] = FN_EFUSE_WRITE; > + regs.regs[1] = offset; > + regs.regs[2] = size; > + > + smc_call(®s); > + > + if (regs.regs[0] == 0) > + return -1; > + > + return 0; > +} > + > #define SM_CHIP_ID_LENGTH 119 > #define SM_CHIP_ID_OFFSET 4 > #define SM_CHIP_ID_SIZE 12 > @@ -187,9 +207,53 @@ static int do_sm_reboot_reason(struct cmd_tbl *cmdtp, int flag, int argc, > return CMD_RET_SUCCESS; > } > > +static int do_efuse_read(struct cmd_tbl *cmdtp, int flag, int argc, > + char *const argv[]) > +{ > + ulong address, offset, size; > + int ret; > + > + if (argc < 4) > + return CMD_RET_USAGE; > + > + offset = simple_strtoul(argv[1], NULL, 0); > + size = simple_strtoul(argv[2], NULL, 0); > + > + address = simple_strtoul(argv[3], NULL, 0); > + > + ret = meson_sm_read_efuse(offset, (void *)address, size); > + if (ret) > + return CMD_RET_FAILURE; > + > + return CMD_RET_SUCCESS; > +} > + > +static int do_efuse_write(struct cmd_tbl *cmdtp, int flag, int argc, > + char *const argv[]) > +{ > + ulong address, offset, size; > + int ret; > + > + if (argc < 4) > + return CMD_RET_USAGE; > + > + offset = simple_strtoul(argv[1], NULL, 0); > + size = simple_strtoul(argv[2], NULL, 0); > + > + address = simple_strtoul(argv[3], NULL, 0); > + > + ret = meson_sm_write_efuse(offset, (void *)address, size); > + if (ret) > + return CMD_RET_FAILURE; > + > + return CMD_RET_SUCCESS; > +} > + > static struct cmd_tbl cmd_sm_sub[] = { > U_BOOT_CMD_MKENT(serial, 2, 1, do_sm_serial, "", ""), > U_BOOT_CMD_MKENT(reboot_reason, 1, 1, do_sm_reboot_reason, "", ""), > + U_BOOT_CMD_MKENT(efuseread, 4, 1, do_efuse_read, "", ""), > + U_BOOT_CMD_MKENT(efusewrite, 4, 0, do_efuse_write, "", ""), These should be aligned with tabs > }; > > static int do_sm(struct cmd_tbl *cmdtp, int flag, int argc, > @@ -216,5 +280,7 @@ U_BOOT_CMD( > sm, 5, 0, do_sm, > "Secure Monitor Control", > "serial <address> - read chip unique id to memory address\n" > - "sm reboot_reason [name] - get reboot reason and store to to environment" > + "sm reboot_reason [name] - get reboot reason and store to to environment\n" > + "sm efuseread <offset> <size> <address> - read efuse to memory address\n" > + "sm efusewrite <offset> <size> <address> - write into efuse from memory address" Same here > ); > Applied to u-boot-amlogic while fixing indent Thanks, Neil
diff --git a/arch/arm/mach-meson/sm.c b/arch/arm/mach-meson/sm.c index 1a8f23cb1fa..fb437b94d14 100644 --- a/arch/arm/mach-meson/sm.c +++ b/arch/arm/mach-meson/sm.c @@ -68,6 +68,26 @@ ssize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size) return regs.regs[0]; } +ssize_t meson_sm_write_efuse(uintptr_t offset, void *buffer, size_t size) +{ + struct pt_regs regs; + + meson_init_shmem(); + + memcpy(shmem_input, buffer, size); + + regs.regs[0] = FN_EFUSE_WRITE; + regs.regs[1] = offset; + regs.regs[2] = size; + + smc_call(®s); + + if (regs.regs[0] == 0) + return -1; + + return 0; +} + #define SM_CHIP_ID_LENGTH 119 #define SM_CHIP_ID_OFFSET 4 #define SM_CHIP_ID_SIZE 12 @@ -187,9 +207,53 @@ static int do_sm_reboot_reason(struct cmd_tbl *cmdtp, int flag, int argc, return CMD_RET_SUCCESS; } +static int do_efuse_read(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + ulong address, offset, size; + int ret; + + if (argc < 4) + return CMD_RET_USAGE; + + offset = simple_strtoul(argv[1], NULL, 0); + size = simple_strtoul(argv[2], NULL, 0); + + address = simple_strtoul(argv[3], NULL, 0); + + ret = meson_sm_read_efuse(offset, (void *)address, size); + if (ret) + return CMD_RET_FAILURE; + + return CMD_RET_SUCCESS; +} + +static int do_efuse_write(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + ulong address, offset, size; + int ret; + + if (argc < 4) + return CMD_RET_USAGE; + + offset = simple_strtoul(argv[1], NULL, 0); + size = simple_strtoul(argv[2], NULL, 0); + + address = simple_strtoul(argv[3], NULL, 0); + + ret = meson_sm_write_efuse(offset, (void *)address, size); + if (ret) + return CMD_RET_FAILURE; + + return CMD_RET_SUCCESS; +} + static struct cmd_tbl cmd_sm_sub[] = { U_BOOT_CMD_MKENT(serial, 2, 1, do_sm_serial, "", ""), U_BOOT_CMD_MKENT(reboot_reason, 1, 1, do_sm_reboot_reason, "", ""), + U_BOOT_CMD_MKENT(efuseread, 4, 1, do_efuse_read, "", ""), + U_BOOT_CMD_MKENT(efusewrite, 4, 0, do_efuse_write, "", ""), }; static int do_sm(struct cmd_tbl *cmdtp, int flag, int argc, @@ -216,5 +280,7 @@ U_BOOT_CMD( sm, 5, 0, do_sm, "Secure Monitor Control", "serial <address> - read chip unique id to memory address\n" - "sm reboot_reason [name] - get reboot reason and store to to environment" + "sm reboot_reason [name] - get reboot reason and store to to environment\n" + "sm efuseread <offset> <size> <address> - read efuse to memory address\n" + "sm efusewrite <offset> <size> <address> - write into efuse from memory address" );
This adds support for amlogic efuse write and provides two subcommands of "sm" command: "efuseread" and "efusewrite" to read/write bytes between memory and efuse. Signed-off-by: Vyacheslav Bocharov <adeep@lexina.in> --- arch/arm/mach-meson/sm.c | 68 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-)