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