blob: e6ba9eaaa0af38a22ac33570b063b0fa94d2b84e [file] [log] [blame] [edit]
/*
* Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: GPL-2.0-only
*/
#include <autoconf.h>
#include <elfloader/gen_config.h>
#include <printf.h>
#ifdef CONFIG_ARCH_AARCH64
#define SMC_FID_VER 0x84000000
#define SMC_FID_CPU_SUSPEND 0xc4000001
#define SMC_FID_CPU_OFF 0x84000002
#define SMC_FID_CPU_ON 0xc4000003
#define SMC_FID_SYSTEM_RESET 0x84000009
#else
#define SMC_FID_VER 0x80000000
#define SMC_FID_CPU_SUSPEND 0x80000001
#define SMC_FID_CPU_OFF 0x80000002
#define SMC_FID_CPU_ON 0x80000003
#define SMC_FID_SYSTEM_RESET 0x80000009
#endif
extern int psci_func(unsigned int id, unsigned long param1,
unsigned long param2, unsigned long param3);
int psci_version(void)
{
int ver = psci_func(SMC_FID_VER, 0, 0, 0);
return ver;
}
int psci_cpu_suspend(int power_state, unsigned long entry_point,
unsigned long context_id)
{
int ret = psci_func(SMC_FID_CPU_SUSPEND, power_state, entry_point, context_id);
return ret;
}
/* this function does not return when successful */
int psci_cpu_off(void)
{
int ret = psci_func(SMC_FID_CPU_OFF, 0, 0, 0);
return ret;
}
int psci_cpu_on(unsigned long target_cpu, unsigned long entry_point,
unsigned long context_id)
{
int ret = psci_func(SMC_FID_CPU_ON, target_cpu, entry_point, context_id);
return ret;
}
int psci_system_reset(void)
{
int ret = psci_func(SMC_FID_SYSTEM_RESET, 0, 0, 0);
return ret;
}