blob: 67fd7ee88e194b386ed722405f1f082867290798 [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
85sp_result sp_msg_send_direct_req(const struct sp_msg *req, struct sp_msg *resp)
86{
87 ffa_result ffa_res = FFA_OK;
88 struct ffa_direct_msg ffa_req = { 0 };
89 struct ffa_direct_msg ffa_resp = { 0 };
90
91 if (!resp)
92 return SP_RESULT_INVALID_PARAMETERS;
93
94 if (!req) {
95 *resp = (struct sp_msg){ 0 };
96 return SP_RESULT_INVALID_PARAMETERS;
97 }
98
99 pack_ffa_direct_msg(req, &ffa_req);
100
Imre Kisbe97e772021-02-25 17:56:19 +0100101#if FFA_DIRECT_MSG_ROUTING_EXTENSION
Imre Kisaec6d142023-06-27 16:16:57 +0200102 ffa_res = ffa_direct_msg_routing_ext_req_pre_hook(&ffa_req);
103 if (ffa_res != FFA_OK) {
104 *resp = (struct sp_msg){ 0 };
105 return SP_RESULT_INVALID_PARAMETERS;
106 }
Imre Kisbe97e772021-02-25 17:56:19 +0100107#endif
108
Imre Kis1bc4a622022-07-19 17:38:00 +0200109 if (req->is_64bit_message)
110 ffa_res = ffa_msg_send_direct_req_64(
111 ffa_req.source_id, ffa_req.destination_id,
112 ffa_req.args.args64[0], ffa_req.args.args64[1],
113 ffa_req.args.args64[2], ffa_req.args.args64[3],
114 ffa_req.args.args64[4], &ffa_resp);
115 else
116 ffa_res = ffa_msg_send_direct_req_32(
117 ffa_req.source_id, ffa_req.destination_id,
118 ffa_req.args.args32[0], ffa_req.args.args32[1],
119 ffa_req.args.args32[2], ffa_req.args.args32[3],
120 ffa_req.args.args32[4], &ffa_resp);
Imre Kisc674b5b2021-02-09 19:05:27 +0100121
122 if (ffa_res != FFA_OK) {
Imre Kisbe97e772021-02-25 17:56:19 +0100123#if FFA_DIRECT_MSG_ROUTING_EXTENSION
124 ffa_direct_msg_routing_ext_req_error_hook();
125#endif
Imre Kisc674b5b2021-02-09 19:05:27 +0100126 *resp = (struct sp_msg){ 0 };
127 return SP_RESULT_FFA(ffa_res);
128 }
129
Imre Kisbe97e772021-02-25 17:56:19 +0100130#if FFA_DIRECT_MSG_ROUTING_EXTENSION
131 ffa_res = ffa_direct_msg_routing_ext_req_post_hook(&ffa_resp);
132 if (ffa_res != SP_RESULT_OK) {
133 *resp = (struct sp_msg){ 0 };
134 return SP_RESULT_FFA(ffa_res);
135 }
136#endif
137
Imre Kisc674b5b2021-02-09 19:05:27 +0100138 unpack_ffa_direct_msg(&ffa_resp, resp);
139
140 return SP_RESULT_OK;
141}
142
143sp_result sp_msg_send_direct_resp(const struct sp_msg *resp, struct sp_msg *req)
144{
145 ffa_result ffa_res = FFA_OK;
146 struct ffa_direct_msg ffa_resp = { 0 };
147 struct ffa_direct_msg ffa_req = { 0 };
148
149 if (!req)
150 return SP_RESULT_INVALID_PARAMETERS;
151
152 if (!resp) {
153 *req = (struct sp_msg){ 0 };
154 return SP_RESULT_INVALID_PARAMETERS;
155 }
156
157 pack_ffa_direct_msg(resp, &ffa_resp);
158
Imre Kisbe97e772021-02-25 17:56:19 +0100159#if FFA_DIRECT_MSG_ROUTING_EXTENSION
Imre Kisaec6d142023-06-27 16:16:57 +0200160 ffa_res = ffa_direct_msg_routing_ext_resp_pre_hook(&ffa_resp);
161 if (ffa_res != FFA_OK) {
162 *req = (struct sp_msg){ 0 };
163 return SP_RESULT_INVALID_PARAMETERS;
164 }
Imre Kisbe97e772021-02-25 17:56:19 +0100165#endif
166
Imre Kis1bc4a622022-07-19 17:38:00 +0200167 if (resp->is_64bit_message)
168 ffa_res = ffa_msg_send_direct_resp_64(
169 ffa_resp.source_id, ffa_resp.destination_id,
170 ffa_resp.args.args64[0], ffa_resp.args.args64[1],
171 ffa_resp.args.args64[2], ffa_resp.args.args64[3],
172 ffa_resp.args.args64[4], &ffa_req);
173 else
174 ffa_res = ffa_msg_send_direct_resp_32(
175 ffa_resp.source_id, ffa_resp.destination_id,
176 ffa_resp.args.args32[0], ffa_resp.args.args32[1],
177 ffa_resp.args.args32[2], ffa_resp.args.args32[3],
178 ffa_resp.args.args32[4], &ffa_req);
Imre Kisc674b5b2021-02-09 19:05:27 +0100179
180 if (ffa_res != FFA_OK) {
Imre Kisbe97e772021-02-25 17:56:19 +0100181#if FFA_DIRECT_MSG_ROUTING_EXTENSION
182 ffa_direct_msg_routing_ext_resp_error_hook();
183#endif
Imre Kisc674b5b2021-02-09 19:05:27 +0100184 *req = (struct sp_msg){ 0 };
185 return SP_RESULT_FFA(ffa_res);
186 }
187
Imre Kisbe97e772021-02-25 17:56:19 +0100188#if FFA_DIRECT_MSG_ROUTING_EXTENSION
189 ffa_res = ffa_direct_msg_routing_ext_resp_post_hook(&ffa_req);
190 if (ffa_res != SP_RESULT_OK) {
191 *req = (struct sp_msg){ 0 };
192 return SP_RESULT_FFA(ffa_res);
193 }
194#endif
195
Imre Kisc674b5b2021-02-09 19:05:27 +0100196 unpack_ffa_direct_msg(&ffa_req, req);
197
198 return SP_RESULT_OK;
199}
Imre Kisbe97e772021-02-25 17:56:19 +0100200
201#if FFA_DIRECT_MSG_ROUTING_EXTENSION
202sp_result sp_msg_send_rc_req(const struct sp_msg *req, struct sp_msg *resp)
203{
204 ffa_result ffa_res = FFA_OK;
205 struct ffa_direct_msg ffa_req = { 0 };
206 struct ffa_direct_msg ffa_resp = { 0 };
207
208 if (!resp)
209 return SP_RESULT_INVALID_PARAMETERS;
210
211 if (!req) {
212 *resp = (struct sp_msg){ 0 };
213 return SP_RESULT_INVALID_PARAMETERS;
214 }
215
216 pack_ffa_direct_msg(req, &ffa_req);
217
Imre Kisaec6d142023-06-27 16:16:57 +0200218 ffa_res = ffa_direct_msg_routing_ext_rc_req_pre_hook(&ffa_req);
219 if (ffa_res != FFA_OK) {
220 *resp = (struct sp_msg){ 0 };
221 return SP_RESULT_INVALID_PARAMETERS;
222 }
Imre Kisbe97e772021-02-25 17:56:19 +0100223
Imre Kis1bc4a622022-07-19 17:38:00 +0200224 ffa_res = ffa_msg_send_direct_resp_32(ffa_req.source_id,
Imre Kisbe97e772021-02-25 17:56:19 +0100225 ffa_req.destination_id,
Imre Kis1bc4a622022-07-19 17:38:00 +0200226 ffa_req.args.args32[0], ffa_req.args.args32[1],
227 ffa_req.args.args32[2], ffa_req.args.args32[3],
228 ffa_req.args.args32[4], &ffa_resp);
Imre Kisbe97e772021-02-25 17:56:19 +0100229
230 if (ffa_res != FFA_OK) {
231 ffa_direct_msg_routing_ext_rc_req_error_hook();
232 *resp = (struct sp_msg){ 0 };
233 return SP_RESULT_FFA(ffa_res);
234 }
235
236 ffa_res = ffa_direct_msg_routing_ext_rc_req_post_hook(&ffa_resp);
237 if (ffa_res != SP_RESULT_OK) {
238 *resp = (struct sp_msg){ 0 };
239 return SP_RESULT_FFA(ffa_res);
240 }
241
242 unpack_ffa_direct_msg(&ffa_resp, resp);
243
244 return SP_RESULT_OK;
245}
246#endif