On 10/16/23 16:11, Thomas Richard wrote:
From: Gregory CLEMENT <gregory.clem...@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.clem...@bootlin.com>
Signed-off-by: Thomas Richard <thomas.rich...@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);

Suspend exists on other architectures, too. E.g. OpenSBI provides an
implementation for RISC-V. It would be preferable to add suspend as a
value to enum enum sysreset_t. Then that functionality can be
implemented in sysreset_psci.c sysreset_sbi.c, and others.

The command should simply be called 'suspend'.

Best regards

Heinrich

+
+       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[]);

Reply via email to