xref: /rk3399_ARM-atf/include/drivers/arm/mhu.h (revision b62673c645752a78f649282cfa293e8da09e3bef)
1 /*
2  * Copyright (c) 2022, Arm Limited. All rights reserved.
3  * Copyright (c) 2025, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #ifndef MHU_H
9 #define MHU_H
10 
11 #include <stddef.h>
12 #include <stdint.h>
13 
14 /**
15  * Generic MHU error enumeration types.
16  */
17 enum mhu_error_t {
18 	MHU_ERR_NONE			=  0,
19 	MHU_ERR_NOT_INIT		= -1,
20 	MHU_ERR_ALREADY_INIT		= -2,
21 	MHU_ERR_UNSUPPORTED_VERSION	= -3,
22 	MHU_ERR_UNSUPPORTED		= -4,
23 	MHU_ERR_INVALID_ARG		= -5,
24 	MHU_ERR_BUFFER_TOO_SMALL	= -6,
25 	MHU_ERR_GENERAL			= -7,
26 };
27 
28 /**
29  * Structure used by RSE comms
30  */
31 struct mhu_addr {
32 	uintptr_t sender_base;
33 	uintptr_t receiver_base;
34 };
35 
36 /**
37  * Initializes sender MHU.
38  *
39  * mhu_sender_base	Base address of sender MHU.
40  *
41  * Returns mhu_error_t error code.
42  *
43  * This function must be called before mhu_send_data().
44  */
45 enum mhu_error_t mhu_init_sender(uintptr_t mhu_sender_base);
46 
47 
48 /**
49  * Initializes receiver MHU.
50  *
51  * mhu_receiver_base	Base address of receiver MHU.
52  *
53  * Returns mhu_error_t error code.
54  *
55  * This function must be called before mhu_receive_data().
56  */
57 enum mhu_error_t mhu_init_receiver(uintptr_t mhu_receiver_base);
58 
59 /**
60  * Sends data over MHU.
61  *
62  * send_buffer		Pointer to buffer containing the data to be transmitted.
63  * size			Size of the data to be transmitted in bytes.
64  *
65  * Returns mhu_error_t error code.
66  *
67  * The send_buffer must be 4-byte aligned and its length must be at least
68  * (4 - (size % 4)) bytes bigger than the data size to prevent buffer
69  * over-reading.
70  */
71 enum mhu_error_t mhu_send_data(const uint8_t *send_buffer, size_t size);
72 
73 /**
74  * Receives data from MHU.
75  *
76  * receive_buffer	Pointer the buffer where to store the received data.
77  * size			As input the size of the receive_buffer, as output the
78  *			number of bytes received. As a limitation,
79  *			the size of the buffer must be a multiple of 4.
80  *
81  * Returns mhu_error_t error code.
82  *
83  * The receive_buffer must be 4-byte aligned and its length must be a
84  * multiple of 4.
85  */
86 enum mhu_error_t mhu_receive_data(uint8_t *receive_buffer, size_t *size);
87 
88 /**
89  * Gets the maximum amount of bytes that can be transmitted in a single send by MHU.
90  *
91  * Returns The amount of bytes that can be sent or received in a single message.
92  */
93 size_t mhu_get_max_message_size(void);
94 
95 #endif /* MHU_H */
96