[PATCH 9/9] cmd: test_enter_suspend: Add test_enter_suspend command
Thomas Richard
thomas.richard at bootlin.com
Mon Oct 16 16:11:35 CEST 2023
From: Gregory CLEMENT <gregory.clement at bootlin.com>
Add test_enter_suspend command using PSCI.
This command is only to test suspend sequence from U-Boot.
The resume will not work.
Signed-off-by: Gregory CLEMENT <gregory.clement at bootlin.com>
Signed-off-by: Thomas Richard <thomas.richard at bootlin.com>
---
cmd/Kconfig | 7 +++++++
cmd/boot.c | 8 ++++++++
drivers/firmware/psci.c | 23 +++++++++++++++++++++++
include/command.h | 2 ++
4 files changed, 40 insertions(+)
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 43ca10f69c..54e7d4b0e6 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1450,6 +1450,13 @@ config CMD_POWEROFF
help
Poweroff/Shutdown the system
+config CMD_TEST_ENTER_SUSPEND
+ bool "test enter suspend"
+ depends on ARM
+ select ARM_SMCCC
+ help
+ Command to test the suspend sequence (only for test)
+
config CMD_READ
bool "read - Read binary data from a partition"
help
diff --git a/cmd/boot.c b/cmd/boot.c
index 14839c1ced..609c07a5a5 100644
--- a/cmd/boot.c
+++ b/cmd/boot.c
@@ -70,3 +70,11 @@ U_BOOT_CMD(
""
);
#endif
+
+#if IS_ENABLED(CONFIG_CMD_TEST_ENTER_SUSPEND)
+U_BOOT_CMD(
+ test_enter_suspend, 1, 0, do_test_enter_suspend,
+ "Test the enter SUSPEND sequence of the device",
+ ""
+);
+#endif
diff --git a/drivers/firmware/psci.c b/drivers/firmware/psci.c
index c6b9efab41..591ad1869d 100644
--- a/drivers/firmware/psci.c
+++ b/drivers/firmware/psci.c
@@ -23,6 +23,9 @@
#include <linux/libfdt.h>
#include <linux/printk.h>
#include <linux/psci.h>
+#if IS_ENABLED(CONFIG_CMD_TEST_ENTER_SUSPEND)
+#include <cpu_func.h>
+#endif
#define DRIVER_NAME "psci"
@@ -303,6 +306,26 @@ int do_poweroff(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
}
#endif
+#if IS_ENABLED(CONFIG_CMD_TEST_ENTER_SUSPEND)
+int do_test_enter_suspend(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+ do_psci_probe();
+
+ puts("suspend ...\n");
+ puts("disable dcache\n");
+
+ dcache_disable();
+
+ /* ARM_PSCI_1_0_FN64_SYSTEM_SUSPEND */
+ invoke_psci_fn(PSCI_0_2_FN64(14), (unsigned long)do_test_enter_suspend, 0, 0);
+
+ dcache_enable();
+
+ log_err("Suspend failed or not supported on this platform\n");
+ return CMD_RET_FAILURE;
+}
+#endif
+
static const struct udevice_id psci_of_match[] = {
{ .compatible = "arm,psci" },
{ .compatible = "arm,psci-0.2" },
diff --git a/include/command.h b/include/command.h
index c4e3170967..0126da6b37 100644
--- a/include/command.h
+++ b/include/command.h
@@ -177,6 +177,8 @@ int do_reset(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[]);
int do_poweroff(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[]);
+int do_test_enter_suspend(struct cmd_tbl *cmdtp, int flag, int argc,
+ char *const argv[]);
unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc,
char *const argv[]);
--
2.39.2
More information about the U-Boot
mailing list