arm: implement generic PSCI reset call for armv8
authorBeniamino Galvani <b.galvani@gmail.com>
Sun, 8 May 2016 06:30:14 +0000 (08:30 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 27 May 2016 19:39:46 +0000 (15:39 -0400)
Add a psci_system_reset() which calls the SYSTEM_RESET function of
PSCI 0.2 and can be used by boards that support it to implement
reset_cpu().

Signed-off-by: Beniamino Galvani <b.galvani@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/arm/cpu/armv8/fwcall.c
arch/arm/include/asm/psci.h
arch/arm/include/asm/system.h

index 9efcc5ada9176772895ade3ea36609ba2861fbd7..079e250cbe995d4f09de60f394e3a3d73e7492bf 100644 (file)
@@ -8,6 +8,7 @@
 #include <config.h>
 #include <version.h>
 #include <asm/macro.h>
+#include <asm/psci.h>
 #include <asm/system.h>
 
 /*
@@ -73,3 +74,18 @@ void smc_call(struct pt_regs *args)
                  "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
                  "x16", "x17");
 }
+
+void __noreturn psci_system_reset(bool conduit_smc)
+{
+       struct pt_regs regs;
+
+       regs.regs[0] = ARM_PSCI_0_2_FN_SYSTEM_RESET;
+
+       if (conduit_smc)
+               smc_call(&regs);
+       else
+               hvc_call(&regs);
+
+       while (1)
+               ;
+}
index 128a606444fed668b914eca9e14d407829a8a379..3704f077b007b45c14b47c3894962ff18a2feefb 100644 (file)
@@ -18,7 +18,7 @@
 #ifndef __ARM_PSCI_H__
 #define __ARM_PSCI_H__
 
-/* PSCI interface */
+/* PSCI 0.1 interface */
 #define ARM_PSCI_FN_BASE               0x95c1ba5e
 #define ARM_PSCI_FN(n)                 (ARM_PSCI_FN_BASE + (n))
 
 #define ARM_PSCI_RET_INVAL             (-2)
 #define ARM_PSCI_RET_DENIED            (-3)
 
+/* PSCI 0.2 interface */
+#define ARM_PSCI_0_2_FN_BASE                   0x84000000
+#define ARM_PSCI_0_2_FN(n)                     (ARM_PSCI_0_2_FN_BASE + (n))
+
+#define ARM_PSCI_0_2_FN_PSCI_VERSION           ARM_PSCI_0_2_FN(0)
+#define ARM_PSCI_0_2_FN_CPU_SUSPEND            ARM_PSCI_0_2_FN(1)
+#define ARM_PSCI_0_2_FN_CPU_OFF                        ARM_PSCI_0_2_FN(2)
+#define ARM_PSCI_0_2_FN_CPU_ON                 ARM_PSCI_0_2_FN(3)
+#define ARM_PSCI_0_2_FN_AFFINITY_INFO          ARM_PSCI_0_2_FN(4)
+#define ARM_PSCI_0_2_FN_MIGRATE                        ARM_PSCI_0_2_FN(5)
+#define ARM_PSCI_0_2_FN_MIGRATE_INFO_TYPE      ARM_PSCI_0_2_FN(6)
+#define ARM_PSCI_0_2_FN_MIGRATE_INFO_UP_CPU    ARM_PSCI_0_2_FN(7)
+#define ARM_PSCI_0_2_FN_SYSTEM_OFF             ARM_PSCI_0_2_FN(8)
+#define ARM_PSCI_0_2_FN_SYSTEM_RESET           ARM_PSCI_0_2_FN(9)
+
 #ifndef __ASSEMBLY__
 int psci_update_dt(void *fdt);
 void psci_board_init(void);
index 9ae890a830387b8690e6fe01e677e0d2d45e5bf1..2bdc0bec824e1c81dc358f1cf1955717e37cb0db 100644 (file)
@@ -128,6 +128,8 @@ void hvc_call(struct pt_regs *args);
  */
 void smc_call(struct pt_regs *args);
 
+void __noreturn psci_system_reset(bool smc);
+
 #endif /* __ASSEMBLY__ */
 
 #else /* CONFIG_ARM64 */