blob: 0c26aa7ca081efc7bdf3157b4d5c13ab0aa8be96 [file] [log] [blame]
Imre Kisc674b5b2021-02-09 19:05:27 +01001// SPDX-License-Identifier: BSD-3-Clause
2/*
Imre Kis1bc4a622022-07-19 17:38:00 +02003 * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
Imre Kisc674b5b2021-02-09 19:05:27 +01004 */
5
6#include "ffa_api.h"
7#include "sp_api_defines.h"
8#include "sp_messaging.h"
Imre Kisbe97e772021-02-25 17:56:19 +01009#if FFA_DIRECT_MSG_ROUTING_EXTENSION
10#include "ffa_direct_msg_routing_extension.h"
11#endif
Imre Kisc674b5b2021-02-09 19:05:27 +010012
13#include <string.h>
14
Imre Kisc674b5b2021-02-09 19:05:27 +010015static void pack_ffa_direct_msg(const struct sp_msg *msg,
16 struct ffa_direct_msg *ffa_msg)
17{
Imre Kisc674b5b2021-02-09 19:05:27 +010018 ffa_msg->source_id = msg->source_id;
19 ffa_msg->destination_id = msg->destination_id;
20
Imre Kisaec6d142023-06-27 16:16:57 +020021 if (msg->is_64bit_message) {
22 ffa_msg->function_id = FFA_TO_64_BIT_FUNC(0);
23 memcpy(ffa_msg->args.args64, msg->args.args64, sizeof(msg->args.args64));
24 } else {
25 memcpy(ffa_msg->args.args32, msg->args.args32, sizeof(msg->args.args32));
26 }
Imre Kisc674b5b2021-02-09 19:05:27 +010027}
28
29static void unpack_ffa_direct_msg(const struct ffa_direct_msg *ffa_msg,
30 struct sp_msg *msg)
31{
Imre Kis1bc4a622022-07-19 17:38:00 +020032 if (ffa_msg->function_id == FFA_MSG_SEND_DIRECT_REQ_32 ||
33 ffa_msg->function_id == FFA_MSG_SEND_DIRECT_RESP_32) {
Imre Kisc674b5b2021-02-09 19:05:27 +010034 /*
Imre Kis1bc4a622022-07-19 17:38:00 +020035 * Handling 32 bit request or response
Imre Kisc674b5b2021-02-09 19:05:27 +010036 */
37 msg->source_id = ffa_msg->source_id;
38 msg->destination_id = ffa_msg->destination_id;
Imre Kisaec6d142023-06-27 16:16:57 +020039 msg->is_64bit_message = false;
Imre Kisc674b5b2021-02-09 19:05:27 +010040
Imre Kisaec6d142023-06-27 16:16:57 +020041 memcpy(msg->args.args32, ffa_msg->args.args32, sizeof(msg->args.args32));
Imre Kis1bc4a622022-07-19 17:38:00 +020042 } else if (ffa_msg->function_id == FFA_MSG_SEND_DIRECT_REQ_64 ||
43 ffa_msg->function_id == FFA_MSG_SEND_DIRECT_RESP_64) {
44 /*
45 * Handling 64 bit request or response
46 */
47 msg->source_id = ffa_msg->source_id;
48 msg->destination_id = ffa_msg->destination_id;
Imre Kisaec6d142023-06-27 16:16:57 +020049 msg->is_64bit_message = true;
Imre Kis1bc4a622022-07-19 17:38:00 +020050
Imre Kisaec6d142023-06-27 16:16:57 +020051 memcpy(msg->args.args64, ffa_msg->args.args64, sizeof(msg->args.args64));
Imre Kisc674b5b2021-02-09 19:05:27 +010052 } else {
53 /* Success has no message parameters */
54 *msg = (struct sp_msg){ 0 };
55 }
56}
57
58sp_result sp_msg_wait(struct sp_msg *msg)
59{
60 ffa_result ffa_res = FFA_OK;
61 struct ffa_direct_msg ffa_msg = { 0 };
62
63 if (!msg)
64 return SP_RESULT_INVALID_PARAMETERS;
65
66 ffa_res = ffa_msg_wait(&ffa_msg);
67 if (ffa_res != FFA_OK) {
68 *msg = (struct sp_msg){ 0 };
69 return SP_RESULT_FFA(ffa_res);
70 }
71
Imre Kisbe97e772021-02-25 17:56:19 +010072#if FFA_DIRECT_MSG_ROUTING_EXTENSION
73 ffa_res = ffa_direct_msg_routing_ext_wait_post_hook(&ffa_msg);
74 if (ffa_res != FFA_OK) {
75 *msg = (struct sp_msg){ 0 };
76 return SP_RESULT_FFA(ffa_res);
77 }
78#endif
79
Imre Kisc674b5b2021-02-09 19:05:27 +010080 unpack_ffa_direct_msg(&ffa_msg, msg);
81
82 return SP_RESULT_OK;
83}
84
Gabor Toth0d6eb662025-03-11 10:44:43 +010085sp_result sp_yield(void)
86{
87 return SP_RESULT_FFA(ffa_yield());
88}
89
Imre Kisc674b5b2021-02-09 19:05:27 +010090sp_result sp_msg_send_direct_req(const struct sp_msg *req, struct sp_msg *resp)
91{
92 ffa_result ffa_res = FFA_OK;
93 struct ffa_direct_msg ffa_req = { 0 };
94 struct ffa_direct_msg ffa_resp = { 0 };
95
96 if (!resp)
97 return SP_RESULT_INVALID_PARAMETERS;
98
99 if (!req) {
100 *resp = (struct sp_msg){ 0 };
101 return SP_RESULT_INVALID_PARAMETERS;
102 }
103
104 pack_ffa_direct_msg(req, &ffa_req);
105
Imre Kisbe97e772021-02-25 17:56:19 +0100106#if FFA_DIRECT_MSG_ROUTING_EXTENSION
Imre Kisaec6d142023-06-27 16:16:57 +0200107 ffa_res = ffa_direct_msg_routing_ext_req_pre_hook(&ffa_req);
108 if (ffa_res != FFA_OK) {
109 *resp = (struct sp_msg){ 0 };
110 return SP_RESULT_INVALID_PARAMETERS;
111 }
Imre Kisbe97e772021-02-25 17:56:19 +0100112#endif
113
Imre Kis1bc4a622022-07-19 17:38:00 +0200114 if (req->is_64bit_message)
115 ffa_res = ffa_msg_send_direct_req_64(
116 ffa_req.source_id, ffa_req.destination_id,
117 ffa_req.args.args64[0], ffa_req.args.args64[1],
118 ffa_req.args.args64[2], ffa_req.args.args64[3],
119 ffa_req.args.args64[4], &ffa_resp);
120 else
121 ffa_res = ffa_msg_send_direct_req_32(
122 ffa_req.source_id, ffa_req.destination_id,
123 ffa_req.args.args32[0], ffa_req.args.args32[1],
124 ffa_req.args.args32[2], ffa_req.args.args32[3],
125 ffa_req.args.args32[4], &ffa_resp);
Imre Kisc674b5b2021-02-09 19:05:27 +0100126
127 if (ffa_res != FFA_OK) {
Imre Kisbe97e772021-02-25 17:56:19 +0100128#if FFA_DIRECT_MSG_ROUTING_EXTENSION
129 ffa_direct_msg_routing_ext_req_error_hook();
130#endif
Imre Kisc674b5b2021-02-09 19:05:27 +0100131 *resp = (struct sp_msg){ 0 };
132 return SP_RESULT_FFA(ffa_res);
133 }
134
Imre Kisbe97e772021-02-25 17:56:19 +0100135#if FFA_DIRECT_MSG_ROUTING_EXTENSION
136 ffa_res = ffa_direct_msg_routing_ext_req_post_hook(&ffa_resp);
137 if (ffa_res != SP_RESULT_OK) {
138 *resp = (struct sp_msg){ 0 };
139 return SP_RESULT_FFA(ffa_res);
140 }
141#endif
142
Imre Kisc674b5b2021-02-09 19:05:27 +0100143 unpack_ffa_direct_msg(&ffa_resp, resp);
144
145 return SP_RESULT_OK;
146}
147
148sp_result sp_msg_send_direct_resp(const struct sp_msg *resp, struct sp_msg *req)
149{
150 ffa_result ffa_res = FFA_OK;
151 struct ffa_direct_msg ffa_resp = { 0 };
152 struct ffa_direct_msg ffa_req = { 0 };
153
154 if (!req)
155 return SP_RESULT_INVALID_PARAMETERS;
156
157 if (!resp) {
158 *req = (struct sp_msg){ 0 };
159 return SP_RESULT_INVALID_PARAMETERS;
160 }
161
162 pack_ffa_direct_msg(resp, &ffa_resp);
163
Imre Kisbe97e772021-02-25 17:56:19 +0100164#if FFA_DIRECT_MSG_ROUTING_EXTENSION
Imre Kisaec6d142023-06-27 16:16:57 +0200165 ffa_res = ffa_direct_msg_routing_ext_resp_pre_hook(&ffa_resp);
166 if (ffa_res != FFA_OK) {
167 *req = (struct sp_msg){ 0 };
168 return SP_RESULT_INVALID_PARAMETERS;
169 }
Imre Kisbe97e772021-02-25 17:56:19 +0100170#endif
171
Imre Kis1bc4a622022-07-19 17:38:00 +0200172 if (resp->is_64bit_message)
173 ffa_res = ffa_msg_send_direct_resp_64(
174 ffa_resp.source_id, ffa_resp.destination_id,
175 ffa_resp.args.args64[0], ffa_resp.args.args64[1],
176 ffa_resp.args.args64[2], ffa_resp.args.args64[3],
177 ffa_resp.args.args64[4], &ffa_req);
178 else
179 ffa_res = ffa_msg_send_direct_resp_32(
180 ffa_resp.source_id, ffa_resp.destination_id,
181 ffa_resp.args.args32[0], ffa_resp.args.args32[1],
182 ffa_resp.args.args32[2], ffa_resp.args.args32[3],
183 ffa_resp.args.args32[4], &ffa_req);
Imre Kisc674b5b2021-02-09 19:05:27 +0100184
185 if (ffa_res != FFA_OK) {
Imre Kisbe97e772021-02-25 17:56:19 +0100186#if FFA_DIRECT_MSG_ROUTING_EXTENSION
187 ffa_direct_msg_routing_ext_resp_error_hook();
188#endif
Imre Kisc674b5b2021-02-09 19:05:27 +0100189 *req = (struct sp_msg){ 0 };
190 return SP_RESULT_FFA(ffa_res);
191 }
192
Imre Kisbe97e772021-02-25 17:56:19 +0100193#if FFA_DIRECT_MSG_ROUTING_EXTENSION
194 ffa_res = ffa_direct_msg_routing_ext_resp_post_hook(&ffa_req);
195 if (ffa_res != SP_RESULT_OK) {
196 *req = (struct sp_msg){ 0 };
197 return SP_RESULT_FFA(ffa_res);
198 }
199#endif
200
Imre Kisc674b5b2021-02-09 19:05:27 +0100201 unpack_ffa_direct_msg(&ffa_req, req);
202
203 return SP_RESULT_OK;
204}
Imre Kisbe97e772021-02-25 17:56:19 +0100205
206#if FFA_DIRECT_MSG_ROUTING_EXTENSION
207sp_result sp_msg_send_rc_req(const struct sp_msg *req, struct sp_msg *resp)
208{
209 ffa_result ffa_res = FFA_OK;
210 struct ffa_direct_msg ffa_req = { 0 };
211 struct ffa_direct_msg ffa_resp = { 0 };
212
213 if (!resp)
214 return SP_RESULT_INVALID_PARAMETERS;
215
216 if (!req) {
217 *resp = (struct sp_msg){ 0 };
218 return SP_RESULT_INVALID_PARAMETERS;
219 }
220
221 pack_ffa_direct_msg(req, &ffa_req);
222
Imre Kisaec6d142023-06-27 16:16:57 +0200223 ffa_res = ffa_direct_msg_routing_ext_rc_req_pre_hook(&ffa_req);
224 if (ffa_res != FFA_OK) {
225 *resp = (struct sp_msg){ 0 };
226 return SP_RESULT_INVALID_PARAMETERS;
227 }
Imre Kisbe97e772021-02-25 17:56:19 +0100228
Imre Kis1bc4a622022-07-19 17:38:00 +0200229 ffa_res = ffa_msg_send_direct_resp_32(ffa_req.source_id,
Imre Kisbe97e772021-02-25 17:56:19 +0100230 ffa_req.destination_id,
Imre Kis1bc4a622022-07-19 17:38:00 +0200231 ffa_req.args.args32[0], ffa_req.args.args32[1],
232 ffa_req.args.args32[2], ffa_req.args.args32[3],
233 ffa_req.args.args32[4], &ffa_resp);
Imre Kisbe97e772021-02-25 17:56:19 +0100234
235 if (ffa_res != FFA_OK) {
236 ffa_direct_msg_routing_ext_rc_req_error_hook();
237 *resp = (struct sp_msg){ 0 };
238 return SP_RESULT_FFA(ffa_res);
239 }
240
241 ffa_res = ffa_direct_msg_routing_ext_rc_req_post_hook(&ffa_resp);
242 if (ffa_res != SP_RESULT_OK) {
243 *resp = (struct sp_msg){ 0 };
244 return SP_RESULT_FFA(ffa_res);
245 }
246
247 unpack_ffa_direct_msg(&ffa_resp, resp);
248
249 return SP_RESULT_OK;
250}
251#endif