Skip to content

Commit

Permalink
openamp: add new API rpmsg_virtio_get_rx_buffer_size()
Browse files Browse the repository at this point in the history
This API can be used by the endpoint callback to limit the rx
buffer usage range.

Signed-off-by: Guiding Li <liguiding1@xiaomi.com>
Signed-off-by: Bowen Wang <wangbowen6@xiaomi.com>
  • Loading branch information
GUIDINGLI authored and CV-Bowen committed Oct 17, 2023
1 parent cd88238 commit 4879af7
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 6 deletions.
11 changes: 10 additions & 1 deletion lib/include/openamp/rpmsg_virtio.h
Original file line number Diff line number Diff line change
Expand Up @@ -166,14 +166,23 @@ rpmsg_virtio_create_virtqueues(struct rpmsg_virtio_device *rvdev,
}

/**
* @brief Get rpmsg virtio buffer size
* @brief Get rpmsg virtio Tx buffer size
*
* @param rdev Pointer to the rpmsg device
*
* @return Next available buffer size for text, negative value for failure
*/
int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev);

/**
* @brief Get rpmsg virtio Rx buffer size
*
* @param 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);

/**
* @brief Initialize rpmsg virtio device
*
Expand Down
27 changes: 22 additions & 5 deletions lib/rpmsg/rpmsg_virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,13 +273,14 @@ static int rpmsg_virtio_wait_remote_ready(struct rpmsg_virtio_device *rvdev)
/**
* @internal
*
* @brief Returns buffer size available for sending messages.
* @brief Returns buffer size available for sending/receiving messages.
*
* @param rvdev Pointer to rpmsg device
* @param tx Tx or Rx buffer
*
* @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;
Expand All @@ -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*/

Expand All @@ -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*/
Expand Down Expand Up @@ -670,7 +673,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;
}
Expand Down

0 comments on commit 4879af7

Please sign in to comment.