Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (c) 2015, Linaro Limited
0004  */
0005 #ifndef __LINUX_ARM_SMCCC_H
0006 #define __LINUX_ARM_SMCCC_H
0007 
0008 #include <linux/const.h>
0009 
0010 /*
0011  * This file provides common defines for ARM SMC Calling Convention as
0012  * specified in
0013  * https://developer.arm.com/docs/den0028/latest
0014  *
0015  * This code is up-to-date with version DEN 0028 C
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 /* Save/restore register a6 */
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 /* KVM UID value: 28b46fb6-2ec5-11e9-a9ca-4b564d003a74 */
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 /* KVM "vendor specific" services */
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  * ptp_kvm is a feature used for time sync between vm and host.
0127  * ptp_kvm module in guest kernel will get service from host using
0128  * this hypercall ID.
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 /* ptp_kvm counter type ID */
0137 #define KVM_PTP_VIRT_COUNTER            0
0138 #define KVM_PTP_PHYS_COUNTER            1
0139 
0140 /* Paravirtualised time calls (defined by ARM DEN0057A) */
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 /* TRNG entropy source calls (defined by ARM DEN0098) */
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  * Return codes defined in ARM DEN 0070A
0186  * ARM DEN 0070A is now merged/consolidated into ARM DEN 0028 C
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 /*__LINUX_ARM_SMCCC_H*/