xref: /openbmc/qemu/hw/s390x/virtio-ccw-scsi.c (revision 988717b46b6424907618cb845ace9d69062703af)
1  /*
2   * virtio ccw scsi implementation
3   *
4   * Copyright 2012, 2015 IBM Corp.
5   * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
6   *
7   * This work is licensed under the terms of the GNU GPL, version 2 or (at
8   * your option) any later version. See the COPYING file in the top-level
9   * directory.
10   */
11  
12  #include "qemu/osdep.h"
13  #include "hw/qdev-properties.h"
14  #include "hw/virtio/virtio.h"
15  #include "qapi/error.h"
16  #include "qemu/module.h"
17  #include "virtio-ccw.h"
18  
19  static void virtio_ccw_scsi_realize(VirtioCcwDevice *ccw_dev, Error **errp)
20  {
21      VirtIOSCSICcw *dev = VIRTIO_SCSI_CCW(ccw_dev);
22      DeviceState *vdev = DEVICE(&dev->vdev);
23      DeviceState *qdev = DEVICE(ccw_dev);
24      char *bus_name;
25  
26      /*
27       * For command line compatibility, this sets the virtio-scsi-device bus
28       * name as before.
29       */
30      if (qdev->id) {
31          bus_name = g_strdup_printf("%s.0", qdev->id);
32          virtio_device_set_child_bus_name(VIRTIO_DEVICE(vdev), bus_name);
33          g_free(bus_name);
34      }
35  
36      qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus));
37      object_property_set_bool(OBJECT(vdev), true, "realized", errp);
38  }
39  
40  static void virtio_ccw_scsi_instance_init(Object *obj)
41  {
42      VirtIOSCSICcw *dev = VIRTIO_SCSI_CCW(obj);
43  
44      virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
45                                  TYPE_VIRTIO_SCSI);
46  }
47  
48  static Property virtio_ccw_scsi_properties[] = {
49      DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags,
50                      VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true),
51      DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
52                         VIRTIO_CCW_MAX_REV),
53      DEFINE_PROP_END_OF_LIST(),
54  };
55  
56  static void virtio_ccw_scsi_class_init(ObjectClass *klass, void *data)
57  {
58      DeviceClass *dc = DEVICE_CLASS(klass);
59      VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
60  
61      k->realize = virtio_ccw_scsi_realize;
62      device_class_set_props(dc, virtio_ccw_scsi_properties);
63      set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
64  }
65  
66  static const TypeInfo virtio_ccw_scsi = {
67      .name          = TYPE_VIRTIO_SCSI_CCW,
68      .parent        = TYPE_VIRTIO_CCW_DEVICE,
69      .instance_size = sizeof(VirtIOSCSICcw),
70      .instance_init = virtio_ccw_scsi_instance_init,
71      .class_init    = virtio_ccw_scsi_class_init,
72  };
73  
74  #ifdef CONFIG_VHOST_SCSI
75  
76  static void vhost_ccw_scsi_realize(VirtioCcwDevice *ccw_dev, Error **errp)
77  {
78      VHostSCSICcw *dev = VHOST_SCSI_CCW(ccw_dev);
79      DeviceState *vdev = DEVICE(&dev->vdev);
80  
81      qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus));
82      object_property_set_bool(OBJECT(vdev), true, "realized", errp);
83  }
84  
85  static void vhost_ccw_scsi_instance_init(Object *obj)
86  {
87      VHostSCSICcw *dev = VHOST_SCSI_CCW(obj);
88  
89      virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
90                                  TYPE_VHOST_SCSI);
91  }
92  
93  static Property vhost_ccw_scsi_properties[] = {
94      DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev,
95                         VIRTIO_CCW_MAX_REV),
96      DEFINE_PROP_END_OF_LIST(),
97  };
98  
99  static void vhost_ccw_scsi_class_init(ObjectClass *klass, void *data)
100  {
101      DeviceClass *dc = DEVICE_CLASS(klass);
102      VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass);
103  
104      k->realize = vhost_ccw_scsi_realize;
105      device_class_set_props(dc, vhost_ccw_scsi_properties);
106      set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
107  }
108  
109  static const TypeInfo vhost_ccw_scsi = {
110      .name          = TYPE_VHOST_SCSI_CCW,
111      .parent        = TYPE_VIRTIO_CCW_DEVICE,
112      .instance_size = sizeof(VHostSCSICcw),
113      .instance_init = vhost_ccw_scsi_instance_init,
114      .class_init    = vhost_ccw_scsi_class_init,
115  };
116  
117  #endif
118  
119  static void virtio_ccw_scsi_register(void)
120  {
121      type_register_static(&virtio_ccw_scsi);
122  #ifdef CONFIG_VHOST_SCSI
123      type_register_static(&vhost_ccw_scsi);
124  #endif
125  }
126  
127  type_init(virtio_ccw_scsi_register)
128