1 #ifndef __ASM_PSCI_H__
2 #define __ASM_PSCI_H__
3 
4 #include <asm/smccc.h>
5 
6 /* PSCI return values (inclusive of all PSCI versions) */
7 #define PSCI_SUCCESS                 0
8 #define PSCI_NOT_SUPPORTED          -1
9 #define PSCI_INVALID_PARAMETERS     -2
10 #define PSCI_DENIED                 -3
11 #define PSCI_ALREADY_ON             -4
12 #define PSCI_ON_PENDING             -5
13 #define PSCI_INTERNAL_FAILURE       -6
14 #define PSCI_NOT_PRESENT            -7
15 #define PSCI_DISABLED               -8
16 #define PSCI_INVALID_ADDRESS        -9
17 
18 /* availability of PSCI on the host for SMP bringup */
19 extern uint32_t psci_ver;
20 
21 int psci_init(void);
22 int call_psci_cpu_on(int cpu);
23 void call_psci_cpu_off(void);
24 void call_psci_system_off(void);
25 void call_psci_system_reset(void);
26 
27 /* Range of allocated PSCI function numbers */
28 #define	PSCI_FNUM_MIN_VALUE                 _AC(0,U)
29 #define	PSCI_FNUM_MAX_VALUE                 _AC(0x1f,U)
30 
31 /* PSCI v0.2 interface */
32 #define PSCI_0_2_FN32(nr) ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,             \
33                                              ARM_SMCCC_CONV_32,               \
34                                              ARM_SMCCC_OWNER_STANDARD,        \
35                                              nr)
36 #define PSCI_0_2_FN64(nr) ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,             \
37                                              ARM_SMCCC_CONV_64,               \
38                                              ARM_SMCCC_OWNER_STANDARD,        \
39                                              nr)
40 
41 #define PSCI_0_2_FN32_PSCI_VERSION        PSCI_0_2_FN32(0)
42 #define PSCI_0_2_FN32_CPU_SUSPEND         PSCI_0_2_FN32(1)
43 #define PSCI_0_2_FN32_CPU_OFF             PSCI_0_2_FN32(2)
44 #define PSCI_0_2_FN32_CPU_ON              PSCI_0_2_FN32(3)
45 #define PSCI_0_2_FN32_AFFINITY_INFO       PSCI_0_2_FN32(4)
46 #define PSCI_0_2_FN32_MIGRATE_INFO_TYPE   PSCI_0_2_FN32(6)
47 #define PSCI_0_2_FN32_SYSTEM_OFF          PSCI_0_2_FN32(8)
48 #define PSCI_0_2_FN32_SYSTEM_RESET        PSCI_0_2_FN32(9)
49 #define PSCI_1_0_FN32_PSCI_FEATURES       PSCI_0_2_FN32(10)
50 
51 #define PSCI_0_2_FN64_CPU_SUSPEND         PSCI_0_2_FN64(1)
52 #define PSCI_0_2_FN64_CPU_ON              PSCI_0_2_FN64(3)
53 #define PSCI_0_2_FN64_AFFINITY_INFO       PSCI_0_2_FN64(4)
54 
55 /* PSCI v0.2 affinity level state returned by AFFINITY_INFO */
56 #define PSCI_0_2_AFFINITY_LEVEL_ON      0
57 #define PSCI_0_2_AFFINITY_LEVEL_OFF     1
58 #define PSCI_0_2_AFFINITY_LEVEL_ON_PENDING  2
59 
60 /* PSCI v0.2 multicore support in Trusted OS returned by MIGRATE_INFO_TYPE */
61 #define PSCI_0_2_TOS_UP_MIGRATE_CAPABLE          0
62 #define PSCI_0_2_TOS_UP_NOT_MIGRATE_CAPABLE      1
63 #define PSCI_0_2_TOS_MP_OR_NOT_PRESENT           2
64 
65 /* PSCI v0.2 power state encoding for CPU_SUSPEND function */
66 #define PSCI_0_2_POWER_STATE_ID_MASK        0xffff
67 #define PSCI_0_2_POWER_STATE_ID_SHIFT       0
68 #define PSCI_0_2_POWER_STATE_TYPE_SHIFT     16
69 #define PSCI_0_2_POWER_STATE_TYPE_MASK      \
70                     (0x1 << PSCI_0_2_POWER_STATE_TYPE_SHIFT)
71 
72 /* PSCI version decoding (independent of PSCI version) */
73 #define PSCI_VERSION_MAJOR_SHIFT            16
74 #define PSCI_VERSION_MINOR_MASK             \
75         ((1U << PSCI_VERSION_MAJOR_SHIFT) - 1)
76 #define PSCI_VERSION_MAJOR_MASK             ~PSCI_VERSION_MINOR_MASK
77 #define PSCI_VERSION_MAJOR(ver)             \
78         (((ver) & PSCI_VERSION_MAJOR_MASK) >> PSCI_VERSION_MAJOR_SHIFT)
79 #define PSCI_VERSION_MINOR(ver)             \
80         ((ver) & PSCI_VERSION_MINOR_MASK)
81 
82 #define PSCI_VERSION(major, minor)          \
83     (((major) << PSCI_VERSION_MAJOR_SHIFT) | (minor))
84 
85 #endif /* __ASM_PSCI_H__ */
86 
87 /*
88  * Local variables:
89  * mode: C
90  * c-file-style: "BSD"
91  * c-basic-offset: 4
92  * tab-width: 4
93  * indent-tabs-mode: nil
94  * End:
95  */
96