xref: /optee_os/core/arch/arm/include/sm/psci.h (revision 62d8e0e8447138133f8e09bb7e52dba0d6dabf6b)
12441aaf0SEtienne Carriere /* SPDX-License-Identifier: BSD-2-Clause */
22441aaf0SEtienne Carriere /*
32441aaf0SEtienne Carriere  * Copyright (c) 2017-2023, Linaro Limited
42441aaf0SEtienne Carriere  */
5*62d8e0e8SEtienne Carriere #ifndef __SM_PSCI_H
6*62d8e0e8SEtienne Carriere #define __SM_PSCI_H
7*62d8e0e8SEtienne Carriere 
8319556cdSPeng Fan #include <kernel/thread.h>
91b181fb2SPeng Fan #include <sm/sm.h>
10319556cdSPeng Fan #include <stdint.h>
11319556cdSPeng Fan 
124a6784caSJens Wiklander #define PSCI_VERSION_0_2		U(0x00000002)
134a6784caSJens Wiklander #define PSCI_VERSION_1_0		U(0x00010000)
149daed40cSIgor Opaniuk #define PSCI_VERSION_1_1		U(0x00010001)
15a83bf6deSIgor Opaniuk #define PSCI_VERSION			U(0x84000000)
16a83bf6deSIgor Opaniuk #define PSCI_CPU_SUSPEND		U(0x84000001)
17a83bf6deSIgor Opaniuk #define PSCI_CPU_OFF			U(0x84000002)
18a83bf6deSIgor Opaniuk #define PSCI_CPU_ON			U(0x84000003)
194a6784caSJens Wiklander #define PSCI_CPU_ON_SMC64		(PSCI_CPU_ON | U(0x40000000))
20a83bf6deSIgor Opaniuk #define PSCI_AFFINITY_INFO		U(0x84000004)
21a83bf6deSIgor Opaniuk #define PSCI_MIGRATE			U(0x84000005)
22a83bf6deSIgor Opaniuk #define PSCI_MIGRATE_INFO_TYPE		U(0x84000006)
23a83bf6deSIgor Opaniuk #define PSCI_MIGRATE_INFO_UP_CPU	U(0x84000007)
24a83bf6deSIgor Opaniuk #define PSCI_SYSTEM_OFF			U(0x84000008)
25a83bf6deSIgor Opaniuk #define PSCI_SYSTEM_RESET		U(0x84000009)
26a83bf6deSIgor Opaniuk #define PSCI_PSCI_FEATURES		U(0x8400000a)
27a83bf6deSIgor Opaniuk #define PSCI_CPU_FREEZE			U(0x8400000b)
28a83bf6deSIgor Opaniuk #define PSCI_CPU_DEFAULT_SUSPEND	U(0x8400000c)
29a83bf6deSIgor Opaniuk #define PSCI_NODE_HW_STATE		U(0x8400000d)
30a83bf6deSIgor Opaniuk #define PSCI_SYSTEM_SUSPEND		U(0x8400000e)
31a83bf6deSIgor Opaniuk #define PSCI_PSCI_SET_SUSPEND_MODE	U(0x8400000f)
32a83bf6deSIgor Opaniuk #define PSCI_FN_STAT_RESIDENCY		U(0x84000010)
33a83bf6deSIgor Opaniuk #define PSCI_FN_STAT_COUNT		U(0x84000011)
349daed40cSIgor Opaniuk #define PSCI_SYSTEM_RESET2		U(0x84000012)
359daed40cSIgor Opaniuk #define PSCI_MEM_PROTECT		U(0x84000013)
369daed40cSIgor Opaniuk #define PSCI_MEM_PROTECT_CHECK_RANGE	U(0x84000014)
37319556cdSPeng Fan 
389daed40cSIgor Opaniuk #define PSCI_NUM_CALLS			U(21)
39319556cdSPeng Fan 
404a6784caSJens Wiklander #define PSCI_AFFINITY_LEVEL_ON		U(0)
414a6784caSJens Wiklander #define PSCI_AFFINITY_LEVEL_OFF		U(1)
424a6784caSJens Wiklander #define PSCI_AFFINITY_LEVEL_ON_PENDING	U(2)
43319556cdSPeng Fan 
444a6784caSJens Wiklander #define PSCI_POWER_STATE_ID_MASK	U(0xffff)
454a6784caSJens Wiklander #define PSCI_POWER_STATE_ID_SHIFT	U(0)
464a6784caSJens Wiklander #define PSCI_POWER_STATE_TYPE_SHIFT	U(16)
47b3c4f4f5SPeng Fan #define PSCI_POWER_STATE_TYPE_MASK	BIT32(PSCI_POWER_STATE_TYPE_SHIFT)
484a6784caSJens Wiklander #define PSCI_POWER_STATE_AFFL_SHIFT	U(24)
49b3c4f4f5SPeng Fan #define PSCI_POWER_STATE_AFFL_MASK	SHIFT_U32(0x3, \
50b3c4f4f5SPeng Fan 						  PSCI_POWER_STATE_AFFL_SHIFT)
51b3c4f4f5SPeng Fan 
524a6784caSJens Wiklander #define PSCI_POWER_STATE_TYPE_STANDBY		U(0)
534a6784caSJens Wiklander #define PSCI_POWER_STATE_TYPE_POWER_DOWN	U(1)
54b3c4f4f5SPeng Fan 
55319556cdSPeng Fan #define PSCI_RET_SUCCESS		(0)
56319556cdSPeng Fan #define PSCI_RET_NOT_SUPPORTED		(-1)
57319556cdSPeng Fan #define PSCI_RET_INVALID_PARAMETERS	(-2)
58319556cdSPeng Fan #define PSCI_RET_DENIED			(-3)
59319556cdSPeng Fan #define PSCI_RET_ALREADY_ON		(-4)
60319556cdSPeng Fan #define PSCI_RET_ON_PENDING		(-5)
61319556cdSPeng Fan #define PSCI_RET_INTERNAL_FAILURE	(-6)
62319556cdSPeng Fan #define PSCI_RET_NOT_PRESENT		(-7)
63319556cdSPeng Fan #define PSCI_RET_DISABLED		(-8)
64319556cdSPeng Fan #define PSCI_RET_INVALID_ADDRESS	(-9)
65319556cdSPeng Fan 
66319556cdSPeng Fan uint32_t psci_version(void);
67319556cdSPeng Fan int psci_cpu_suspend(uint32_t power_state, uintptr_t entry,
681b181fb2SPeng Fan 		     uint32_t context_id, struct sm_nsec_ctx *nsec);
69319556cdSPeng Fan int psci_cpu_off(void);
70319556cdSPeng Fan int psci_cpu_on(uint32_t cpu_id, uint32_t entry, uint32_t context_id);
71319556cdSPeng Fan int psci_affinity_info(uint32_t affinity, uint32_t lowest_affnity_level);
72319556cdSPeng Fan int psci_migrate(uint32_t cpu_id);
73319556cdSPeng Fan int psci_migrate_info_type(void);
74319556cdSPeng Fan int psci_migrate_info_up_cpu(void);
75319556cdSPeng Fan void psci_system_off(void);
76319556cdSPeng Fan void psci_system_reset(void);
77319556cdSPeng Fan int psci_features(uint32_t psci_fid);
789daed40cSIgor Opaniuk int psci_system_reset2(uint32_t reset_type, uint32_t cookie);
799daed40cSIgor Opaniuk int psci_mem_protect(uint32_t enable);
809daed40cSIgor Opaniuk int psci_mem_chk_range(paddr_t base, size_t length);
81319556cdSPeng Fan int psci_node_hw_state(uint32_t cpu_id, uint32_t power_level);
82789e38a6SZeng Tao int psci_system_suspend(uintptr_t entry, uint32_t context_id,
83789e38a6SZeng Tao 			struct sm_nsec_ctx *nsec);
84319556cdSPeng Fan int psci_stat_residency(uint32_t cpu_id, uint32_t power_state);
85319556cdSPeng Fan int psci_stat_count(uint32_t cpu_id, uint32_t power_state);
861b181fb2SPeng Fan void tee_psci_handler(struct thread_smc_args *args, struct sm_nsec_ctx *nsec);
877ce47501SPeng Fan 
887ce47501SPeng Fan void psci_armv7_cpu_off(void);
89*62d8e0e8SEtienne Carriere #endif /* __SM_PSCI_H */
90