blob: 4e223ca41e56c472d7bb6aa8929bc51d336b26cc [file] [log] [blame]
nabkah01002e5692022-10-10 12:36:46 +01001
2/*
AlexeiFedorovf09c77a2024-09-10 15:50:44 +01003 * Copyright (c) 2022-2024, Arm Limited. All rights reserved.
nabkah01002e5692022-10-10 12:36:46 +01004 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 *
7 */
8
9#include <host_realm_rmi.h>
10#include <lib/aarch64/arch_features.h>
Shruti Gupta91105082024-11-27 05:29:55 +000011#include <realm_helpers.h>
nabkah01002e5692022-10-10 12:36:46 +010012#include <realm_rsi.h>
13#include <smccc.h>
14
nabkah01002e5692022-10-10 12:36:46 +010015/* This function return RSI_ABI_VERSION */
Shruti Gupta40de8ec2023-10-12 21:45:12 +010016u_register_t rsi_get_version(u_register_t req_ver)
nabkah01002e5692022-10-10 12:36:46 +010017{
18 smc_ret_values res = {};
19
20 res = tftf_smc(&(smc_args)
Shruti Gupta40de8ec2023-10-12 21:45:12 +010021 {RSI_VERSION, req_ver, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL});
nabkah01002e5692022-10-10 12:36:46 +010022
Shruti Gupta40de8ec2023-10-12 21:45:12 +010023 if (res.ret0 == SMC_UNKNOWN) {
24 return SMC_UNKNOWN;
25 }
Shruti Gupta5abab762024-11-27 04:57:53 +000026
27 if (res.ret0 == RSI_ERROR_STATE) {
28 return RSI_ERROR_STATE;
29 }
30
AlexeiFedorov9a60ecb2024-08-06 16:39:00 +010031 /* Return lower version */
Shruti Gupta40de8ec2023-10-12 21:45:12 +010032 return res.ret1;
nabkah01002e5692022-10-10 12:36:46 +010033}
34
nabkah01002e5692022-10-10 12:36:46 +010035/* This function call Host and request to exit Realm with proper exit code */
Shruti Gupta91105082024-11-27 05:29:55 +000036u_register_t rsi_exit_to_host(enum host_call_cmd exit_code)
nabkah01002e5692022-10-10 12:36:46 +010037{
Shruti Gupta43a50c32023-11-28 10:54:27 +000038 struct rsi_host_call host_cal __aligned(sizeof(struct rsi_host_call));
Shruti Gupta91105082024-11-27 05:29:55 +000039 smc_ret_values res = {};
Shruti Gupta43a50c32023-11-28 10:54:27 +000040
nabkah01002e5692022-10-10 12:36:46 +010041 host_cal.imm = exit_code;
Shruti Gupta91105082024-11-27 05:29:55 +000042 host_cal.gprs[0] = realm_get_my_plane_num();
43 host_cal.gprs[1] = read_mpidr_el1();
44 res = tftf_smc(&(smc_args) {RSI_HOST_CALL, (u_register_t)&host_cal,
nabkah01002e5692022-10-10 12:36:46 +010045 0UL, 0UL, 0UL, 0UL, 0UL, 0UL});
Shruti Gupta91105082024-11-27 05:29:55 +000046 return res.ret0;
nabkah01002e5692022-10-10 12:36:46 +010047}
Shruti Guptabb772192023-10-09 16:08:28 +010048
49/* This function will exit to the Host to request RIPAS CHANGE of IPA range */
50u_register_t rsi_ipa_state_set(u_register_t base,
51 u_register_t top,
52 rsi_ripas_type ripas,
53 u_register_t flag,
54 u_register_t *new_base,
55 rsi_ripas_respose_type *response)
56{
57 smc_ret_values res = {};
58
59 res = tftf_smc(&(smc_args)
60 {RSI_IPA_STATE_SET, base, top, ripas, flag});
61 if (res.ret0 == RSI_SUCCESS) {
62 *new_base = res.ret1;
63 *response = res.ret2;
64 }
65 return res.ret0;
66}
67
AlexeiFedorov9a60ecb2024-08-06 16:39:00 +010068/* This function will return RIPAS of IPA range */
69u_register_t rsi_ipa_state_get(u_register_t base,
70 u_register_t top,
71 u_register_t *out_top,
72 rsi_ripas_type *ripas)
Shruti Guptabb772192023-10-09 16:08:28 +010073{
74 smc_ret_values res = {};
75
76 res = tftf_smc(&(smc_args)
AlexeiFedorov9a60ecb2024-08-06 16:39:00 +010077 {RSI_IPA_STATE_GET, base, top});
Shruti Guptabb772192023-10-09 16:08:28 +010078 if (res.ret0 == RSI_SUCCESS) {
AlexeiFedorov9a60ecb2024-08-06 16:39:00 +010079 *out_top = res.ret1;
80 *ripas = res.ret2;
Shruti Guptabb772192023-10-09 16:08:28 +010081 }
82 return res.ret0;
83}
Juan Pablo Conde88ffad22024-10-11 21:22:29 -050084
85/* This function will initialize the attestation context */
86u_register_t rsi_attest_token_init(u_register_t challenge_0,
87 u_register_t challenge_1,
88 u_register_t challenge_2,
89 u_register_t challenge_3,
90 u_register_t challenge_4,
91 u_register_t challenge_5,
92 u_register_t challenge_6,
93 u_register_t challenge_7,
94 u_register_t *out_token_upper_bound)
95{
96 smc_ret_values_ext res = {};
97
98 tftf_smc_no_retval_x8(&(smc_args_ext) {
99 RSI_ATTEST_TOKEN_INIT,
100 challenge_0,
101 challenge_1,
102 challenge_2,
103 challenge_3,
104 challenge_4,
105 challenge_5,
106 challenge_6,
107 challenge_7
108 },
109 &res);
110
111 if (res.ret0 == RSI_SUCCESS) {
112 *out_token_upper_bound = res.ret1;
113 }
114
115 return res.ret0;
116}
117
118/* This function will retrieve the (or part of) attestation token */
119u_register_t rsi_attest_token_continue(u_register_t buffer_addr,
120 u_register_t offset,
121 u_register_t buffer_size,
122 u_register_t *bytes_copied)
123{
124 smc_ret_values res = {};
125
126 res = tftf_smc(&(smc_args) {
127 RSI_ATTEST_TOKEN_CONTINUE,
128 buffer_addr,
129 offset,
130 buffer_size
131 });
132
133 if ((res.ret0 == RSI_SUCCESS) || (res.ret0 == RSI_INCOMPLETE)) {
134 *bytes_copied = res.ret1;
135 }
136 return res.ret0;
137}
Shruti Gupta5abab762024-11-27 04:57:53 +0000138
139u_register_t rsi_realm_config(struct rsi_realm_config *s)
140{
141 smc_ret_values res = {};
142
143 res = tftf_smc(&(smc_args)
144 {RSI_REALM_CONFIG, (u_register_t)s});
145 return res.ret0;
146}
147
148u_register_t rsi_mem_get_perm_value(u_register_t plane_index,
149 u_register_t perm_index,
150 u_register_t *perm)
151{
152 smc_ret_values res = {};
153
154 res = tftf_smc(&(smc_args)
155 {RSI_MEM_GET_PERM_VALUE, plane_index, perm_index});
156 if (res.ret0 == RSI_SUCCESS) {
157 *perm = res.ret1;
158 }
159 return res.ret0;
160}
161
162u_register_t rsi_mem_set_perm_value(u_register_t plane_index,
163 u_register_t perm_index,
164 u_register_t perm)
165{
166 smc_ret_values res = {};
167
168 res = tftf_smc(&(smc_args)
169 {RSI_MEM_SET_PERM_VALUE, plane_index, perm_index, perm});
170 return res.ret0;
171}
172
173u_register_t rsi_mem_set_perm_index(u_register_t base,
174 u_register_t top,
175 u_register_t perm_index,
176 u_register_t cookie,
177 u_register_t *new_base,
178 u_register_t *response,
179 u_register_t *new_cookie)
180{
181 smc_ret_values res = {};
182
183 res = tftf_smc(&(smc_args)
184 {RSI_MEM_SET_PERM_INDEX, base, top, perm_index, cookie});
185 if (res.ret0 == RSI_SUCCESS) {
186 *new_base = res.ret1;
187 *response = res.ret2;
188 *new_cookie = res.ret3;
189 }
190 return res.ret0;
191}
192
193u_register_t rsi_plane_enter(u_register_t plane_index,
194 u_register_t plane_run)
195{
196 smc_ret_values res = {};
197
198 res = tftf_smc(&(smc_args)
199 {RSI_PLANE_ENTER, plane_index, plane_run});
200 return res.ret0;
201}
Shruti Gupta41434682024-12-05 14:57:48 +0000202
203u_register_t rsi_plane_reg_read(u_register_t plane_index,
204 u_register_t register_encoding,
205 u_register_t *value)
206{
207 smc_ret_values res = {};
208
209 res = tftf_smc(&(smc_args)
210 {RSI_PLANE_REG_READ, plane_index, register_encoding});
211 if (res.ret0 == RSI_SUCCESS) {
212 *value = res.ret1;
213 }
214 return res.ret0;
215}
216
217u_register_t rsi_plane_reg_write(u_register_t plane_index,
218 u_register_t register_encoding,
219 u_register_t value)
220{
221 smc_ret_values res = {};
222
223 res = tftf_smc(&(smc_args)
224 {RSI_PLANE_REG_WRITE, plane_index, register_encoding, value});
225 return res.ret0;
226}