0001
0002
0003
0004
0005 #ifndef __LINUX_ARM_SMCCC_H
0006 #define __LINUX_ARM_SMCCC_H
0007
0008 #include <linux/const.h>
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #define ARM_SMCCC_STD_CALL _AC(0,U)
0019 #define ARM_SMCCC_FAST_CALL _AC(1,U)
0020 #define ARM_SMCCC_TYPE_SHIFT 31
0021
0022 #define ARM_SMCCC_SMC_32 0
0023 #define ARM_SMCCC_SMC_64 1
0024 #define ARM_SMCCC_CALL_CONV_SHIFT 30
0025
0026 #define ARM_SMCCC_OWNER_MASK 0x3F
0027 #define ARM_SMCCC_OWNER_SHIFT 24
0028
0029 #define ARM_SMCCC_FUNC_MASK 0xFFFF
0030
0031 #define ARM_SMCCC_IS_FAST_CALL(smc_val) \
0032 ((smc_val) & (ARM_SMCCC_FAST_CALL << ARM_SMCCC_TYPE_SHIFT))
0033 #define ARM_SMCCC_IS_64(smc_val) \
0034 ((smc_val) & (ARM_SMCCC_SMC_64 << ARM_SMCCC_CALL_CONV_SHIFT))
0035 #define ARM_SMCCC_FUNC_NUM(smc_val) ((smc_val) & ARM_SMCCC_FUNC_MASK)
0036 #define ARM_SMCCC_OWNER_NUM(smc_val) \
0037 (((smc_val) >> ARM_SMCCC_OWNER_SHIFT) & ARM_SMCCC_OWNER_MASK)
0038
0039 #define ARM_SMCCC_CALL_VAL(type, calling_convention, owner, func_num) \
0040 (((type) << ARM_SMCCC_TYPE_SHIFT) | \
0041 ((calling_convention) << ARM_SMCCC_CALL_CONV_SHIFT) | \
0042 (((owner) & ARM_SMCCC_OWNER_MASK) << ARM_SMCCC_OWNER_SHIFT) | \
0043 ((func_num) & ARM_SMCCC_FUNC_MASK))
0044
0045 #define ARM_SMCCC_OWNER_ARCH 0
0046 #define ARM_SMCCC_OWNER_CPU 1
0047 #define ARM_SMCCC_OWNER_SIP 2
0048 #define ARM_SMCCC_OWNER_OEM 3
0049 #define ARM_SMCCC_OWNER_STANDARD 4
0050 #define ARM_SMCCC_OWNER_STANDARD_HYP 5
0051 #define ARM_SMCCC_OWNER_VENDOR_HYP 6
0052 #define ARM_SMCCC_OWNER_TRUSTED_APP 48
0053 #define ARM_SMCCC_OWNER_TRUSTED_APP_END 49
0054 #define ARM_SMCCC_OWNER_TRUSTED_OS 50
0055 #define ARM_SMCCC_OWNER_TRUSTED_OS_END 63
0056
0057 #define ARM_SMCCC_FUNC_QUERY_CALL_UID 0xff01
0058
0059 #define ARM_SMCCC_QUIRK_NONE 0
0060 #define ARM_SMCCC_QUIRK_QCOM_A6 1
0061
0062 #define ARM_SMCCC_VERSION_1_0 0x10000
0063 #define ARM_SMCCC_VERSION_1_1 0x10001
0064 #define ARM_SMCCC_VERSION_1_2 0x10002
0065 #define ARM_SMCCC_VERSION_1_3 0x10003
0066
0067 #define ARM_SMCCC_1_3_SVE_HINT 0x10000
0068
0069 #define ARM_SMCCC_VERSION_FUNC_ID \
0070 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0071 ARM_SMCCC_SMC_32, \
0072 0, 0)
0073
0074 #define ARM_SMCCC_ARCH_FEATURES_FUNC_ID \
0075 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0076 ARM_SMCCC_SMC_32, \
0077 0, 1)
0078
0079 #define ARM_SMCCC_ARCH_SOC_ID \
0080 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0081 ARM_SMCCC_SMC_32, \
0082 0, 2)
0083
0084 #define ARM_SMCCC_ARCH_WORKAROUND_1 \
0085 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0086 ARM_SMCCC_SMC_32, \
0087 0, 0x8000)
0088
0089 #define ARM_SMCCC_ARCH_WORKAROUND_2 \
0090 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0091 ARM_SMCCC_SMC_32, \
0092 0, 0x7fff)
0093
0094 #define ARM_SMCCC_ARCH_WORKAROUND_3 \
0095 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0096 ARM_SMCCC_SMC_32, \
0097 0, 0x3fff)
0098
0099 #define ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID \
0100 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0101 ARM_SMCCC_SMC_32, \
0102 ARM_SMCCC_OWNER_VENDOR_HYP, \
0103 ARM_SMCCC_FUNC_QUERY_CALL_UID)
0104
0105
0106 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0 0xb66fb428U
0107 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1 0xe911c52eU
0108 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2 0x564bcaa9U
0109 #define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3 0x743a004dU
0110
0111
0112 #define ARM_SMCCC_KVM_FUNC_FEATURES 0
0113 #define ARM_SMCCC_KVM_FUNC_PTP 1
0114 #define ARM_SMCCC_KVM_FUNC_FEATURES_2 127
0115 #define ARM_SMCCC_KVM_NUM_FUNCS 128
0116
0117 #define ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID \
0118 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0119 ARM_SMCCC_SMC_32, \
0120 ARM_SMCCC_OWNER_VENDOR_HYP, \
0121 ARM_SMCCC_KVM_FUNC_FEATURES)
0122
0123 #define SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED 1
0124
0125
0126
0127
0128
0129
0130 #define ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID \
0131 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0132 ARM_SMCCC_SMC_32, \
0133 ARM_SMCCC_OWNER_VENDOR_HYP, \
0134 ARM_SMCCC_KVM_FUNC_PTP)
0135
0136
0137 #define KVM_PTP_VIRT_COUNTER 0
0138 #define KVM_PTP_PHYS_COUNTER 1
0139
0140
0141 #define ARM_SMCCC_HV_PV_TIME_FEATURES \
0142 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0143 ARM_SMCCC_SMC_64, \
0144 ARM_SMCCC_OWNER_STANDARD_HYP, \
0145 0x20)
0146
0147 #define ARM_SMCCC_HV_PV_TIME_ST \
0148 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0149 ARM_SMCCC_SMC_64, \
0150 ARM_SMCCC_OWNER_STANDARD_HYP, \
0151 0x21)
0152
0153
0154 #define ARM_SMCCC_TRNG_VERSION \
0155 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0156 ARM_SMCCC_SMC_32, \
0157 ARM_SMCCC_OWNER_STANDARD, \
0158 0x50)
0159
0160 #define ARM_SMCCC_TRNG_FEATURES \
0161 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0162 ARM_SMCCC_SMC_32, \
0163 ARM_SMCCC_OWNER_STANDARD, \
0164 0x51)
0165
0166 #define ARM_SMCCC_TRNG_GET_UUID \
0167 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0168 ARM_SMCCC_SMC_32, \
0169 ARM_SMCCC_OWNER_STANDARD, \
0170 0x52)
0171
0172 #define ARM_SMCCC_TRNG_RND32 \
0173 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0174 ARM_SMCCC_SMC_32, \
0175 ARM_SMCCC_OWNER_STANDARD, \
0176 0x53)
0177
0178 #define ARM_SMCCC_TRNG_RND64 \
0179 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
0180 ARM_SMCCC_SMC_64, \
0181 ARM_SMCCC_OWNER_STANDARD, \
0182 0x53)
0183
0184
0185
0186
0187
0188 #define SMCCC_RET_SUCCESS 0
0189 #define SMCCC_RET_NOT_SUPPORTED -1
0190 #define SMCCC_RET_NOT_REQUIRED -2
0191 #define SMCCC_RET_INVALID_PARAMETER -3
0192
0193 #endif