mirror of
https://github.com/OpenAMP/open-amp.git
synced 2026-02-06 02:54:32 +08:00
implement rproc_virtio_read_config/rproc_virtio_write_config
so the rpmsg could access the configuration space as needed Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
committed by
Arnaud Pouliquen
parent
7a8527e17b
commit
20292c5dca
@@ -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,
|
||||
|
||||
@@ -128,20 +128,42 @@ 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;
|
||||
|
||||
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;
|
||||
|
||||
if (offset + length <= vdev_rsc->config_len)
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
if (offset + length <= vdev_rsc->config_len) {
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user