xref: /rk3399_ARM-atf/drivers/arm/rse/rse_comms_protocol_embed.c (revision 955116982f5bfb6803b1961eda5fa24ab7886419)
1*95511698STamas Ban /*
2*95511698STamas Ban  * Copyright (c) 2022-2024, Arm Limited. All rights reserved.
3*95511698STamas Ban  *
4*95511698STamas Ban  * SPDX-License-Identifier: BSD-3-Clause
5*95511698STamas Ban  *
6*95511698STamas Ban  */
7*95511698STamas Ban 
8*95511698STamas Ban #include <assert.h>
9*95511698STamas Ban #include <string.h>
10*95511698STamas Ban 
11*95511698STamas Ban #include <common/debug.h>
12*95511698STamas Ban #include "rss_comms_protocol_common.h"
13*95511698STamas Ban #include "rss_comms_protocol_embed.h"
14*95511698STamas Ban 
15*95511698STamas Ban psa_status_t rss_protocol_embed_serialize_msg(psa_handle_t handle,
16*95511698STamas Ban 					      int16_t type,
17*95511698STamas Ban 					      const psa_invec *in_vec,
18*95511698STamas Ban 					      uint8_t in_len,
19*95511698STamas Ban 					      const psa_outvec *out_vec,
20*95511698STamas Ban 					      uint8_t out_len,
21*95511698STamas Ban 					      struct rss_embed_msg_t *msg,
22*95511698STamas Ban 					      size_t *msg_len)
23*95511698STamas Ban {
24*95511698STamas Ban 	uint32_t payload_size = 0;
25*95511698STamas Ban 	uint32_t i;
26*95511698STamas Ban 
27*95511698STamas Ban 	assert(msg != NULL);
28*95511698STamas Ban 	assert(msg_len != NULL);
29*95511698STamas Ban 	assert(in_vec != NULL);
30*95511698STamas Ban 
31*95511698STamas Ban 	msg->ctrl_param = PARAM_PACK(type, in_len, out_len);
32*95511698STamas Ban 	msg->handle = handle;
33*95511698STamas Ban 
34*95511698STamas Ban 	/* Fill msg iovec lengths */
35*95511698STamas Ban 	for (i = 0U; i < in_len; ++i) {
36*95511698STamas Ban 		msg->io_size[i] = in_vec[i].len;
37*95511698STamas Ban 	}
38*95511698STamas Ban 	for (i = 0U; i < out_len; ++i) {
39*95511698STamas Ban 		msg->io_size[in_len + i] = out_vec[i].len;
40*95511698STamas Ban 	}
41*95511698STamas Ban 
42*95511698STamas Ban 	for (i = 0U; i < in_len; ++i) {
43*95511698STamas Ban 		if (in_vec[i].len > sizeof(msg->trailer) - payload_size) {
44*95511698STamas Ban 			return PSA_ERROR_INVALID_ARGUMENT;
45*95511698STamas Ban 		}
46*95511698STamas Ban 		memcpy(msg->trailer + payload_size,
47*95511698STamas Ban 		       in_vec[i].base,
48*95511698STamas Ban 		       in_vec[i].len);
49*95511698STamas Ban 		payload_size += in_vec[i].len;
50*95511698STamas Ban 	}
51*95511698STamas Ban 
52*95511698STamas Ban 	/* Output the actual size of the message, to optimize sending */
53*95511698STamas Ban 	*msg_len = sizeof(*msg) - sizeof(msg->trailer) + payload_size;
54*95511698STamas Ban 
55*95511698STamas Ban 	return PSA_SUCCESS;
56*95511698STamas Ban }
57*95511698STamas Ban 
58*95511698STamas Ban psa_status_t rss_protocol_embed_deserialize_reply(psa_outvec *out_vec,
59*95511698STamas Ban 						  uint8_t out_len,
60*95511698STamas Ban 						  psa_status_t *return_val,
61*95511698STamas Ban 						  const struct rss_embed_reply_t *reply,
62*95511698STamas Ban 						  size_t reply_size)
63*95511698STamas Ban {
64*95511698STamas Ban 	uint32_t payload_offset = 0;
65*95511698STamas Ban 	uint32_t i;
66*95511698STamas Ban 
67*95511698STamas Ban 	assert(reply != NULL);
68*95511698STamas Ban 	assert(return_val != NULL);
69*95511698STamas Ban 
70*95511698STamas Ban 	for (i = 0U; i < out_len; ++i) {
71*95511698STamas Ban 		if ((sizeof(*reply) - sizeof(reply->trailer) + payload_offset)
72*95511698STamas Ban 		    > reply_size) {
73*95511698STamas Ban 			return PSA_ERROR_INVALID_ARGUMENT;
74*95511698STamas Ban 		}
75*95511698STamas Ban 
76*95511698STamas Ban 		memcpy(out_vec[i].base,
77*95511698STamas Ban 		       reply->trailer + payload_offset,
78*95511698STamas Ban 		       reply->out_size[i]);
79*95511698STamas Ban 		out_vec[i].len = reply->out_size[i];
80*95511698STamas Ban 		payload_offset += reply->out_size[i];
81*95511698STamas Ban 	}
82*95511698STamas Ban 
83*95511698STamas Ban 	*return_val = reply->return_val;
84*95511698STamas Ban 
85*95511698STamas Ban 	return PSA_SUCCESS;
86*95511698STamas Ban }
87