blob: 1c6fc8e48106a12dd575fa174e1f91d526a9c04e [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>
11#include <realm_rsi.h>
12#include <smccc.h>
13
nabkah01002e5692022-10-10 12:36:46 +010014/* This function return RSI_ABI_VERSION */
Shruti Gupta40de8ec2023-10-12 21:45:12 +010015u_register_t rsi_get_version(u_register_t req_ver)
nabkah01002e5692022-10-10 12:36:46 +010016{
17 smc_ret_values res = {};
18
19 res = tftf_smc(&(smc_args)
Shruti Gupta40de8ec2023-10-12 21:45:12 +010020 {RSI_VERSION, req_ver, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL});
nabkah01002e5692022-10-10 12:36:46 +010021
Shruti Gupta40de8ec2023-10-12 21:45:12 +010022 if (res.ret0 == SMC_UNKNOWN) {
23 return SMC_UNKNOWN;
24 }
Shruti Gupta5abab762024-11-27 04:57:53 +000025
26 if (res.ret0 == RSI_ERROR_STATE) {
27 return RSI_ERROR_STATE;
28 }
29
AlexeiFedorov9a60ecb2024-08-06 16:39:00 +010030 /* Return lower version */
Shruti Gupta40de8ec2023-10-12 21:45:12 +010031 return res.ret1;
nabkah01002e5692022-10-10 12:36:46 +010032}
33
34/* This function will call the Host to request IPA of the NS shared buffer */
35u_register_t rsi_get_ns_buffer(void)
36{
37 smc_ret_values res = {};
Shruti Gupta43a50c32023-11-28 10:54:27 +000038 struct rsi_host_call host_cal __aligned(sizeof(struct rsi_host_call));
nabkah01002e5692022-10-10 12:36:46 +010039
40 host_cal.imm = HOST_CALL_GET_SHARED_BUFF_CMD;
41 res = tftf_smc(&(smc_args) {RSI_HOST_CALL, (u_register_t)&host_cal,
42 0UL, 0UL, 0UL, 0UL, 0UL, 0UL});
43 if (res.ret0 != RSI_SUCCESS) {
44 return 0U;
45 }
46 return host_cal.gprs[0];
47}
48
49/* This function call Host and request to exit Realm with proper exit code */
50void rsi_exit_to_host(enum host_call_cmd exit_code)
51{
Shruti Gupta43a50c32023-11-28 10:54:27 +000052 struct rsi_host_call host_cal __aligned(sizeof(struct rsi_host_call));
53
nabkah01002e5692022-10-10 12:36:46 +010054 host_cal.imm = exit_code;
AlexeiFedorovf09c77a2024-09-10 15:50:44 +010055 host_cal.gprs[0] = read_mpidr_el1();
nabkah01002e5692022-10-10 12:36:46 +010056 tftf_smc(&(smc_args) {RSI_HOST_CALL, (u_register_t)&host_cal,
57 0UL, 0UL, 0UL, 0UL, 0UL, 0UL});
58}
Shruti Guptabb772192023-10-09 16:08:28 +010059
60/* This function will exit to the Host to request RIPAS CHANGE of IPA range */
61u_register_t rsi_ipa_state_set(u_register_t base,
62 u_register_t top,
63 rsi_ripas_type ripas,
64 u_register_t flag,
65 u_register_t *new_base,
66 rsi_ripas_respose_type *response)
67{
68 smc_ret_values res = {};
69
70 res = tftf_smc(&(smc_args)
71 {RSI_IPA_STATE_SET, base, top, ripas, flag});
72 if (res.ret0 == RSI_SUCCESS) {
73 *new_base = res.ret1;
74 *response = res.ret2;
75 }
76 return res.ret0;
77}
78
AlexeiFedorov9a60ecb2024-08-06 16:39:00 +010079/* This function will return RIPAS of IPA range */
80u_register_t rsi_ipa_state_get(u_register_t base,
81 u_register_t top,
82 u_register_t *out_top,
83 rsi_ripas_type *ripas)
Shruti Guptabb772192023-10-09 16:08:28 +010084{
85 smc_ret_values res = {};
86
87 res = tftf_smc(&(smc_args)
AlexeiFedorov9a60ecb2024-08-06 16:39:00 +010088 {RSI_IPA_STATE_GET, base, top});
Shruti Guptabb772192023-10-09 16:08:28 +010089 if (res.ret0 == RSI_SUCCESS) {
AlexeiFedorov9a60ecb2024-08-06 16:39:00 +010090 *out_top = res.ret1;
91 *ripas = res.ret2;
Shruti Guptabb772192023-10-09 16:08:28 +010092 }
93 return res.ret0;
94}
Juan Pablo Conde88ffad22024-10-11 21:22:29 -050095
96/* This function will initialize the attestation context */
97u_register_t rsi_attest_token_init(u_register_t challenge_0,
98 u_register_t challenge_1,
99 u_register_t challenge_2,
100 u_register_t challenge_3,
101 u_register_t challenge_4,
102 u_register_t challenge_5,
103 u_register_t challenge_6,
104 u_register_t challenge_7,
105 u_register_t *out_token_upper_bound)
106{
107 smc_ret_values_ext res = {};
108
109 tftf_smc_no_retval_x8(&(smc_args_ext) {
110 RSI_ATTEST_TOKEN_INIT,
111 challenge_0,
112 challenge_1,
113 challenge_2,
114 challenge_3,
115 challenge_4,
116 challenge_5,
117 challenge_6,
118 challenge_7
119 },
120 &res);
121
122 if (res.ret0 == RSI_SUCCESS) {
123 *out_token_upper_bound = res.ret1;
124 }
125
126 return res.ret0;
127}
128
129/* This function will retrieve the (or part of) attestation token */
130u_register_t rsi_attest_token_continue(u_register_t buffer_addr,
131 u_register_t offset,
132 u_register_t buffer_size,
133 u_register_t *bytes_copied)
134{
135 smc_ret_values res = {};
136
137 res = tftf_smc(&(smc_args) {
138 RSI_ATTEST_TOKEN_CONTINUE,
139 buffer_addr,
140 offset,
141 buffer_size
142 });
143
144 if ((res.ret0 == RSI_SUCCESS) || (res.ret0 == RSI_INCOMPLETE)) {
145 *bytes_copied = res.ret1;
146 }
147 return res.ret0;
148}
Shruti Gupta5abab762024-11-27 04:57:53 +0000149
150u_register_t rsi_realm_config(struct rsi_realm_config *s)
151{
152 smc_ret_values res = {};
153
154 res = tftf_smc(&(smc_args)
155 {RSI_REALM_CONFIG, (u_register_t)s});
156 return res.ret0;
157}
158
159u_register_t rsi_mem_get_perm_value(u_register_t plane_index,
160 u_register_t perm_index,
161 u_register_t *perm)
162{
163 smc_ret_values res = {};
164
165 res = tftf_smc(&(smc_args)
166 {RSI_MEM_GET_PERM_VALUE, plane_index, perm_index});
167 if (res.ret0 == RSI_SUCCESS) {
168 *perm = res.ret1;
169 }
170 return res.ret0;
171}
172
173u_register_t rsi_mem_set_perm_value(u_register_t plane_index,
174 u_register_t perm_index,
175 u_register_t perm)
176{
177 smc_ret_values res = {};
178
179 res = tftf_smc(&(smc_args)
180 {RSI_MEM_SET_PERM_VALUE, plane_index, perm_index, perm});
181 return res.ret0;
182}
183
184u_register_t rsi_mem_set_perm_index(u_register_t base,
185 u_register_t top,
186 u_register_t perm_index,
187 u_register_t cookie,
188 u_register_t *new_base,
189 u_register_t *response,
190 u_register_t *new_cookie)
191{
192 smc_ret_values res = {};
193
194 res = tftf_smc(&(smc_args)
195 {RSI_MEM_SET_PERM_INDEX, base, top, perm_index, cookie});
196 if (res.ret0 == RSI_SUCCESS) {
197 *new_base = res.ret1;
198 *response = res.ret2;
199 *new_cookie = res.ret3;
200 }
201 return res.ret0;
202}
203
204u_register_t rsi_plane_enter(u_register_t plane_index,
205 u_register_t plane_run)
206{
207 smc_ret_values res = {};
208
209 res = tftf_smc(&(smc_args)
210 {RSI_PLANE_ENTER, plane_index, plane_run});
211 return res.ret0;
212}