diff options
Diffstat (limited to 'hw/s390x')
-rw-r--r-- | hw/s390x/s390-virtio-bus.c | 51 | ||||
-rw-r--r-- | hw/s390x/s390-virtio-bus.h | 16 | ||||
-rw-r--r-- | hw/s390x/virtio-ccw.c | 53 | ||||
-rw-r--r-- | hw/s390x/virtio-ccw.h | 14 |
4 files changed, 132 insertions, 2 deletions
diff --git a/hw/s390x/s390-virtio-bus.c b/hw/s390x/s390-virtio-bus.c index ca0e301f7b..dabbc2e6a5 100644 --- a/hw/s390x/s390-virtio-bus.c +++ b/hw/s390x/s390-virtio-bus.c @@ -28,6 +28,7 @@ #include "hw/virtio/virtio-rng.h" #include "hw/virtio/virtio-serial.h" #include "hw/virtio/virtio-net.h" +#include "hw/virtio/vhost-scsi.h" #include "hw/sysbus.h" #include "sysemu/kvm.h" @@ -239,6 +240,28 @@ static void s390_virtio_scsi_instance_init(Object *obj) object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL); } +#ifdef CONFIG_VHOST_SCSI +static int s390_vhost_scsi_init(VirtIOS390Device *s390_dev) +{ + VHostSCSIS390 *dev = VHOST_SCSI_S390(s390_dev); + DeviceState *vdev = DEVICE(&dev->vdev); + + qdev_set_parent_bus(vdev, BUS(&s390_dev->bus)); + if (qdev_init(vdev) < 0) { + return -1; + } + + return s390_virtio_device_init(s390_dev, VIRTIO_DEVICE(vdev)); +} + +static void s390_vhost_scsi_instance_init(Object *obj) +{ + VHostSCSIS390 *dev = VHOST_SCSI_S390(obj); + object_initialize(OBJECT(&dev->vdev), TYPE_VHOST_SCSI); + object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL); +} +#endif + static int s390_virtio_rng_init(VirtIOS390Device *dev) { VirtIODevice *vdev; @@ -560,7 +583,7 @@ static const TypeInfo virtio_s390_device_info = { }; static Property s390_virtio_scsi_properties[] = { - DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOSCSIS390, vdev.conf), + DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOSCSIS390, vdev.parent_obj.conf), DEFINE_VIRTIO_SCSI_FEATURES(VirtIOS390Device, host_features), DEFINE_PROP_END_OF_LIST(), }; @@ -582,6 +605,31 @@ static const TypeInfo s390_virtio_scsi = { .class_init = s390_virtio_scsi_class_init, }; +#ifdef CONFIG_VHOST_SCSI +static Property s390_vhost_scsi_properties[] = { + DEFINE_VIRTIO_COMMON_FEATURES(VirtIOS390Device, host_features), + DEFINE_VHOST_SCSI_PROPERTIES(VHostSCSIS390, vdev.parent_obj.conf), + DEFINE_PROP_END_OF_LIST(), +}; + +static void s390_vhost_scsi_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass); + + k->init = s390_vhost_scsi_init; + dc->props = s390_vhost_scsi_properties; +} + +static const TypeInfo s390_vhost_scsi = { + .name = TYPE_VHOST_SCSI_S390, + .parent = TYPE_VIRTIO_S390_DEVICE, + .instance_size = sizeof(VHostSCSIS390), + .instance_init = s390_vhost_scsi_instance_init, + .class_init = s390_vhost_scsi_class_init, +}; +#endif + /***************** S390 Virtio Bus Bridge Device *******************/ /* Only required to have the virtio bus as child in the system bus */ @@ -643,6 +691,7 @@ static void s390_virtio_register_types(void) type_register_static(&s390_virtio_blk); type_register_static(&s390_virtio_net); type_register_static(&s390_virtio_scsi); + type_register_static(&s390_vhost_scsi); type_register_static(&s390_virtio_rng); type_register_static(&s390_virtio_bridge_info); } diff --git a/hw/s390x/s390-virtio-bus.h b/hw/s390x/s390-virtio-bus.h index 925ed2b0b1..d7c47db2b9 100644 --- a/hw/s390x/s390-virtio-bus.h +++ b/hw/s390x/s390-virtio-bus.h @@ -25,6 +25,9 @@ #include "hw/virtio/virtio-serial.h" #include "hw/virtio/virtio-scsi.h" #include "hw/virtio/virtio-bus.h" +#ifdef CONFIG_VHOST_SCSI +#include "hw/virtio/vhost-scsi.h" +#endif #define VIRTIO_DEV_OFFS_TYPE 0 /* 8 bits */ #define VIRTIO_DEV_OFFS_NUM_VQ 1 /* 8 bits */ @@ -160,4 +163,17 @@ typedef struct VirtIONetS390 { VirtIONet vdev; } VirtIONetS390; +/* vhost-scsi-s390 */ + +#ifdef CONFIG_VHOST_SCSI +#define TYPE_VHOST_SCSI_S390 "vhost-scsi-s390" +#define VHOST_SCSI_S390(obj) \ + OBJECT_CHECK(VHostSCSIS390, (obj), TYPE_VHOST_SCSI_S390) + +typedef struct VHostSCSIS390 { + VirtIOS390Device parent_obj; + VHostSCSI vdev; +} VHostSCSIS390; +#endif + #endif diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index e9e7509c2f..56539d34e3 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -687,6 +687,28 @@ static void virtio_ccw_scsi_instance_init(Object *obj) object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL); } +#ifdef CONFIG_VHOST_SCSI +static int vhost_ccw_scsi_init(VirtioCcwDevice *ccw_dev) +{ + VHostSCSICcw *dev = VHOST_SCSI_CCW(ccw_dev); + DeviceState *vdev = DEVICE(&dev->vdev); + + qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus)); + if (qdev_init(vdev) < 0) { + return -1; + } + + return virtio_ccw_device_init(ccw_dev, VIRTIO_DEVICE(vdev)); +} + +static void vhost_ccw_scsi_instance_init(Object *obj) +{ + VHostSCSICcw *dev = VHOST_SCSI_CCW(obj); + object_initialize(OBJECT(&dev->vdev), TYPE_VHOST_SCSI); + object_property_add_child(obj, "virtio-backend", OBJECT(&dev->vdev), NULL); +} +#endif + static int virtio_ccw_rng_init(VirtioCcwDevice *dev) { VirtIODevice *vdev; @@ -873,7 +895,7 @@ static const TypeInfo virtio_ccw_balloon = { static Property virtio_ccw_scsi_properties[] = { DEFINE_PROP_STRING("devno", VirtioCcwDevice, bus_id), - DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOSCSICcw, vdev.conf), + DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOSCSICcw, vdev.parent_obj.conf), DEFINE_VIRTIO_SCSI_FEATURES(VirtioCcwDevice, host_features[0]), DEFINE_PROP_END_OF_LIST(), }; @@ -897,6 +919,34 @@ static const TypeInfo virtio_ccw_scsi = { .class_init = virtio_ccw_scsi_class_init, }; +#ifdef CONFIG_VHOST_SCSI +static Property vhost_ccw_scsi_properties[] = { + DEFINE_PROP_STRING("devno", VirtioCcwDevice, bus_id), + DEFINE_VHOST_SCSI_PROPERTIES(VirtIOSCSICcw, vdev.parent_obj.conf), + DEFINE_VIRTIO_COMMON_FEATURES(VirtioCcwDevice, host_features[0]), + DEFINE_PROP_END_OF_LIST(), +}; + +static void vhost_ccw_scsi_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass); + + k->init = vhost_ccw_scsi_init; + k->exit = virtio_ccw_exit; + dc->reset = virtio_ccw_reset; + dc->props = vhost_ccw_scsi_properties; +} + +static const TypeInfo vhost_ccw_scsi = { + .name = TYPE_VHOST_SCSI_CCW, + .parent = TYPE_VIRTIO_CCW_DEVICE, + .instance_size = sizeof(VirtIOSCSICcw), + .instance_init = vhost_ccw_scsi_instance_init, + .class_init = vhost_ccw_scsi_class_init, +}; +#endif + static void virtio_ccw_rng_initfn(Object *obj) { VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(obj); @@ -1054,6 +1104,7 @@ static void virtio_ccw_register(void) type_register_static(&virtio_ccw_net); type_register_static(&virtio_ccw_balloon); type_register_static(&virtio_ccw_scsi); + type_register_static(&vhost_ccw_scsi); type_register_static(&virtio_ccw_rng); type_register_static(&virtual_css_bridge_info); } diff --git a/hw/s390x/virtio-ccw.h b/hw/s390x/virtio-ccw.h index 35ab1a5ef2..84055e71da 100644 --- a/hw/s390x/virtio-ccw.h +++ b/hw/s390x/virtio-ccw.h @@ -16,6 +16,9 @@ #include <hw/virtio/virtio-net.h> #include <hw/virtio/virtio-serial.h> #include <hw/virtio/virtio-scsi.h> +#ifdef CONFIG_VHOST_SCSI +#include <hw/virtio/vhost-scsi.h> +#endif #include <hw/virtio/virtio-balloon.h> #include <hw/virtio/virtio-rng.h> #include <hw/virtio/virtio-bus.h> @@ -101,6 +104,17 @@ typedef struct VirtIOSCSICcw { VirtIOSCSI vdev; } VirtIOSCSICcw; +/* vhost-scsi-ccw */ + +#define TYPE_VHOST_SCSI_CCW "vhost-scsi-ccw" +#define VHOST_SCSI_CCW(obj) \ + OBJECT_CHECK(VHostSCSICcw, (obj), TYPE_VHOST_SCSI_CCW) + +typedef struct VHostSCSICcw { + VirtioCcwDevice parent_obj; + VHostSCSI vdev; +} VHostSCSICcw; + /* virtio-blk-ccw */ #define TYPE_VIRTIO_BLK_CCW "virtio-blk-ccw" |