[PATCH v3 0/5] arch-meson: introduce efusedump command

Keeping the commands code in an arch/ is not correct. This patchset moves the meson smc commands from arch/arm/mach-meson to cmd/meson folder and also adds a new 'efusedump' command with which user can print efuse memory.
Alexey Romanov (5): asm/arch-meson: add missing meson_sm_write_efuse signature arm/mach-meson: move smc commands in cmd/meson doc/usage: cmd: documentation for meson/sm command cmd/arm: meson: sm: introduce efusedump command doc/usage: cmd: sm: documentation efusedump cmd
MAINTAINERS | 1 + arch/arm/include/asm/arch-meson/sm.h | 28 ++++ arch/arm/mach-meson/sm.c | 144 -------------------- cmd/Kconfig | 7 + cmd/Makefile | 3 + cmd/meson/Makefile | 5 + cmd/meson/sm.c | 190 +++++++++++++++++++++++++++ doc/usage/cmd/sm.rst | 48 +++++++ 8 files changed, 282 insertions(+), 144 deletions(-) create mode 100644 cmd/meson/Makefile create mode 100644 cmd/meson/sm.c create mode 100644 doc/usage/cmd/sm.rst

This function can be used by other modules. Also add comments.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru --- arch/arm/include/asm/arch-meson/sm.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
diff --git a/arch/arm/include/asm/arch-meson/sm.h b/arch/arm/include/asm/arch-meson/sm.h index f3ae46a6d6b..53b75176493 100644 --- a/arch/arm/include/asm/arch-meson/sm.h +++ b/arch/arm/include/asm/arch-meson/sm.h @@ -6,10 +6,35 @@ #ifndef __MESON_SM_H__ #define __MESON_SM_H__
+/** + * meson_sm_read_efuse - read efuse memory into buffer + * + * @offset: offset from the start efuse memory + * @buffer: pointer to buffer + * @size: number of bytes to read + * @return: number of bytes read + */ ssize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size);
+/** + * meson_sm_write_efuse - write into efuse memory from buffer + * + * @offset: offset from the start efuse memory + * @buffer: pointer to buffer + * @size: number of bytes to write + * @return: number of bytes written + */ +ssize_t meson_sm_write_efuse(uintptr_t offset, void *buffer, size_t size); + #define SM_SERIAL_SIZE 12
+/** + * meson_sm_get_serial - read chip unique id into buffer + * + * @buffer: pointer to buffer + * @size: buffer size. + * @return: zero on success or -errno on failure + */ int meson_sm_get_serial(void *buffer, size_t size);
enum { @@ -28,6 +53,9 @@ enum { REBOOT_REASON_WATCHDOG_REBOOT = 13, };
+/** + * meson_sm_get_reboot_reason - get reboot reason + */ int meson_sm_get_reboot_reason(void);
#endif /* __MESON_SM_H__ */

Le 22/12/2022 à 13:57, Alexey Romanov via groups.io a écrit :
This function can be used by other modules. Also add comments.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru
arch/arm/include/asm/arch-meson/sm.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
diff --git a/arch/arm/include/asm/arch-meson/sm.h b/arch/arm/include/asm/arch-meson/sm.h index f3ae46a6d6b..53b75176493 100644 --- a/arch/arm/include/asm/arch-meson/sm.h +++ b/arch/arm/include/asm/arch-meson/sm.h @@ -6,10 +6,35 @@ #ifndef __MESON_SM_H__ #define __MESON_SM_H__
+/**
- meson_sm_read_efuse - read efuse memory into buffer
- @offset: offset from the start efuse memory
- @buffer: pointer to buffer
- @size: number of bytes to read
- @return: number of bytes read
- */ ssize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size);
+/**
- meson_sm_write_efuse - write into efuse memory from buffer
- @offset: offset from the start efuse memory
- @buffer: pointer to buffer
- @size: number of bytes to write
- @return: number of bytes written
- */
+ssize_t meson_sm_write_efuse(uintptr_t offset, void *buffer, size_t size);
- #define SM_SERIAL_SIZE 12
+/**
- meson_sm_get_serial - read chip unique id into buffer
- @buffer: pointer to buffer
- @size: buffer size.
- @return: zero on success or -errno on failure
*/ int meson_sm_get_serial(void *buffer, size_t size);
enum {
@@ -28,6 +53,9 @@ enum { REBOOT_REASON_WATCHDOG_REBOOT = 13, };
+/**
- meson_sm_get_reboot_reason - get reboot reason
*/ int meson_sm_get_reboot_reason(void);
#endif /* __MESON_SM_H__ */
Reviewed-by: Neil Armstrong neil.armstrong@linaro.org

It is incorrect to keep commands in the arch/ folder.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru Reviewed-by: Mattijs Korpershoek mkorpershoek@baylibre.com --- MAINTAINERS | 1 + arch/arm/mach-meson/sm.c | 144 ------------------------------------ cmd/Kconfig | 7 ++ cmd/Makefile | 3 + cmd/meson/Makefile | 5 ++ cmd/meson/sm.c | 156 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 172 insertions(+), 144 deletions(-) create mode 100644 cmd/meson/Makefile create mode 100644 cmd/meson/sm.c
diff --git a/MAINTAINERS b/MAINTAINERS index 7f27ff4c20f..7a5460d4922 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -149,6 +149,7 @@ L: u-boot-amlogic@groups.io T: git https://source.denx.de/u-boot/custodians/u-boot-amlogic.git F: arch/arm/mach-meson/ F: arch/arm/include/asm/arch-meson/ +F: cmd/meson/ F: drivers/clk/meson/ F: drivers/serial/serial_meson.c F: drivers/reset/reset-meson.c diff --git a/arch/arm/mach-meson/sm.c b/arch/arm/mach-meson/sm.c index d6eb910689f..f2ca7e76932 100644 --- a/arch/arm/mach-meson/sm.c +++ b/arch/arm/mach-meson/sm.c @@ -6,8 +6,6 @@ */
#include <common.h> -#include <command.h> -#include <env.h> #include <log.h> #include <asm/arch/sm.h> #include <asm/cache.h> @@ -139,145 +137,3 @@ int meson_sm_get_reboot_reason(void) /* The SMC call is not used, we directly use AO_SEC_SD_CFG15 */ return FIELD_GET(REBOOT_REASON_MASK, reason); } - -static int do_sm_serial(struct cmd_tbl *cmdtp, int flag, int argc, - char *const argv[]) -{ - ulong address; - int ret; - - if (argc < 2) - return CMD_RET_USAGE; - - address = simple_strtoul(argv[1], NULL, 0); - - ret = meson_sm_get_serial((void *)address, SM_CHIP_ID_SIZE); - if (ret) - return CMD_RET_FAILURE; - - return CMD_RET_SUCCESS; -} - -#define MAX_REBOOT_REASONS 14 - -static const char *reboot_reasons[MAX_REBOOT_REASONS] = { - [REBOOT_REASON_COLD] = "cold_boot", - [REBOOT_REASON_NORMAL] = "normal", - [REBOOT_REASON_RECOVERY] = "recovery", - [REBOOT_REASON_UPDATE] = "update", - [REBOOT_REASON_FASTBOOT] = "fastboot", - [REBOOT_REASON_SUSPEND_OFF] = "suspend_off", - [REBOOT_REASON_HIBERNATE] = "hibernate", - [REBOOT_REASON_BOOTLOADER] = "bootloader", - [REBOOT_REASON_SHUTDOWN_REBOOT] = "shutdown_reboot", - [REBOOT_REASON_RPMBP] = "rpmbp", - [REBOOT_REASON_CRASH_DUMP] = "crash_dump", - [REBOOT_REASON_KERNEL_PANIC] = "kernel_panic", - [REBOOT_REASON_WATCHDOG_REBOOT] = "watchdog_reboot", -}; - -static int do_sm_reboot_reason(struct cmd_tbl *cmdtp, int flag, int argc, - char *const argv[]) -{ - const char *reason_str; - char *destarg = NULL; - int reason; - - if (argc > 1) - destarg = argv[1]; - - reason = meson_sm_get_reboot_reason(); - if (reason < 0) - return CMD_RET_FAILURE; - - if (reason >= MAX_REBOOT_REASONS || - !reboot_reasons[reason]) - reason_str = "unknown"; - else - reason_str = reboot_reasons[reason]; - - if (destarg) - env_set(destarg, reason_str); - else - printf("reboot reason: %s (%x)\n", reason_str, reason); - - 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 != size) - 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 != size) - 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, - char *const argv[]) -{ - struct cmd_tbl *c; - - if (argc < 2) - return CMD_RET_USAGE; - - /* Strip off leading 'sm' command argument */ - argc--; - argv++; - - c = find_cmd_tbl(argv[0], &cmd_sm_sub[0], ARRAY_SIZE(cmd_sm_sub)); - - if (c) - return c->cmd(cmdtp, flag, argc, argv); - else - return CMD_RET_USAGE; -} - -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\n" - "sm efuseread <offset> <size> <address> - read efuse to memory address\n" - "sm efusewrite <offset> <size> <address> - write into efuse from memory address" -); diff --git a/cmd/Kconfig b/cmd/Kconfig index 09193b61b95..07833f958e7 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -2565,4 +2565,11 @@ config MMC_SPEED_MODE_SET and is indicated using the index from enum bus_mode in include/mmc.h. A speed mode can be set only if it has already been enabled in the device tree. + +config CMD_MESON + bool "Amlogic Meson commands" + depends on ARCH_MESON + default y + help + Enable useful commands for the Meson Soc family developed by Amlogic Inc. endmenu diff --git a/cmd/Makefile b/cmd/Makefile index 5e43a1e022e..146c5ebb227 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -210,6 +210,9 @@ obj-$(CONFIG_RISCV) += riscv/ obj-$(CONFIG_SANDBOX) += sandbox/ obj-$(CONFIG_X86) += x86/
+# Meson +obj-$(CONFIG_CMD_MESON) += meson/ + obj-$(CONFIG_ARCH_MVEBU) += mvebu/ endif # !CONFIG_SPL_BUILD
diff --git a/cmd/meson/Makefile b/cmd/meson/Makefile new file mode 100644 index 00000000000..ee26c175cfe --- /dev/null +++ b/cmd/meson/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (c) 2022, SberDevices. All rights reserved. + +obj-y += sm.o diff --git a/cmd/meson/sm.c b/cmd/meson/sm.c new file mode 100644 index 00000000000..c2b57707258 --- /dev/null +++ b/cmd/meson/sm.c @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2016 Beniamino Galvani + * + * Author: Beniamino Galvani b.galvani@gmail.com + * Author: Vyacheslav Bocharov adeep@lexina.in + * Author: Neil Armstrong narmstrong@baylibre.com + */ + +#include <command.h> +#include <common.h> +#include <env.h> +#include <asm/arch/sm.h> +#include <stdlib.h> + +static int do_sm_serial(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + ulong address; + int ret; + + if (argc < 2) + return CMD_RET_USAGE; + + address = simple_strtoul(argv[1], NULL, 0); + + ret = meson_sm_get_serial((void *)address, SM_SERIAL_SIZE); + if (ret) + return CMD_RET_FAILURE; + + return CMD_RET_SUCCESS; +} + +#define MAX_REBOOT_REASONS 14 + +static const char *reboot_reasons[MAX_REBOOT_REASONS] = { + [REBOOT_REASON_COLD] = "cold_boot", + [REBOOT_REASON_NORMAL] = "normal", + [REBOOT_REASON_RECOVERY] = "recovery", + [REBOOT_REASON_UPDATE] = "update", + [REBOOT_REASON_FASTBOOT] = "fastboot", + [REBOOT_REASON_SUSPEND_OFF] = "suspend_off", + [REBOOT_REASON_HIBERNATE] = "hibernate", + [REBOOT_REASON_BOOTLOADER] = "bootloader", + [REBOOT_REASON_SHUTDOWN_REBOOT] = "shutdown_reboot", + [REBOOT_REASON_RPMBP] = "rpmbp", + [REBOOT_REASON_CRASH_DUMP] = "crash_dump", + [REBOOT_REASON_KERNEL_PANIC] = "kernel_panic", + [REBOOT_REASON_WATCHDOG_REBOOT] = "watchdog_reboot", +}; + +static int do_sm_reboot_reason(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + const char *reason_str; + char *destarg = NULL; + int reason; + + if (argc > 1) + destarg = argv[1]; + + reason = meson_sm_get_reboot_reason(); + if (reason < 0) + return CMD_RET_FAILURE; + + if (reason >= MAX_REBOOT_REASONS || + !reboot_reasons[reason]) + reason_str = "unknown"; + else + reason_str = reboot_reasons[reason]; + + if (destarg) + env_set(destarg, reason_str); + else + printf("reboot reason: %s (%x)\n", reason_str, reason); + + 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 != size) + 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 != size) + 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, + char *const argv[]) +{ + struct cmd_tbl *c; + + if (argc < 2) + return CMD_RET_USAGE; + + /* Strip off leading 'sm' command argument */ + argc--; + argv++; + + c = find_cmd_tbl(argv[0], &cmd_sm_sub[0], ARRAY_SIZE(cmd_sm_sub)); + + if (c) + return c->cmd(cmdtp, flag, argc, argv); + else + return CMD_RET_USAGE; +} + +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 environment\n" + "sm efuseread <offset> <size> <address> - read efuse to memory address\n" + "sm efusewrite <offset> <size> <address> - write into efuse from memory address" +);

Le 22/12/2022 à 13:57, Alexey Romanov via groups.io a écrit :
It is incorrect to keep commands in the arch/ folder.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru Reviewed-by: Mattijs Korpershoek mkorpershoek@baylibre.com
MAINTAINERS | 1 + arch/arm/mach-meson/sm.c | 144 ------------------------------------ cmd/Kconfig | 7 ++ cmd/Makefile | 3 + cmd/meson/Makefile | 5 ++ cmd/meson/sm.c | 156 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 172 insertions(+), 144 deletions(-) create mode 100644 cmd/meson/Makefile create mode 100644 cmd/meson/sm.c
diff --git a/MAINTAINERS b/MAINTAINERS index 7f27ff4c20f..7a5460d4922 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -149,6 +149,7 @@ L: u-boot-amlogic@groups.io T: git https://source.denx.de/u-boot/custodians/u-boot-amlogic.git F: arch/arm/mach-meson/ F: arch/arm/include/asm/arch-meson/ +F: cmd/meson/ F: drivers/clk/meson/ F: drivers/serial/serial_meson.c F: drivers/reset/reset-meson.c diff --git a/arch/arm/mach-meson/sm.c b/arch/arm/mach-meson/sm.c index d6eb910689f..f2ca7e76932 100644 --- a/arch/arm/mach-meson/sm.c +++ b/arch/arm/mach-meson/sm.c @@ -6,8 +6,6 @@ */
#include <common.h> -#include <command.h> -#include <env.h> #include <log.h> #include <asm/arch/sm.h> #include <asm/cache.h> @@ -139,145 +137,3 @@ int meson_sm_get_reboot_reason(void) /* The SMC call is not used, we directly use AO_SEC_SD_CFG15 */ return FIELD_GET(REBOOT_REASON_MASK, reason); }
-static int do_sm_serial(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
-{
- ulong address;
- int ret;
- if (argc < 2)
return CMD_RET_USAGE;
- address = simple_strtoul(argv[1], NULL, 0);
- ret = meson_sm_get_serial((void *)address, SM_CHIP_ID_SIZE);
- if (ret)
return CMD_RET_FAILURE;
- return CMD_RET_SUCCESS;
-}
-#define MAX_REBOOT_REASONS 14
-static const char *reboot_reasons[MAX_REBOOT_REASONS] = {
- [REBOOT_REASON_COLD] = "cold_boot",
- [REBOOT_REASON_NORMAL] = "normal",
- [REBOOT_REASON_RECOVERY] = "recovery",
- [REBOOT_REASON_UPDATE] = "update",
- [REBOOT_REASON_FASTBOOT] = "fastboot",
- [REBOOT_REASON_SUSPEND_OFF] = "suspend_off",
- [REBOOT_REASON_HIBERNATE] = "hibernate",
- [REBOOT_REASON_BOOTLOADER] = "bootloader",
- [REBOOT_REASON_SHUTDOWN_REBOOT] = "shutdown_reboot",
- [REBOOT_REASON_RPMBP] = "rpmbp",
- [REBOOT_REASON_CRASH_DUMP] = "crash_dump",
- [REBOOT_REASON_KERNEL_PANIC] = "kernel_panic",
- [REBOOT_REASON_WATCHDOG_REBOOT] = "watchdog_reboot",
-};
-static int do_sm_reboot_reason(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
-{
- const char *reason_str;
- char *destarg = NULL;
- int reason;
- if (argc > 1)
destarg = argv[1];
- reason = meson_sm_get_reboot_reason();
- if (reason < 0)
return CMD_RET_FAILURE;
- if (reason >= MAX_REBOOT_REASONS ||
!reboot_reasons[reason])
reason_str = "unknown";
- else
reason_str = reboot_reasons[reason];
- if (destarg)
env_set(destarg, reason_str);
- else
printf("reboot reason: %s (%x)\n", reason_str, reason);
- 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 != size)
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 != size)
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,
char *const argv[])
-{
- struct cmd_tbl *c;
- if (argc < 2)
return CMD_RET_USAGE;
- /* Strip off leading 'sm' command argument */
- argc--;
- argv++;
- c = find_cmd_tbl(argv[0], &cmd_sm_sub[0], ARRAY_SIZE(cmd_sm_sub));
- if (c)
return c->cmd(cmdtp, flag, argc, argv);
- else
return CMD_RET_USAGE;
-}
-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\n"
- "sm efuseread <offset> <size> <address> - read efuse to memory address\n"
- "sm efusewrite <offset> <size> <address> - write into efuse from memory address"
-); diff --git a/cmd/Kconfig b/cmd/Kconfig index 09193b61b95..07833f958e7 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -2565,4 +2565,11 @@ config MMC_SPEED_MODE_SET and is indicated using the index from enum bus_mode in include/mmc.h. A speed mode can be set only if it has already been enabled in the device tree.
+config CMD_MESON
- bool "Amlogic Meson commands"
- depends on ARCH_MESON
- default y
- help
endmenuEnable useful commands for the Meson Soc family developed by Amlogic Inc.
diff --git a/cmd/Makefile b/cmd/Makefile index 5e43a1e022e..146c5ebb227 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -210,6 +210,9 @@ obj-$(CONFIG_RISCV) += riscv/ obj-$(CONFIG_SANDBOX) += sandbox/ obj-$(CONFIG_X86) += x86/
+# Meson +obj-$(CONFIG_CMD_MESON) += meson/
- obj-$(CONFIG_ARCH_MVEBU) += mvebu/ endif # !CONFIG_SPL_BUILD
diff --git a/cmd/meson/Makefile b/cmd/meson/Makefile new file mode 100644 index 00000000000..ee26c175cfe --- /dev/null +++ b/cmd/meson/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (c) 2022, SberDevices. All rights reserved.
+obj-y += sm.o diff --git a/cmd/meson/sm.c b/cmd/meson/sm.c new file mode 100644 index 00000000000..c2b57707258 --- /dev/null +++ b/cmd/meson/sm.c @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Copyright (c) 2016 Beniamino Galvani
- Author: Beniamino Galvani b.galvani@gmail.com
- Author: Vyacheslav Bocharov adeep@lexina.in
- Author: Neil Armstrong narmstrong@baylibre.com
- */
+#include <command.h> +#include <common.h> +#include <env.h> +#include <asm/arch/sm.h> +#include <stdlib.h>
+static int do_sm_serial(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
+{
- ulong address;
- int ret;
- if (argc < 2)
return CMD_RET_USAGE;
- address = simple_strtoul(argv[1], NULL, 0);
- ret = meson_sm_get_serial((void *)address, SM_SERIAL_SIZE);
- if (ret)
return CMD_RET_FAILURE;
- return CMD_RET_SUCCESS;
+}
+#define MAX_REBOOT_REASONS 14
+static const char *reboot_reasons[MAX_REBOOT_REASONS] = {
- [REBOOT_REASON_COLD] = "cold_boot",
- [REBOOT_REASON_NORMAL] = "normal",
- [REBOOT_REASON_RECOVERY] = "recovery",
- [REBOOT_REASON_UPDATE] = "update",
- [REBOOT_REASON_FASTBOOT] = "fastboot",
- [REBOOT_REASON_SUSPEND_OFF] = "suspend_off",
- [REBOOT_REASON_HIBERNATE] = "hibernate",
- [REBOOT_REASON_BOOTLOADER] = "bootloader",
- [REBOOT_REASON_SHUTDOWN_REBOOT] = "shutdown_reboot",
- [REBOOT_REASON_RPMBP] = "rpmbp",
- [REBOOT_REASON_CRASH_DUMP] = "crash_dump",
- [REBOOT_REASON_KERNEL_PANIC] = "kernel_panic",
- [REBOOT_REASON_WATCHDOG_REBOOT] = "watchdog_reboot",
+};
+static int do_sm_reboot_reason(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
+{
- const char *reason_str;
- char *destarg = NULL;
- int reason;
- if (argc > 1)
destarg = argv[1];
- reason = meson_sm_get_reboot_reason();
- if (reason < 0)
return CMD_RET_FAILURE;
- if (reason >= MAX_REBOOT_REASONS ||
!reboot_reasons[reason])
reason_str = "unknown";
- else
reason_str = reboot_reasons[reason];
- if (destarg)
env_set(destarg, reason_str);
- else
printf("reboot reason: %s (%x)\n", reason_str, reason);
- 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 != size)
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 != size)
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,
char *const argv[])
+{
- struct cmd_tbl *c;
- if (argc < 2)
return CMD_RET_USAGE;
- /* Strip off leading 'sm' command argument */
- argc--;
- argv++;
- c = find_cmd_tbl(argv[0], &cmd_sm_sub[0], ARRAY_SIZE(cmd_sm_sub));
- if (c)
return c->cmd(cmdtp, flag, argc, argv);
- else
return CMD_RET_USAGE;
+}
+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 environment\n"
- "sm efuseread <offset> <size> <address> - read efuse to memory address\n"
- "sm efusewrite <offset> <size> <address> - write into efuse from memory address"
+);
Reviewed-by: Neil Armstrong neil.armstrong@linaro.org

