From: KONRAD Frederic <fred.konrad@xxxxxxxxxxxxx> Signed-off-by: KONRAD Frederic <fred.konrad@xxxxxxxxxxxxx> --- hw/virtio-scsi.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ hw/virtio-scsi.h | 14 +++++++++++++ 2 files changed, 78 insertions(+) diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c index c1b47a8..9940a963 100644 --- a/hw/virtio-scsi.c +++ b/hw/virtio-scsi.c @@ -14,6 +14,8 @@ */ #include "virtio-scsi.h" +#include "virtio-transport.h" +#include "virtio-pci.h" #include <hw/scsi.h> #include <hw/scsi-defs.h> @@ -738,3 +740,65 @@ void virtio_scsi_exit(VirtIODevice *vdev) unregister_savevm(s->qdev, "virtio-scsi", s); virtio_cleanup(vdev); } + +/******************** VirtIOSCSI Device **********************/ + +static int virtio_scsidev_init(DeviceState *dev) +{ + VirtIODevice *vdev; + VirtIOSCSIState *s = VIRTIO_SCSI_FROM_QDEV(dev); + + vdev = virtio_scsi_init(dev, &s->scsi); + if (!vdev) + { + return -1; + } + + if (s->trl == NULL) + { + error_report("transport property not set"); + return -1; + } + + /* Pass default host_features to transport */ + s->trl->host_features = s->host_features; + + if (virtio_call_backend_init_cb(dev, s->trl, vdev) != 0) + { + return -1; + } + + /* Binding should be ready here, let's get final features */ + if (vdev->binding->get_features) + { + s->host_features = vdev->binding->get_features(vdev->binding_opaque); + } + return 0; +} + +static Property virtio_scsi_properties[] = { + DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOSCSIState, host_features, scsi), + DEFINE_PROP_TRANSPORT("transport", VirtIOSCSIState, trl), + DEFINE_PROP_END_OF_LIST(), +}; + +static void virtio_scsi_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + dc->init = virtio_scsidev_init; + dc->props = virtio_scsi_properties; +} + +static TypeInfo virtio_scsi_info = { + .name = "virtio-scsi", + .parent = TYPE_DEVICE, + .instance_size = sizeof(VirtIOSCSIState), + .class_init = virtio_scsi_class_init, +}; + +static void virtio_scsi_register_types(void) +{ + type_register_static(&virtio_scsi_info); +} + +type_init(virtio_scsi_register_types) diff --git a/hw/virtio-scsi.h b/hw/virtio-scsi.h index 91924f6..49c4e9e 100644 --- a/hw/virtio-scsi.h +++ b/hw/virtio-scsi.h @@ -14,7 +14,9 @@ #ifndef _QEMU_VIRTIO_SCSI_H #define _QEMU_VIRTIO_SCSI_H +#include "sysbus.h" #include "virtio.h" +#include "virtio-transport.h" #include "net.h" #include "pci.h" @@ -40,4 +42,16 @@ struct VirtIOSCSIConf { DEFINE_PROP_BIT("hotplug", _state, _features_field, VIRTIO_SCSI_F_HOTPLUG, true), \ DEFINE_PROP_BIT("param_change", _state, _features_field, VIRTIO_SCSI_F_CHANGE, true) +typedef struct { + DeviceState qdev; + /* virtio-scsi */ + VirtIOSCSIConf scsi; + + uint32_t host_features; + + VirtIOTransportLink *trl; +} VirtIOSCSIState; + +#define VIRTIO_SCSI_FROM_QDEV(dev) DO_UPCAST(VirtIOSCSIState, qdev, dev) + #endif /* _QEMU_VIRTIO_SCSI_H */ -- 1.7.11.7 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm