Skip to content

Commit e69d131

Browse files
jacksonc-xlnxcarlescufi
authored andcommitted
ipc_service: Adding ipc_static_vrings_deinit function
This function deinitialises the static vrings used by the ipc_service instance. It acheieves this by tearing down the initialised virtqueues before closing the various aspects of libmetal which are in use. Signed-off-by: Jackson Cooper-Driver <[email protected]>
1 parent f16a19c commit e69d131

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

include/zephyr/ipc/ipc_static_vrings.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,18 @@ struct ipc_static_vrings {
101101
*/
102102
int ipc_static_vrings_init(struct ipc_static_vrings *vr, unsigned int role);
103103

104+
/** @brief Deinitialise the static VRINGs.
105+
*
106+
* Deinitialise VRINGs and Virtqueues of an OpenAMP / RPMsg instance.
107+
*
108+
* @param vr Pointer to the VRINGs instance struct.
109+
* @param role Host / Remote role.
110+
*
111+
* @retval 0 If successful.
112+
* @retval Other errno codes depending on the OpenAMP implementation.
113+
*/
114+
int ipc_static_vrings_deinit(struct ipc_static_vrings *vr, unsigned int role);
115+
104116
/**
105117
* @}
106118
*/

subsys/ipc/ipc_service/lib/ipc_static_vrings.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,17 @@ static int libmetal_setup(struct ipc_static_vrings *vr)
103103
return 0;
104104
}
105105

106+
static int libmetal_teardown(struct ipc_static_vrings *vr)
107+
{
108+
vr->shm_io = 0;
109+
110+
metal_device_close(&vr->shm_device);
111+
112+
metal_finish();
113+
114+
return 0;
115+
}
116+
106117
static int vq_setup(struct ipc_static_vrings *vr, unsigned int role)
107118
{
108119
vr->vq[RPMSG_VQ_0] = virtqueue_allocate(vr->vring_size);
@@ -136,6 +147,19 @@ static int vq_setup(struct ipc_static_vrings *vr, unsigned int role)
136147
return 0;
137148
}
138149

150+
static int vq_teardown(struct ipc_static_vrings *vr, unsigned int role)
151+
{
152+
memset(&vr->vdev, 0, sizeof(struct virtio_device));
153+
154+
memset(&(vr->rvrings[RPMSG_VQ_1]), 0, sizeof(struct virtio_vring_info));
155+
memset(&(vr->rvrings[RPMSG_VQ_0]), 0, sizeof(struct virtio_vring_info));
156+
157+
virtqueue_free(vr->vq[RPMSG_VQ_1]);
158+
virtqueue_free(vr->vq[RPMSG_VQ_0]);
159+
160+
return 0;
161+
}
162+
139163
int ipc_static_vrings_init(struct ipc_static_vrings *vr, unsigned int role)
140164
{
141165
int err = 0;
@@ -158,3 +182,22 @@ int ipc_static_vrings_init(struct ipc_static_vrings *vr, unsigned int role)
158182

159183
return vq_setup(vr, role);
160184
}
185+
186+
int ipc_static_vrings_deinit(struct ipc_static_vrings *vr, unsigned int role)
187+
{
188+
int err;
189+
190+
err = vq_teardown(vr, role);
191+
if (err != 0) {
192+
return err;
193+
}
194+
195+
err = libmetal_teardown(vr);
196+
if (err != 0) {
197+
return err;
198+
}
199+
200+
metal_io_finish(vr->shm_device.regions);
201+
202+
return 0;
203+
}

0 commit comments

Comments
 (0)