This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 621da5bc5c9b33bb1d4aceebe0ece03f2e881fa7 Author: yintao <[email protected]> AuthorDate: Tue Apr 15 17:53:24 2025 +0800 drivers/rpmsg_virtio: Add VIRTIO_RPMSG_F_BUFADDR to support specify the address support specify the address by h2r_buf_addr and r2h_buf_addr so is can split shared memory pool Signed-off-by: yintao <[email protected]> Signed-off-by: Bowen Wang <[email protected]> --- drivers/rpmsg/rpmsg_virtio.c | 54 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/drivers/rpmsg/rpmsg_virtio.c b/drivers/rpmsg/rpmsg_virtio.c index 7f1f5cc9bc3..628f68c84d6 100644 --- a/drivers/rpmsg/rpmsg_virtio.c +++ b/drivers/rpmsg/rpmsg_virtio.c @@ -49,7 +49,8 @@ #define RPMSG_VIRTIO_FEATURES (1 << VIRTIO_RPMSG_F_NS | \ 1 << VIRTIO_RPMSG_F_ACK | \ 1 << VIRTIO_RPMSG_F_BUFSZ | \ - 1 << VIRTIO_RPMSG_F_CPUNAME) + 1 << VIRTIO_RPMSG_F_CPUNAME | \ + 1 << VIRTIO_RPMSG_F_BUFADDR) #ifdef CONFIG_OPENAMP_CACHE # define RPMSG_VIRTIO_INVALIDATE(x) metal_cache_invalidate(&x, sizeof(x)) @@ -541,10 +542,57 @@ static int rpmsg_virtio_notify_wait(FAR struct rpmsg_device *rdev, static int rpmsg_virtio_start(FAR struct rpmsg_virtio_priv_s *priv) { FAR struct virtio_device *vdev = priv->vdev; + struct rpmsg_virtio_config config = + { + RPMSG_BUFFER_SIZE, + RPMSG_BUFFER_SIZE, + false, + }; + int ret; - ret = rpmsg_init_vdev(&priv->rvdev, vdev, rpmsg_ns_bind, - metal_io_get_region(), priv->pool); + if (virtio_has_feature(vdev, VIRTIO_RPMSG_F_BUFSZ)) + { + virtio_read_config_member(vdev, struct fw_rsc_config, h2r_buf_size, + &config.h2r_buf_size) + virtio_read_config_member(vdev, struct fw_rsc_config, r2h_buf_size, + &config.r2h_buf_size); + } + + if (vdev->role == VIRTIO_DEV_DRIVER && + virtio_has_feature(vdev, VIRTIO_RPMSG_F_BUFADDR)) + { + FAR void *shmbuf_va0; + FAR void *shmbuf_va1; + uint64_t shmbuf_pa0; + uint64_t shmbuf_pa1; + + /* In OpenAMP, priv->pool[0] is the RX share memory pool, should use + * r2h_buf_addr and r2h_buf_size + */ + + virtio_read_config_member(vdev, struct fw_rsc_config, r2h_buf_addr, + &shmbuf_pa0); + shmbuf_va0 = up_addrenv_pa_to_va((uintptr_t)shmbuf_pa0); + rpmsg_virtio_init_shm_pool(&priv->pool[0], shmbuf_va0, + config.r2h_buf_size * vdev->vrings_info[0].info.num_descs); + + /* In OpenAMP, priv->pool[1] is the TX share memory pool, should use + * h2r_buf_addr and h2r_buf_size + */ + + virtio_read_config_member(vdev, struct fw_rsc_config, h2r_buf_addr, + &shmbuf_pa1); + shmbuf_va1 = up_addrenv_pa_to_va((uintptr_t)shmbuf_pa1); + rpmsg_virtio_init_shm_pool(&priv->pool[1], shmbuf_va1, + config.h2r_buf_size * vdev->vrings_info[1].info.num_descs); + + config.split_shpool = true; + } + + ret = rpmsg_init_vdev_with_config(&priv->rvdev, vdev, rpmsg_ns_bind, + metal_io_get_region(), + priv->pool, &config); if (ret < 0) { rpmsgerr("rpmsg_init_vdev failed, ret=%d\n", ret);
