[PATCH v2 0/3] 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 (3): asm/arch-meson: add missing meson_sm_write_efuse signature arm/mach-meson: move smc commands in cmd/meson cmd/arm: meson: sm: introduce efusedump command
MAINTAINERS | 1 + arch/arm/include/asm/arch-meson/sm.h | 2 + arch/arm/mach-meson/sm.c | 144 --------------------- cmd/Kconfig | 7 + cmd/Makefile | 3 + cmd/meson/Makefile | 5 + cmd/meson/sm.c | 187 +++++++++++++++++++++++++++ 7 files changed, 205 insertions(+), 144 deletions(-) create mode 100644 cmd/meson/Makefile create mode 100644 cmd/meson/sm.c

This function can be used by other modules.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru --- arch/arm/include/asm/arch-meson/sm.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/arch/arm/include/asm/arch-meson/sm.h b/arch/arm/include/asm/arch-meson/sm.h index f3ae46a6d6b..b68edf842e4 100644 --- a/arch/arm/include/asm/arch-meson/sm.h +++ b/arch/arm/include/asm/arch-meson/sm.h @@ -8,6 +8,8 @@
ssize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size);
+ssize_t meson_sm_write_efuse(uintptr_t offset, void *buffer, size_t size); + #define SM_SERIAL_SIZE 12
int meson_sm_get_serial(void *buffer, size_t size);

Hi Alexey,
On Tue, 13 Dec 2022 at 10:32, Alexey Romanov avromanov@sberdevices.ru wrote:
This function can be used by other modules.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru
arch/arm/include/asm/arch-meson/sm.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/arch/arm/include/asm/arch-meson/sm.h b/arch/arm/include/asm/arch-meson/sm.h index f3ae46a6d6b..b68edf842e4 100644 --- a/arch/arm/include/asm/arch-meson/sm.h +++ b/arch/arm/include/asm/arch-meson/sm.h @@ -8,6 +8,8 @@
ssize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size);
+ssize_t meson_sm_write_efuse(uintptr_t offset, void *buffer, size_t size);
#define SM_SERIAL_SIZE 12
int meson_sm_get_serial(void *buffer, size_t size);
2.25.1
Should add function comments.
Also, you might consider adding a uclass for this. It seems like an important use case that is not handled right now.
Regards, Simon

Hello!
On Tue, Dec 13, 2022 at 08:39:46PM -0800, Simon Glass wrote:
Hi Alexey,
On Tue, 13 Dec 2022 at 10:32, Alexey Romanov avromanov@sberdevices.ru wrote:
This function can be used by other modules.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru
arch/arm/include/asm/arch-meson/sm.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/arch/arm/include/asm/arch-meson/sm.h b/arch/arm/include/asm/arch-meson/sm.h index f3ae46a6d6b..b68edf842e4 100644 --- a/arch/arm/include/asm/arch-meson/sm.h +++ b/arch/arm/include/asm/arch-meson/sm.h @@ -8,6 +8,8 @@
ssize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size);
+ssize_t meson_sm_write_efuse(uintptr_t offset, void *buffer, size_t size);
#define SM_SERIAL_SIZE 12
int meson_sm_get_serial(void *buffer, size_t size);
2.25.1
Should add function comments.
Also, you might consider adding a uclass for this. It seems like an important use case that is not handled right now.
Regards, Simon
I'm afraid we can't generalize sm API for each arch types. It's very close to Secure Monitor vendor implementation and can provide various APIs for different purposes.

