xref: /rk3399_ARM-atf/drivers/arm/rse/rse_comms_mhu.c (revision e0be63c88050a0436e19e52edd4e1cc28336f8e8)
1*36416b1eSYann Gautier /*
2*36416b1eSYann Gautier  * Copyright (c) 2025, Arm Limited and Contributors. All rights reserved.
3*36416b1eSYann Gautier  *
4*36416b1eSYann Gautier  * SPDX-License-Identifier: BSD-3-Clause
5*36416b1eSYann Gautier  */
6*36416b1eSYann Gautier 
7*36416b1eSYann Gautier #include <stdint.h>
8*36416b1eSYann Gautier #include <string.h>
9*36416b1eSYann Gautier 
10*36416b1eSYann Gautier #include <common/debug.h>
11*36416b1eSYann Gautier #include <drivers/arm/mhu.h>
12*36416b1eSYann Gautier #include <drivers/arm/rse_comms.h>
13*36416b1eSYann Gautier 
rse_mbx_get_max_message_size(void)14*36416b1eSYann Gautier size_t rse_mbx_get_max_message_size(void)
15*36416b1eSYann Gautier {
16*36416b1eSYann Gautier 	return mhu_get_max_message_size();
17*36416b1eSYann Gautier }
18*36416b1eSYann Gautier 
rse_mbx_send_data(const uint8_t * send_buffer,size_t size)19*36416b1eSYann Gautier int rse_mbx_send_data(const uint8_t *send_buffer, size_t size)
20*36416b1eSYann Gautier {
21*36416b1eSYann Gautier 	enum mhu_error_t err = mhu_send_data(send_buffer, size);
22*36416b1eSYann Gautier 
23*36416b1eSYann Gautier 	if (err != MHU_ERR_NONE) {
24*36416b1eSYann Gautier 		ERROR("mhu_send_data err=%d\n", err);
25*36416b1eSYann Gautier 		return -1;
26*36416b1eSYann Gautier 	}
27*36416b1eSYann Gautier 
28*36416b1eSYann Gautier 	return 0;
29*36416b1eSYann Gautier }
30*36416b1eSYann Gautier 
rse_mbx_receive_data(uint8_t * receive_buffer,size_t * size)31*36416b1eSYann Gautier int rse_mbx_receive_data(uint8_t *receive_buffer, size_t *size)
32*36416b1eSYann Gautier {
33*36416b1eSYann Gautier 	enum mhu_error_t err = mhu_receive_data(receive_buffer, size);
34*36416b1eSYann Gautier 
35*36416b1eSYann Gautier 	if (err != MHU_ERR_NONE) {
36*36416b1eSYann Gautier 		ERROR("mhu_receive_data err=%d\n", err);
37*36416b1eSYann Gautier 		return -1;
38*36416b1eSYann Gautier 	}
39*36416b1eSYann Gautier 
40*36416b1eSYann Gautier 	return 0;
41*36416b1eSYann Gautier }
42*36416b1eSYann Gautier 
rse_mbx_init(const void * init_data)43*36416b1eSYann Gautier int rse_mbx_init(const void *init_data)
44*36416b1eSYann Gautier {
45*36416b1eSYann Gautier 	enum mhu_error_t err;
46*36416b1eSYann Gautier 	const struct mhu_addr *mbx_addr = (const struct mhu_addr *)init_data;
47*36416b1eSYann Gautier 
48*36416b1eSYann Gautier 	err = mhu_init_sender(mbx_addr->sender_base);
49*36416b1eSYann Gautier 	if (err != MHU_ERR_NONE) {
50*36416b1eSYann Gautier 		if (err == MHU_ERR_ALREADY_INIT) {
51*36416b1eSYann Gautier 			INFO("[RSE-COMMS] Host to RSE MHU driver already initialized\n");
52*36416b1eSYann Gautier 		} else {
53*36416b1eSYann Gautier 			ERROR("[RSE-COMMS] Host to RSE MHU driver initialization failed: %d\n",
54*36416b1eSYann Gautier 			      err);
55*36416b1eSYann Gautier 			return -1;
56*36416b1eSYann Gautier 		}
57*36416b1eSYann Gautier 	}
58*36416b1eSYann Gautier 
59*36416b1eSYann Gautier 	err = mhu_init_receiver(mbx_addr->receiver_base);
60*36416b1eSYann Gautier 	if (err != MHU_ERR_NONE) {
61*36416b1eSYann Gautier 		if (err == MHU_ERR_ALREADY_INIT) {
62*36416b1eSYann Gautier 			INFO("[RSE-COMMS] RSE to Host MHU driver already initialized\n");
63*36416b1eSYann Gautier 		} else {
64*36416b1eSYann Gautier 			ERROR("[RSE-COMMS] RSE to Host MHU driver initialization failed: %d\n",
65*36416b1eSYann Gautier 			      err);
66*36416b1eSYann Gautier 			return -1;
67*36416b1eSYann Gautier 		}
68*36416b1eSYann Gautier 	}
69*36416b1eSYann Gautier 
70*36416b1eSYann Gautier 	return 0;
71*36416b1eSYann Gautier }
72