Skip to content

Commit

Permalink
virtio-scsi: Add virtio-scsi stub device
Browse files Browse the repository at this point in the history
Add a useless virtio SCSI HBA device:

  qemu -device virtio-scsi-pci

Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
Stefan Hajnoczi authored and bonzini committed Feb 22, 2012
1 parent 43b978b commit 973abc7
Show file tree
Hide file tree
Showing 11 changed files with 364 additions and 0 deletions.
1 change: 1 addition & 0 deletions Makefile.target
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ obj-y = arch_init.o cpus.o monitor.o machine.o gdbstub.o balloon.o ioport.o
# need to fix this properly
obj-$(CONFIG_NO_PCI) += pci-stub.o
obj-$(CONFIG_VIRTIO) += virtio.o virtio-blk.o virtio-balloon.o virtio-net.o virtio-serial-bus.o
obj-$(CONFIG_VIRTIO_SCSI) += virtio-scsi.o
obj-y += vhost_net.o
obj-$(CONFIG_VHOST_NET) += vhost.o
obj-$(CONFIG_REALLY_VIRTFS) += 9pfs/virtio-9p-device.o
Expand Down
1 change: 1 addition & 0 deletions default-configs/pci.mak
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_SCSI=y
CONFIG_VIRTIO=y
CONFIG_USB_UHCI=y
CONFIG_USB_OHCI=y
Expand Down
1 change: 1 addition & 0 deletions default-configs/s390x-softmmu.mak
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
CONFIG_VIRTIO=y
CONFIG_VIRTIO_SCSI=y
1 change: 1 addition & 0 deletions hw/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
#define PCI_DEVICE_ID_VIRTIO_BLOCK 0x1001
#define PCI_DEVICE_ID_VIRTIO_BALLOON 0x1002
#define PCI_DEVICE_ID_VIRTIO_CONSOLE 0x1003
#define PCI_DEVICE_ID_VIRTIO_SCSI 0x1004

#define FMT_PCIBUS PRIx64

Expand Down
33 changes: 33 additions & 0 deletions hw/s390-virtio-bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,18 @@ static int s390_virtio_serial_init(VirtIOS390Device *dev)
return r;
}

static int s390_virtio_scsi_init(VirtIOS390Device *dev)
{
VirtIODevice *vdev;

vdev = virtio_scsi_init((DeviceState *)dev, &dev->scsi);
if (!vdev) {
return -1;
}

return s390_virtio_device_init(dev, vdev);
}

static uint64_t s390_virtio_device_vq_token(VirtIOS390Device *dev, int vq)
{
ram_addr_t token_off;
Expand Down Expand Up @@ -433,6 +445,26 @@ static TypeInfo virtio_s390_device_info = {
.abstract = true,
};

static Property s390_virtio_scsi_properties[] = {
DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOS390Device, host_features, scsi),
DEFINE_PROP_END_OF_LIST(),
};

static void s390_virtio_scsi_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);

k->init = s390_virtio_scsi_init;
dc->props = s390_virtio_scsi_properties;
}

static TypeInfo s390_virtio_scsi = {
.name = "virtio-scsi-s390",
.parent = TYPE_VIRTIO_S390_DEVICE,
.instance_size = sizeof(VirtIOS390Device),
.class_init = s390_virtio_scsi_class_init,
};

/***************** S390 Virtio Bus Bridge Device *******************/
/* Only required to have the virtio bus as child in the system bus */
Expand Down Expand Up @@ -465,6 +497,7 @@ static void s390_virtio_register_types(void)
type_register_static(&s390_virtio_serial);
type_register_static(&s390_virtio_blk);
type_register_static(&s390_virtio_net);
type_register_static(&s390_virtio_scsi);
type_register_static(&s390_virtio_bridge_info);
}

Expand Down
2 changes: 2 additions & 0 deletions hw/s390-virtio-bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include "virtio-net.h"
#include "virtio-serial.h"
#include "virtio-scsi.h"

#define VIRTIO_DEV_OFFS_TYPE 0 /* 8 bits */
#define VIRTIO_DEV_OFFS_NUM_VQ 1 /* 8 bits */
Expand Down Expand Up @@ -67,6 +68,7 @@ struct VirtIOS390Device {
uint32_t host_features;
virtio_serial_conf serial;
virtio_net_conf net;
VirtIOSCSIConf scsi;
};

typedef struct VirtIOS390Bus {
Expand Down
56 changes: 56 additions & 0 deletions hw/virtio-pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "virtio-blk.h"
#include "virtio-net.h"
#include "virtio-serial.h"
#include "virtio-scsi.h"
#include "pci.h"
#include "qemu-error.h"
#include "msix.h"
Expand Down Expand Up @@ -930,12 +931,67 @@ static TypeInfo virtio_balloon_info = {
.class_init = virtio_balloon_class_init,
};

static int virtio_scsi_init_pci(PCIDevice *pci_dev)
{
VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
VirtIODevice *vdev;

vdev = virtio_scsi_init(&pci_dev->qdev, &proxy->scsi);
if (!vdev) {
return -EINVAL;
}

vdev->nvectors = proxy->nvectors;
virtio_init_pci(proxy, vdev);

/* make the actual value visible */
proxy->nvectors = vdev->nvectors;
return 0;
}

static int virtio_scsi_exit_pci(PCIDevice *pci_dev)
{
VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);

virtio_scsi_exit(proxy->vdev);
return virtio_exit_pci(pci_dev);
}

static Property virtio_scsi_properties[] = {
DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOPCIProxy, host_features, scsi),
DEFINE_PROP_END_OF_LIST(),
};

static void virtio_scsi_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);

k->init = virtio_scsi_init_pci;
k->exit = virtio_scsi_exit_pci;
k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
k->device_id = PCI_DEVICE_ID_VIRTIO_SCSI;
k->revision = 0x00;
k->class_id = PCI_CLASS_STORAGE_SCSI;
dc->reset = virtio_pci_reset;
dc->props = virtio_scsi_properties;
}

static TypeInfo virtio_scsi_info = {
.name = "virtio-scsi-pci",
.parent = TYPE_PCI_DEVICE,
.instance_size = sizeof(VirtIOPCIProxy),
.class_init = virtio_scsi_class_init,
};

static void virtio_pci_register_types(void)
{
type_register_static(&virtio_blk_info);
type_register_static(&virtio_net_info);
type_register_static(&virtio_serial_info);
type_register_static(&virtio_balloon_info);
type_register_static(&virtio_scsi_info);
}

type_init(virtio_pci_register_types)
2 changes: 2 additions & 0 deletions hw/virtio-pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

#include "virtio-net.h"
#include "virtio-serial.h"
#include "virtio-scsi.h"

/* Performance improves when virtqueue kick processing is decoupled from the
* vcpu thread using ioeventfd for some devices. */
Expand All @@ -40,6 +41,7 @@ typedef struct {
#endif
virtio_serial_conf serial;
virtio_net_conf net;
VirtIOSCSIConf scsi;
bool ioeventfd_disabled;
bool ioeventfd_started;
} VirtIOPCIProxy;
Expand Down
Loading

0 comments on commit 973abc7

Please sign in to comment.