From: KONRAD Frederic <fred.konrad@xxxxxxxxxxxxx> Split the old virtio-9p-pci device into virtio-pci and virtio-9p. The old virtio-9p-pci is removed from virtio-9p-device.c. Signed-off-by: KONRAD Frederic <fred.konrad@xxxxxxxxxxxxx> --- hw/9pfs/virtio-9p-device.c | 118 ++++++++++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 43 deletions(-) diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c index 062ddd9..494966a 100644 --- a/hw/9pfs/virtio-9p-device.c +++ b/hw/9pfs/virtio-9p-device.c @@ -143,65 +143,94 @@ VirtIODevice *virtio_9p_init(DeviceState *dev, V9fsConf *conf) return &s->vdev; } -static int virtio_9p_init_pci(PCIDevice *pci_dev) +/******************** VirtIO9P Device **********************/ + +static int virtio_9pdev_init(DeviceState *dev) { - VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev); VirtIODevice *vdev; + VirtIO9PState *s = DO_UPCAST(VirtIO9PState, qdev, dev); + + vdev = virtio_9p_init(dev, &s->v9fs); + 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; - vdev = virtio_9p_init(&pci_dev->qdev, &proxy->fsconf); - vdev->nvectors = proxy->nvectors; - virtio_init_pci(proxy, vdev); - /* make the actual value visible */ - proxy->nvectors = vdev->nvectors; + 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_9p_properties[] = { - DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true), - DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2), - DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features), - DEFINE_PROP_STRING("mount_tag", VirtIOPCIProxy, fsconf.tag), - DEFINE_PROP_STRING("fsdev", VirtIOPCIProxy, fsconf.fsdev_id), +static Property virtio_9pdev_properties[] = { + DEFINE_VIRTIO_COMMON_FEATURES(VirtIO9PState, host_features), + DEFINE_PROP_STRING("mount_tag", VirtIO9PState, v9fs.tag), + DEFINE_PROP_STRING("fsdev", VirtIO9PState, v9fs.fsdev_id), + DEFINE_PROP_TRANSPORT("transport", VirtIO9PState, trl), DEFINE_PROP_END_OF_LIST(), }; -static void virtio_9p_class_init(ObjectClass *klass, void *data) +static void virtio_9pdev_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); - PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); - - k->init = virtio_9p_init_pci; - k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET; - k->device_id = 0x1009; - k->revision = VIRTIO_PCI_ABI_VERSION; - k->class_id = 0x2; - dc->props = virtio_9p_properties; - dc->reset = virtio_pci_reset; + dc->init = virtio_9pdev_init; + dc->props = virtio_9pdev_properties; } -static TypeInfo virtio_9p_info = { - .name = "virtio-9p-pci", - .parent = TYPE_PCI_DEVICE, - .instance_size = sizeof(VirtIOPCIProxy), - .class_init = virtio_9p_class_init, +static TypeInfo virtio_9pdev_info = { + .name = "virtio-9p", + .parent = TYPE_DEVICE, + .instance_size = sizeof(VirtIO9PState), + .class_init = virtio_9pdev_class_init, }; -/******************** VirtIO9P Device **********************/ +/****************** VirtIO9P-PCI Device ********************/ +/* This device create a virtio-pci, and a virtio-9p device */ -static int virtio_9pdev_init(DeviceState *dev) + +static int virtio_9p_pcidev_init(DeviceState *dev) { VirtIODevice *vdev; VirtIO9PState *s = DO_UPCAST(VirtIO9PState, qdev, dev); + PCIBus *rootpcibus; + PCIDevice *vpcidev; - vdev = virtio_9p_init(dev, &s->v9fs); - if (!vdev) + /* We have to create a new virtio-pci */ + rootpcibus = pci_find_root_bus(0); + if (rootpcibus==NULL) { + /* No PCI BUS ? */ return -1; } - if (s->trl == NULL) + vpcidev = pci_create_simple(rootpcibus, -1, "virtio-pci"); + if (vpcidev==NULL) + { + return -1; + } + + /* Link Virtio 9P to Virtio PCI */ + s->trl = virtio_find_transport_by_device_state(&(vpcidev->qdev)); + + vdev = virtio_9p_init(dev, &s->v9fs); + if (!vdev) { - error_report("transport property not set"); return -1; } @@ -221,31 +250,34 @@ static int virtio_9pdev_init(DeviceState *dev) return 0; } -static Property virtio_9pdev_properties[] = { +static Property virtio_9p_pci_properties[] = +{ DEFINE_VIRTIO_COMMON_FEATURES(VirtIO9PState, host_features), DEFINE_PROP_STRING("mount_tag", VirtIO9PState, v9fs.tag), DEFINE_PROP_STRING("fsdev", VirtIO9PState, v9fs.fsdev_id), - DEFINE_PROP_TRANSPORT("transport", VirtIO9PState, trl), DEFINE_PROP_END_OF_LIST(), }; -static void virtio_9pdev_class_init(ObjectClass *klass, void *data) +static void virtio_9p_pci_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); - dc->init = virtio_9pdev_init; - dc->props = virtio_9pdev_properties; + dc->init = virtio_9p_pcidev_init; + dc->props = virtio_9p_pci_properties; } -static TypeInfo virtio_9pdev_info = { - .name = "virtio-9p", +static TypeInfo virtio_9p_pci_info = +{ + .name = "virtio-9p-pci", .parent = TYPE_DEVICE, .instance_size = sizeof(VirtIO9PState), - .class_init = virtio_9pdev_class_init, + .class_init = virtio_9p_pci_class_init, }; +/*************************************************************/ + static void virtio_9p_register_types(void) { - type_register_static(&virtio_9p_info); + type_register_static(&virtio_9p_pci_info); type_register_static(&virtio_9pdev_info); virtio_9p_set_fd_limit(); } -- 1.7.11.7 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm