blob: 351c97108f24cf87f3c26e729986690cd650a371 [file] [log] [blame]
David Hu5923bc22019-09-23 15:44:06 +08001/*
David Hu46603dd2019-12-11 18:05:16 +08002 * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
David Hu5923bc22019-09-23 15:44:06 +08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Mingyang Sunc3123ec2020-06-11 17:43:58 +08008#include "spm_api.h"
Mingyang Sund44522a2020-01-16 16:48:37 +08009#include "spm_psa_client_call.h"
David Hu5923bc22019-09-23 15:44:06 +080010#include "tfm_rpc.h"
Summer Qin5fdcf632020-06-22 16:49:24 +080011#include "utilities.h"
David Hu5923bc22019-09-23 15:44:06 +080012
13static void default_handle_req(void)
14{
15}
16
17static void default_mailbox_reply(const void *owner, int32_t ret)
18{
19 (void)owner;
20 (void)ret;
21}
22
David Hua79c7c12019-12-11 18:47:06 +080023static const void *default_get_caller_data(int32_t client_id)
24{
25 (void)client_id;
26
27 return NULL;
28}
29
David Hu5923bc22019-09-23 15:44:06 +080030static struct tfm_rpc_ops_t rpc_ops = {
31 .handle_req = default_handle_req,
32 .reply = default_mailbox_reply,
David Hua79c7c12019-12-11 18:47:06 +080033 .get_caller_data = default_get_caller_data,
David Hu5923bc22019-09-23 15:44:06 +080034};
35
36uint32_t tfm_rpc_psa_framework_version(void)
37{
Mingyang Sund44522a2020-01-16 16:48:37 +080038 return tfm_spm_client_psa_framework_version();
David Hu5923bc22019-09-23 15:44:06 +080039}
40
41uint32_t tfm_rpc_psa_version(const struct client_call_params_t *params,
Summer Qin43c185d2019-10-10 15:44:42 +080042 bool ns_caller)
David Hu5923bc22019-09-23 15:44:06 +080043{
Ken Liuf250b8b2019-12-27 16:31:24 +080044 TFM_CORE_ASSERT(params != NULL);
David Hu5923bc22019-09-23 15:44:06 +080045
Mingyang Sund44522a2020-01-16 16:48:37 +080046 return tfm_spm_client_psa_version(params->sid, ns_caller);
David Hu5923bc22019-09-23 15:44:06 +080047}
48
49psa_status_t tfm_rpc_psa_connect(const struct client_call_params_t *params,
Summer Qin43c185d2019-10-10 15:44:42 +080050 bool ns_caller)
David Hu5923bc22019-09-23 15:44:06 +080051{
Ken Liuf250b8b2019-12-27 16:31:24 +080052 TFM_CORE_ASSERT(params != NULL);
David Hu5923bc22019-09-23 15:44:06 +080053
Mingyang Sund44522a2020-01-16 16:48:37 +080054 return tfm_spm_client_psa_connect(params->sid, params->version, ns_caller);
David Hu5923bc22019-09-23 15:44:06 +080055}
56
57psa_status_t tfm_rpc_psa_call(const struct client_call_params_t *params,
Summer Qin43c185d2019-10-10 15:44:42 +080058 bool ns_caller)
David Hu5923bc22019-09-23 15:44:06 +080059{
Ken Liuf250b8b2019-12-27 16:31:24 +080060 TFM_CORE_ASSERT(params != NULL);
David Hu5923bc22019-09-23 15:44:06 +080061
Mingyang Sund44522a2020-01-16 16:48:37 +080062 return tfm_spm_client_psa_call(params->handle, params->type,
63 params->in_vec, params->in_len,
64 params->out_vec, params->out_len, ns_caller,
65 TFM_PARTITION_UNPRIVILEGED_MODE);
David Hu5923bc22019-09-23 15:44:06 +080066}
67
68void tfm_rpc_psa_close(const struct client_call_params_t *params,
Summer Qin43c185d2019-10-10 15:44:42 +080069 bool ns_caller)
David Hu5923bc22019-09-23 15:44:06 +080070{
Ken Liuf250b8b2019-12-27 16:31:24 +080071 TFM_CORE_ASSERT(params != NULL);
David Hu5923bc22019-09-23 15:44:06 +080072
Mingyang Sund44522a2020-01-16 16:48:37 +080073 tfm_spm_client_psa_close(params->handle, ns_caller);
David Hu5923bc22019-09-23 15:44:06 +080074}
75
76int32_t tfm_rpc_register_ops(const struct tfm_rpc_ops_t *ops_ptr)
77{
78 if (!ops_ptr) {
79 return TFM_RPC_INVAL_PARAM;
80 }
81
David Hua79c7c12019-12-11 18:47:06 +080082 if (!ops_ptr->handle_req || !ops_ptr->reply || !ops_ptr->get_caller_data) {
David Hu5923bc22019-09-23 15:44:06 +080083 return TFM_RPC_INVAL_PARAM;
84 }
85
86 /* Currently, one and only one mailbox implementation is supported. */
87 if ((rpc_ops.handle_req != default_handle_req) ||
David Hua79c7c12019-12-11 18:47:06 +080088 (rpc_ops.reply != default_mailbox_reply) || \
89 (rpc_ops.get_caller_data != default_get_caller_data)) {
David Hu5923bc22019-09-23 15:44:06 +080090 return TFM_RPC_CONFLICT_CALLBACK;
91 }
92
93 rpc_ops.handle_req = ops_ptr->handle_req;
94 rpc_ops.reply = ops_ptr->reply;
David Hua79c7c12019-12-11 18:47:06 +080095 rpc_ops.get_caller_data = ops_ptr->get_caller_data;
David Hu5923bc22019-09-23 15:44:06 +080096
97 return TFM_RPC_SUCCESS;
98}
99
100void tfm_rpc_unregister_ops(void)
101{
102 rpc_ops.handle_req = default_handle_req;
103 rpc_ops.reply = default_mailbox_reply;
David Hua79c7c12019-12-11 18:47:06 +0800104 rpc_ops.get_caller_data = default_get_caller_data;
David Hu5923bc22019-09-23 15:44:06 +0800105}
106
107void tfm_rpc_client_call_handler(void)
108{
109 rpc_ops.handle_req();
110}
111
112void tfm_rpc_client_call_reply(const void *owner, int32_t ret)
113{
David Hu46603dd2019-12-11 18:05:16 +0800114 const struct tfm_msg_body_t *msg = (const struct tfm_msg_body_t *)owner;
115
116 rpc_ops.reply(msg->caller_data, ret);
117}
118
119void tfm_rpc_set_caller_data(struct tfm_msg_body_t *msg, int32_t client_id)
120{
David Hua79c7c12019-12-11 18:47:06 +0800121 msg->caller_data = rpc_ops.get_caller_data(client_id);
David Hu5923bc22019-09-23 15:44:06 +0800122}