1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef __LINUX_ARM_SMCCC_H
15#define __LINUX_ARM_SMCCC_H
16
17
18
19
20
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
60#define ARM_SMCCC_QUIRK_NONE 0
61#define ARM_SMCCC_QUIRK_QCOM_A6 1
62
63#ifndef __ASSEMBLY__
64
65#include <linux/linkage.h>
66#include <linux/types.h>
67
68
69
70
71struct arm_smccc_res {
72 unsigned long a0;
73 unsigned long a1;
74 unsigned long a2;
75 unsigned long a3;
76};
77
78
79
80
81
82
83
84struct arm_smccc_quirk {
85 int id;
86 union {
87 unsigned long a6;
88 } state;
89};
90
91
92
93
94
95
96
97
98
99
100
101
102
103asmlinkage void __arm_smccc_smc(unsigned long a0, unsigned long a1,
104 unsigned long a2, unsigned long a3, unsigned long a4,
105 unsigned long a5, unsigned long a6, unsigned long a7,
106 struct arm_smccc_res *res, struct arm_smccc_quirk *quirk);
107
108
109
110
111
112
113
114
115
116
117
118
119
120asmlinkage void __arm_smccc_hvc(unsigned long a0, unsigned long a1,
121 unsigned long a2, unsigned long a3, unsigned long a4,
122 unsigned long a5, unsigned long a6, unsigned long a7,
123 struct arm_smccc_res *res, struct arm_smccc_quirk *quirk);
124
125#define arm_smccc_smc(...) __arm_smccc_smc(__VA_ARGS__, NULL)
126
127#define arm_smccc_smc_quirk(...) __arm_smccc_smc(__VA_ARGS__)
128
129#define arm_smccc_hvc(...) __arm_smccc_hvc(__VA_ARGS__, NULL)
130
131#define arm_smccc_hvc_quirk(...) __arm_smccc_hvc(__VA_ARGS__)
132
133#endif
134#endif
135