arm-smccc.h 5.6 KB

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