From b03e398fb8c2016029500f058e1cdaa7cc4cb92f Mon Sep 17 00:00:00 2001 From: ligd Date: Mon, 20 Feb 2023 21:08:35 +0800 Subject: [PATCH 6/6] openamp: add new API rpmsg_virtio_get_rxbuffer_size() Change-Id: If98c7260be8524627cd1c272c164c22a9548198c Signed-off-by: ligd --- lib/include/openamp/rpmsg_virtio.h | 11 ++++++++++- lib/rpmsg/rpmsg_virtio.c | 25 +++++++++++++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/lib/include/openamp/rpmsg_virtio.h open-amp/lib/include/openamp/rpmsg_virtio.h index 11cb6df..bdc6cc6 100644 --- a/lib/include/openamp/rpmsg_virtio.h +++ open-amp/lib/include/openamp/rpmsg_virtio.h @@ -158,7 +158,7 @@ rpmsg_virtio_notify_wait(struct rpmsg_virtio_device *rvdev, } /** - * rpmsg_virtio_get_buffer_size - get rpmsg virtio buffer size + * rpmsg_virtio_get_buffer_size - get rpmsg virtio Tx buffer size * * @rdev - pointer to the rpmsg device * @@ -166,6 +166,15 @@ rpmsg_virtio_notify_wait(struct rpmsg_virtio_device *rvdev, */ int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev); +/** + * rpmsg_virtio_get_rx_buffer_size - get rpmsg virtio Rx buffer size + * + * @rdev - pointer to the rpmsg device + * + * @return - next available buffer size for text, negative value for failure + */ +int rpmsg_virtio_get_rx_buffer_size(struct rpmsg_device *rdev); + /** * rpmsg_init_vdev - initialize rpmsg virtio device * Host side: diff --git a/lib/rpmsg/rpmsg_virtio.c open-amp/lib/rpmsg/rpmsg_virtio.c index 13fd496..c44b4fd 100644 --- a/lib/rpmsg/rpmsg_virtio.c +++ open-amp/lib/rpmsg/rpmsg_virtio.c @@ -275,11 +275,12 @@ static int rpmsg_virtio_wait_remote_ready(struct rpmsg_virtio_device *rvdev) * Returns buffer size available for sending messages. * * @param rvdev - pointer to rpmsg device + * tx - tx or rx * * @return - buffer size * */ -static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev) +static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev, bool tx) { unsigned int role = rpmsg_virtio_get_role(rvdev); int length = 0; @@ -290,7 +291,9 @@ static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev) * If device role is host then buffers are provided by us, * so just provide the macro. */ - length = rvdev->config.h2r_buf_size - sizeof(struct rpmsg_hdr); + length = + tx ? rvdev->config.h2r_buf_size : rvdev->config.r2h_buf_size + - sizeof(struct rpmsg_hdr); } #endif /*!VIRTIO_DEVICE_ONLY*/ @@ -301,7 +304,7 @@ static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev) * so get the buffer size from the virtqueue. */ length = - (int)virtqueue_get_desc_size(rvdev->svq) - + (int)virtqueue_get_desc_size(tx ? rvdev->svq : rvdev->rvq) - sizeof(struct rpmsg_hdr); } #endif /*!VIRTIO_DRIVER_ONLY*/ @@ -700,7 +703,21 @@ int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev) return RPMSG_ERR_PARAM; metal_mutex_acquire(&rdev->lock); rvdev = (struct rpmsg_virtio_device *)rdev; - size = _rpmsg_virtio_get_buffer_size(rvdev); + size = _rpmsg_virtio_get_buffer_size(rvdev, true); + metal_mutex_release(&rdev->lock); + return size; +} + +int rpmsg_virtio_get_rx_buffer_size(struct rpmsg_device *rdev) +{ + int size; + struct rpmsg_virtio_device *rvdev; + + if (!rdev) + return RPMSG_ERR_PARAM; + metal_mutex_acquire(&rdev->lock); + rvdev = (struct rpmsg_virtio_device *)rdev; + size = _rpmsg_virtio_get_buffer_size(rvdev, false); metal_mutex_release(&rdev->lock); return size; } -- 2.25.1