Skip to content

Commit

Permalink
implement rproc_virtio_read_config/rproc_virtio_write_config
Browse files Browse the repository at this point in the history
so the rpmsg could access the configuration space as needed

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
  • Loading branch information
xiaoxiang781216 committed Apr 26, 2020
1 parent 078ba09 commit afbac2a
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 8 deletions.
14 changes: 14 additions & 0 deletions lib/include/openamp/rpmsg_virtio.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,20 @@ rpmsg_virtio_get_features(struct rpmsg_virtio_device *rvdev)
return rvdev->vdev->func->get_features(rvdev->vdev);
}

static inline void
rpmsg_virtio_read_config(struct rpmsg_virtio_device *rvdev,
uint32_t offset, void *dst, int length)
{
rvdev->vdev->func->read_config(rvdev->vdev, offset, dst, length);
}

static inline void
rpmsg_virtio_write_config(struct rpmsg_virtio_device *rvdev,
uint32_t offset, void *dst, int length)
{
rvdev->vdev->func->write_config(rvdev->vdev, offset, dst, length);
}

static inline int
rpmsg_virtio_create_virtqueues(struct rpmsg_virtio_device *rvdev,
int flags, unsigned int nvqs,
Expand Down
1 change: 1 addition & 0 deletions lib/include/openamp/virtio.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ struct virtio_device {
virtio_dev_reset_cb reset_cb; /**< user registered device callback */
const struct virtio_dispatch *func; /**< Virtio dispatch table */
void *priv; /**< TODO: remove pointer to virtio_device private data */
unsigned int config_len; /**< config space length */
unsigned int vrings_num; /**< number of vrings */
struct virtio_vring_info *vrings_info;
};
Expand Down
40 changes: 32 additions & 8 deletions lib/remoteproc/remoteproc_virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,20 +128,43 @@ static uint32_t rproc_virtio_negotiate_features(struct virtio_device *vdev,
static void rproc_virtio_read_config(struct virtio_device *vdev,
uint32_t offset, void *dst, int length)
{
(void)vdev;
(void)offset;
(void)dst;
(void)length;
struct remoteproc_virtio *rpvdev;
struct fw_rsc_vdev *vdev_rsc;
struct metal_io_region *io;
char *config;

if (offset + length > vdev->config_len || offset + length < length)
return;

rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
vdev_rsc = rpvdev->vdev_rsc;
config = (char *)(&vdev_rsc->vring[vdev->vrings_num]);
io = rpvdev->vdev_rsc_io;
metal_io_block_read(io,
metal_io_virt_to_offset(io, config + offset),
dst, length);
}

#ifndef VIRTIO_SLAVE_ONLY
static void rproc_virtio_write_config(struct virtio_device *vdev,
uint32_t offset, void *src, int length)
{
(void)vdev;
(void)offset;
(void)src;
(void)length;
struct remoteproc_virtio *rpvdev;
struct fw_rsc_vdev *vdev_rsc;
struct metal_io_region *io;
char *config;

if (offset + length > vdev->config_len || offset + length < length)
return;

rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
vdev_rsc = rpvdev->vdev_rsc;
config = (char *)(&vdev_rsc->vring[vdev->vrings_num]);
io = rpvdev->vdev_rsc_io;
metal_io_block_write(io,
metal_io_virt_to_offset(io, config + offset),
src, length);
rpvdev->notify(rpvdev->priv, vdev->notifyid);
}

static void rproc_virtio_reset_device(struct virtio_device *vdev)
Expand Down Expand Up @@ -222,6 +245,7 @@ rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid,
vdev->notifyid = notifyid;
vdev->role = role;
vdev->reset_cb = rst_cb;
vdev->config_len = vdev_rsc->config_len;
vdev->vrings_num = num_vrings;
vdev->func = &remoteproc_virtio_dispatch_funcs;

Expand Down

0 comments on commit afbac2a

Please sign in to comment.