On 14/12/2022 05:39, Simon Glass wrote:
Hi Alexey,
On Tue, 13 Dec 2022 at 10:32, Alexey Romanov avromanov@sberdevices.ru wrote:
This function can be used by other modules.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru
arch/arm/include/asm/arch-meson/sm.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/arch/arm/include/asm/arch-meson/sm.h b/arch/arm/include/asm/arch-meson/sm.h index f3ae46a6d6b..b68edf842e4 100644 --- a/arch/arm/include/asm/arch-meson/sm.h +++ b/arch/arm/include/asm/arch-meson/sm.h @@ -8,6 +8,8 @@
ssize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size);
+ssize_t meson_sm_write_efuse(uintptr_t offset, void *buffer, size_t size);
#define SM_SERIAL_SIZE 12
int meson_sm_get_serial(void *buffer, size_t size);
-- 2.25.1
Should add function comments.
Also, you might consider adding a uclass for this. It seems like an important use case that is not handled right now.
An NVMEM uclass would be a great addition, but for the scope of this change it can be done later.
Neil
Regards, Simon
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#1378): https://groups.io/g/u-boot-amlogic/message/1378 Mute This Topic: https://groups.io/mt/95651322/900740 Group Owner: u-boot-amlogic+owner@groups.io Unsubscribe: https://groups.io/g/u-boot-amlogic/unsub [neil.armstrong@linaro.org] -=-=-=-=-=-=-=-=-=-=-=-

It is incorrect to keep commands in the arch/ folder.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru --- MAINTAINERS | 1 + arch/arm/mach-meson/sm.c | 144 ------------------------------------ cmd/Kconfig | 7 ++ cmd/Makefile | 3 + cmd/meson/Makefile | 5 ++ cmd/meson/sm.c | 154 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 170 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..1a3a2c7920a --- /dev/null +++ b/cmd/meson/sm.c @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2022, SberDevices. All rights reserved. + * + * Author: Alexey Romanov avromanov@sberdevices.ru + */ + +#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" +);

On Tue, Dec 13, 2022 at 21:31, Alexey Romanov avromanov@sberdevices.ru wrote:
It is incorrect to keep commands in the arch/ folder.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru
MAINTAINERS | 1 + arch/arm/mach-meson/sm.c | 144 ------------------------------------ cmd/Kconfig | 7 ++ cmd/Makefile | 3 + cmd/meson/Makefile | 5 ++ cmd/meson/sm.c | 154 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 170 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..1a3a2c7920a --- /dev/null +++ b/cmd/meson/sm.c @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Copyright (c) 2022, SberDevices. All rights reserved.
- Author: Alexey Romanov avromanov@sberdevices.ru
Sorry to be pedantic, but since we moved a lot of code from arch/arm/mach-meson/ here, shouldn't we keep the copyright from that file as well?
In other words, keep the following line:
(C) Copyright 2016 Beniamino Galvani b.galvani@gmail.com
With that, please add
Reviewed-by: Mattijs Korpershoek mkorpershoek@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"
+);
2.25.1

On Wed, Dec 14, 2022 at 11:33:35AM +0100, Mattijs Korpershoek wrote:
On Tue, Dec 13, 2022 at 21:31, Alexey Romanov avromanov@sberdevices.ru wrote:
It is incorrect to keep commands in the arch/ folder.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru
MAINTAINERS | 1 + arch/arm/mach-meson/sm.c | 144 ------------------------------------ cmd/Kconfig | 7 ++ cmd/Makefile | 3 + cmd/meson/Makefile | 5 ++ cmd/meson/sm.c | 154 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 170 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..1a3a2c7920a --- /dev/null +++ b/cmd/meson/sm.c @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Copyright (c) 2022, SberDevices. All rights reserved.
- Author: Alexey Romanov avromanov@sberdevices.ru
Sorry to be pedantic, but since we moved a lot of code from arch/arm/mach-meson/ here, shouldn't we keep the copyright from that file as well?
In other words, keep the following line:
(C) Copyright 2016 Beniamino Galvani b.galvani@gmail.com
With that, please add
Reviewed-by: Mattijs Korpershoek mkorpershoek@baylibre.com
Sure. I'll fix it in the v3 patchest. Thank you.
- */
+#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"
+);
2.25.1

