diff options
author | Vincent Guittot <vincent.guittot@linaro.org> | 2022-02-01 17:31:11 +0100 |
---|---|---|
committer | Vincent Guittot <vincent.guittot@linaro.org> | 2022-08-13 11:51:13 +0200 |
commit | 1baa715ebdc305e83bc98f3f6b416ac4e62e6d8a (patch) | |
tree | faa29c3518ea3a3e939841bb05407a8162b356f9 /hw/virtio/virtio.c | |
parent | 717d828c9e7d8cd577d84bfe590e51993d1ce6e2 (diff) |
virtio-mmio: support device mode
With device mode, the virtio-mmio behaves like the device side of the
virtio-mmio transport layer instead of the driver side
Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
Diffstat (limited to 'hw/virtio/virtio.c')
-rw-r--r-- | hw/virtio/virtio.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 9d637e043e..892d881216 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -123,6 +123,8 @@ struct VirtQueue unsigned int inuse; + bool ready; + uint16_t vector; VirtIOHandleOutput handle_output; VirtIODevice *vdev; @@ -1938,7 +1940,12 @@ int virtio_set_status(VirtIODevice *vdev, uint8_t val) } } - if ((vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) != + if (vdev->device_mode) { + if ((vdev->status & VIRTIO_CONFIG_S_FEATURES_OK) != + (val & VIRTIO_CONFIG_S_FEATURES_OK)) { + virtio_set_started(vdev, val & VIRTIO_CONFIG_S_FEATURES_OK); + } + } else if ((vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) != (val & VIRTIO_CONFIG_S_DRIVER_OK)) { virtio_set_started(vdev, val & VIRTIO_CONFIG_S_DRIVER_OK); } @@ -2015,6 +2022,7 @@ void virtio_reset(void *opaque) vdev->vq[i].notification = true; vdev->vq[i].vring.num = vdev->vq[i].vring.num_default; vdev->vq[i].inuse = 0; + vdev->vq[i].ready = false; virtio_virtqueue_reset_region_cache(&vdev->vq[i]); } } @@ -3300,6 +3308,16 @@ bool virtio_queue_enabled(VirtIODevice *vdev, int n) return virtio_queue_enabled_legacy(vdev, n); } +bool virtio_queue_get_ready(VirtIODevice *vdev, int n) +{ + return vdev->vq[n].ready; +} + +void virtio_queue_set_ready(VirtIODevice *vdev, int n, bool ready) +{ + vdev->vq[n].ready = ready; +} + hwaddr virtio_queue_get_avail_addr(VirtIODevice *vdev, int n) { return vdev->vq[n].vring.avail; @@ -3685,6 +3703,7 @@ static Property virtio_properties[] = { DEFINE_PROP_BOOL("use-disabled-flag", VirtIODevice, use_disabled_flag, true), DEFINE_PROP_BOOL("x-disable-legacy-check", VirtIODevice, disable_legacy_check, false), + DEFINE_PROP_BOOL("device-mode", VirtIODevice, device_mode, false), DEFINE_PROP_END_OF_LIST(), }; |