blob: 4f92b02732b017659b67ab36c638ab5cdb30576f [file] [log] [blame]
/*
* 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_ */