Add several new functions to the IPC service API: - ipc_service_get_tx_buffer() - ipc_service_drop_tx_buffer() - ipc_service_send_nocopy() - ipc_service_release_rx_buffer() - ipc_service_hold_rx_buffer() This set of function is used to support backends with nocopy capability. Signed-off-by: Carlo Caione <ccaione@baylibre.com>
193 lines
6.2 KiB
C
193 lines
6.2 KiB
C
/*
|
|
* Copyright (c) 2021 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_IPC_SERVICE_IPC_SERVICE_BACKEND_H_
|
|
#define ZEPHYR_INCLUDE_IPC_SERVICE_IPC_SERVICE_BACKEND_H_
|
|
|
|
#include <ipc/ipc_service.h>
|
|
#include <stdio.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief IPC Service backend
|
|
* @ingroup ipc_service_api
|
|
* @{
|
|
*/
|
|
|
|
/** @brief IPC backend configuration structure.
|
|
*
|
|
* This structure is used for configuration backend during registration.
|
|
*/
|
|
struct ipc_service_backend {
|
|
/** @brief Pointer to the function that will be used to open an instance
|
|
*
|
|
* @param[in] instance Instance pointer.
|
|
*
|
|
* @retval -EALREADY when the instance is already opened.
|
|
*
|
|
* @retval 0 on success
|
|
* @retval other errno codes depending on the implementation of the
|
|
* backend.
|
|
*/
|
|
int (*open_instance)(const struct device *instance);
|
|
|
|
/** @brief Pointer to the function that will be used to send data to the endpoint.
|
|
*
|
|
* @param[in] instance Instance pointer.
|
|
* @param[in] token Backend-specific token.
|
|
* @param[in] data Pointer to the buffer to send.
|
|
* @param[in] len Number of bytes to send.
|
|
*
|
|
* @retval -EINVAL when instance is invalid.
|
|
* @retval -EBADMSG when the message is invalid.
|
|
* @retval -EBUSY when the instance is busy or not ready.
|
|
*
|
|
* @retval bytes number of bytes sent.
|
|
* @retval other errno codes depending on the implementation of the
|
|
* backend.
|
|
*/
|
|
int (*send)(const struct device *instance, void *token,
|
|
const void *data, size_t len);
|
|
|
|
/** @brief Pointer to the function that will be used to register endpoints.
|
|
*
|
|
* @param[in] instance Instance to register the endpoint onto.
|
|
* @param[out] token Backend-specific token.
|
|
* @param[in] cfg Endpoint configuration.
|
|
*
|
|
* @retval -EINVAL when the endpoint configuration or instance is invalid.
|
|
* @retval -EBUSY when the instance is busy or not ready.
|
|
*
|
|
* @retval 0 on success
|
|
* @retval other errno codes depending on the implementation of the
|
|
* backend.
|
|
*/
|
|
int (*register_endpoint)(const struct device *instance,
|
|
void **token,
|
|
const struct ipc_ept_cfg *cfg);
|
|
|
|
/** @brief Pointer to the function that will return the TX buffer size
|
|
*
|
|
* @param[in] instance Instance pointer.
|
|
* @param[in] token Backend-specific token.
|
|
*
|
|
* @retval -EINVAL when instance is invalid.
|
|
* @retval -ENOTSUP when the operation is not supported.
|
|
*
|
|
* @retval size TX buffer size on success.
|
|
* @retval other errno codes depending on the implementation of the
|
|
* backend.
|
|
*/
|
|
int (*get_tx_buffer_size)(const struct device *instance, void *token);
|
|
|
|
/** @brief Pointer to the function that will return an empty TX buffer.
|
|
*
|
|
* @param[in] instance Instance pointer.
|
|
* @param[in] token Backend-specific token.
|
|
* @param[out] data Pointer to the empty TX buffer.
|
|
* @param[in,out] len Pointer to store the TX buffer size.
|
|
* @param[in] wait Timeout waiting for an available TX buffer.
|
|
*
|
|
* @retval -EINVAL when instance is invalid.
|
|
* @retval -ENOTSUP when the operation or the timeout is not supported.
|
|
* @retval -ENOBUFS when there are no TX buffers available.
|
|
* @retval -EALREADY when a buffer was already claimed and not yet released.
|
|
* @retval -ENOMEM when the requested size is too big (and the size parameter
|
|
* contains the maximum allowed size).
|
|
*
|
|
* @retval 0 on success
|
|
* @retval other errno codes depending on the implementation of the
|
|
* backend.
|
|
*/
|
|
int (*get_tx_buffer)(const struct device *instance, void *token,
|
|
void **data, uint32_t *len, k_timeout_t wait);
|
|
|
|
/** @brief Pointer to the function that will drop a TX buffer.
|
|
*
|
|
* @param[in] instance Instance pointer.
|
|
* @param[in] token Backend-specific token.
|
|
* @param[in] data Pointer to the TX buffer.
|
|
*
|
|
* @retval -EINVAL when instance is invalid.
|
|
* @retval -ENOTSUP when this function is not supported.
|
|
* @retval -EALREADY when the buffer was already dropped.
|
|
*
|
|
* @retval 0 on success
|
|
* @retval other errno codes depending on the implementation of the
|
|
* backend.
|
|
*/
|
|
int (*drop_tx_buffer)(const struct device *instance, void *token,
|
|
const void *data);
|
|
|
|
/** @brief Pointer to the function that will be used to send data to
|
|
* the endpoint when the TX buffer has been obtained using @ref
|
|
* ipc_service_get_tx_buffer
|
|
*
|
|
* @param[in] instance Instance pointer.
|
|
* @param[in] token Backend-specific token.
|
|
* @param[in] data Pointer to the buffer to send.
|
|
* @param[in] len Number of bytes to send.
|
|
*
|
|
* @retval -EINVAL when instance is invalid.
|
|
* @retval -EBADMSG when the data is invalid (i.e. invalid data format,
|
|
* invalid length, ...)
|
|
* @retval -EBUSY when the instance is busy or not ready.
|
|
*
|
|
* @retval bytes number of bytes sent.
|
|
* @retval other errno codes depending on the implementation of the
|
|
* backend.
|
|
*/
|
|
int (*send_nocopy)(const struct device *instance, void *token,
|
|
const void *data, size_t len);
|
|
|
|
/** @brief Pointer to the function that will hold the RX buffer
|
|
*
|
|
* @param[in] instance Instance pointer.
|
|
* @param[in] token Backend-specific token.
|
|
* @param[in] data Pointer to the RX buffer to hold.
|
|
*
|
|
* @retval -EINVAL when instance is invalid.
|
|
* @retval -EALREADY when the buffer data has been already hold.
|
|
* @retval -ENOTSUP when this function is not supported.
|
|
*
|
|
* @retval 0 on success
|
|
* @retval other errno codes depending on the implementation of the
|
|
* backend.
|
|
*/
|
|
int (*hold_rx_buffer)(const struct device *instance, void *token,
|
|
void *data);
|
|
|
|
/** @brief Pointer to the function that will release the RX buffer.
|
|
*
|
|
* @param[in] instance Instance pointer.
|
|
* @param[in] token Backend-specific token.
|
|
* @param[in] data Pointer to the RX buffer to release.
|
|
*
|
|
* @retval -EINVAL when instance is invalid.
|
|
* @retval -EALREADY when the buffer data has been already released.
|
|
* @retval -ENOTSUP when this function is not supported.
|
|
*
|
|
* @retval 0 on success
|
|
* @retval other errno codes depending on the implementation of the
|
|
* backend.
|
|
*/
|
|
int (*release_rx_buffer)(const struct device *instance, void *token,
|
|
void *data);
|
|
};
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_INCLUDE_IPC_SERVICE_IPC_SERVICE_BACKEND_H_ */
|