Line data Source code
1 0 : /*
2 : * Copyright (c) 2021 Carlo Caione <ccaione@baylibre.com>
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_IPC_SERVICE_IPC_RPMSG_H_
8 : #define ZEPHYR_INCLUDE_IPC_SERVICE_IPC_RPMSG_H_
9 :
10 : #include <zephyr/ipc/ipc_service.h>
11 : #include <openamp/open_amp.h>
12 : #include <metal/device.h>
13 :
14 : #ifdef __cplusplus
15 : extern "C" {
16 : #endif
17 :
18 : /**
19 : * @brief IPC service RPMsg API
20 : * @defgroup ipc_service_rpmsg_api IPC service RPMsg API
21 : * @ingroup ipc
22 : * @{
23 : */
24 :
25 : /** Number of endpoints. */
26 1 : #define NUM_ENDPOINTS CONFIG_IPC_SERVICE_BACKEND_RPMSG_NUM_ENDPOINTS_PER_INSTANCE
27 :
28 : struct ipc_rpmsg_ept;
29 :
30 : /**
31 : * @typedef rpmsg_ept_bound_cb
32 : * @brief Define the bound callback.
33 : *
34 : * This callback is defined at instance level and it is called when an endpoint
35 : * of the instance is bound.
36 : *
37 : * @param ept Endpoint of the instance just bound.
38 : */
39 1 : typedef void (*rpmsg_ept_bound_cb)(struct ipc_rpmsg_ept *ept);
40 :
41 : /** @brief Endpoint structure.
42 : *
43 : * Used to define an endpoint to be encapsulated in an RPMsg instance.
44 : */
45 1 : struct ipc_rpmsg_ept {
46 : /** RPMsg endpoint. */
47 1 : struct rpmsg_endpoint ep;
48 :
49 : /** Name of the endpoint. */
50 1 : char name[RPMSG_NAME_SIZE];
51 :
52 : /** Destination endpoint. */
53 1 : uint32_t dest;
54 :
55 : /** Bound flag. */
56 1 : volatile bool bound;
57 :
58 : /** Callbacks. */
59 1 : const struct ipc_service_cb *cb;
60 :
61 : /** Private data to be passed to the endpoint callbacks. */
62 1 : void *priv;
63 : };
64 :
65 : /** @brief RPMsg instance structure.
66 : *
67 : * Struct representation of an RPMsg instance.
68 : */
69 1 : struct ipc_rpmsg_instance {
70 : /** Endpoints in the instance. */
71 1 : struct ipc_rpmsg_ept endpoint[NUM_ENDPOINTS];
72 :
73 : /** RPMsg virtIO device. */
74 1 : struct rpmsg_virtio_device rvdev;
75 :
76 : /** SHM pool. */
77 1 : struct rpmsg_virtio_shm_pool shm_pool;
78 :
79 : /** EPT (instance) bound callback. */
80 1 : rpmsg_ept_bound_cb bound_cb;
81 :
82 : /** EPT (instance) callback. */
83 1 : rpmsg_ept_cb cb;
84 :
85 : /** Mutex for the instance. */
86 1 : struct k_mutex mtx;
87 : };
88 :
89 : /** @brief Init an RPMsg instance.
90 : *
91 : * Init an RPMsg instance.
92 : *
93 : * @param instance Pointer to the RPMsg instance struct.
94 : * @param role Host / Remote role.
95 : * @param buffer_size Size of the buffer used to send data between host and remote.
96 : * @param shm_io SHM IO region pointer.
97 : * @param vdev VirtIO device pointer.
98 : * @param shb Shared memory region pointer.
99 : * @param size Size of the shared memory region.
100 : * @param ns_bind_cb callback handler for name service announcement without
101 : * local endpoints waiting to bind. If NULL the
102 : * implementation falls back to the internal implementation.
103 : *
104 : * @retval -EINVAL When some parameter is missing.
105 : * @retval 0 If successful.
106 : * @retval Other errno codes depending on the OpenAMP implementation.
107 : */
108 1 : int ipc_rpmsg_init(struct ipc_rpmsg_instance *instance,
109 : unsigned int role,
110 : unsigned int buffer_size,
111 : struct metal_io_region *shm_io,
112 : struct virtio_device *vdev,
113 : void *shb, size_t size,
114 : rpmsg_ns_bind_cb ns_bind_cb);
115 :
116 :
117 : /** @brief
118 : *
119 : * Deinit an RPMsg instance
120 : *
121 : * @param instance Pointer to the RPMsg instance struct.
122 : * @param role Host / Remote role.
123 : *
124 : * @retval -EINVAL When some parameter is missing
125 : * @retval 0 If successful
126 : */
127 1 : int ipc_rpmsg_deinit(struct ipc_rpmsg_instance *instance,
128 : unsigned int role);
129 :
130 : /** @brief Register an endpoint.
131 : *
132 : * Register an endpoint to a provided RPMsg instance.
133 : *
134 : * @param instance Pointer to the RPMsg instance struct.
135 : * @param role Host / Remote role.
136 : * @param ept Endpoint to register.
137 : *
138 : * @retval -EINVAL When some parameter is missing.
139 : * @retval 0 If successful.
140 : * @retval Other errno codes depending on the OpenAMP implementation.
141 : */
142 1 : int ipc_rpmsg_register_ept(struct ipc_rpmsg_instance *instance, unsigned int role,
143 : struct ipc_rpmsg_ept *ept);
144 :
145 : /**
146 : * @}
147 : */
148 :
149 : #ifdef __cplusplus
150 : }
151 : #endif
152 :
153 : #endif /* ZEPHYR_INCLUDE_IPC_SERVICE_IPC_RPMSG_H_ */
|