Signed-off-by: Alexey Romanov avromanov@sberdevices.ru --- doc/usage/cmd/sm.rst | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 doc/usage/cmd/sm.rst
diff --git a/doc/usage/cmd/sm.rst b/doc/usage/cmd/sm.rst new file mode 100644 index 00000000000..3a70c137ec9 --- /dev/null +++ b/doc/usage/cmd/sm.rst @@ -0,0 +1,44 @@ +.. SPDX-License-Identifier: GPL-2.0+: + +Meson Security Monitor command +============================== + +Synopis +------- + +:: + + sm serial <address> + sm reboot_reason [name] + sm efuseread <offset> <size> <address> + sm efusewrite <offset> <size> <address> + sm efusedump <offset> <size> + +Description +----------- + +The sm command is used to request services from the secure monitor. User +can call secure monitor to request special TEE function, for example chip +serial number info, reboot reason, etc. + +sm serial + Retrieve chip unique serial number from sm and write it to memory on + appropriate address. + +sm reboot_reason + Print reboot reason to the console, if parameter [name] isn't specified. + If parameter specified, set reboot reason string to environment variable + with this name. + +sm efuseread + Read <size> bytes starting from <offset> from efuse memory bank and write + result to the address <address>. + +sm efusewrite + Write into efuse memory bank, starting from <offset>, the <size> bytes + of data, located at address <address>. + +Configuration +------------- + +To use the sm command you must specify CONFIG_CMD_MESON=y

