xref: /linux/arch/arm64/include/asm/rsi_smc.h (revision 5a4332062e9e71de8e78dc1b389d21e0dd44848b)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2023 ARM Ltd.
4  */
5 
6 #ifndef __ASM_RSI_SMC_H_
7 #define __ASM_RSI_SMC_H_
8 
9 #include <linux/arm-smccc.h>
10 
11 /*
12  * This file describes the Realm Services Interface (RSI) Application Binary
13  * Interface (ABI) for SMC calls made from within the Realm to the RMM and
14  * serviced by the RMM.
15  */
16 
17 /*
18  * The major version number of the RSI implementation.  This is increased when
19  * the binary format or semantics of the SMC calls change.
20  */
21 #define RSI_ABI_VERSION_MAJOR		UL(1)
22 
23 /*
24  * The minor version number of the RSI implementation.  This is increased when
25  * a bug is fixed, or a feature is added without breaking binary compatibility.
26  */
27 #define RSI_ABI_VERSION_MINOR		UL(0)
28 
29 #define RSI_ABI_VERSION			((RSI_ABI_VERSION_MAJOR << 16) | \
30 					 RSI_ABI_VERSION_MINOR)
31 
32 #define RSI_ABI_VERSION_GET_MAJOR(_version) ((_version) >> 16)
33 #define RSI_ABI_VERSION_GET_MINOR(_version) ((_version) & 0xFFFF)
34 
35 #define RSI_SUCCESS		UL(0)
36 #define RSI_ERROR_INPUT		UL(1)
37 #define RSI_ERROR_STATE		UL(2)
38 #define RSI_INCOMPLETE		UL(3)
39 #define RSI_ERROR_UNKNOWN	UL(4)
40 
41 #define SMC_RSI_FID(n)		ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,      \
42 						   ARM_SMCCC_SMC_64,         \
43 						   ARM_SMCCC_OWNER_STANDARD, \
44 						   n)
45 
46 /*
47  * Returns RSI version.
48  *
49  * arg1 == Requested interface revision
50  * ret0 == Status / error
51  * ret1 == Lower implemented interface revision
52  * ret2 == Higher implemented interface revision
53  */
54 #define SMC_RSI_ABI_VERSION	SMC_RSI_FID(0x190)
55 
56 /*
57  * Read feature register.
58  *
59  * arg1 == Feature register index
60  * ret0 == Status / error
61  * ret1 == Feature register value
62  */
63 #define SMC_RSI_FEATURES			SMC_RSI_FID(0x191)
64 
65 /*
66  * Read measurement for the current Realm.
67  *
68  * arg1 == Index, which measurements slot to read
69  * ret0 == Status / error
70  * ret1 == Measurement value, bytes:  0 -  7
71  * ret2 == Measurement value, bytes:  8 - 15
72  * ret3 == Measurement value, bytes: 16 - 23
73  * ret4 == Measurement value, bytes: 24 - 31
74  * ret5 == Measurement value, bytes: 32 - 39
75  * ret6 == Measurement value, bytes: 40 - 47
76  * ret7 == Measurement value, bytes: 48 - 55
77  * ret8 == Measurement value, bytes: 56 - 63
78  */
79 #define SMC_RSI_MEASUREMENT_READ		SMC_RSI_FID(0x192)
80 
81 /*
82  * Extend Realm Extensible Measurement (REM) value.
83  *
84  * arg1  == Index, which measurements slot to extend
85  * arg2  == Size of realm measurement in bytes, max 64 bytes
86  * arg3  == Measurement value, bytes:  0 -  7
87  * arg4  == Measurement value, bytes:  8 - 15
88  * arg5  == Measurement value, bytes: 16 - 23
89  * arg6  == Measurement value, bytes: 24 - 31
90  * arg7  == Measurement value, bytes: 32 - 39
91  * arg8  == Measurement value, bytes: 40 - 47
92  * arg9  == Measurement value, bytes: 48 - 55
93  * arg10 == Measurement value, bytes: 56 - 63
94  * ret0  == Status / error
95  */
96 #define SMC_RSI_MEASUREMENT_EXTEND		SMC_RSI_FID(0x193)
97 
98 /*
99  * Initialize the operation to retrieve an attestation token.
100  *
101  * arg1 == Challenge value, bytes:  0 -  7
102  * arg2 == Challenge value, bytes:  8 - 15
103  * arg3 == Challenge value, bytes: 16 - 23
104  * arg4 == Challenge value, bytes: 24 - 31
105  * arg5 == Challenge value, bytes: 32 - 39
106  * arg6 == Challenge value, bytes: 40 - 47
107  * arg7 == Challenge value, bytes: 48 - 55
108  * arg8 == Challenge value, bytes: 56 - 63
109  * ret0 == Status / error
110  * ret1 == Upper bound of token size in bytes
111  */
112 #define SMC_RSI_ATTESTATION_TOKEN_INIT		SMC_RSI_FID(0x194)
113 
114 /*
115  * Continue the operation to retrieve an attestation token.
116  *
117  * arg1 == The IPA of token buffer
118  * arg2 == Offset within the granule of the token buffer
119  * arg3 == Size of the granule buffer
120  * ret0 == Status / error
121  * ret1 == Length of token bytes copied to the granule buffer
122  */
123 #define SMC_RSI_ATTESTATION_TOKEN_CONTINUE	SMC_RSI_FID(0x195)
124 
125 #ifndef __ASSEMBLY__
126 
127 struct realm_config {
128 	union {
129 		struct {
130 			unsigned long ipa_bits; /* Width of IPA in bits */
131 			unsigned long hash_algo; /* Hash algorithm */
132 		};
133 		u8 pad[0x200];
134 	};
135 	union {
136 		u8 rpv[64]; /* Realm Personalization Value */
137 		u8 pad2[0xe00];
138 	};
139 	/*
140 	 * The RMM requires the configuration structure to be aligned to a 4k
141 	 * boundary, ensure this happens by aligning this structure.
142 	 */
143 } __aligned(0x1000);
144 
145 #endif /* __ASSEMBLY__ */
146 
147 /*
148  * Read configuration for the current Realm.
149  *
150  * arg1 == struct realm_config addr
151  * ret0 == Status / error
152  */
153 #define SMC_RSI_REALM_CONFIG			SMC_RSI_FID(0x196)
154 
155 /*
156  * Request RIPAS of a target IPA range to be changed to a specified value.
157  *
158  * arg1 == Base IPA address of target region
159  * arg2 == Top of the region
160  * arg3 == RIPAS value
161  * arg4 == flags
162  * ret0 == Status / error
163  * ret1 == Top of modified IPA range
164  * ret2 == Whether the Host accepted or rejected the request
165  */
166 #define SMC_RSI_IPA_STATE_SET			SMC_RSI_FID(0x197)
167 
168 #define RSI_NO_CHANGE_DESTROYED			UL(0)
169 #define RSI_CHANGE_DESTROYED			UL(1)
170 
171 #define RSI_ACCEPT				UL(0)
172 #define RSI_REJECT				UL(1)
173 
174 /*
175  * Get RIPAS of a target IPA range.
176  *
177  * arg1 == Base IPA of target region
178  * arg2 == End of target IPA region
179  * ret0 == Status / error
180  * ret1 == Top of IPA region which has the reported RIPAS value
181  * ret2 == RIPAS value
182  */
183 #define SMC_RSI_IPA_STATE_GET			SMC_RSI_FID(0x198)
184 
185 /*
186  * Make a Host call.
187  *
188  * arg1 == IPA of host call structure
189  * ret0 == Status / error
190  */
191 #define SMC_RSI_HOST_CALL			SMC_RSI_FID(0x199)
192 
193 #endif /* __ASM_RSI_SMC_H_ */
194