arm: implement generic PSCI reset call for armv8

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>
This commit is contained in:
Beniamino Galvani 2016-05-08 08:30:14 +02:00 committed by Tom Rini
parent 20898ea934
commit 5a07abb370
3 changed files with 34 additions and 1 deletions

View 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)
;
}

View 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))
@ -32,6 +32,21 @@
#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);

View 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 */