Le 22/12/2022 à 13:57, Alexey Romanov via groups.io a écrit :
Please add a short description of the change in the commit message.
With this added: Reviewed-by: Neil Armstrong neil.armstrong@linaro.org
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru
doc/usage/cmd/sm.rst | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 doc/usage/cmd/sm.rst
diff --git a/doc/usage/cmd/sm.rst b/doc/usage/cmd/sm.rst new file mode 100644 index 00000000000..3a70c137ec9 --- /dev/null +++ b/doc/usage/cmd/sm.rst @@ -0,0 +1,44 @@ +.. SPDX-License-Identifier: GPL-2.0+:
+Meson Security Monitor command +==============================
+Synopis +-------
+::
- sm serial <address>
- sm reboot_reason [name]
- sm efuseread <offset> <size> <address>
- sm efusewrite <offset> <size> <address>
- sm efusedump <offset> <size>
+Description +-----------
+The sm command is used to request services from the secure monitor. User +can call secure monitor to request special TEE function, for example chip +serial number info, reboot reason, etc.
+sm serial
- Retrieve chip unique serial number from sm and write it to memory on
- appropriate address.
+sm reboot_reason
- Print reboot reason to the console, if parameter [name] isn't specified.
- If parameter specified, set reboot reason string to environment variable
- with this name.
+sm efuseread
- Read <size> bytes starting from <offset> from efuse memory bank and write
- result to the address <address>.
+sm efusewrite
- Write into efuse memory bank, starting from <offset>, the <size> bytes
- of data, located at address <address>.
+Configuration +-------------
+To use the sm command you must specify CONFIG_CMD_MESON=y

