]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - include/linux/arm-smccc.h
arm/arm64: KVM: Advertise SMCCC v1.1
[mirror_ubuntu-artful-kernel.git] / include / linux / arm-smccc.h
CommitLineData
98dd64f3
JW
1/*
2 * Copyright (c) 2015, Linaro Limited
3 *
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 */
14#ifndef __LINUX_ARM_SMCCC_H
15#define __LINUX_ARM_SMCCC_H
16
98dd64f3
JW
17/*
18 * This file provides common defines for ARM SMC Calling Convention as
19 * specified in
20 * http://infocenter.arm.com/help/topic/com.arm.doc.den0028a/index.html
21 */
22
23#define ARM_SMCCC_STD_CALL 0
24#define ARM_SMCCC_FAST_CALL 1
25#define ARM_SMCCC_TYPE_SHIFT 31
26
27#define ARM_SMCCC_SMC_32 0
28#define ARM_SMCCC_SMC_64 1
29#define ARM_SMCCC_CALL_CONV_SHIFT 30
30
31#define ARM_SMCCC_OWNER_MASK 0x3F
32#define ARM_SMCCC_OWNER_SHIFT 24
33
34#define ARM_SMCCC_FUNC_MASK 0xFFFF
35
36#define ARM_SMCCC_IS_FAST_CALL(smc_val) \
37 ((smc_val) & (ARM_SMCCC_FAST_CALL << ARM_SMCCC_TYPE_SHIFT))
38#define ARM_SMCCC_IS_64(smc_val) \
39 ((smc_val) & (ARM_SMCCC_SMC_64 << ARM_SMCCC_CALL_CONV_SHIFT))
40#define ARM_SMCCC_FUNC_NUM(smc_val) ((smc_val) & ARM_SMCCC_FUNC_MASK)
41#define ARM_SMCCC_OWNER_NUM(smc_val) \
42 (((smc_val) >> ARM_SMCCC_OWNER_SHIFT) & ARM_SMCCC_OWNER_MASK)
43
44#define ARM_SMCCC_CALL_VAL(type, calling_convention, owner, func_num) \
45 (((type) << ARM_SMCCC_TYPE_SHIFT) | \
46 ((calling_convention) << ARM_SMCCC_CALL_CONV_SHIFT) | \
47 (((owner) & ARM_SMCCC_OWNER_MASK) << ARM_SMCCC_OWNER_SHIFT) | \
48 ((func_num) & ARM_SMCCC_FUNC_MASK))
49
50#define ARM_SMCCC_OWNER_ARCH 0
51#define ARM_SMCCC_OWNER_CPU 1
52#define ARM_SMCCC_OWNER_SIP 2
53#define ARM_SMCCC_OWNER_OEM 3
54#define ARM_SMCCC_OWNER_STANDARD 4
55#define ARM_SMCCC_OWNER_TRUSTED_APP 48
56#define ARM_SMCCC_OWNER_TRUSTED_APP_END 49
57#define ARM_SMCCC_OWNER_TRUSTED_OS 50
58#define ARM_SMCCC_OWNER_TRUSTED_OS_END 63
59
82bcd087
AG
60#define ARM_SMCCC_QUIRK_NONE 0
61#define ARM_SMCCC_QUIRK_QCOM_A6 1 /* Save/restore register a6 */
62
f4e7680c
MZ
63#define ARM_SMCCC_VERSION_1_0 0x10000
64#define ARM_SMCCC_VERSION_1_1 0x10001
65
66#define ARM_SMCCC_VERSION_FUNC_ID \
67 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
68 ARM_SMCCC_SMC_32, \
69 0, 0)
70
71#define ARM_SMCCC_ARCH_FEATURES_FUNC_ID \
72 ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
73 ARM_SMCCC_SMC_32, \
74 0, 1)
75
82bcd087
AG
76#ifndef __ASSEMBLY__
77
78#include <linux/linkage.h>
79#include <linux/types.h>
98dd64f3
JW
80/**
81 * struct arm_smccc_res - Result from SMC/HVC call
82 * @a0-a3 result values from registers 0 to 3
83 */
84struct arm_smccc_res {
85 unsigned long a0;
86 unsigned long a1;
87 unsigned long a2;
88 unsigned long a3;
89};
90
91/**
680a0873
AG
92 * struct arm_smccc_quirk - Contains quirk information
93 * @id: quirk identification
94 * @state: quirk specific information
95 * @a6: Qualcomm quirk entry for returning post-smc call contents of a6
96 */
97struct arm_smccc_quirk {
98 int id;
99 union {
100 unsigned long a6;
101 } state;
102};
103
104/**
105 * __arm_smccc_smc() - make SMC calls
98dd64f3
JW
106 * @a0-a7: arguments passed in registers 0 to 7
107 * @res: result values from registers 0 to 3
680a0873 108 * @quirk: points to an arm_smccc_quirk, or NULL when no quirks are required.
98dd64f3
JW
109 *
110 * This function is used to make SMC calls following SMC Calling Convention.
111 * The content of the supplied param are copied to registers 0 to 7 prior
112 * to the SMC instruction. The return values are updated with the content
680a0873
AG
113 * from register 0 to 3 on return from the SMC instruction. An optional
114 * quirk structure provides vendor specific behavior.
98dd64f3 115 */
680a0873 116asmlinkage void __arm_smccc_smc(unsigned long a0, unsigned long a1,
98dd64f3
JW
117 unsigned long a2, unsigned long a3, unsigned long a4,
118 unsigned long a5, unsigned long a6, unsigned long a7,
680a0873 119 struct arm_smccc_res *res, struct arm_smccc_quirk *quirk);
98dd64f3
JW
120
121/**
680a0873 122 * __arm_smccc_hvc() - make HVC calls
98dd64f3
JW
123 * @a0-a7: arguments passed in registers 0 to 7
124 * @res: result values from registers 0 to 3
3046ec67 125 * @quirk: points to an arm_smccc_quirk, or NULL when no quirks are required.
98dd64f3
JW
126 *
127 * This function is used to make HVC calls following SMC Calling
128 * Convention. The content of the supplied param are copied to registers 0
129 * to 7 prior to the HVC instruction. The return values are updated with
680a0873
AG
130 * the content from register 0 to 3 on return from the HVC instruction. An
131 * optional quirk structure provides vendor specific behavior.
98dd64f3 132 */
680a0873 133asmlinkage void __arm_smccc_hvc(unsigned long a0, unsigned long a1,
98dd64f3
JW
134 unsigned long a2, unsigned long a3, unsigned long a4,
135 unsigned long a5, unsigned long a6, unsigned long a7,
680a0873
AG
136 struct arm_smccc_res *res, struct arm_smccc_quirk *quirk);
137
138#define arm_smccc_smc(...) __arm_smccc_smc(__VA_ARGS__, NULL)
139
140#define arm_smccc_smc_quirk(...) __arm_smccc_smc(__VA_ARGS__)
141
142#define arm_smccc_hvc(...) __arm_smccc_hvc(__VA_ARGS__, NULL)
143
144#define arm_smccc_hvc_quirk(...) __arm_smccc_hvc(__VA_ARGS__)
98dd64f3 145
82bcd087 146#endif /*__ASSEMBLY__*/
98dd64f3 147#endif /*__LINUX_ARM_SMCCC_H*/