blob: 6a5137927fc3ea508a9b29ae89e8f43a0cca2232 [file] [log] [blame]
Imre Kis9fcf8412020-11-23 03:15:45 +01001// SPDX-License-Identifier: BSD-3-Clause
2/*
Balint Dobszay40410ab2022-01-19 16:31:02 +01003 * Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
Imre Kis9fcf8412020-11-23 03:15:45 +01004 */
5
6#include <assert.h> // for assert
7#include <stddef.h> // for size_t
8#include <stdint.h> // for uint32_t, uint16_t, uintptr_t, U
Imre Kise56c7b12023-06-01 13:33:40 +02009#include <string.h> // for memcpy
Imre Kis9fcf8412020-11-23 03:15:45 +010010#include "ffa_api.h" // for FFA_OK, ffa_interrupt_handler, ffa_fea...
11#include "ffa_api_defines.h" // for FFA_PARAM_MBZ, FFA_OK, FFA_ERROR, FFA_...
12#include "ffa_api_types.h" // for ffa_result, ffa_direct_msg, ffa_uuid
13#include "ffa_internal_api.h" // for ffa_params, ffa_svc
14#include "util.h" // for GENMASK_32, SHIFT_U32, BIT
15
16/*
17 * Unpacks the error code from the FFA_ERROR message. It is a signed 32 bit
18 * value in an unsigned 64 bit field so proper casting must be used to avoid
19 * compiler dependent behavior.
20 */
21static inline ffa_result ffa_get_errorcode(struct ffa_params *result)
22{
23 uint32_t raw_value = result->a2;
24
25 return *(ffa_result *)(&raw_value);
26}
27
28/*
29 * Unpacks the content of the SVC result into an ffa_direct_msg structure.
30 */
31static inline void ffa_unpack_direct_msg(struct ffa_params *svc_result,
32 struct ffa_direct_msg *msg)
33{
34 msg->function_id = svc_result->a0;
35 msg->source_id = (svc_result->a1 >> 16);
36 msg->destination_id = svc_result->a1;
Imre Kis1bc4a622022-07-19 17:38:00 +020037
38 if (FFA_IS_32_BIT_FUNC(msg->function_id)) {
39 msg->args.args32[0] = svc_result->a3;
40 msg->args.args32[1] = svc_result->a4;
41 msg->args.args32[2] = svc_result->a5;
42 msg->args.args32[3] = svc_result->a6;
43 msg->args.args32[4] = svc_result->a7;
44 } else {
45 msg->args.args64[0] = svc_result->a3;
46 msg->args.args64[1] = svc_result->a4;
47 msg->args.args64[2] = svc_result->a5;
48 msg->args.args64[3] = svc_result->a6;
49 msg->args.args64[4] = svc_result->a7;
50 }
Imre Kis9fcf8412020-11-23 03:15:45 +010051}
52
53/*
54 * The end of the interrupt handler is indicated by an FFA_MSG_WAIT call.
55 */
56static inline void ffa_return_from_interrupt(struct ffa_params *result)
57{
58 ffa_svc(FFA_MSG_WAIT, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
59 FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
60 result);
61}
62
63static inline void ffa_uuid_to_abi_format(const struct ffa_uuid *uuid,
64 uint32_t *result)
65{
66 size_t i = 0;
67
68 for (i = 0; i < 4; i++) {
69 result[i] = uuid->uuid[4 * i];
70 result[i] |= SHIFT_U32(uuid->uuid[4 * i + 1], 8);
71 result[i] |= SHIFT_U32(uuid->uuid[4 * i + 2], 16);
72 result[i] |= SHIFT_U32(uuid->uuid[4 * i + 3], 24);
73 }
74}
75
76ffa_result ffa_version(uint32_t *version)
77{
78 struct ffa_params result = {0};
79 uint32_t self_version = 0;
80
81 self_version = (FFA_VERSION_MAJOR << FFA_VERSION_MAJOR_SHIFT) |
82 (FFA_VERSION_MINOR << FFA_VERSION_MINOR);
83
84 ffa_svc(FFA_VERSION, self_version, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
85 FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
86 &result);
87
88 if (result.a0 & BIT(31)) {
89 uint32_t raw_error = result.a0;
90
91 *version = 0;
92
93 return *(ffa_result *)(&raw_error);
94 }
95
96 *version = result.a0;
97 return FFA_OK;
98}
99
100ffa_result ffa_features(uint32_t ffa_function_id,
101 struct ffa_interface_properties *interface_properties)
102{
103 struct ffa_params result = {0};
104
105 ffa_svc(FFA_FEATURES, ffa_function_id, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
106 FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
107 &result);
108
109 if (result.a0 == FFA_ERROR) {
110 interface_properties->interface_properties[0] = 0;
111 interface_properties->interface_properties[1] = 0;
112 return ffa_get_errorcode(&result);
113 }
114
115 assert(result.a0 == FFA_SUCCESS_32);
116 interface_properties->interface_properties[0] = result.a2;
117 interface_properties->interface_properties[1] = result.a3;
118 return FFA_OK;
119}
120
121ffa_result ffa_rx_release(void)
122{
123 struct ffa_params result = {0};
124
125 ffa_svc(FFA_RX_RELEASE, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
126 FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
127 &result);
128
129 if (result.a0 == FFA_ERROR)
130 return ffa_get_errorcode(&result);
131
132 assert(result.a0 == FFA_SUCCESS_32);
133 return FFA_OK;
134}
135
136ffa_result ffa_rxtx_map(const void *tx_buffer, const void *rx_buffer,
137 uint32_t page_count)
138{
139 struct ffa_params result = {0};
140
141 assert(page_count <= FFA_RXTX_MAP_PAGE_COUNT_MAX);
142
143 page_count = SHIFT_U32(page_count & FFA_RXTX_MAP_PAGE_COUNT_MASK,
144 FFA_RXTX_MAP_PAGE_COUNT_SHIFT);
145
Balint Dobszay40410ab2022-01-19 16:31:02 +0100146 ffa_svc(FFA_RXTX_MAP_64, (uintptr_t)tx_buffer, (uintptr_t)rx_buffer,
Imre Kis9fcf8412020-11-23 03:15:45 +0100147 page_count, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
148 FFA_PARAM_MBZ, &result);
149
150 if (result.a0 == FFA_ERROR)
151 return ffa_get_errorcode(&result);
152
Balint Dobszay40410ab2022-01-19 16:31:02 +0100153 /*
154 * There are no 64-bit parameters returned with FFA_SUCCESS, the SPMC
155 * will use the default 32-bit version.
156 */
Imre Kis9fcf8412020-11-23 03:15:45 +0100157 assert(result.a0 == FFA_SUCCESS_32);
158 return FFA_OK;
159}
160
161ffa_result ffa_rxtx_unmap(uint16_t id)
162{
163 struct ffa_params result = {0};
164
165 ffa_svc(FFA_RXTX_UNMAP, SHIFT_U32(id, FFA_RXTX_UNMAP_ID_SHIFT),
166 FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
167 FFA_PARAM_MBZ, FFA_PARAM_MBZ, &result);
168
169 if (result.a0 == FFA_ERROR)
170 return ffa_get_errorcode(&result);
171
172 assert(result.a0 == FFA_SUCCESS_32);
173 return FFA_OK;
174}
175
176ffa_result ffa_partition_info_get(const struct ffa_uuid *uuid, uint32_t *count)
177{
178 struct ffa_params result = {0};
179 uint32_t abi_uuid[4] = {0};
180
181 ffa_uuid_to_abi_format(uuid, abi_uuid);
182
183 ffa_svc(FFA_PARTITION_INFO_GET, abi_uuid[0], abi_uuid[1], abi_uuid[2],
184 abi_uuid[3], FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
185 &result);
186
187 if (result.a0 == FFA_ERROR) {
188 *count = UINT32_C(0);
189 return ffa_get_errorcode(&result);
190 }
191
192 assert(result.a0 == FFA_SUCCESS_32);
193 *count = result.a2;
194 return FFA_OK;
195}
196
197ffa_result ffa_id_get(uint16_t *id)
198{
199 struct ffa_params result = {0};
200
201 ffa_svc(FFA_ID_GET, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
202 FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
203 &result);
204
205 if (result.a0 == FFA_ERROR) {
206 *id = FFA_ID_GET_ID_MASK;
207 return ffa_get_errorcode(&result);
208 }
209
210 assert(result.a0 == FFA_SUCCESS_32);
211 *id = (result.a2 >> FFA_ID_GET_ID_SHIFT) & FFA_ID_GET_ID_MASK;
212 return FFA_OK;
213}
214
215ffa_result ffa_msg_wait(struct ffa_direct_msg *msg)
216{
217 struct ffa_params result = {0};
218
219 ffa_svc(FFA_MSG_WAIT, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
220 FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
221 &result);
222
223 while (result.a0 == FFA_INTERRUPT) {
224 ffa_interrupt_handler(result.a2);
225 ffa_return_from_interrupt(&result);
226 }
227
228 if (result.a0 == FFA_ERROR) {
229 return ffa_get_errorcode(&result);
Imre Kis1bc4a622022-07-19 17:38:00 +0200230 } else if (FFA_TO_32_BIT_FUNC(result.a0) == FFA_MSG_SEND_DIRECT_REQ_32) {
Imre Kis9fcf8412020-11-23 03:15:45 +0100231 ffa_unpack_direct_msg(&result, msg);
232 } else {
233 assert(result.a0 == FFA_SUCCESS_32);
234 *msg = (struct ffa_direct_msg){.function_id = result.a0};
235 }
236
237 return FFA_OK;
238}
239
Imre Kis1bc4a622022-07-19 17:38:00 +0200240static ffa_result ffa_msg_send_direct_req(uint32_t function_id, uint32_t resp_id,
241 uint16_t source, uint16_t dest,
242 uint64_t a0, uint64_t a1, uint64_t a2,
243 uint64_t a3, uint64_t a4,
244 struct ffa_direct_msg *msg)
Imre Kis9fcf8412020-11-23 03:15:45 +0100245{
246 struct ffa_params result = {0};
247
Imre Kis1bc4a622022-07-19 17:38:00 +0200248 ffa_svc(function_id,
Imre Kis9fcf8412020-11-23 03:15:45 +0100249 SHIFT_U32(source, FFA_MSG_SEND_DIRECT_REQ_SOURCE_ID_SHIFT) |
250 dest, FFA_PARAM_MBZ, a0, a1, a2, a3, a4, &result);
251
252 while (result.a0 == FFA_INTERRUPT) {
253 ffa_interrupt_handler(result.a2);
254 ffa_return_from_interrupt(&result);
255 }
256
257 if (result.a0 == FFA_ERROR) {
258 return ffa_get_errorcode(&result);
Imre Kis1bc4a622022-07-19 17:38:00 +0200259 } else if (result.a0 == resp_id) {
Imre Kis9fcf8412020-11-23 03:15:45 +0100260 ffa_unpack_direct_msg(&result, msg);
261 } else {
262 assert(result.a0 == FFA_SUCCESS_32);
263 *msg = (struct ffa_direct_msg){.function_id = result.a0};
264 }
265
266 return FFA_OK;
267}
268
Imre Kis1bc4a622022-07-19 17:38:00 +0200269ffa_result ffa_msg_send_direct_req_32(uint16_t source, uint16_t dest,
270 uint32_t a0, uint32_t a1, uint32_t a2,
271 uint32_t a3, uint32_t a4,
272 struct ffa_direct_msg *msg)
273{
274 return ffa_msg_send_direct_req(FFA_MSG_SEND_DIRECT_REQ_32,
275 FFA_MSG_SEND_DIRECT_RESP_32,
276 source, dest, a0, a1, a2, a3, a4, msg);
277}
278
279ffa_result ffa_msg_send_direct_req_64(uint16_t source, uint16_t dest,
280 uint64_t a0, uint64_t a1, uint64_t a2,
281 uint64_t a3, uint64_t a4,
282 struct ffa_direct_msg *msg)
283{
284 return ffa_msg_send_direct_req(FFA_MSG_SEND_DIRECT_REQ_64,
285 FFA_MSG_SEND_DIRECT_RESP_64,
286 source, dest, a0, a1, a2, a3, a4, msg);
287}
288
289static ffa_result ffa_msg_send_direct_resp(uint32_t function_id,
290 uint16_t source, uint16_t dest,
291 uint64_t a0, uint64_t a1,
292 uint64_t a2, uint64_t a3,
293 uint64_t a4,
294 struct ffa_direct_msg *msg)
Imre Kis9fcf8412020-11-23 03:15:45 +0100295{
296 struct ffa_params result = {0};
297
Imre Kis1bc4a622022-07-19 17:38:00 +0200298 ffa_svc(function_id,
Imre Kis9fcf8412020-11-23 03:15:45 +0100299 SHIFT_U32(source, FFA_MSG_SEND_DIRECT_RESP_SOURCE_ID_SHIFT) |
300 dest, FFA_PARAM_MBZ, a0, a1, a2, a3, a4, &result);
301
302 while (result.a0 == FFA_INTERRUPT) {
303 ffa_interrupt_handler(result.a2);
304 ffa_return_from_interrupt(&result);
305 }
306
307 if (result.a0 == FFA_ERROR) {
308 return ffa_get_errorcode(&result);
Imre Kis1bc4a622022-07-19 17:38:00 +0200309 } else if (FFA_TO_32_BIT_FUNC(result.a0) == FFA_MSG_SEND_DIRECT_REQ_32) {
Imre Kis9fcf8412020-11-23 03:15:45 +0100310 ffa_unpack_direct_msg(&result, msg);
311 } else {
312 assert(result.a0 == FFA_SUCCESS_32);
313 *msg = (struct ffa_direct_msg){.function_id = result.a0};
314 }
315
316 return FFA_OK;
317}
Imre Kise3112e02020-11-23 03:15:46 +0100318
Imre Kis1bc4a622022-07-19 17:38:00 +0200319ffa_result ffa_msg_send_direct_resp_32(uint16_t source, uint16_t dest,
320 uint32_t a0, uint32_t a1, uint32_t a2,
321 uint32_t a3, uint32_t a4,
322 struct ffa_direct_msg *msg)
323{
324 return ffa_msg_send_direct_resp(FFA_MSG_SEND_DIRECT_RESP_32, source,
325 dest, a0, a1, a2, a3, a4, msg);
326}
327
328ffa_result ffa_msg_send_direct_resp_64(uint16_t source, uint16_t dest,
329 uint64_t a0, uint64_t a1, uint64_t a2,
330 uint64_t a3, uint64_t a4,
331 struct ffa_direct_msg *msg)
332{
333 return ffa_msg_send_direct_resp(FFA_MSG_SEND_DIRECT_RESP_64, source,
334 dest, a0, a1, a2, a3, a4, msg);
335}
336
Imre Kise3112e02020-11-23 03:15:46 +0100337ffa_result ffa_mem_donate(uint32_t total_length, uint32_t fragment_length,
338 void *buffer_address, uint32_t page_count,
339 uint64_t *handle)
340{
341 struct ffa_params result = {0};
342
Balint Dobszay40410ab2022-01-19 16:31:02 +0100343 ffa_svc((buffer_address) ? FFA_MEM_DONATE_64 : FFA_MEM_DONATE_32,
344 total_length, fragment_length, (uintptr_t)buffer_address,
345 page_count, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
346 &result);
Imre Kise3112e02020-11-23 03:15:46 +0100347
348 if (result.a0 == FFA_ERROR) {
349 *handle = 0U;
350 return ffa_get_errorcode(&result);
351 }
352
Balint Dobszay40410ab2022-01-19 16:31:02 +0100353 /*
354 * There are no 64-bit parameters returned with FFA_SUCCESS, the SPMC
355 * will use the default 32-bit version.
356 */
Imre Kise3112e02020-11-23 03:15:46 +0100357 assert(result.a0 == FFA_SUCCESS_32);
358 *handle = reg_pair_to_64(result.a3, result.a2);
359 return FFA_OK;
360}
361
362ffa_result ffa_mem_donate_rxtx(uint32_t total_length, uint32_t fragment_length,
363 uint64_t *handle)
364{
365 return ffa_mem_donate(total_length, fragment_length, NULL, 0, handle);
366}
367
368ffa_result ffa_mem_lend(uint32_t total_length, uint32_t fragment_length,
369 void *buffer_address, uint32_t page_count,
370 uint64_t *handle)
371{
372 struct ffa_params result = {0};
373
Balint Dobszay40410ab2022-01-19 16:31:02 +0100374 ffa_svc((buffer_address) ? FFA_MEM_LEND_64 : FFA_MEM_LEND_32,
375 total_length, fragment_length, (uintptr_t)buffer_address,
376 page_count, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
377 &result);
Imre Kise3112e02020-11-23 03:15:46 +0100378
379 if (result.a0 == FFA_ERROR) {
380 *handle = 0U;
381 return ffa_get_errorcode(&result);
382 }
383
Balint Dobszay40410ab2022-01-19 16:31:02 +0100384 /*
385 * There are no 64-bit parameters returned with FFA_SUCCESS, the SPMC
386 * will use the default 32-bit version.
387 */
Imre Kise3112e02020-11-23 03:15:46 +0100388 assert(result.a0 == FFA_SUCCESS_32);
389 *handle = reg_pair_to_64(result.a3, result.a2);
390 return FFA_OK;
391}
392
393ffa_result ffa_mem_lend_rxtx(uint32_t total_length, uint32_t fragment_length,
394 uint64_t *handle)
395{
396 return ffa_mem_lend(total_length, fragment_length, NULL, 0, handle);
397}
398
399ffa_result ffa_mem_share(uint32_t total_length, uint32_t fragment_length,
400 void *buffer_address, uint32_t page_count,
401 uint64_t *handle)
402{
403 struct ffa_params result = {0};
404
Balint Dobszay40410ab2022-01-19 16:31:02 +0100405 ffa_svc((buffer_address) ? FFA_MEM_SHARE_64 : FFA_MEM_SHARE_32,
406 total_length, fragment_length, (uintptr_t)buffer_address,
407 page_count, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
408 &result);
Imre Kise3112e02020-11-23 03:15:46 +0100409
410 if (result.a0 == FFA_ERROR) {
411 *handle = 0U;
412 return ffa_get_errorcode(&result);
413 }
414
Balint Dobszay40410ab2022-01-19 16:31:02 +0100415 /*
416 * There are no 64-bit parameters returned with FFA_SUCCESS, the SPMC
417 * will use the default 32-bit version.
418 */
Imre Kise3112e02020-11-23 03:15:46 +0100419 assert(result.a0 == FFA_SUCCESS_32);
420 *handle = reg_pair_to_64(result.a3, result.a2);
421 return FFA_OK;
422}
423
424ffa_result ffa_mem_share_rxtx(uint32_t total_length, uint32_t fragment_length,
425 uint64_t *handle)
426{
427 return ffa_mem_share(total_length, fragment_length, NULL, 0, handle);
428}
429
430ffa_result ffa_mem_retrieve_req(uint32_t total_length, uint32_t fragment_length,
431 void *buffer_address, uint32_t page_count,
432 uint32_t *resp_total_length,
433 uint32_t *resp_fragment_length)
434{
435 struct ffa_params result = {0};
436
Balint Dobszay40410ab2022-01-19 16:31:02 +0100437 ffa_svc((buffer_address) ? FFA_MEM_RETRIEVE_REQ_64 : FFA_MEM_RETRIEVE_REQ_32,
438 total_length, fragment_length, (uintptr_t)buffer_address,
439 page_count, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
440 &result);
Imre Kise3112e02020-11-23 03:15:46 +0100441
442 if (result.a0 == FFA_ERROR) {
443 *resp_total_length = 0U;
444 *resp_fragment_length = 0U;
445 return ffa_get_errorcode(&result);
446 }
447
448 assert(result.a0 == FFA_MEM_RETRIEVE_RESP);
449 *resp_total_length = result.a1;
450 *resp_fragment_length = result.a2;
451 return FFA_OK;
452}
453
454ffa_result ffa_mem_retrieve_req_rxtx(uint32_t total_length,
455 uint32_t fragment_length,
456 uint32_t *resp_total_length,
457 uint32_t *resp_fragment_length)
458{
459 return ffa_mem_retrieve_req(total_length, fragment_length, NULL, 0,
460 resp_total_length, resp_fragment_length);
461}
462
463ffa_result ffa_mem_relinquish(void)
464{
465 struct ffa_params result = {0};
466
467 ffa_svc(FFA_MEM_RELINQUISH, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
468 FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
469 &result);
470
471 if (result.a0 == FFA_ERROR)
472 return ffa_get_errorcode(&result);
473
474 assert(result.a0 == FFA_SUCCESS_32);
475 return FFA_OK;
476}
477
478ffa_result ffa_mem_reclaim(uint64_t handle, uint32_t flags)
479{
480 struct ffa_params result = {0};
481 uint32_t handle_hi = 0;
482 uint32_t handle_lo = 0;
483
484 reg_pair_from_64(handle, &handle_hi, &handle_lo);
485
486 ffa_svc(FFA_MEM_RECLAIM, handle_lo, handle_hi, flags, FFA_PARAM_MBZ,
487 FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, &result);
488
489 if (result.a0 == FFA_ERROR)
490 return ffa_get_errorcode(&result);
491
492 assert(result.a0 == FFA_SUCCESS_32);
493 return FFA_OK;
494}
Imre Kisa5201e42022-02-22 15:25:21 +0100495
496ffa_result ffa_mem_perm_get(const void *base_address, uint32_t *mem_perm)
497{
498 struct ffa_params result = {0};
499
500 ffa_svc(FFA_MEM_PERM_GET, (uintptr_t)base_address, FFA_PARAM_MBZ,
501 FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
502 FFA_PARAM_MBZ, &result);
503
504 if (result.a0 == FFA_ERROR)
505 return ffa_get_errorcode(&result);
506
507 assert(result.a0 == FFA_SUCCESS_32);
508 *mem_perm = result.a2;
509 return FFA_OK;
510}
511
512ffa_result ffa_mem_perm_set(const void *base_address, uint32_t page_count,
513 uint32_t mem_perm)
514{
515 struct ffa_params result = {0};
516
517 assert((mem_perm & FFA_MEM_PERM_RESERVED_MASK) == 0);
518
519 ffa_svc(FFA_MEM_PERM_SET, (uintptr_t)base_address, page_count, mem_perm,
520 FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ, FFA_PARAM_MBZ,
521 &result);
522
523 if (result.a0 == FFA_ERROR)
524 return ffa_get_errorcode(&result);
525
526 assert(result.a0 == FFA_SUCCESS_32);
527 return FFA_OK;
528}
Imre Kise56c7b12023-06-01 13:33:40 +0200529
530ffa_result ffa_console_log_32(const char *message, size_t length)
531{
532 struct ffa_params result = {0};
533 uint32_t char_lists[6] = {0};
534
535 assert(length > 0 && length <= sizeof(char_lists));
536
537 memcpy(char_lists, message, MIN(length, sizeof(char_lists)));
538
539 ffa_svc(FFA_CONSOLE_LOG_32, length, char_lists[0], char_lists[1],
540 char_lists[2], char_lists[3], char_lists[4], char_lists[5],
541 &result);
542
543 if (result.a0 == FFA_ERROR)
544 return ffa_get_errorcode(&result);
545
546 assert(result.a0 == FFA_SUCCESS_32);
547 return FFA_OK;
548}
549
550ffa_result ffa_console_log_64(const char *message, size_t length)
551{
552 struct ffa_params result = {0};
553 uint64_t char_lists[6] = {0};
554
555 assert(length > 0 && length <= sizeof(char_lists));
556
557 memcpy(char_lists, message, MIN(length, sizeof(char_lists)));
558
559 ffa_svc(FFA_CONSOLE_LOG_64, length, char_lists[0], char_lists[1],
560 char_lists[2], char_lists[3], char_lists[4], char_lists[5],
561 &result);
562
563 if (result.a0 == FFA_ERROR)
564 return ffa_get_errorcode(&result);
565
566 assert(result.a0 == FFA_SUCCESS_32);
567 return FFA_OK;
568}