xref: /qemu/tests/qtest/libqos/virtio-scsi.c (revision 907b5105f1b9e1af1abbdbb4f2039c7ab105c001)
18f41a3a8SEmanuele Giuseppe Esposito /*
28f41a3a8SEmanuele Giuseppe Esposito  * libqos driver framework
38f41a3a8SEmanuele Giuseppe Esposito  *
48f41a3a8SEmanuele Giuseppe Esposito  * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com>
58f41a3a8SEmanuele Giuseppe Esposito  *
68f41a3a8SEmanuele Giuseppe Esposito  * This library is free software; you can redistribute it and/or
78f41a3a8SEmanuele Giuseppe Esposito  * modify it under the terms of the GNU Lesser General Public
8dc0ad02dSThomas Huth  * License version 2.1 as published by the Free Software Foundation.
98f41a3a8SEmanuele Giuseppe Esposito  *
108f41a3a8SEmanuele Giuseppe Esposito  * This library is distributed in the hope that it will be useful,
118f41a3a8SEmanuele Giuseppe Esposito  * but WITHOUT ANY WARRANTY; without even the implied warranty of
128f41a3a8SEmanuele Giuseppe Esposito  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138f41a3a8SEmanuele Giuseppe Esposito  * Lesser General Public License for more details.
148f41a3a8SEmanuele Giuseppe Esposito  *
158f41a3a8SEmanuele Giuseppe Esposito  * You should have received a copy of the GNU Lesser General Public
168f41a3a8SEmanuele Giuseppe Esposito  * License along with this library; if not, see <http://www.gnu.org/licenses/>
178f41a3a8SEmanuele Giuseppe Esposito  */
188f41a3a8SEmanuele Giuseppe Esposito 
198f41a3a8SEmanuele Giuseppe Esposito #include "qemu/osdep.h"
20*907b5105SMarc-André Lureau #include "../libqtest.h"
210b8fa32fSMarkus Armbruster #include "qemu/module.h"
228f41a3a8SEmanuele Giuseppe Esposito #include "standard-headers/linux/virtio_ids.h"
23a2ce7dbdSPaolo Bonzini #include "qgraph.h"
24a2ce7dbdSPaolo Bonzini #include "virtio-scsi.h"
258f41a3a8SEmanuele Giuseppe Esposito 
268f41a3a8SEmanuele Giuseppe Esposito /* virtio-scsi-device */
qvirtio_scsi_get_driver(QVirtioSCSI * v_scsi,const char * interface)278f41a3a8SEmanuele Giuseppe Esposito static void *qvirtio_scsi_get_driver(QVirtioSCSI *v_scsi,
288f41a3a8SEmanuele Giuseppe Esposito                                      const char *interface)
298f41a3a8SEmanuele Giuseppe Esposito {
308f41a3a8SEmanuele Giuseppe Esposito     if (!g_strcmp0(interface, "virtio-scsi")) {
318f41a3a8SEmanuele Giuseppe Esposito         return v_scsi;
328f41a3a8SEmanuele Giuseppe Esposito     }
338f41a3a8SEmanuele Giuseppe Esposito     if (!g_strcmp0(interface, "virtio")) {
348f41a3a8SEmanuele Giuseppe Esposito         return v_scsi->vdev;
358f41a3a8SEmanuele Giuseppe Esposito     }
368f41a3a8SEmanuele Giuseppe Esposito 
378f41a3a8SEmanuele Giuseppe Esposito     fprintf(stderr, "%s not present in virtio-scsi-device\n", interface);
388f41a3a8SEmanuele Giuseppe Esposito     g_assert_not_reached();
398f41a3a8SEmanuele Giuseppe Esposito }
408f41a3a8SEmanuele Giuseppe Esposito 
qvirtio_scsi_device_get_driver(void * object,const char * interface)418f41a3a8SEmanuele Giuseppe Esposito static void *qvirtio_scsi_device_get_driver(void *object,
428f41a3a8SEmanuele Giuseppe Esposito                                             const char *interface)
438f41a3a8SEmanuele Giuseppe Esposito {
448f41a3a8SEmanuele Giuseppe Esposito     QVirtioSCSIDevice *v_scsi = object;
458f41a3a8SEmanuele Giuseppe Esposito     return qvirtio_scsi_get_driver(&v_scsi->scsi, interface);
468f41a3a8SEmanuele Giuseppe Esposito }
478f41a3a8SEmanuele Giuseppe Esposito 
virtio_scsi_device_create(void * virtio_dev,QGuestAllocator * t_alloc,void * addr)488f41a3a8SEmanuele Giuseppe Esposito static void *virtio_scsi_device_create(void *virtio_dev,
498f41a3a8SEmanuele Giuseppe Esposito                                           QGuestAllocator *t_alloc,
508f41a3a8SEmanuele Giuseppe Esposito                                           void *addr)
518f41a3a8SEmanuele Giuseppe Esposito {
528f41a3a8SEmanuele Giuseppe Esposito     QVirtioSCSIDevice *virtio_bdevice = g_new0(QVirtioSCSIDevice, 1);
538f41a3a8SEmanuele Giuseppe Esposito     QVirtioSCSI *interface = &virtio_bdevice->scsi;
548f41a3a8SEmanuele Giuseppe Esposito 
558f41a3a8SEmanuele Giuseppe Esposito     interface->vdev = virtio_dev;
568f41a3a8SEmanuele Giuseppe Esposito 
578f41a3a8SEmanuele Giuseppe Esposito     virtio_bdevice->obj.get_driver = qvirtio_scsi_device_get_driver;
588f41a3a8SEmanuele Giuseppe Esposito 
598f41a3a8SEmanuele Giuseppe Esposito     return &virtio_bdevice->obj;
608f41a3a8SEmanuele Giuseppe Esposito }
618f41a3a8SEmanuele Giuseppe Esposito 
628f41a3a8SEmanuele Giuseppe Esposito /* virtio-scsi-pci */
qvirtio_scsi_pci_get_driver(void * object,const char * interface)638f41a3a8SEmanuele Giuseppe Esposito static void *qvirtio_scsi_pci_get_driver(void *object,
648f41a3a8SEmanuele Giuseppe Esposito                                          const char *interface)
658f41a3a8SEmanuele Giuseppe Esposito {
668f41a3a8SEmanuele Giuseppe Esposito     QVirtioSCSIPCI *v_scsi = object;
678f41a3a8SEmanuele Giuseppe Esposito     if (!g_strcmp0(interface, "pci-device")) {
688f41a3a8SEmanuele Giuseppe Esposito         return v_scsi->pci_vdev.pdev;
698f41a3a8SEmanuele Giuseppe Esposito     }
708f41a3a8SEmanuele Giuseppe Esposito     return qvirtio_scsi_get_driver(&v_scsi->scsi, interface);
718f41a3a8SEmanuele Giuseppe Esposito }
728f41a3a8SEmanuele Giuseppe Esposito 
virtio_scsi_pci_create(void * pci_bus,QGuestAllocator * t_alloc,void * addr)738f41a3a8SEmanuele Giuseppe Esposito static void *virtio_scsi_pci_create(void *pci_bus,
748f41a3a8SEmanuele Giuseppe Esposito                                     QGuestAllocator *t_alloc,
758f41a3a8SEmanuele Giuseppe Esposito                                     void *addr)
768f41a3a8SEmanuele Giuseppe Esposito {
778f41a3a8SEmanuele Giuseppe Esposito     QVirtioSCSIPCI *virtio_spci = g_new0(QVirtioSCSIPCI, 1);
788f41a3a8SEmanuele Giuseppe Esposito     QVirtioSCSI *interface = &virtio_spci->scsi;
798f41a3a8SEmanuele Giuseppe Esposito     QOSGraphObject *obj = &virtio_spci->pci_vdev.obj;
808f41a3a8SEmanuele Giuseppe Esposito 
818f41a3a8SEmanuele Giuseppe Esposito     virtio_pci_init(&virtio_spci->pci_vdev, pci_bus, addr);
828f41a3a8SEmanuele Giuseppe Esposito     interface->vdev = &virtio_spci->pci_vdev.vdev;
838f41a3a8SEmanuele Giuseppe Esposito 
848f41a3a8SEmanuele Giuseppe Esposito     g_assert_cmphex(interface->vdev->device_type, ==, VIRTIO_ID_SCSI);
858f41a3a8SEmanuele Giuseppe Esposito 
868f41a3a8SEmanuele Giuseppe Esposito     obj->get_driver = qvirtio_scsi_pci_get_driver;
878f41a3a8SEmanuele Giuseppe Esposito 
888f41a3a8SEmanuele Giuseppe Esposito     return obj;
898f41a3a8SEmanuele Giuseppe Esposito }
908f41a3a8SEmanuele Giuseppe Esposito 
virtio_scsi_register_nodes(void)918f41a3a8SEmanuele Giuseppe Esposito static void virtio_scsi_register_nodes(void)
928f41a3a8SEmanuele Giuseppe Esposito {
938f41a3a8SEmanuele Giuseppe Esposito     QPCIAddress addr = {
948f41a3a8SEmanuele Giuseppe Esposito         .devfn = QPCI_DEVFN(4, 0),
958f41a3a8SEmanuele Giuseppe Esposito     };
968f41a3a8SEmanuele Giuseppe Esposito 
978f41a3a8SEmanuele Giuseppe Esposito     QOSGraphEdgeOptions opts = {
98ca1ef1e6SAndrey Shinkevich         .before_cmd_line = "-drive id=drv0,if=none,file=null-co://,"
99ca1ef1e6SAndrey Shinkevich                            "file.read-zeroes=on,format=raw",
1008f41a3a8SEmanuele Giuseppe Esposito         .after_cmd_line = "-device scsi-hd,bus=vs0.0,drive=drv0",
1018f41a3a8SEmanuele Giuseppe Esposito     };
1028f41a3a8SEmanuele Giuseppe Esposito 
1038f41a3a8SEmanuele Giuseppe Esposito     /* virtio-scsi-device */
1048f41a3a8SEmanuele Giuseppe Esposito     opts.extra_device_opts = "id=vs0";
1058f41a3a8SEmanuele Giuseppe Esposito     qos_node_create_driver("virtio-scsi-device",
1068f41a3a8SEmanuele Giuseppe Esposito                             virtio_scsi_device_create);
1078f41a3a8SEmanuele Giuseppe Esposito     qos_node_consumes("virtio-scsi-device", "virtio-bus", &opts);
1088f41a3a8SEmanuele Giuseppe Esposito     qos_node_produces("virtio-scsi-device", "virtio-scsi");
1098f41a3a8SEmanuele Giuseppe Esposito 
1108f41a3a8SEmanuele Giuseppe Esposito     /* virtio-scsi-pci */
1118f41a3a8SEmanuele Giuseppe Esposito     opts.extra_device_opts = "id=vs0,addr=04.0";
1128f41a3a8SEmanuele Giuseppe Esposito     add_qpci_address(&opts, &addr);
1138f41a3a8SEmanuele Giuseppe Esposito     qos_node_create_driver("virtio-scsi-pci", virtio_scsi_pci_create);
1148f41a3a8SEmanuele Giuseppe Esposito     qos_node_consumes("virtio-scsi-pci", "pci-bus", &opts);
1158f41a3a8SEmanuele Giuseppe Esposito     qos_node_produces("virtio-scsi-pci", "pci-device");
1168f41a3a8SEmanuele Giuseppe Esposito     qos_node_produces("virtio-scsi-pci", "virtio-scsi");
1178f41a3a8SEmanuele Giuseppe Esposito }
1188f41a3a8SEmanuele Giuseppe Esposito 
1198f41a3a8SEmanuele Giuseppe Esposito libqos_init(virtio_scsi_register_nodes);
120