-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Import the standard SMCCC definitions from include/linux/arm-smccc.h. Signed-off-by: Raghavendra Rao Ananta <rananta@google.com> Reviewed-by: Gavin Shan <gshan@redhat.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20220502233853.1233742-8-rananta@google.com
- Loading branch information
Raghavendra Rao Ananta
authored and
Marc Zyngier
committed
May 3, 2022
1 parent
fa246c6
commit ea73326
Showing
1 changed file
with
193 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,193 @@ | ||
/* SPDX-License-Identifier: GPL-2.0-only */ | ||
/* | ||
* Copyright (c) 2015, Linaro Limited | ||
*/ | ||
#ifndef __LINUX_ARM_SMCCC_H | ||
#define __LINUX_ARM_SMCCC_H | ||
|
||
#include <linux/const.h> | ||
|
||
/* | ||
* This file provides common defines for ARM SMC Calling Convention as | ||
* specified in | ||
* https://developer.arm.com/docs/den0028/latest | ||
* | ||
* This code is up-to-date with version DEN 0028 C | ||
*/ | ||
|
||
#define ARM_SMCCC_STD_CALL _AC(0,U) | ||
#define ARM_SMCCC_FAST_CALL _AC(1,U) | ||
#define ARM_SMCCC_TYPE_SHIFT 31 | ||
|
||
#define ARM_SMCCC_SMC_32 0 | ||
#define ARM_SMCCC_SMC_64 1 | ||
#define ARM_SMCCC_CALL_CONV_SHIFT 30 | ||
|
||
#define ARM_SMCCC_OWNER_MASK 0x3F | ||
#define ARM_SMCCC_OWNER_SHIFT 24 | ||
|
||
#define ARM_SMCCC_FUNC_MASK 0xFFFF | ||
|
||
#define ARM_SMCCC_IS_FAST_CALL(smc_val) \ | ||
((smc_val) & (ARM_SMCCC_FAST_CALL << ARM_SMCCC_TYPE_SHIFT)) | ||
#define ARM_SMCCC_IS_64(smc_val) \ | ||
((smc_val) & (ARM_SMCCC_SMC_64 << ARM_SMCCC_CALL_CONV_SHIFT)) | ||
#define ARM_SMCCC_FUNC_NUM(smc_val) ((smc_val) & ARM_SMCCC_FUNC_MASK) | ||
#define ARM_SMCCC_OWNER_NUM(smc_val) \ | ||
(((smc_val) >> ARM_SMCCC_OWNER_SHIFT) & ARM_SMCCC_OWNER_MASK) | ||
|
||
#define ARM_SMCCC_CALL_VAL(type, calling_convention, owner, func_num) \ | ||
(((type) << ARM_SMCCC_TYPE_SHIFT) | \ | ||
((calling_convention) << ARM_SMCCC_CALL_CONV_SHIFT) | \ | ||
(((owner) & ARM_SMCCC_OWNER_MASK) << ARM_SMCCC_OWNER_SHIFT) | \ | ||
((func_num) & ARM_SMCCC_FUNC_MASK)) | ||
|
||
#define ARM_SMCCC_OWNER_ARCH 0 | ||
#define ARM_SMCCC_OWNER_CPU 1 | ||
#define ARM_SMCCC_OWNER_SIP 2 | ||
#define ARM_SMCCC_OWNER_OEM 3 | ||
#define ARM_SMCCC_OWNER_STANDARD 4 | ||
#define ARM_SMCCC_OWNER_STANDARD_HYP 5 | ||
#define ARM_SMCCC_OWNER_VENDOR_HYP 6 | ||
#define ARM_SMCCC_OWNER_TRUSTED_APP 48 | ||
#define ARM_SMCCC_OWNER_TRUSTED_APP_END 49 | ||
#define ARM_SMCCC_OWNER_TRUSTED_OS 50 | ||
#define ARM_SMCCC_OWNER_TRUSTED_OS_END 63 | ||
|
||
#define ARM_SMCCC_FUNC_QUERY_CALL_UID 0xff01 | ||
|
||
#define ARM_SMCCC_QUIRK_NONE 0 | ||
#define ARM_SMCCC_QUIRK_QCOM_A6 1 /* Save/restore register a6 */ | ||
|
||
#define ARM_SMCCC_VERSION_1_0 0x10000 | ||
#define ARM_SMCCC_VERSION_1_1 0x10001 | ||
#define ARM_SMCCC_VERSION_1_2 0x10002 | ||
#define ARM_SMCCC_VERSION_1_3 0x10003 | ||
|
||
#define ARM_SMCCC_1_3_SVE_HINT 0x10000 | ||
|
||
#define ARM_SMCCC_VERSION_FUNC_ID \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
0, 0) | ||
|
||
#define ARM_SMCCC_ARCH_FEATURES_FUNC_ID \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
0, 1) | ||
|
||
#define ARM_SMCCC_ARCH_SOC_ID \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
0, 2) | ||
|
||
#define ARM_SMCCC_ARCH_WORKAROUND_1 \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
0, 0x8000) | ||
|
||
#define ARM_SMCCC_ARCH_WORKAROUND_2 \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
0, 0x7fff) | ||
|
||
#define ARM_SMCCC_ARCH_WORKAROUND_3 \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
0, 0x3fff) | ||
|
||
#define ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
ARM_SMCCC_OWNER_VENDOR_HYP, \ | ||
ARM_SMCCC_FUNC_QUERY_CALL_UID) | ||
|
||
/* KVM UID value: 28b46fb6-2ec5-11e9-a9ca-4b564d003a74 */ | ||
#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0 0xb66fb428U | ||
#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1 0xe911c52eU | ||
#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2 0x564bcaa9U | ||
#define ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3 0x743a004dU | ||
|
||
/* KVM "vendor specific" services */ | ||
#define ARM_SMCCC_KVM_FUNC_FEATURES 0 | ||
#define ARM_SMCCC_KVM_FUNC_PTP 1 | ||
#define ARM_SMCCC_KVM_FUNC_FEATURES_2 127 | ||
#define ARM_SMCCC_KVM_NUM_FUNCS 128 | ||
|
||
#define ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
ARM_SMCCC_OWNER_VENDOR_HYP, \ | ||
ARM_SMCCC_KVM_FUNC_FEATURES) | ||
|
||
#define SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED 1 | ||
|
||
/* | ||
* ptp_kvm is a feature used for time sync between vm and host. | ||
* ptp_kvm module in guest kernel will get service from host using | ||
* this hypercall ID. | ||
*/ | ||
#define ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
ARM_SMCCC_OWNER_VENDOR_HYP, \ | ||
ARM_SMCCC_KVM_FUNC_PTP) | ||
|
||
/* ptp_kvm counter type ID */ | ||
#define KVM_PTP_VIRT_COUNTER 0 | ||
#define KVM_PTP_PHYS_COUNTER 1 | ||
|
||
/* Paravirtualised time calls (defined by ARM DEN0057A) */ | ||
#define ARM_SMCCC_HV_PV_TIME_FEATURES \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_64, \ | ||
ARM_SMCCC_OWNER_STANDARD_HYP, \ | ||
0x20) | ||
|
||
#define ARM_SMCCC_HV_PV_TIME_ST \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_64, \ | ||
ARM_SMCCC_OWNER_STANDARD_HYP, \ | ||
0x21) | ||
|
||
/* TRNG entropy source calls (defined by ARM DEN0098) */ | ||
#define ARM_SMCCC_TRNG_VERSION \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
ARM_SMCCC_OWNER_STANDARD, \ | ||
0x50) | ||
|
||
#define ARM_SMCCC_TRNG_FEATURES \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
ARM_SMCCC_OWNER_STANDARD, \ | ||
0x51) | ||
|
||
#define ARM_SMCCC_TRNG_GET_UUID \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
ARM_SMCCC_OWNER_STANDARD, \ | ||
0x52) | ||
|
||
#define ARM_SMCCC_TRNG_RND32 \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_32, \ | ||
ARM_SMCCC_OWNER_STANDARD, \ | ||
0x53) | ||
|
||
#define ARM_SMCCC_TRNG_RND64 \ | ||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ | ||
ARM_SMCCC_SMC_64, \ | ||
ARM_SMCCC_OWNER_STANDARD, \ | ||
0x53) | ||
|
||
/* | ||
* Return codes defined in ARM DEN 0070A | ||
* ARM DEN 0070A is now merged/consolidated into ARM DEN 0028 C | ||
*/ | ||
#define SMCCC_RET_SUCCESS 0 | ||
#define SMCCC_RET_NOT_SUPPORTED -1 | ||
#define SMCCC_RET_NOT_REQUIRED -2 | ||
#define SMCCC_RET_INVALID_PARAMETER -3 | ||
|
||
#endif /*__LINUX_ARM_SMCCC_H*/ |