* [PATCH v2 0/3] arch-meson: introduce efusedump command
@ 2022-12-13 18:31 ` Alexey Romanov
0 siblings, 0 replies; 18+ messages in thread
From: Alexey Romanov @ 2022-12-13 18:31 UTC (permalink / raw)
To: narmstrong, trini; +Cc: u-boot-amlogic, u-boot, kernel, Alexey Romanov
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
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 0/3] arch-meson: introduce efusedump command
@ 2022-12-13 18:31 ` Alexey Romanov
0 siblings, 0 replies; 18+ messages in thread
From: Alexey Romanov @ 2022-12-13 18:31 UTC (permalink / raw)
To: narmstrong, trini; +Cc: u-boot-amlogic, u-boot, kernel, Alexey Romanov
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
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v2 1/3] asm/arch-meson: add missing meson_sm_write_efuse signature
2022-12-13 18:31 ` Alexey Romanov
@ 2022-12-13 18:31 ` Alexey Romanov
-1 siblings, 0 replies; 18+ messages in thread
From: Alexey Romanov @ 2022-12-13 18:31 UTC (permalink / raw)
To: narmstrong, trini; +Cc: u-boot-amlogic, u-boot, kernel, Alexey Romanov
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
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 1/3] asm/arch-meson: add missing meson_sm_write_efuse signature
@ 2022-12-13 18:31 ` Alexey Romanov
0 siblings, 0 replies; 18+ messages in thread
From: Alexey Romanov @ 2022-12-13 18:31 UTC (permalink / raw)
To: narmstrong, trini; +Cc: u-boot-amlogic, u-boot, kernel, Alexey Romanov
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
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 2/3] arm/mach-meson: move smc commands in cmd/meson
2022-12-13 18:31 ` Alexey Romanov
@ 2022-12-13 18:31 ` Alexey Romanov
-1 siblings, 0 replies; 18+ messages in thread
From: Alexey Romanov @ 2022-12-13 18:31 UTC (permalink / raw)
To: narmstrong, trini; +Cc: u-boot-amlogic, u-boot, kernel, Alexey Romanov
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"
+);
--
2.25.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 2/3] arm/mach-meson: move smc commands in cmd/meson
@ 2022-12-13 18:31 ` Alexey Romanov
0 siblings, 0 replies; 18+ messages in thread
From: Alexey Romanov @ 2022-12-13 18:31 UTC (permalink / raw)
To: narmstrong, trini; +Cc: u-boot-amlogic, u-boot, kernel, Alexey Romanov
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"
+);
--
2.25.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 3/3] cmd/arm: meson: sm: introduce efusedump command
2022-12-13 18:31 ` Alexey Romanov
@ 2022-12-13 18:31 ` Alexey Romanov
-1 siblings, 0 replies; 18+ messages in thread
From: Alexey Romanov @ 2022-12-13 18:31 UTC (permalink / raw)
To: narmstrong, trini; +Cc: u-boot-amlogic, u-boot, kernel, Alexey Romanov
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"
);
--
2.25.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v2 3/3] cmd/arm: meson: sm: introduce efusedump command
@ 2022-12-13 18:31 ` Alexey Romanov
0 siblings, 0 replies; 18+ messages in thread
From: Alexey Romanov @ 2022-12-13 18:31 UTC (permalink / raw)
To: narmstrong, trini; +Cc: u-boot-amlogic, u-boot, kernel, Alexey Romanov
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"
);
--
2.25.1
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v2 0/3] arch-meson: introduce efusedump command
2022-12-13 18:31 ` Alexey Romanov
` (3 preceding siblings ...)
(?)
@ 2022-12-14 4:39 ` Simon Glass
2022-12-14 11:16 ` Alexey Romanov
-1 siblings, 1 reply; 18+ messages in thread
From: Simon Glass @ 2022-12-14 4:39 UTC (permalink / raw)
To: Alexey Romanov; +Cc: narmstrong, trini, u-boot-amlogic, u-boot, kernel
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
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 1/3] asm/arch-meson: add missing meson_sm_write_efuse signature
2022-12-13 18:31 ` Alexey Romanov
(?)
@ 2022-12-14 4:39 ` Simon Glass
2022-12-14 11:14 ` Alexey Romanov
2022-12-14 14:53 ` Neil Armstrong
-1 siblings, 2 replies; 18+ messages in thread
From: Simon Glass @ 2022-12-14 4:39 UTC (permalink / raw)
To: Alexey Romanov; +Cc: narmstrong, trini, u-boot-amlogic, u-boot, kernel
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
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/3] arm/mach-meson: move smc commands in cmd/meson
2022-12-13 18:31 ` Alexey Romanov
(?)
@ 2022-12-14 10:33 ` Mattijs Korpershoek
2022-12-14 11:11 ` Alexey Romanov
2022-12-14 14:52 ` Neil Armstrong
-1 siblings, 2 replies; 18+ messages in thread
From: Mattijs Korpershoek @ 2022-12-14 10:33 UTC (permalink / raw)
To: Alexey Romanov, narmstrong, trini
Cc: u-boot-amlogic, u-boot, kernel, Alexey Romanov
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
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/3] arm/mach-meson: move smc commands in cmd/meson
2022-12-14 10:33 ` Mattijs Korpershoek
@ 2022-12-14 11:11 ` Alexey Romanov
2022-12-14 14:52 ` Neil Armstrong
1 sibling, 0 replies; 18+ messages in thread
From: Alexey Romanov @ 2022-12-14 11:11 UTC (permalink / raw)
To: Mattijs Korpershoek; +Cc: narmstrong, trini, u-boot-amlogic, u-boot, kernel
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
--
Thank you,
Alexey
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 1/3] asm/arch-meson: add missing meson_sm_write_efuse signature
2022-12-14 4:39 ` Simon Glass
@ 2022-12-14 11:14 ` Alexey Romanov
2022-12-14 14:53 ` Neil Armstrong
1 sibling, 0 replies; 18+ messages in thread
From: Alexey Romanov @ 2022-12-14 11:14 UTC (permalink / raw)
To: Simon Glass; +Cc: narmstrong, trini, u-boot-amlogic, u-boot, kernel
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.
--
Thank you,
Alexey
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 0/3] arch-meson: introduce efusedump command
2022-12-14 4:39 ` [PATCH v2 0/3] arch-meson: " Simon Glass
@ 2022-12-14 11:16 ` Alexey Romanov
0 siblings, 0 replies; 18+ messages in thread
From: Alexey Romanov @ 2022-12-14 11:16 UTC (permalink / raw)
To: Simon Glass; +Cc: narmstrong, trini, u-boot-amlogic, u-boot, kernel
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.
--
Thank you,
Alexey
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/3] arm/mach-meson: move smc commands in cmd/meson
2022-12-14 10:33 ` Mattijs Korpershoek
@ 2022-12-14 14:52 ` Neil Armstrong
2022-12-14 14:52 ` Neil Armstrong
1 sibling, 0 replies; 18+ messages in thread
From: Neil Armstrong @ 2022-12-14 14:52 UTC (permalink / raw)
To: u-boot-amlogic, mkorpershoek, Alexey Romanov, narmstrong, trini
Cc: u-boot, kernel
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
>> + 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>
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]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 2/3] arm/mach-meson: move smc commands in cmd/meson
@ 2022-12-14 14:52 ` Neil Armstrong
0 siblings, 0 replies; 18+ messages in thread
From: Neil Armstrong @ 2022-12-14 14:52 UTC (permalink / raw)
To: u-boot-amlogic, mkorpershoek, Alexey Romanov, narmstrong, trini
Cc: u-boot, kernel
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
>> + 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>
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
>
>
>
>
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 1/3] asm/arch-meson: add missing meson_sm_write_efuse signature
2022-12-14 4:39 ` Simon Glass
@ 2022-12-14 14:53 ` Neil Armstrong
2022-12-14 14:53 ` Neil Armstrong
1 sibling, 0 replies; 18+ messages in thread
From: Neil Armstrong @ 2022-12-14 14:53 UTC (permalink / raw)
To: u-boot-amlogic, sjg, Alexey Romanov; +Cc: narmstrong, trini, u-boot, kernel
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]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v2 1/3] asm/arch-meson: add missing meson_sm_write_efuse signature
@ 2022-12-14 14:53 ` Neil Armstrong
0 siblings, 0 replies; 18+ messages in thread
From: Neil Armstrong @ 2022-12-14 14:53 UTC (permalink / raw)
To: u-boot-amlogic, sjg, Alexey Romanov; +Cc: narmstrong, trini, u-boot, kernel
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
>
>
>
>
>
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2022-12-14 14:53 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-13 18:31 [PATCH v2 0/3] arch-meson: introduce efusedump command Alexey Romanov
2022-12-13 18:31 ` Alexey Romanov
2022-12-13 18:31 ` [PATCH v2 1/3] asm/arch-meson: add missing meson_sm_write_efuse signature Alexey Romanov
2022-12-13 18:31 ` Alexey Romanov
2022-12-14 4:39 ` Simon Glass
2022-12-14 11:14 ` Alexey Romanov
2022-12-14 14:53 ` Neil Armstrong
2022-12-14 14:53 ` Neil Armstrong
2022-12-13 18:31 ` [PATCH v2 2/3] arm/mach-meson: move smc commands in cmd/meson Alexey Romanov
2022-12-13 18:31 ` Alexey Romanov
2022-12-14 10:33 ` Mattijs Korpershoek
2022-12-14 11:11 ` Alexey Romanov
2022-12-14 14:52 ` Neil Armstrong
2022-12-14 14:52 ` Neil Armstrong
2022-12-13 18:31 ` [PATCH v2 3/3] cmd/arm: meson: sm: introduce efusedump command Alexey Romanov
2022-12-13 18:31 ` Alexey Romanov
2022-12-14 4:39 ` [PATCH v2 0/3] arch-meson: " Simon Glass
2022-12-14 11:16 ` Alexey Romanov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.