Skip to content

Commit

Permalink
Negotiate individual buffer size dynamically
Browse files Browse the repository at this point in the history
If slave support VIRTIO_RPMSG_F_BUFSZ(0x04) feature, master
determine the buffer size from config space(first 8 bytes),
otherwise the default size(512 bytes) will be used.

Signed-off-by: Chao An <anchao@pinecone.net>
  • Loading branch information
anchao authored and xiaoxiang781216 committed Jan 8, 2022
1 parent a12d03c commit 9ecafcf
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 2 deletions.
17 changes: 17 additions & 0 deletions lib/include/openamp/remoteproc.h
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,23 @@ struct fw_rsc_vdev {
struct fw_rsc_vdev_vring vring[0];
} METAL_PACKED_END;

/**
* struct fw_rsc_config - configuration space declaration
* @h2r_buf_size: the size of the buffer used to send data from host to remote
* @r2h_buf_size: the size of the buffer used to send data from remote to host
* @reserved: reserved (must be zero)
*
* This structure immediately follow fw_rsc_vdev to provide the config info.
*/
METAL_PACKED_BEGIN
struct fw_rsc_config {
/* The individual buffer size(if VIRTIO_RPMSG_F_BUFSZ) */
uint32_t h2r_buf_size;
uint32_t r2h_buf_size;
uint32_t reserved[14]; /* Reserve for the future use */
/* Put the customize config here */
} METAL_PACKED_END;

/**
* struct fw_rsc_vendor - remote processor vendor specific resource
* @len: length of the resource
Expand Down
4 changes: 3 additions & 1 deletion lib/include/openamp/rpmsg_virtio.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <metal/mutex.h>
#include <openamp/rpmsg.h>
#include <openamp/virtio.h>
#include <openamp/remoteproc.h>

#if defined __cplusplus
extern "C" {
Expand All @@ -28,6 +29,7 @@ extern "C" {

/* The feature bitmap for virtio rpmsg */
#define VIRTIO_RPMSG_F_NS 0 /* RP supports name service notifications */
#define VIRTIO_RPMSG_F_BUFSZ 2 /* RP supports buffer size negotiation */

/**
* struct rpmsg_virtio_shm_pool - shared memory pool used for rpmsg buffers
Expand Down Expand Up @@ -74,7 +76,7 @@ struct rpmsg_virtio_config {
*/
struct rpmsg_virtio_device {
struct rpmsg_device rdev;
struct rpmsg_virtio_config config;
struct fw_rsc_config config;
struct virtio_device *vdev;
struct virtqueue *rvq;
struct virtqueue *svq;
Expand Down
10 changes: 9 additions & 1 deletion lib/rpmsg/rpmsg_virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -651,7 +651,8 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
if (config == NULL) {
return RPMSG_ERR_PARAM;
}
rvdev->config = *config;
rvdev->config.h2r_buf_size = config->h2r_buf_size;
rvdev->config.r2h_buf_size = config->r2h_buf_size;
}
#else /*!VIRTIO_SLAVE_ONLY*/
/* Ignore passed config in the virtio-device-only configuration. */
Expand All @@ -668,6 +669,13 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
vdev->features = rpmsg_virtio_get_features(rvdev);
rdev->support_ns = !!(vdev->features & (1 << VIRTIO_RPMSG_F_NS));

if (vdev->features & (1 << VIRTIO_RPMSG_F_BUFSZ)) {
rpmsg_virtio_read_config(rvdev,
0,
&rvdev->config,
sizeof(rvdev->config));
}

#ifndef VIRTIO_SLAVE_ONLY
if (role == RPMSG_MASTER) {
/*
Expand Down

0 comments on commit 9ecafcf

Please sign in to comment.