Line data Source code
1 0 : /* 2 : * Copyright (c) 2021 Nordic Semiconductor ASA 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : #ifndef ZEPHYR_INCLUDE_IPC_SERVICE_IPC_SERVICE_BACKEND_H_ 8 : #define ZEPHYR_INCLUDE_IPC_SERVICE_IPC_SERVICE_BACKEND_H_ 9 : 10 : #include <zephyr/ipc/ipc_service.h> 11 : #include <zephyr/kernel.h> 12 : #include <stdio.h> 13 : 14 : #ifdef __cplusplus 15 : extern "C" { 16 : #endif 17 : 18 : /** 19 : * @brief IPC service backend 20 : * @defgroup ipc_service_backend IPC service backend 21 : * @ingroup ipc 22 : * @{ 23 : */ 24 : 25 : /** @brief IPC backend configuration structure. 26 : * 27 : * This structure is used for configuration backend during registration. 28 : */ 29 1 : struct ipc_service_backend { 30 : /** @brief Pointer to the function that will be used to open an instance 31 : * 32 : * @param[in] instance Instance pointer. 33 : * 34 : * @retval -EALREADY when the instance is already opened. 35 : * 36 : * @retval 0 on success 37 : * @retval other errno codes depending on the implementation of the 38 : * backend. 39 : */ 40 1 : int (*open_instance)(const struct device *instance); 41 : 42 : /** @brief Pointer to the function that will be used to close an instance 43 : * 44 : * @param[in] instance Instance pointer. 45 : * 46 : * @retval -EALREADY when the instance is not already inited. 47 : * 48 : * @retval 0 on success 49 : * @retval other errno codes depending on the implementation of the 50 : * backend. 51 : */ 52 1 : int (*close_instance)(const struct device *instance); 53 : 54 : /** @brief Pointer to the function that will be used to send data to the endpoint. 55 : * 56 : * @param[in] instance Instance pointer. 57 : * @param[in] token Backend-specific token. 58 : * @param[in] data Pointer to the buffer to send. 59 : * @param[in] len Number of bytes to send. 60 : * 61 : * @retval -EINVAL when instance is invalid. 62 : * @retval -ENOENT when the endpoint is not registered with the instance. 63 : * @retval -EBADMSG when the message is invalid. 64 : * @retval -EBUSY when the instance is busy or not ready. 65 : * @retval -ENOMEM when no memory / buffers are available. 66 : * 67 : * @retval bytes number of bytes sent. 68 : * @retval other errno codes depending on the implementation of the 69 : * backend. 70 : */ 71 1 : int (*send)(const struct device *instance, void *token, 72 : const void *data, size_t len); 73 : 74 : /** @brief Pointer to the function that will be used to register endpoints. 75 : * 76 : * @param[in] instance Instance to register the endpoint onto. 77 : * @param[out] token Backend-specific token. 78 : * @param[in] cfg Endpoint configuration. 79 : * 80 : * @retval -EINVAL when the endpoint configuration or instance is invalid. 81 : * @retval -EBUSY when the instance is busy or not ready. 82 : * 83 : * @retval 0 on success 84 : * @retval other errno codes depending on the implementation of the 85 : * backend. 86 : */ 87 1 : int (*register_endpoint)(const struct device *instance, 88 : void **token, 89 : const struct ipc_ept_cfg *cfg); 90 : 91 : /** @brief Pointer to the function that will be used to deregister endpoints 92 : * 93 : * @param[in] instance Instance from which to deregister the endpoint. 94 : * @param[in] token Backend-specific token. 95 : * 96 : * @retval -EINVAL when the endpoint configuration or instance is invalid. 97 : * @retval -ENOENT when the endpoint is not registered with the instance. 98 : * @retval -EBUSY when the instance is busy or not ready. 99 : * 100 : * @retval 0 on success 101 : * @retval other errno codes depending on the implementation of the 102 : * backend. 103 : */ 104 1 : int (*deregister_endpoint)(const struct device *instance, void *token); 105 : 106 : /** @brief Pointer to the function that will return the TX buffer size 107 : * 108 : * @param[in] instance Instance pointer. 109 : * @param[in] token Backend-specific token. 110 : * 111 : * @retval -EINVAL when instance is invalid. 112 : * @retval -ENOENT when the endpoint is not registered with the instance. 113 : * @retval -ENOTSUP when the operation is not supported. 114 : * 115 : * @retval size TX buffer size on success. 116 : * @retval other errno codes depending on the implementation of the 117 : * backend. 118 : */ 119 1 : int (*get_tx_buffer_size)(const struct device *instance, void *token); 120 : 121 : /** @brief Pointer to the function that will return an empty TX buffer. 122 : * 123 : * @param[in] instance Instance pointer. 124 : * @param[in] token Backend-specific token. 125 : * @param[out] data Pointer to the empty TX buffer. 126 : * @param[in,out] len Pointer to store the TX buffer size. 127 : * @param[in] wait Timeout waiting for an available TX buffer. 128 : * 129 : * @retval -EINVAL when instance is invalid. 130 : * @retval -ENOENT when the endpoint is not registered with the instance. 131 : * @retval -ENOTSUP when the operation or the timeout is not supported. 132 : * @retval -ENOBUFS when there are no TX buffers available. 133 : * @retval -EALREADY when a buffer was already claimed and not yet released. 134 : * @retval -ENOMEM when the requested size is too big (and the size parameter 135 : * contains the maximum allowed size). 136 : * 137 : * @retval 0 on success 138 : * @retval other errno codes depending on the implementation of the 139 : * backend. 140 : */ 141 1 : int (*get_tx_buffer)(const struct device *instance, void *token, 142 : void **data, uint32_t *len, k_timeout_t wait); 143 : 144 : /** @brief Pointer to the function that will drop a TX buffer. 145 : * 146 : * @param[in] instance Instance pointer. 147 : * @param[in] token Backend-specific token. 148 : * @param[in] data Pointer to the TX buffer. 149 : * 150 : * @retval -EINVAL when instance is invalid. 151 : * @retval -ENOENT when the endpoint is not registered with the instance. 152 : * @retval -ENOTSUP when this function is not supported. 153 : * @retval -EALREADY when the buffer was already dropped. 154 : * 155 : * @retval 0 on success 156 : * @retval other errno codes depending on the implementation of the 157 : * backend. 158 : */ 159 1 : int (*drop_tx_buffer)(const struct device *instance, void *token, 160 : const void *data); 161 : 162 : /** @brief Pointer to the function that will be used to send data to 163 : * the endpoint when the TX buffer has been obtained using @ref 164 : * ipc_service_get_tx_buffer 165 : * 166 : * @param[in] instance Instance pointer. 167 : * @param[in] token Backend-specific token. 168 : * @param[in] data Pointer to the buffer to send. 169 : * @param[in] len Number of bytes to send. 170 : * 171 : * @retval -EINVAL when instance is invalid. 172 : * @retval -ENOENT when the endpoint is not registered with the instance. 173 : * @retval -EBADMSG when the data is invalid (i.e. invalid data format, 174 : * invalid length, ...) 175 : * @retval -EBUSY when the instance is busy or not ready. 176 : * 177 : * @retval bytes number of bytes sent. 178 : * @retval other errno codes depending on the implementation of the 179 : * backend. 180 : */ 181 1 : int (*send_nocopy)(const struct device *instance, void *token, 182 : const void *data, size_t len); 183 : 184 : /** @brief Pointer to the function that will hold the RX buffer 185 : * 186 : * @param[in] instance Instance pointer. 187 : * @param[in] token Backend-specific token. 188 : * @param[in] data Pointer to the RX buffer to hold. 189 : * 190 : * @retval -EINVAL when instance is invalid. 191 : * @retval -ENOENT when the endpoint is not registered with the instance. 192 : * @retval -EALREADY when the buffer data has been already hold. 193 : * @retval -ENOTSUP when this function is not supported. 194 : * 195 : * @retval 0 on success 196 : * @retval other errno codes depending on the implementation of the 197 : * backend. 198 : */ 199 1 : int (*hold_rx_buffer)(const struct device *instance, void *token, 200 : void *data); 201 : 202 : /** @brief Pointer to the function that will release the RX buffer. 203 : * 204 : * @param[in] instance Instance pointer. 205 : * @param[in] token Backend-specific token. 206 : * @param[in] data Pointer to the RX buffer to release. 207 : * 208 : * @retval -EINVAL when instance is invalid. 209 : * @retval -ENOENT when the endpoint is not registered with the instance. 210 : * @retval -EALREADY when the buffer data has been already released. 211 : * @retval -ENOTSUP when this function is not supported. 212 : * 213 : * @retval 0 on success 214 : * @retval other errno codes depending on the implementation of the 215 : * backend. 216 : */ 217 1 : int (*release_rx_buffer)(const struct device *instance, void *token, 218 : void *data); 219 : }; 220 : 221 : /** 222 : * @} 223 : */ 224 : 225 : #ifdef __cplusplus 226 : } 227 : #endif 228 : 229 : #endif /* ZEPHYR_INCLUDE_IPC_SERVICE_IPC_SERVICE_BACKEND_H_ */