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 Feb 29, 2024
1 parent 79b795e commit 7f36844
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 0 deletions.
17 changes: 17 additions & 0 deletions lib/include/openamp/remoteproc.h
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,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;

/**
* @brief Resource table remote processor vendor specific entry
*
Expand Down
1 change: 1 addition & 0 deletions lib/include/openamp/rpmsg_virtio.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,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 */

#ifdef VIRTIO_CACHED_BUFFERS
#warning "VIRTIO_CACHED_BUFFERS is deprecated, please use VIRTIO_USE_DCACHE"
Expand Down
9 changes: 9 additions & 0 deletions lib/rpmsg/rpmsg_virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <metal/sleep.h>
#include <metal/utilities.h>
#include <openamp/rpmsg_virtio.h>
#include <openamp/remoteproc.h>
#include <openamp/virtqueue.h>

#include "rpmsg_internal.h"
Expand Down Expand Up @@ -808,6 +809,7 @@ int rpmsg_init_vdev_with_config(struct rpmsg_virtio_device *rvdev,
struct rpmsg_device *rdev;
const char *vq_names[RPMSG_NUM_VRINGS];
vq_callback callback[RPMSG_NUM_VRINGS];
struct fw_rsc_config fw_config;
int status;
unsigned int i, role;

Expand Down Expand Up @@ -854,6 +856,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, &fw_config, sizeof(fw_config));
rvdev->config.h2r_buf_size = fw_config.h2r_buf_size;
rvdev->config.r2h_buf_size = fw_config.r2h_buf_size;
}

#ifndef VIRTIO_DEVICE_ONLY
if (role == RPMSG_HOST) {
/*
Expand Down

0 comments on commit 7f36844

Please sign in to comment.