On 1/4/23 13:35, Neil Armstrong wrote:
Le 22/12/2022 à 13:57, Alexey Romanov via groups.io a écrit :
Please add a short description of the change in the commit message.
With this added: Reviewed-by: Neil Armstrong neil.armstrong@linaro.org
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru
doc/usage/cmd/sm.rst | 44 ++++++++++++++++++++++++++++++++++++++++++++
This lacks an addition to doc/usage/index.rst.
1 file changed, 44 insertions(+) create mode 100644 doc/usage/cmd/sm.rst
diff --git a/doc/usage/cmd/sm.rst b/doc/usage/cmd/sm.rst new file mode 100644 index 00000000000..3a70c137ec9 --- /dev/null +++ b/doc/usage/cmd/sm.rst @@ -0,0 +1,44 @@ +.. SPDX-License-Identifier: GPL-2.0+:
+Meson Security Monitor command
sm command ==========
We always use the actual command name here as it appears in the index.
You can mention the Meson Security Monitor in the text below.
Best regards
Heinrich
+==============================
+Synopis +-------
+::
+ sm serial <address> + sm reboot_reason [name] + sm efuseread <offset> <size> <address> + sm efusewrite <offset> <size> <address> + sm efusedump <offset> <size>
+Description +-----------
+The sm command is used to request services from the secure monitor. User +can call secure monitor to request special TEE function, for example chip +serial number info, reboot reason, etc.
+sm serial + Retrieve chip unique serial number from sm and write it to memory on + appropriate address.
+sm reboot_reason + Print reboot reason to the console, if parameter [name] isn't specified. + If parameter specified, set reboot reason string to environment variable + with this name.
+sm efuseread + Read <size> bytes starting from <offset> from efuse memory bank and write + result to the address <address>.
+sm efusewrite + Write into efuse memory bank, starting from <offset>, the <size> bytes + of data, located at address <address>.
+Configuration +-------------
+To use the sm command you must specify CONFIG_CMD_MESON=y

