| /* |
| * Copyright (c) 2021 Carlo Caione <ccaione@baylibre.com> |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef ZEPHYR_INCLUDE_IPC_SERVICE_IPC_RPMSG_H_ |
| #define ZEPHYR_INCLUDE_IPC_SERVICE_IPC_RPMSG_H_ |
| |
| #include <ipc/ipc_service.h> |
| #include <openamp/open_amp.h> |
| #include <metal/device.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * @brief IPC service RPMsg API |
| * @defgroup ipc_service_rpmsg_api IPC service RPMsg API |
| * @{ |
| */ |
| |
| /** Number of endpoints. */ |
| #define NUM_ENDPOINTS CONFIG_IPC_SERVICE_BACKEND_RPMSG_NUM_ENDPOINTS_PER_INSTANCE |
| |
| struct ipc_rpmsg_ept; |
| |
| /** |
| * @typedef rpmsg_ept_bound_cb |
| * @brief Define the bound callback. |
| * |
| * This callback is defined at instance level and it is called when an endpoint |
| * of the instance is bound. |
| * |
| * @param ept Endpoint of the instance just bound. |
| */ |
| typedef void (*rpmsg_ept_bound_cb)(struct ipc_rpmsg_ept *ept); |
| |
| /** @brief Endpoint structure. |
| * |
| * Used to define an endpoint to be encapsulated in an RPMsg instance. |
| */ |
| struct ipc_rpmsg_ept { |
| /** RPMsg endpoint. */ |
| struct rpmsg_endpoint ep; |
| |
| /** Name of the endpoint. */ |
| char name[RPMSG_NAME_SIZE]; |
| |
| /** Destination endpoint. */ |
| uint32_t dest; |
| |
| /** Bound flag. */ |
| volatile bool bound; |
| |
| /** Callbacks. */ |
| const struct ipc_service_cb *cb; |
| |
| /** Private data to be passed to the endpoint callbacks. */ |
| void *priv; |
| }; |
| |
| /** @brief RPMsg instance structure. |
| * |
| * Struct representation of an RPMsg instance. |
| */ |
| struct ipc_rpmsg_instance { |
| /** Endpoints in the instance. */ |
| struct ipc_rpmsg_ept endpoint[NUM_ENDPOINTS]; |
| |
| /** RPMsg virtIO device. */ |
| struct rpmsg_virtio_device rvdev; |
| |
| /** SHM pool. */ |
| struct rpmsg_virtio_shm_pool shm_pool; |
| |
| /** EPT (instance) bound callback. */ |
| rpmsg_ept_bound_cb bound_cb; |
| |
| /** EPT (instance) callback. */ |
| rpmsg_ept_cb cb; |
| |
| /** Mutex for the instance. */ |
| struct k_mutex mtx; |
| }; |
| |
| /** @brief Init an RPMsg instance. |
| * |
| * Init an RPMsg instance. |
| * |
| * @param instance Pointer to the RPMsg instance struct. |
| * @param role Master / Remote role. |
| * @param shm_io SHM IO region pointer. |
| * @param vdev VirtIO device pointer. |
| * @param shb Shared memory region pointer. |
| * @param size Size of the shared memory region. |
| * @param ns_bind_cb callback handler for name service announcement without |
| * local endpoints waiting to bind. If NULL the |
| * implementation falls back to the internal implementation. |
| * |
| * @retval -EINVAL When some parameter is missing. |
| * @retval 0 If successful. |
| * @retval Other errno codes depending on the OpenAMP implementation. |
| */ |
| int ipc_rpmsg_init(struct ipc_rpmsg_instance *instance, |
| unsigned int role, |
| struct metal_io_region *shm_io, |
| struct virtio_device *vdev, |
| void *shb, size_t size, |
| rpmsg_ns_bind_cb ns_bind_cb); |
| |
| /** @brief Register an endpoint. |
| * |
| * Register an endpoint to a provided RPMsg instance. |
| * |
| * @param instance Pointer to the RPMsg instance struct. |
| * @param role Master / Remote role. |
| * @param ept Endpoint to register. |
| * |
| * @retval -EINVAL When some parameter is missing. |
| * @retval 0 If successful. |
| * @retval Other errno codes depending on the OpenAMP implementation. |
| */ |
| int ipc_rpmsg_register_ept(struct ipc_rpmsg_instance *instance, unsigned int role, |
| struct ipc_rpmsg_ept *ept); |
| |
| /** |
| * @} |
| */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* ZEPHYR_INCLUDE_IPC_SERVICE_IPC_RPMSG_H_ */ |