On 14/12/2022 11:33, Mattijs Korpershoek wrote:
On Tue, Dec 13, 2022 at 21:31, Alexey Romanov avromanov@sberdevices.ru wrote:
It is incorrect to keep commands in the arch/ folder.
Signed-off-by: Alexey Romanov avromanov@sberdevices.ru
MAINTAINERS | 1 + arch/arm/mach-meson/sm.c | 144 ------------------------------------ cmd/Kconfig | 7 ++ cmd/Makefile | 3 + cmd/meson/Makefile | 5 ++ cmd/meson/sm.c | 154 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 170 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..1a3a2c7920a --- /dev/null +++ b/cmd/meson/sm.c @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: GPL-2.0+ +/*
- Copyright (c) 2022, SberDevices. All rights reserved.
- Author: Alexey Romanov avromanov@sberdevices.ru
Sorry to be pedantic, but since we moved a lot of code from arch/arm/mach-meson/ here, shouldn't we keep the copyright from that file as well?
In other words, keep the following line:
(C) Copyright 2016 Beniamino Galvani b.galvani@gmail.com
Well no really, the moved code was added by Vyacheslav (efuse rd/wr) & me (Serial & reboot reason), so I don't know what to add !
Neil
With that, please add
Reviewed-by: Mattijs Korpershoek mkorpershoek@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"
+);
2.25.1
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#1379): https://groups.io/g/u-boot-amlogic/message/1379 Mute This Topic: https://groups.io/mt/95651323/900740 Group Owner: u-boot-amlogic+owner@groups.io Unsubscribe: https://groups.io/g/u-boot-amlogic/unsub [neil.armstrong@linaro.org] -=-=-=-=-=-=-=-=-=-=-=-

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 --- cmd/meson/sm.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-)
diff --git a/cmd/meson/sm.c b/cmd/meson/sm.c index 1a3a2c7920a..9493f4fd846 100644 --- a/cmd/meson/sm.c +++ b/cmd/meson/sm.c @@ -117,11 +117,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, @@ -150,5 +182,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" );

Hi Alexey,
On Tue, 13 Dec 2022 at 10:31, Alexey Romanov avromanov@sberdevices.ru wrote:
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 (3): asm/arch-meson: add missing meson_sm_write_efuse signature arm/mach-meson: move smc commands in cmd/meson cmd/arm: meson: sm: introduce efusedump command
MAINTAINERS | 1 + arch/arm/include/asm/arch-meson/sm.h | 2 + arch/arm/mach-meson/sm.c | 144 --------------------- cmd/Kconfig | 7 + cmd/Makefile | 3 + cmd/meson/Makefile | 5 + cmd/meson/sm.c | 187 +++++++++++++++++++++++++++ 7 files changed, 205 insertions(+), 144 deletions(-) create mode 100644 cmd/meson/Makefile create mode 100644 cmd/meson/sm.c
-- 2.25.1
It might be a good time to add some documentation in doc/usage/cmd/meson ?
Regards, Simon

Hello!
On Tue, Dec 13, 2022 at 08:39:43PM -0800, Simon Glass wrote:
Hi Alexey,
On Tue, 13 Dec 2022 at 10:31, Alexey Romanov avromanov@sberdevices.ru wrote:
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 (3): asm/arch-meson: add missing meson_sm_write_efuse signature arm/mach-meson: move smc commands in cmd/meson cmd/arm: meson: sm: introduce efusedump command
MAINTAINERS | 1 + arch/arm/include/asm/arch-meson/sm.h | 2 + arch/arm/mach-meson/sm.c | 144 --------------------- cmd/Kconfig | 7 + cmd/Makefile | 3 + cmd/meson/Makefile | 5 + cmd/meson/sm.c | 187 +++++++++++++++++++++++++++ 7 files changed, 205 insertions(+), 144 deletions(-) create mode 100644 cmd/meson/Makefile create mode 100644 cmd/meson/sm.c
-- 2.25.1
It might be a good time to add some documentation in doc/usage/cmd/meson ?
Regards, Simon
Yeah, I'll add docs in v3 patchest.
participants (5)
-
Alexey Romanov
-
Alexey Romanov
-
Mattijs Korpershoek
-
Neil Armstrong
-
Simon Glass