blob: 282cfbe46bb3b0ec700558db871798aff893025f [file] [log] [blame]
J-Alvesd1aae292020-10-08 17:16:58 +01001/*
Madhukar Pappireddyd655d582024-01-16 14:45:39 -06002 * Copyright (c) 2021-2024, Arm Limited. All rights reserved.
J-Alvesd1aae292020-10-08 17:16:58 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef CACTUS_TEST_CMDS
8#define CACTUS_TEST_CMDS
9
J-Alvesd1aae292020-10-08 17:16:58 +010010#include <ffa_helpers.h>
Manish Pandey9ee6a8d2021-03-03 09:53:33 +000011#include <spm_common.h>
J-Alvesd1aae292020-10-08 17:16:58 +010012
13/**
14 * Success and error return to be sent over a msg response.
15 */
J-Alves0e1e7ca2021-01-25 14:11:06 +000016#define CACTUS_SUCCESS U(0)
17#define CACTUS_ERROR U(-1)
18
19/**
20 * Error codes.
21 */
22#define CACTUS_ERROR_INVALID U(1)
23#define CACTUS_ERROR_TEST U(2)
24#define CACTUS_ERROR_FFA_CALL U(3)
J-Alves4cb9dee2021-03-03 13:59:52 +000025#define CACTUS_ERROR_UNHANDLED U(4)
J-Alvesd1aae292020-10-08 17:16:58 +010026
Madhukar Pappireddy4d76de02022-06-22 17:38:21 -050027#define ECHO_VAL1 U(0xa0a0a0a0)
28#define ECHO_VAL2 U(0xb0b0b0b0)
29#define ECHO_VAL3 U(0xc0c0c0c0)
30
J-Alvesd1aae292020-10-08 17:16:58 +010031/**
Daniel Boulbyce386b12022-03-29 18:36:36 +010032 * Get command from struct ffa_value.
J-Alvesd1aae292020-10-08 17:16:58 +010033 */
Daniel Boulbyce386b12022-03-29 18:36:36 +010034static inline uint64_t cactus_get_cmd(struct ffa_value ret)
J-Alves53392012020-11-18 14:51:57 +000035{
Daniel Boulbyce386b12022-03-29 18:36:36 +010036 return (uint64_t)ret.arg3;
J-Alves53392012020-11-18 14:51:57 +000037}
J-Alvesd1aae292020-10-08 17:16:58 +010038
39/**
40 * Template for commands to be sent to CACTUS partitions over direct
41 * messages interfaces.
42 */
Daniel Boulbyce386b12022-03-29 18:36:36 +010043static inline struct ffa_value cactus_send_cmd(
Daniel Boulbye79d2072021-03-03 11:34:53 +000044 ffa_id_t source, ffa_id_t dest, uint64_t cmd, uint64_t val0,
J-Alves53392012020-11-18 14:51:57 +000045 uint64_t val1, uint64_t val2, uint64_t val3)
46{
J-Alvesecd30742021-02-19 18:31:06 +000047 return ffa_msg_send_direct_req64(source, dest, cmd, val0, val1, val2,
48 val3);
J-Alves53392012020-11-18 14:51:57 +000049}
J-Alvesd1aae292020-10-08 17:16:58 +010050
J-Alves7d28b332021-02-11 16:08:08 +000051/**
52 * Template for responses to Cactus commands.
53 * 'cactus_send_response' is the template for custom responses, in case there is
54 * a need to propagate more than one value in the response of a command.
55 */
Daniel Boulbyce386b12022-03-29 18:36:36 +010056static inline struct ffa_value cactus_send_response(
J-Alves7a595282021-03-29 15:11:11 +010057 ffa_id_t source, ffa_id_t dest, uint32_t resp, uint64_t val0,
J-Alves7d28b332021-02-11 16:08:08 +000058 uint64_t val1, uint64_t val2, uint64_t val3)
59{
J-Alvesecd30742021-02-19 18:31:06 +000060 return ffa_msg_send_direct_resp64(source, dest, resp, val0, val1,
61 val2, val3);
J-Alves7d28b332021-02-11 16:08:08 +000062}
63
64/**
65 * For responses of one value only.
66 */
Daniel Boulbyce386b12022-03-29 18:36:36 +010067static inline struct ffa_value cactus_response(
Daniel Boulbye79d2072021-03-03 11:34:53 +000068 ffa_id_t source, ffa_id_t dest, uint32_t response)
J-Alves7d28b332021-02-11 16:08:08 +000069{
Madhukar Pappireddy3c287262021-08-05 14:39:24 -050070 return cactus_send_response(source, dest, response, 0, 0, 0, 0);
J-Alves7d28b332021-02-11 16:08:08 +000071}
72
Daniel Boulbyce386b12022-03-29 18:36:36 +010073static inline uint32_t cactus_get_response(struct ffa_value ret)
J-Alves7d28b332021-02-11 16:08:08 +000074{
Daniel Boulbyce386b12022-03-29 18:36:36 +010075 return (uint32_t)ret.arg3;
J-Alves7d28b332021-02-11 16:08:08 +000076}
77
78/**
79 * In a successful test, in case the SP needs to propagate an extra value
80 * to conclude the test.
81 * If more arguments are needed, a custom response should be defined for the
82 * specific test.
83 */
Daniel Boulbyce386b12022-03-29 18:36:36 +010084static inline struct ffa_value cactus_success_resp(
Daniel Boulbye79d2072021-03-03 11:34:53 +000085 ffa_id_t source, ffa_id_t dest, uint64_t value)
J-Alves7d28b332021-02-11 16:08:08 +000086{
87 return cactus_send_response(source, dest, CACTUS_SUCCESS, value,
88 0, 0, 0);
89}
90
91/**
92 * In case the test fails on the SP side, the 'error_code' should help specify
93 * the reason, which can be specific to the test, or general ones as defined
94 * in the error code list.
95 */
Daniel Boulbyce386b12022-03-29 18:36:36 +010096static inline struct ffa_value cactus_error_resp(
Daniel Boulbye79d2072021-03-03 11:34:53 +000097 ffa_id_t source, ffa_id_t dest, uint32_t error_code)
J-Alves7d28b332021-02-11 16:08:08 +000098{
99 return cactus_send_response(source, dest, CACTUS_ERROR, error_code,
100 0, 0, 0);
101}
102
Daniel Boulbyce386b12022-03-29 18:36:36 +0100103static inline uint32_t cactus_error_code(struct ffa_value ret)
J-Alves7d28b332021-02-11 16:08:08 +0000104{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100105 return (uint32_t) ret.arg4;
J-Alves7d28b332021-02-11 16:08:08 +0000106}
107
J-Alvesd1aae292020-10-08 17:16:58 +0100108/**
J-Alves28672f92020-11-09 15:34:31 +0000109 * With this test command the sender transmits a 64-bit value that it then
110 * expects to receive on the respective command response.
111 *
112 * The id is the hex representation of the string 'echo'.
113 */
114#define CACTUS_ECHO_CMD U(0x6563686f)
115
Daniel Boulbyce386b12022-03-29 18:36:36 +0100116static inline struct ffa_value cactus_echo_send_cmd(
Daniel Boulbye79d2072021-03-03 11:34:53 +0000117 ffa_id_t source, ffa_id_t dest, uint64_t echo_val)
J-Alves53392012020-11-18 14:51:57 +0000118{
119 return cactus_send_cmd(source, dest, CACTUS_ECHO_CMD, echo_val, 0, 0,
120 0);
121}
J-Alves28672f92020-11-09 15:34:31 +0000122
Daniel Boulbyce386b12022-03-29 18:36:36 +0100123static inline uint64_t cactus_echo_get_val(struct ffa_value ret)
J-Alves53392012020-11-18 14:51:57 +0000124{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100125 return (uint64_t)ret.arg4;
J-Alves53392012020-11-18 14:51:57 +0000126}
J-Alves28672f92020-11-09 15:34:31 +0000127
128/**
129 * Command to request a cactus secure partition to send an echo command to
130 * another partition.
131 *
132 * The sender of this command expects to receive CACTUS_SUCCESS if the requested
133 * echo interaction happened successfully, or CACTUS_ERROR otherwise.
134 */
135#define CACTUS_REQ_ECHO_CMD (CACTUS_ECHO_CMD + 1)
136
Daniel Boulbyce386b12022-03-29 18:36:36 +0100137static inline struct ffa_value cactus_req_echo_send_cmd(
Daniel Boulbye79d2072021-03-03 11:34:53 +0000138 ffa_id_t source, ffa_id_t dest, ffa_id_t echo_dest,
J-Alves53392012020-11-18 14:51:57 +0000139 uint64_t echo_val)
140{
141 return cactus_send_cmd(source, dest, CACTUS_REQ_ECHO_CMD, echo_val,
142 echo_dest, 0, 0);
143}
J-Alves28672f92020-11-09 15:34:31 +0000144
Daniel Boulbyce386b12022-03-29 18:36:36 +0100145static inline ffa_id_t cactus_req_echo_get_echo_dest(struct ffa_value ret)
J-Alves53392012020-11-18 14:51:57 +0000146{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100147 return (ffa_id_t)ret.arg5;
J-Alves53392012020-11-18 14:51:57 +0000148}
J-Alves28672f92020-11-09 15:34:31 +0000149
150/**
J-Alves1d203f12020-11-11 11:38:49 +0000151 * Command to create a cyclic dependency between SPs, which could result in
152 * a deadlock. This aims at proving such scenario cannot happen.
153 * If the deadlock happens, the system will just hang.
154 * If the deadlock is prevented, the last partition to use the command will
155 * send response CACTUS_SUCCESS.
156 *
157 * The id is the hex representation of the string 'dead'.
158 */
159#define CACTUS_DEADLOCK_CMD U(0x64656164)
160
Daniel Boulbyce386b12022-03-29 18:36:36 +0100161static inline struct ffa_value cactus_deadlock_send_cmd(
Daniel Boulbye79d2072021-03-03 11:34:53 +0000162 ffa_id_t source, ffa_id_t dest, ffa_id_t next_dest)
J-Alves53392012020-11-18 14:51:57 +0000163{
164 return cactus_send_cmd(source, dest, CACTUS_DEADLOCK_CMD, next_dest, 0,
165 0, 0);
166}
J-Alves1d203f12020-11-11 11:38:49 +0000167
Daniel Boulbyce386b12022-03-29 18:36:36 +0100168static inline ffa_id_t cactus_deadlock_get_next_dest(struct ffa_value ret)
J-Alves53392012020-11-18 14:51:57 +0000169{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100170 return (ffa_id_t)ret.arg4;
J-Alves53392012020-11-18 14:51:57 +0000171}
J-Alves1d203f12020-11-11 11:38:49 +0000172
173/**
174 * Command to request a sequence CACTUS_DEADLOCK_CMD between the partitions
175 * of specified IDs.
176 */
177#define CACTUS_REQ_DEADLOCK_CMD (CACTUS_DEADLOCK_CMD + 1)
178
Daniel Boulbyce386b12022-03-29 18:36:36 +0100179static inline struct ffa_value cactus_req_deadlock_send_cmd(
Daniel Boulbye79d2072021-03-03 11:34:53 +0000180 ffa_id_t source, ffa_id_t dest, ffa_id_t next_dest1,
181 ffa_id_t next_dest2)
J-Alves53392012020-11-18 14:51:57 +0000182{
183 return cactus_send_cmd(source, dest, CACTUS_REQ_DEADLOCK_CMD,
184 next_dest1, next_dest2, 0, 0);
185}
J-Alves1d203f12020-11-11 11:38:49 +0000186
J-Alves53392012020-11-18 14:51:57 +0000187/* To get next_dest1 use CACTUS_DEADLOCK_GET_NEXT_DEST */
Daniel Boulbyce386b12022-03-29 18:36:36 +0100188static inline ffa_id_t cactus_deadlock_get_next_dest2(struct ffa_value ret)
J-Alves53392012020-11-18 14:51:57 +0000189{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100190 return (ffa_id_t)ret.arg5;
J-Alves53392012020-11-18 14:51:57 +0000191}
J-Alves1d203f12020-11-11 11:38:49 +0000192
193/**
J-Alvesd1aae292020-10-08 17:16:58 +0100194 * Command to notify cactus of a memory management operation. The cmd value
195 * should be the memory management smc function id.
J-Alvesb9085f82020-12-07 10:57:28 +0000196 *
197 * The id is the hex representation of the string "mem"
J-Alvesd1aae292020-10-08 17:16:58 +0100198 */
J-Alvesb9085f82020-12-07 10:57:28 +0000199#define CACTUS_MEM_SEND_CMD U(0x6d656d)
J-Alvesd1aae292020-10-08 17:16:58 +0100200
Daniel Boulbyce386b12022-03-29 18:36:36 +0100201static inline struct ffa_value cactus_mem_send_cmd(
Daniel Boulbye79d2072021-03-03 11:34:53 +0000202 ffa_id_t source, ffa_id_t dest, uint32_t mem_func,
J-Alves32ccd2b2021-12-14 14:59:51 +0000203 ffa_memory_handle_t handle, ffa_memory_region_flags_t retrieve_flags,
Daniel Boulby3d8cd682024-07-23 14:28:15 +0100204 uint16_t word_to_write, bool expect_exception, bool is_normal_memory)
J-Alves53392012020-11-18 14:51:57 +0000205{
J-Alvese742ba82024-01-11 10:38:29 +0000206 uint64_t _expect_exception = expect_exception ? (1ULL << 32) : 0;
Daniel Boulby3d8cd682024-07-23 14:28:15 +0100207 uint64_t _is_normal_memory = is_normal_memory ? (1ULL << 33) : 0;
208 uint64_t packed = (uint64_t)word_to_write | _expect_exception |
209 _is_normal_memory;
J-Alvese742ba82024-01-11 10:38:29 +0000210
J-Alves53392012020-11-18 14:51:57 +0000211 return cactus_send_cmd(source, dest, CACTUS_MEM_SEND_CMD, mem_func,
J-Alvese742ba82024-01-11 10:38:29 +0000212 handle, retrieve_flags, packed);
J-Alves53392012020-11-18 14:51:57 +0000213}
J-Alvesb9085f82020-12-07 10:57:28 +0000214
Daniel Boulbyce386b12022-03-29 18:36:36 +0100215static inline ffa_memory_handle_t cactus_mem_send_get_handle(
216 struct ffa_value ret)
J-Alves53392012020-11-18 14:51:57 +0000217{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100218 return (ffa_memory_handle_t)ret.arg5;
J-Alves53392012020-11-18 14:51:57 +0000219}
J-Alvesd1aae292020-10-08 17:16:58 +0100220
J-Alves32ccd2b2021-12-14 14:59:51 +0000221static inline ffa_memory_region_flags_t cactus_mem_send_get_retrv_flags(
Daniel Boulbyce386b12022-03-29 18:36:36 +0100222 struct ffa_value ret)
J-Alves32ccd2b2021-12-14 14:59:51 +0000223{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100224 return (ffa_memory_region_flags_t)ret.arg6;
J-Alves32ccd2b2021-12-14 14:59:51 +0000225}
226
Daniel Boulbyce386b12022-03-29 18:36:36 +0100227static inline uint16_t cactus_mem_send_words_to_write(struct ffa_value ret)
J-Alves32ccd2b2021-12-14 14:59:51 +0000228{
J-Alvese742ba82024-01-11 10:38:29 +0000229 return (uint16_t)ret.arg7 & 0xFFFFU;
230}
231
232static inline bool cactus_mem_send_expect_exception(struct ffa_value ret)
233{
Daniel Boulby3d8cd682024-07-23 14:28:15 +0100234 return (bool)((ret.arg7 >> 32) & 0x1);
235}
236
237static inline bool cactus_mem_send_is_normal_memory(struct ffa_value ret)
238{
239 return (bool)((ret.arg7 >> 33) & 0x1);
Federico Recanati6328fb02022-01-14 15:48:16 +0100240}
241
J-Alvesd1aae292020-10-08 17:16:58 +0100242/**
J-Alves542d8d82020-11-18 10:34:06 +0000243 * Command to request a memory management operation. The 'mem_func' argument
244 * identifies the operation that is to be performend, and 'receiver' is the id
245 * of the partition to receive the memory region.
246 *
247 * The command id is the hex representation of the string "memory".
248 */
249#define CACTUS_REQ_MEM_SEND_CMD U(0x6d656d6f7279)
250
Daniel Boulbyce386b12022-03-29 18:36:36 +0100251static inline struct ffa_value cactus_req_mem_send_send_cmd(
Daniel Boulbye79d2072021-03-03 11:34:53 +0000252 ffa_id_t source, ffa_id_t dest, uint32_t mem_func,
Federico Recanati6328fb02022-01-14 15:48:16 +0100253 ffa_id_t receiver, bool non_secure)
J-Alves53392012020-11-18 14:51:57 +0000254{
255 return cactus_send_cmd(source, dest, CACTUS_REQ_MEM_SEND_CMD, mem_func,
Federico Recanati6328fb02022-01-14 15:48:16 +0100256 receiver, non_secure, 0);
J-Alves53392012020-11-18 14:51:57 +0000257}
J-Alves542d8d82020-11-18 10:34:06 +0000258
Daniel Boulbyce386b12022-03-29 18:36:36 +0100259static inline uint32_t cactus_req_mem_send_get_mem_func(struct ffa_value ret)
J-Alves53392012020-11-18 14:51:57 +0000260{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100261 return (uint32_t)ret.arg4;
J-Alves53392012020-11-18 14:51:57 +0000262}
263
Daniel Boulbyce386b12022-03-29 18:36:36 +0100264static inline ffa_id_t cactus_req_mem_send_get_receiver(struct ffa_value ret)
J-Alves53392012020-11-18 14:51:57 +0000265{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100266 return (ffa_id_t)ret.arg5;
J-Alves53392012020-11-18 14:51:57 +0000267}
J-Alves542d8d82020-11-18 10:34:06 +0000268
Daniel Boulbyce386b12022-03-29 18:36:36 +0100269static inline bool cactus_req_mem_send_get_non_secure(struct ffa_value ret)
Federico Recanati6328fb02022-01-14 15:48:16 +0100270{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100271 return (bool)ret.arg6;
Federico Recanati6328fb02022-01-14 15:48:16 +0100272}
273
J-Alves542d8d82020-11-18 10:34:06 +0000274/**
Olivier Deprez881b1992020-12-01 15:34:34 +0100275 * Request to fill SIMD vectors with dummy values with purpose to check a
276 * save/restore routine during the context switches between secure world and
277 * normal world.
278 *
279 * The command id is the hex representation of the string "SIMD"
280 */
281#define CACTUS_REQ_SIMD_FILL_CMD U(0x53494d44)
282
Daniel Boulbyce386b12022-03-29 18:36:36 +0100283static inline struct ffa_value cactus_req_simd_fill_send_cmd(
Daniel Boulbye79d2072021-03-03 11:34:53 +0000284 ffa_id_t source, ffa_id_t dest)
Olivier Deprez881b1992020-12-01 15:34:34 +0100285{
J-Alves0e1e7ca2021-01-25 14:11:06 +0000286 return cactus_send_cmd(source, dest, CACTUS_REQ_SIMD_FILL_CMD, 0, 0, 0,
287 0);
Olivier Deprez881b1992020-12-01 15:34:34 +0100288}
289
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000290/**
Shruti Gupta38133fa2023-04-19 17:00:38 +0100291 * Request to compare FPU state(SIMD vectors, FPCR, FPSR) content
292 * with previous template values to check a save/restore routine during the
293 * context switches between secure world and normal world.
294 */
295#define CACTUS_CMP_SIMD_VALUE_CMD (CACTUS_REQ_SIMD_FILL_CMD + 1)
296
297static inline struct ffa_value cactus_req_simd_compare_send_cmd(
298 ffa_id_t source, ffa_id_t dest)
299{
300 return cactus_send_cmd(source, dest, CACTUS_CMP_SIMD_VALUE_CMD, 0, 0, 0,
301 0);
302}
303
304/**
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000305 * Command to request cactus to sleep for the given time in ms
306 *
307 * The command id is the hex representation of string "sleep"
308 */
309#define CACTUS_SLEEP_CMD U(0x736c656570)
310
Daniel Boulbyce386b12022-03-29 18:36:36 +0100311static inline struct ffa_value cactus_sleep_cmd(
Daniel Boulbye79d2072021-03-03 11:34:53 +0000312 ffa_id_t source, ffa_id_t dest, uint32_t sleep_time)
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000313{
314 return cactus_send_cmd(source, dest, CACTUS_SLEEP_CMD, sleep_time, 0, 0,
315 0);
316}
317
Madhukar Pappireddyb6402592021-08-20 13:13:49 -0500318/**
319 * Command to request cactus to forward sleep command for the given time in ms
320 *
321 * The sender of this command expects to receive CACTUS_SUCCESS if the requested
322 * echo interaction happened successfully, or CACTUS_ERROR otherwise.
Madhukar Pappireddy4b293412022-09-12 11:39:20 -0500323 * Moreover, the sender can send a hint to the destination SP to expect that
324 * the forwaded sleep command could be preempted by a non-secure interrupt.
Madhukar Pappireddyb6402592021-08-20 13:13:49 -0500325 */
326#define CACTUS_FWD_SLEEP_CMD (CACTUS_SLEEP_CMD + 1)
327
Daniel Boulbyce386b12022-03-29 18:36:36 +0100328static inline struct ffa_value cactus_fwd_sleep_cmd(
Madhukar Pappireddyb6402592021-08-20 13:13:49 -0500329 ffa_id_t source, ffa_id_t dest, ffa_id_t fwd_dest,
Madhukar Pappireddy4b293412022-09-12 11:39:20 -0500330 uint32_t sleep_time, bool hint_interrupted)
Madhukar Pappireddyb6402592021-08-20 13:13:49 -0500331{
332 return cactus_send_cmd(source, dest, CACTUS_FWD_SLEEP_CMD, sleep_time,
Madhukar Pappireddy4b293412022-09-12 11:39:20 -0500333 fwd_dest, hint_interrupted, 0);
Madhukar Pappireddyb6402592021-08-20 13:13:49 -0500334}
335
Daniel Boulbyce386b12022-03-29 18:36:36 +0100336static inline uint32_t cactus_get_sleep_time(struct ffa_value ret)
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000337{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100338 return (uint32_t)ret.arg4;
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000339}
340
Daniel Boulbyce386b12022-03-29 18:36:36 +0100341static inline ffa_id_t cactus_get_fwd_sleep_dest(struct ffa_value ret)
Madhukar Pappireddyb6402592021-08-20 13:13:49 -0500342{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100343 return (ffa_id_t)ret.arg5;
Madhukar Pappireddyb6402592021-08-20 13:13:49 -0500344}
345
Madhukar Pappireddy4b293412022-09-12 11:39:20 -0500346static inline bool cactus_get_fwd_sleep_interrupted_hint(struct ffa_value ret)
347{
348 return (bool)ret.arg6;
349}
350
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000351/**
Madhukar Pappireddy407befc2021-12-17 11:06:17 -0600352 * Command to request cactus to sleep for half the given time in ms, trigger
353 * trusted watchdog timer and then sleep again for another half the given time.
354 *
355 * The sender of this command expects to receive CACTUS_SUCCESS if the requested
356 * echo interaction happened successfully, or CACTUS_ERROR otherwise.
357 */
358#define CACTUS_SLEEP_TRIGGER_TWDOG_CMD (CACTUS_SLEEP_CMD + 2)
359
Daniel Boulbyce386b12022-03-29 18:36:36 +0100360static inline struct ffa_value cactus_sleep_trigger_wdog_cmd(
Madhukar Pappireddy407befc2021-12-17 11:06:17 -0600361 ffa_id_t source, ffa_id_t dest, uint32_t sleep_time,
362 uint64_t wdog_time)
363{
364 return cactus_send_cmd(source, dest, CACTUS_SLEEP_TRIGGER_TWDOG_CMD, sleep_time,
365 wdog_time, 0, 0);
366}
367
368
Daniel Boulbyce386b12022-03-29 18:36:36 +0100369static inline uint32_t cactus_get_wdog_trigger_duration(struct ffa_value ret)
Madhukar Pappireddy407befc2021-12-17 11:06:17 -0600370{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100371 return (uint32_t)ret.arg5;
Madhukar Pappireddy407befc2021-12-17 11:06:17 -0600372}
373
374/**
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000375 * Command to request cactus to enable/disable an interrupt
376 *
377 * The command id is the hex representation of string "intr"
378 */
379#define CACTUS_INTERRUPT_CMD U(0x696e7472)
380
Daniel Boulbyce386b12022-03-29 18:36:36 +0100381static inline struct ffa_value cactus_interrupt_cmd(
Daniel Boulbye79d2072021-03-03 11:34:53 +0000382 ffa_id_t source, ffa_id_t dest, uint32_t interrupt_id,
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000383 bool enable, uint32_t pin)
384{
385 return cactus_send_cmd(source, dest, CACTUS_INTERRUPT_CMD, interrupt_id,
386 enable, pin, 0);
387}
388
Daniel Boulbyce386b12022-03-29 18:36:36 +0100389static inline uint32_t cactus_get_interrupt_id(struct ffa_value ret)
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000390{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100391 return (uint32_t)ret.arg4;
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000392}
393
Daniel Boulbyce386b12022-03-29 18:36:36 +0100394static inline bool cactus_get_interrupt_enable(struct ffa_value ret)
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000395{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100396 return (bool)ret.arg5;
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000397}
398
Daniel Boulbyce386b12022-03-29 18:36:36 +0100399static inline enum interrupt_pin cactus_get_interrupt_pin(struct ffa_value ret)
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000400{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100401 return (enum interrupt_pin)ret.arg6;
Manish Pandey9ee6a8d2021-03-03 09:53:33 +0000402}
403
Madhukar Pappireddy172523b2020-12-31 19:25:33 -0600404/**
405 * Request to initiate DMA transaction by upstream peripheral.
406 *
407 * The command id is the hex representation of the string "SMMU"
408 */
409#define CACTUS_DMA_SMMUv3_CMD (0x534d4d55)
410
Daniel Boulbyce386b12022-03-29 18:36:36 +0100411static inline struct ffa_value cactus_send_dma_cmd(
Olivier Depreze71ec9c2022-02-28 18:57:26 +0100412 ffa_id_t source, ffa_id_t dest, uint32_t operation,
413 uintptr_t base, size_t range, uint32_t attributes)
Madhukar Pappireddy172523b2020-12-31 19:25:33 -0600414{
Olivier Depreze71ec9c2022-02-28 18:57:26 +0100415 return cactus_send_cmd(source, dest, CACTUS_DMA_SMMUv3_CMD,
416 (uint64_t)operation, (uint64_t)base,
417 (uint64_t)range, attributes);
Madhukar Pappireddy172523b2020-12-31 19:25:33 -0600418}
J-Alvesb4e89a22021-03-09 10:04:39 +0000419
420/*
421 * Request SP to bind a notification to a FF-A endpoint. In case of error
422 * when using the FFA_NOTIFICATION_BIND interface, include the error code
423 * in the response to the command's request. The receiver and sender arguments
424 * are propagated through the command's arguments, to allow the test of
425 * erroneous uses of the FFA_NOTIFICATION_BIND interface.
426 *
427 * The command id is the hex representation of the string "bind".
428 */
429#define CACTUS_NOTIFICATION_BIND_CMD U(0x62696e64)
430
Daniel Boulbyce386b12022-03-29 18:36:36 +0100431static inline struct ffa_value cactus_notification_bind_send_cmd(
J-Alvesb4e89a22021-03-09 10:04:39 +0000432 ffa_id_t source, ffa_id_t dest, ffa_id_t receiver,
433 ffa_id_t sender, ffa_notification_bitmap_t notifications, uint32_t flags)
434{
435 return cactus_send_cmd(source, dest, CACTUS_NOTIFICATION_BIND_CMD,
436 receiver, sender, notifications, flags);
437}
438
439/**
440 * Request to SP unbind a notification. In case of error when using the
441 * FFA_NOTIFICATION_UNBIND interface, the test includes the error code in the
442 * response. The receiver and sender arguments are propagated throught the
443 * command's arguments, to allow the test of erroneous uses of the
444 * FFA_NOTIFICATION_BIND interface.
445 *
446 * The command id is the hex representation of the string "unbind".
447 */
448#define CACTUS_NOTIFICATION_UNBIND_CMD U(0x756e62696e64)
449
Daniel Boulbyce386b12022-03-29 18:36:36 +0100450static inline struct ffa_value cactus_notification_unbind_send_cmd(
J-Alvesb4e89a22021-03-09 10:04:39 +0000451 ffa_id_t source, ffa_id_t dest, ffa_id_t receiver,
452 ffa_id_t sender, ffa_notification_bitmap_t notifications)
453{
454 return cactus_send_cmd(source, dest, CACTUS_NOTIFICATION_UNBIND_CMD,
455 receiver, sender, notifications, 0);
456}
457
Daniel Boulbyce386b12022-03-29 18:36:36 +0100458static inline ffa_id_t cactus_notification_get_receiver(struct ffa_value ret)
J-Alvesb4e89a22021-03-09 10:04:39 +0000459{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100460 return (ffa_id_t)ret.arg4;
J-Alvesb4e89a22021-03-09 10:04:39 +0000461}
462
Daniel Boulbyce386b12022-03-29 18:36:36 +0100463static inline ffa_id_t cactus_notification_get_sender(struct ffa_value ret)
J-Alvesb4e89a22021-03-09 10:04:39 +0000464{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100465 return (ffa_id_t)ret.arg5;
J-Alvesb4e89a22021-03-09 10:04:39 +0000466}
467
468static inline ffa_notification_bitmap_t cactus_notification_get_notifications(
Daniel Boulbyce386b12022-03-29 18:36:36 +0100469 struct ffa_value ret)
J-Alvesb4e89a22021-03-09 10:04:39 +0000470{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100471 return (uint64_t)ret.arg6;
J-Alvesb4e89a22021-03-09 10:04:39 +0000472}
473
J-Alvesab775912021-03-29 15:22:33 +0100474/**
475 * Request SP to get notifications. The arguments to use in ffa_notification_get
476 * are propagated on the command to test erroneous uses of the interface.
477 * In a successful call to the interface, the SP's response payload should
478 * include all bitmaps returned by the SPMC.
479 *
480 * The command id is the hex representation of the string "getnot".
481 */
482#define CACTUS_NOTIFICATION_GET_CMD U(0x6765746e6f74)
483
Daniel Boulbyce386b12022-03-29 18:36:36 +0100484static inline struct ffa_value cactus_notification_get_send_cmd(
J-Alvesab775912021-03-29 15:22:33 +0100485 ffa_id_t source, ffa_id_t dest, ffa_id_t receiver,
J-Alvesa076d4c2021-10-19 16:06:15 +0100486 uint32_t vcpu_id, uint32_t flags, bool check_npi_handled)
J-Alvesab775912021-03-29 15:22:33 +0100487{
488 return cactus_send_cmd(source, dest, CACTUS_NOTIFICATION_GET_CMD,
J-Alvesa076d4c2021-10-19 16:06:15 +0100489 receiver, vcpu_id, check_npi_handled, flags);
J-Alvesab775912021-03-29 15:22:33 +0100490}
491
Daniel Boulbyce386b12022-03-29 18:36:36 +0100492static inline uint32_t cactus_notification_get_vcpu(struct ffa_value ret)
J-Alvesab775912021-03-29 15:22:33 +0100493{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100494 return (uint32_t)ret.arg5;
J-Alvesab775912021-03-29 15:22:33 +0100495}
496
Daniel Boulbyce386b12022-03-29 18:36:36 +0100497static inline uint32_t cactus_notification_get_flags(struct ffa_value ret)
J-Alvesb4e89a22021-03-09 10:04:39 +0000498{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100499 return (uint32_t)ret.arg7;
J-Alvesb4e89a22021-03-09 10:04:39 +0000500}
501
Daniel Boulbyce386b12022-03-29 18:36:36 +0100502static inline struct ffa_value cactus_notifications_get_success_resp(
J-Alvesab775912021-03-29 15:22:33 +0100503 ffa_id_t source, ffa_id_t dest, uint64_t from_sp,
504 uint64_t from_vm)
505{
506 return cactus_send_response(source, dest, CACTUS_SUCCESS, from_sp,
507 from_vm, 0, 0);
508}
509
Daniel Boulbyce386b12022-03-29 18:36:36 +0100510static inline uint64_t cactus_notifications_get_from_sp(struct ffa_value ret)
J-Alvesab775912021-03-29 15:22:33 +0100511{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100512 return (uint64_t)ret.arg4;
J-Alvesab775912021-03-29 15:22:33 +0100513}
514
Daniel Boulbyce386b12022-03-29 18:36:36 +0100515static inline uint64_t cactus_notifications_get_from_vm(struct ffa_value ret)
J-Alvesab775912021-03-29 15:22:33 +0100516{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100517 return (uint64_t)ret.arg5;
J-Alvesab775912021-03-29 15:22:33 +0100518}
519
Daniel Boulbyce386b12022-03-29 18:36:36 +0100520static inline bool cactus_notifications_check_npi_handled(struct ffa_value ret)
J-Alvesa076d4c2021-10-19 16:06:15 +0100521{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100522 return (bool)ret.arg6;
J-Alvesa076d4c2021-10-19 16:06:15 +0100523}
524
J-Alvesab775912021-03-29 15:22:33 +0100525/**
526 * Request SP to set notifications. The arguments to use in ffa_notification_set
527 * are propagated on the command to test erroneous uses of the interface.
528 * In case of error while calling the interface, the response should include the
J-Alvesfbbbf622021-07-30 16:43:36 +0100529 * error code. If in the flags a delay SRI is requested, cactus should
530 * send a CACTUS_ECHO_CMD to the SP specified as `echo_dest`. This should help
531 * validate that the SRI is only sent when returning execution to the NWd.
J-Alvesab775912021-03-29 15:22:33 +0100532 */
533#define CACTUS_NOTIFICATIONS_SET_CMD U(0x6e6f74736574)
534
Daniel Boulbyce386b12022-03-29 18:36:36 +0100535static inline struct ffa_value cactus_notifications_set_send_cmd(
J-Alvesab775912021-03-29 15:22:33 +0100536 ffa_id_t source, ffa_id_t dest, ffa_id_t receiver,
J-Alvesfbbbf622021-07-30 16:43:36 +0100537 ffa_id_t sender, uint32_t flags, ffa_notification_bitmap_t notifications,
538 ffa_id_t echo_dest)
J-Alvesab775912021-03-29 15:22:33 +0100539{
540 return cactus_send_cmd(source, dest, CACTUS_NOTIFICATIONS_SET_CMD,
J-Alvesfbbbf622021-07-30 16:43:36 +0100541 (uint32_t)receiver | ((uint32_t)sender << 16),
542 echo_dest,
543 notifications, flags);
544}
545
Daniel Boulbyce386b12022-03-29 18:36:36 +0100546static inline ffa_id_t cactus_notifications_set_get_receiver(
547 struct ffa_value ret)
J-Alvesfbbbf622021-07-30 16:43:36 +0100548{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100549 return (ffa_id_t)(ret.arg4 & 0xFFFFU);
J-Alvesfbbbf622021-07-30 16:43:36 +0100550}
551
Daniel Boulbyce386b12022-03-29 18:36:36 +0100552static inline ffa_id_t cactus_notifications_set_get_sender(struct ffa_value ret)
J-Alvesfbbbf622021-07-30 16:43:36 +0100553{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100554 return (ffa_id_t)((ret.arg4 >> 16U) & 0xFFFFU);
J-Alvesab775912021-03-29 15:22:33 +0100555}
556
Madhukar Pappireddy3c287262021-08-05 14:39:24 -0500557/**
558 * Request to start trusted watchdog timer.
559 *
560 * The command id is the hex representaton of the string "WDOG"
561 */
562#define CACTUS_TWDOG_START_CMD U(0x57444f47)
563
Daniel Boulbyce386b12022-03-29 18:36:36 +0100564static inline struct ffa_value cactus_send_twdog_cmd(
Madhukar Pappireddy3c287262021-08-05 14:39:24 -0500565 ffa_id_t source, ffa_id_t dest, uint64_t time)
566{
567 return cactus_send_cmd(source, dest, CACTUS_TWDOG_START_CMD, time, 0, 0,
568 0);
569}
570
Daniel Boulbyce386b12022-03-29 18:36:36 +0100571static inline uint32_t cactus_get_wdog_duration(struct ffa_value ret)
Madhukar Pappireddy3c287262021-08-05 14:39:24 -0500572{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100573 return (uint32_t)ret.arg4;
Madhukar Pappireddy3c287262021-08-05 14:39:24 -0500574}
575
J-Alvesf7535f42021-07-30 11:58:41 +0100576/**
577 * Request SP to return the current count of handled requests.
578 *
579 * The command id is the hex representation of the string "getnot".
580 */
581#define CACTUS_GET_REQ_COUNT_CMD U(0x726571636f756e74)
582
Daniel Boulbyce386b12022-03-29 18:36:36 +0100583static inline struct ffa_value cactus_get_req_count_send_cmd(
J-Alvesf7535f42021-07-30 11:58:41 +0100584 ffa_id_t source, ffa_id_t dest)
585{
586 return cactus_send_cmd(source, dest, CACTUS_GET_REQ_COUNT_CMD, 0, 0, 0,
587 0);
588}
589
Daniel Boulbyce386b12022-03-29 18:36:36 +0100590static inline uint32_t cactus_get_req_count(struct ffa_value ret)
J-Alvesf7535f42021-07-30 11:58:41 +0100591{
Daniel Boulbyce386b12022-03-29 18:36:36 +0100592 return (uint32_t)ret.arg4;
J-Alvesf7535f42021-07-30 11:58:41 +0100593}
594
Madhukar Pappireddyf4c8e8d2022-02-15 15:52:53 -0600595/**
596 * Request SP to return the last serviced secure virtual interrupt.
597 *
598 * The command id is the hex representaton of the string "vINT"
599 */
600#define CACTUS_LAST_INTERRUPT_SERVICED_CMD U(0x76494e54)
601
Daniel Boulbyce386b12022-03-29 18:36:36 +0100602static inline struct ffa_value cactus_get_last_interrupt_cmd(
Madhukar Pappireddyf4c8e8d2022-02-15 15:52:53 -0600603 ffa_id_t source, ffa_id_t dest)
604{
605 return cactus_send_cmd(source, dest, CACTUS_LAST_INTERRUPT_SERVICED_CMD,
606 0, 0, 0, 0);
607}
Madhukar Pappireddy0b0ca112022-09-19 13:39:48 -0500608
609/**
610 * Request SP to resume the task requested by current endpoint after managed
611 * exit.
612 *
613 * The command id is the hex representation of the string "RAME" which denotes
614 * (R)esume (A)fter (M)anaged (E)xit.
615 */
616#define CACTUS_RESUME_AFTER_MANAGED_EXIT U(0x52414d45)
617
618static inline struct ffa_value cactus_resume_after_managed_exit(
619 ffa_id_t source, ffa_id_t dest)
620{
621 return cactus_send_cmd(source, dest, CACTUS_RESUME_AFTER_MANAGED_EXIT,
622 0, 0, 0, 0);
623}
Raghu Krishnamurthy9e267a02022-08-11 21:25:26 -0700624
625/**
626 * Request SP to pend an interrupt in the extended SPI range.
627 *
628 * The command is the hex representation of the string "espi".
629 */
630#define CACTUS_TRIGGER_ESPI_CMD U(0x65737069)
631static inline struct ffa_value cactus_trigger_espi_cmd(
632 ffa_id_t source, ffa_id_t dest, uint32_t espi_id)
633{
634 return cactus_send_cmd(source, dest, CACTUS_TRIGGER_ESPI_CMD,
635 espi_id, 0, 0, 0);
636}
637
638static inline uint32_t cactus_get_espi_id(struct ffa_value ret)
639{
640 return (uint32_t)ret.arg4;
641}
642
Madhukar Pappireddyd655d582024-01-16 14:45:39 -0600643/*
644 * Request SP to mimic handling a RAS error delegated by an EL3 logical secure
645 * partition.
646 *
647 * The command ID is the hex representation of the string 'rase' which
648 * denotes RAS Error.
649 */
650#define CACTUS_RAS_DELEGATE_CMD U(0x72617365)
651
652static inline struct ffa_value cactus_ras_delegate_send_cmd(
653 ffa_id_t source, ffa_id_t dest, uint64_t event_id)
654{
655 return cactus_send_cmd(source, dest, CACTUS_RAS_DELEGATE_CMD, event_id, 0, 0,
656 0);
657}
658
659static inline uint64_t cactus_ras_get_event_id(struct ffa_value ret)
660{
661 return (uint64_t)ret.arg4;
662}
663
J-Alves58cc4da2024-04-05 14:17:35 +0100664/**
665 * Request SP to send indirect message to FF-A endpoint.
666 *
667 * Command ID is string: MSGREQ.
668 */
669#define CACTUS_REQ_MSG_SEND_CMD U(0x4d5347524551a)
670
671static inline struct ffa_value cactus_req_ind_msg_send_cmd(
672 ffa_id_t source, ffa_id_t dest, ffa_id_t receiver,
673 ffa_id_t sender, uint32_t flags)
674{
675 return cactus_send_cmd(source, dest, CACTUS_REQ_MSG_SEND_CMD,
676 flags, receiver, sender, 0);
677}
678
679static inline ffa_id_t cactus_msg_send_receiver(struct ffa_value ret)
680{
681 return (ffa_id_t)ret.arg5;
682}
683
684static inline ffa_id_t cactus_msg_send_sender(struct ffa_value ret)
685{
686 return (ffa_id_t)ret.arg6;
687}
688
689static inline uint64_t cactus_msg_send_flags(struct ffa_value ret)
690{
691 return (uint64_t)ret.arg4;
692}
693
J-Alvesd1aae292020-10-08 17:16:58 +0100694#endif