Using this command user can print efuse memory:
$ sm efusedump 0 10 00000000: ff 00 31 00 00 ff 66 00 00 00 ..1...f...
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru Reviewed-by: Mattijs Korpershoek mkorpershoek@baylibre.com --- cmd/meson/sm.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/cmd/meson/sm.c b/cmd/meson/sm.c index c2b57707258..d5eb1d6c084 100644 --- a/cmd/meson/sm.c +++ b/cmd/meson/sm.c @@ -5,6 +5,7 @@ * Author: Beniamino Galvani b.galvani@gmail.com * Author: Vyacheslav Bocharov adeep@lexina.in * Author: Neil Armstrong narmstrong@baylibre.com + * Author: Alexey Romanov avromanov@sberdevices.ru */
#include <command.h> @@ -119,11 +120,43 @@ static int do_efuse_write(struct cmd_tbl *cmdtp, int flag, int argc, return CMD_RET_SUCCESS; }
+static int do_efuse_dump(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + ulong offset, size; + u8 *buffer; + int ret; + + if (argc != 3) + return CMD_RET_USAGE; + + offset = simple_strtoul(argv[1], NULL, 0); + size = simple_strtoul(argv[2], NULL, 0); + buffer = malloc(size); + if (!buffer) { + pr_err("Failed to allocate %lu bytes\n", size); + return CMD_RET_FAILURE; + } + + ret = meson_sm_read_efuse(offset, (void *)buffer, size); + if (ret != size) { + ret = CMD_RET_FAILURE; + goto free_buffer; + } + + print_buffer(0, buffer, 1, size, 0); + +free_buffer: + free(buffer); + return ret; +} + 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, "", ""), + U_BOOT_CMD_MKENT(efusedump, 3, 1, do_efuse_dump, "", ""), };
static int do_sm(struct cmd_tbl *cmdtp, int flag, int argc, @@ -152,5 +185,6 @@ U_BOOT_CMD( "serial <address> - read chip unique id to memory address\n" "sm reboot_reason [name] - get reboot reason and store 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" + "sm efusewrite <offset> <size> <address> - write into efuse from memory address\n" + "sm efusedump <offset> <size> - dump efuse data range to console" );

Le 22/12/2022 à 13:57, Alexey Romanov via groups.io a écrit :
Using this command user can print efuse memory:
$ sm efusedump 0 10 00000000: ff 00 31 00 00 ff 66 00 00 00 ..1...f...
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru Reviewed-by: Mattijs Korpershoek mkorpershoek@baylibre.com
cmd/meson/sm.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/cmd/meson/sm.c b/cmd/meson/sm.c index c2b57707258..d5eb1d6c084 100644 --- a/cmd/meson/sm.c +++ b/cmd/meson/sm.c @@ -5,6 +5,7 @@
- Author: Beniamino Galvani b.galvani@gmail.com
- Author: Vyacheslav Bocharov adeep@lexina.in
- Author: Neil Armstrong narmstrong@baylibre.com
- Author: Alexey Romanov avromanov@sberdevices.ru
*/
#include <command.h>
@@ -119,11 +120,43 @@ static int do_efuse_write(struct cmd_tbl *cmdtp, int flag, int argc, return CMD_RET_SUCCESS; }
+static int do_efuse_dump(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
+{
- ulong offset, size;
- u8 *buffer;
- int ret;
- if (argc != 3)
return CMD_RET_USAGE;
- offset = simple_strtoul(argv[1], NULL, 0);
- size = simple_strtoul(argv[2], NULL, 0);
- buffer = malloc(size);
- if (!buffer) {
pr_err("Failed to allocate %lu bytes\n", size);
return CMD_RET_FAILURE;
- }
- ret = meson_sm_read_efuse(offset, (void *)buffer, size);
- if (ret != size) {
ret = CMD_RET_FAILURE;
goto free_buffer;
- }
- print_buffer(0, buffer, 1, size, 0);
+free_buffer:
- free(buffer);
- return ret;
+}
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, "", ""),
U_BOOT_CMD_MKENT(efusedump, 3, 1, do_efuse_dump, "", ""), };
static int do_sm(struct cmd_tbl *cmdtp, int flag, int argc,
@@ -152,5 +185,6 @@ U_BOOT_CMD( "serial <address> - read chip unique id to memory address\n" "sm reboot_reason [name] - get reboot reason and store 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"
- "sm efusewrite <offset> <size> <address> - write into efuse from memory address\n"
- "sm efusedump <offset> <size> - dump efuse data range to console" );
Reviewed-by: Neil Armstrong neil.armstrong@linaro.org

Signed-off-by: Alexey Romanov avromanov@sberdevices.ru --- doc/usage/cmd/sm.rst | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/doc/usage/cmd/sm.rst b/doc/usage/cmd/sm.rst index 3a70c137ec9..beb53b3f46d 100644 --- a/doc/usage/cmd/sm.rst +++ b/doc/usage/cmd/sm.rst @@ -38,6 +38,10 @@ sm efusewrite Write into efuse memory bank, starting from <offset>, the <size> bytes of data, located at address <address>.
+sm efusedump + Read <size> bytes starting from <offset> from efuse memory bank and print + them to the console. + Configuration -------------

Le 22/12/2022 à 13:57, Alexey Romanov via groups.io a écrit :
Same here, add a short description.
With that: Reviewed-by: Neil Armstrong neil.armstrong@linaro.org
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru
doc/usage/cmd/sm.rst | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/doc/usage/cmd/sm.rst b/doc/usage/cmd/sm.rst index 3a70c137ec9..beb53b3f46d 100644 --- a/doc/usage/cmd/sm.rst +++ b/doc/usage/cmd/sm.rst @@ -38,6 +38,10 @@ sm efusewrite Write into efuse memory bank, starting from <offset>, the <size> bytes of data, located at address <address>.
+sm efusedump
- Read <size> bytes starting from <offset> from efuse memory bank and print
- them to the console.
Configuration
participants (3)
-
Alexey Romanov
-
Heinrich Schuchardt
-
Neil Armstrong