Merge tag 'printk-for-5.19-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / tools / include / linux / arm-smccc.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (c) 2015, Linaro Limited
4  */
5 #ifndef __LINUX_ARM_SMCCC_H
6 #define __LINUX_ARM_SMCCC_H
7
8 #include <linux/const.h>
9
10 /*
11  * This file provides common defines for ARM SMC Calling Convention as
12  * specified in
13  * https://developer.arm.com/docs/den0028/latest
14  *
15  * This code is up-to-date with version DEN 0028 C
16  */
17
18 #define ARM_SMCCC_STD_CALL              _AC(0,U)
19 #define ARM_SMCCC_FAST_CALL             _AC(1,U)
20 #define ARM_SMCCC_TYPE_SHIFT            31
21
22 #define ARM_SMCCC_SMC_32                0
23 #define ARM_SMCCC_SMC_64                1
24 #define ARM_SMCCC_CALL_CONV_SHIFT       30
25
26 #define ARM_SMCCC_OWNER_MASK            0x3F
27 #define ARM_SMCCC_OWNER_SHIFT           24
28
29 #define ARM_SMCCC_FUNC_MASK             0xFFFF
30
31 #define ARM_SMCCC_IS_FAST_CALL(smc_val) \
32         ((smc_val) & (ARM_SMCCC_FAST_CALL << ARM_SMCCC_TYPE_SHIFT))
33 #define ARM_SMCCC_IS_64(smc_val) \
34         ((smc_val) & (ARM_SMCCC_SMC_64 << ARM_SMCCC_CALL_CONV_SHIFT))
35 #define ARM_SMCCC_FUNC_NUM(smc_val)     ((smc_val) & ARM_SMCCC_FUNC_MASK)
36 #define ARM_SMCCC_OWNER_NUM(smc_val) \
37         (((smc_val) >> ARM_SMCCC_OWNER_SHIFT) & ARM_SMCCC_OWNER_MASK)
38
39 #define ARM_SMCCC_CALL_VAL(type, calling_convention, owner, func_num) \
40         (((type) << ARM_SMCCC_TYPE_SHIFT) | \
41         ((calling_convention) << ARM_SMCCC_CALL_CONV_SHIFT) | \
42         (((owner) & ARM_SMCCC_OWNER_MASK) << ARM_SMCCC_OWNER_SHIFT) | \
43         ((func_num) & ARM_SMCCC_FUNC_MASK))
44
45 #define ARM_SMCCC_OWNER_ARCH            0
46 #define ARM_SMCCC_OWNER_CPU             1
47 #define ARM_SMCCC_OWNER_SIP             2
48 #define ARM_SMCCC_OWNER_OEM             3
49 #define ARM_SMCCC_OWNER_STANDARD        4
50 #define ARM_SMCCC_OWNER_STANDARD_HYP    5
51 #define ARM_SMCCC_OWNER_VENDOR_HYP      6
52 #define ARM_SMCCC_OWNER_TRUSTED_APP     48
53 #define ARM_SMCCC_OWNER_TRUSTED_APP_END 49
54 #define ARM_SMCCC_OWNER_TRUSTED_OS      50
55 #define ARM_SMCCC_OWNER_TRUSTED_OS_END  63
56
57 #define ARM_SMCCC_FUNC_QUERY_CALL_UID  0xff01
58
59 #define ARM_SMCCC_QUIRK_NONE            0
60 #define ARM_SMCCC_QUIRK_QCOM_A6         1 /* Save/restore register a6 */
61
62 #define ARM_SMCCC_VERSION_1_0           0x10000
63 #define ARM_SMCCC_VERSION_1_1           0x10001
64 #define ARM_SMCCC_VERSION_1_2           0x10002
65 #define ARM_SMCCC_VERSION_1_3           0x10003
66
67 #define ARM_SMCCC_1_3_SVE_HINT          0x10000
68
69 #define ARM_SMCCC_VERSION_FUNC_ID                                       \
70         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                         \
71                            ARM_SMCCC_SMC_32,                            \
72                            0, 0)
73
74 #define ARM_SMCCC_ARCH_FEATURES_FUNC_ID                                 \
75         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                         \
76                            ARM_SMCCC_SMC_32,                            \
77                            0, 1)
78
79 #define ARM_SMCCC_ARCH_SOC_ID                                           \
80         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                         \
81                            ARM_SMCCC_SMC_32,                            \
82                            0, 2)
83
84 #define ARM_SMCCC_ARCH_WORKAROUND_1                                     \
85         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                         \
86                            ARM_SMCCC_SMC_32,                            \
87                            0, 0x8000)
88
89 #define ARM_SMCCC_ARCH_WORKAROUND_2                                     \
90         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                         \
91                            ARM_SMCCC_SMC_32,                            \
92                            0, 0x7fff)
93
94 #define ARM_SMCCC_ARCH_WORKAROUND_3                                     \
95         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                         \
96                            ARM_SMCCC_SMC_32,                            \
97                            0, 0x3fff)
98
99 #define ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID                           \
100         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                         \
101                            ARM_SMCCC_SMC_32,                            \
102                            ARM_SMCCC_OWNER_VENDOR_HYP,                  \
103                            ARM_SMCCC_FUNC_QUERY_CALL_UID)
104
105 /* KVM UID value: 28b46fb6-2ec5-11e9-a9ca-4b564d003a74 */
106 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0      0xb66fb428U
107 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1      0xe911c52eU
108 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2      0x564bcaa9U
109 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3      0x743a004dU
110
111 /* KVM "vendor specific" services */
112 #define ARM_SMCCC_KVM_FUNC_FEATURES             0
113 #define ARM_SMCCC_KVM_FUNC_PTP                  1
114 #define ARM_SMCCC_KVM_FUNC_FEATURES_2           127
115 #define ARM_SMCCC_KVM_NUM_FUNCS                 128
116
117 #define ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID                       \
118         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                         \
119                            ARM_SMCCC_SMC_32,                            \
120                            ARM_SMCCC_OWNER_VENDOR_HYP,                  \
121                            ARM_SMCCC_KVM_FUNC_FEATURES)
122
123 #define SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED    1
124
125 /*
126  * ptp_kvm is a feature used for time sync between vm and host.
127  * ptp_kvm module in guest kernel will get service from host using
128  * this hypercall ID.
129  */
130 #define ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID                            \
131         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                         \
132                            ARM_SMCCC_SMC_32,                            \
133                            ARM_SMCCC_OWNER_VENDOR_HYP,                  \
134                            ARM_SMCCC_KVM_FUNC_PTP)
135
136 /* ptp_kvm counter type ID */
137 #define KVM_PTP_VIRT_COUNTER                    0
138 #define KVM_PTP_PHYS_COUNTER                    1
139
140 /* Paravirtualised time calls (defined by ARM DEN0057A) */
141 #define ARM_SMCCC_HV_PV_TIME_FEATURES                           \
142         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                 \
143                            ARM_SMCCC_SMC_64,                    \
144                            ARM_SMCCC_OWNER_STANDARD_HYP,        \
145                            0x20)
146
147 #define ARM_SMCCC_HV_PV_TIME_ST                                 \
148         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                 \
149                            ARM_SMCCC_SMC_64,                    \
150                            ARM_SMCCC_OWNER_STANDARD_HYP,        \
151                            0x21)
152
153 /* TRNG entropy source calls (defined by ARM DEN0098) */
154 #define ARM_SMCCC_TRNG_VERSION                                  \
155         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                 \
156                            ARM_SMCCC_SMC_32,                    \
157                            ARM_SMCCC_OWNER_STANDARD,            \
158                            0x50)
159
160 #define ARM_SMCCC_TRNG_FEATURES                                 \
161         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                 \
162                            ARM_SMCCC_SMC_32,                    \
163                            ARM_SMCCC_OWNER_STANDARD,            \
164                            0x51)
165
166 #define ARM_SMCCC_TRNG_GET_UUID                                 \
167         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                 \
168                            ARM_SMCCC_SMC_32,                    \
169                            ARM_SMCCC_OWNER_STANDARD,            \
170                            0x52)
171
172 #define ARM_SMCCC_TRNG_RND32                                    \
173         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                 \
174                            ARM_SMCCC_SMC_32,                    \
175                            ARM_SMCCC_OWNER_STANDARD,            \
176                            0x53)
177
178 #define ARM_SMCCC_TRNG_RND64                                    \
179         ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,                 \
180                            ARM_SMCCC_SMC_64,                    \
181                            ARM_SMCCC_OWNER_STANDARD,            \
182                            0x53)
183
184 /*
185  * Return codes defined in ARM DEN 0070A
186  * ARM DEN 0070A is now merged/consolidated into ARM DEN 0028 C
187  */
188 #define SMCCC_RET_SUCCESS                       0
189 #define SMCCC_RET_NOT_SUPPORTED                 -1
190 #define SMCCC_RET_NOT_REQUIRED                  -2
191 #define SMCCC_RET_INVALID_PARAMETER             -3
192
193 #endif /*__LINUX_ARM_SMCCC_H*/