ipc: Call ipm_set_enabled() on RX channel also for dual IPM support

The IPC drivers rpmsg_service and rpmsg_multi_instance are not
explicitly enabling the RX IPM channel when two different devices are
used for TX and RX. While this could be redundant for some IPM drivers,
in some cases the hardware needs to be enabled before using it.

Add the missing calls to ipm_set_enabled() for both the devices.

Signed-off-by: Carlo Caione <ccaione@baylibre.com>
This commit is contained in:
Carlo Caione 2021-08-25 15:20:44 +02:00 committed by Anas Nashif
commit 3dd7fd4f70
2 changed files with 13 additions and 0 deletions

View file

@ -267,6 +267,12 @@ int rpmsg_mi_ctx_init(struct rpmsg_mi_ctx *ctx, const struct rpmsg_mi_ctx_cfg *c
/* Register IPM callback. This cb executes when msg has come. */ /* Register IPM callback. This cb executes when msg has come. */
ipm_register_callback(ctx->ipm_rx_handle, ipm_callback, ctx); ipm_register_callback(ctx->ipm_rx_handle, ipm_callback, ctx);
err = ipm_set_enabled(ctx->ipm_rx_handle, 1);
if (err != 0) {
LOG_ERR("Could not enable IPM interrupts and callbacks for RX");
return err;
}
ctx->vq[RPMSG_VQ_0] = virtqueue_allocate(vring_size); ctx->vq[RPMSG_VQ_0] = virtqueue_allocate(vring_size);
if (!ctx->vq[RPMSG_VQ_0]) { if (!ctx->vq[RPMSG_VQ_0]) {
LOG_ERR("virtqueue_allocate failed to alloc vq[RPMSG_VQ_0]"); LOG_ERR("virtqueue_allocate failed to alloc vq[RPMSG_VQ_0]");

View file

@ -229,6 +229,13 @@ int rpmsg_backend_init(struct metal_io_region **io, struct virtio_device *vdev)
} }
ipm_register_callback(ipm_rx_handle, ipm_callback, NULL); ipm_register_callback(ipm_rx_handle, ipm_callback, NULL);
err = ipm_set_enabled(ipm_rx_handle, 1);
if (err != 0) {
LOG_ERR("Could not enable IPM interrupts and callbacks for RX");
return err;
}
#elif defined(CONFIG_RPMSG_SERVICE_SINGLE_IPM_SUPPORT) #elif defined(CONFIG_RPMSG_SERVICE_SINGLE_IPM_SUPPORT)
ipm_handle = device_get_binding(CONFIG_RPMSG_SERVICE_IPM_NAME); ipm_handle = device_get_binding(CONFIG_RPMSG_SERVICE_IPM_NAME);