194 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (c) 2015, Linaro Limited4 */5#ifndef __LINUX_ARM_SMCCC_H6#define __LINUX_ARM_SMCCC_H7 8#include <linux/const.h>9 10/*11 * This file provides common defines for ARM SMC Calling Convention as12 * specified in13 * https://developer.arm.com/docs/den0028/latest14 *15 * This code is up-to-date with version DEN 0028 C16 */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 3121 22#define ARM_SMCCC_SMC_32 023#define ARM_SMCCC_SMC_64 124#define ARM_SMCCC_CALL_CONV_SHIFT 3025 26#define ARM_SMCCC_OWNER_MASK 0x3F27#define ARM_SMCCC_OWNER_SHIFT 2428 29#define ARM_SMCCC_FUNC_MASK 0xFFFF30 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 046#define ARM_SMCCC_OWNER_CPU 147#define ARM_SMCCC_OWNER_SIP 248#define ARM_SMCCC_OWNER_OEM 349#define ARM_SMCCC_OWNER_STANDARD 450#define ARM_SMCCC_OWNER_STANDARD_HYP 551#define ARM_SMCCC_OWNER_VENDOR_HYP 652#define ARM_SMCCC_OWNER_TRUSTED_APP 4853#define ARM_SMCCC_OWNER_TRUSTED_APP_END 4954#define ARM_SMCCC_OWNER_TRUSTED_OS 5055#define ARM_SMCCC_OWNER_TRUSTED_OS_END 6356 57#define ARM_SMCCC_FUNC_QUERY_CALL_UID 0xff0158 59#define ARM_SMCCC_QUIRK_NONE 060#define ARM_SMCCC_QUIRK_QCOM_A6 1 /* Save/restore register a6 */61 62#define ARM_SMCCC_VERSION_1_0 0x1000063#define ARM_SMCCC_VERSION_1_1 0x1000164#define ARM_SMCCC_VERSION_1_2 0x1000265#define ARM_SMCCC_VERSION_1_3 0x1000366 67#define ARM_SMCCC_1_3_SVE_HINT 0x1000068 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 0xb66fb428U107#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1 0xe911c52eU108#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2 0x564bcaa9U109#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3 0x743a004dU110 111/* KVM "vendor specific" services */112#define ARM_SMCCC_KVM_FUNC_FEATURES 0113#define ARM_SMCCC_KVM_FUNC_PTP 1114#define ARM_SMCCC_KVM_FUNC_FEATURES_2 127115#define ARM_SMCCC_KVM_NUM_FUNCS 128116 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 1124 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 using128 * 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 0138#define KVM_PTP_PHYS_COUNTER 1139 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 0070A186 * ARM DEN 0070A is now merged/consolidated into ARM DEN 0028 C187 */188#define SMCCC_RET_SUCCESS 0189#define SMCCC_RET_NOT_SUPPORTED -1190#define SMCCC_RET_NOT_REQUIRED -2191#define SMCCC_RET_INVALID_PARAMETER -3192 193#endif /*__LINUX_ARM_SMCCC_H*/194