Commit cf21e106cd9b34a12a533191932a8a08a1f5ebe4
1 parent
9d07d757
Virtio-net qdev conversion
Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing
8 changed files
with
40 additions
and
32 deletions
hw/pci.c
hw/virtio-balloon.c
| @@ -172,16 +172,20 @@ static int virtio_balloon_load(QEMUFile *f, void *opaque, int version_id) | @@ -172,16 +172,20 @@ static int virtio_balloon_load(QEMUFile *f, void *opaque, int version_id) | ||
| 172 | void *virtio_balloon_init(PCIBus *bus) | 172 | void *virtio_balloon_init(PCIBus *bus) |
| 173 | { | 173 | { |
| 174 | VirtIOBalloon *s; | 174 | VirtIOBalloon *s; |
| 175 | + PCIDevice *d; | ||
| 175 | 176 | ||
| 176 | - s = (VirtIOBalloon *)virtio_init_pci(bus, "virtio-balloon", | 177 | + d = pci_register_device(bus, "virtio-balloon", sizeof(VirtIOBalloon), |
| 178 | + -1, NULL, NULL); | ||
| 179 | + if (!d) | ||
| 180 | + return NULL; | ||
| 181 | + | ||
| 182 | + s = (VirtIOBalloon *)virtio_init_pci(d, "virtio-balloon", | ||
| 177 | PCI_VENDOR_ID_REDHAT_QUMRANET, | 183 | PCI_VENDOR_ID_REDHAT_QUMRANET, |
| 178 | PCI_DEVICE_ID_VIRTIO_BALLOON, | 184 | PCI_DEVICE_ID_VIRTIO_BALLOON, |
| 179 | PCI_VENDOR_ID_REDHAT_QUMRANET, | 185 | PCI_VENDOR_ID_REDHAT_QUMRANET, |
| 180 | VIRTIO_ID_BALLOON, | 186 | VIRTIO_ID_BALLOON, |
| 181 | PCI_CLASS_MEMORY_RAM, 0x00, | 187 | PCI_CLASS_MEMORY_RAM, 0x00, |
| 182 | - 8, sizeof(VirtIOBalloon)); | ||
| 183 | - if (s == NULL) | ||
| 184 | - return NULL; | 188 | + 8); |
| 185 | 189 | ||
| 186 | s->vdev.get_config = virtio_balloon_get_config; | 190 | s->vdev.get_config = virtio_balloon_get_config; |
| 187 | s->vdev.set_config = virtio_balloon_set_config; | 191 | s->vdev.set_config = virtio_balloon_set_config; |
hw/virtio-blk.c
| @@ -353,16 +353,20 @@ void *virtio_blk_init(PCIBus *bus, BlockDriverState *bs) | @@ -353,16 +353,20 @@ void *virtio_blk_init(PCIBus *bus, BlockDriverState *bs) | ||
| 353 | VirtIOBlock *s; | 353 | VirtIOBlock *s; |
| 354 | int cylinders, heads, secs; | 354 | int cylinders, heads, secs; |
| 355 | static int virtio_blk_id; | 355 | static int virtio_blk_id; |
| 356 | + PCIDevice *d; | ||
| 356 | 357 | ||
| 357 | - s = (VirtIOBlock *)virtio_init_pci(bus, "virtio-blk", | 358 | + d = pci_register_device(bus, "virtio-blk", sizeof(VirtIOBlock), |
| 359 | + -1, NULL, NULL); | ||
| 360 | + if (!d) | ||
| 361 | + return NULL; | ||
| 362 | + | ||
| 363 | + s = (VirtIOBlock *)virtio_init_pci(d, "virtio-blk", | ||
| 358 | PCI_VENDOR_ID_REDHAT_QUMRANET, | 364 | PCI_VENDOR_ID_REDHAT_QUMRANET, |
| 359 | PCI_DEVICE_ID_VIRTIO_BLOCK, | 365 | PCI_DEVICE_ID_VIRTIO_BLOCK, |
| 360 | PCI_VENDOR_ID_REDHAT_QUMRANET, | 366 | PCI_VENDOR_ID_REDHAT_QUMRANET, |
| 361 | VIRTIO_ID_BLOCK, | 367 | VIRTIO_ID_BLOCK, |
| 362 | PCI_CLASS_STORAGE_OTHER, 0x00, | 368 | PCI_CLASS_STORAGE_OTHER, 0x00, |
| 363 | - sizeof(struct virtio_blk_config), sizeof(VirtIOBlock)); | ||
| 364 | - if (!s) | ||
| 365 | - return NULL; | 369 | + sizeof(struct virtio_blk_config)); |
| 366 | 370 | ||
| 367 | s->vdev.get_config = virtio_blk_update_config; | 371 | s->vdev.get_config = virtio_blk_update_config; |
| 368 | s->vdev.get_features = virtio_blk_get_features; | 372 | s->vdev.get_features = virtio_blk_get_features; |
hw/virtio-console.c
| @@ -126,14 +126,20 @@ static int virtio_console_load(QEMUFile *f, void *opaque, int version_id) | @@ -126,14 +126,20 @@ static int virtio_console_load(QEMUFile *f, void *opaque, int version_id) | ||
| 126 | void *virtio_console_init(PCIBus *bus, CharDriverState *chr) | 126 | void *virtio_console_init(PCIBus *bus, CharDriverState *chr) |
| 127 | { | 127 | { |
| 128 | VirtIOConsole *s; | 128 | VirtIOConsole *s; |
| 129 | + PCIDevice *d; | ||
| 129 | 130 | ||
| 130 | - s = (VirtIOConsole *)virtio_init_pci(bus, "virtio-console", | 131 | + d = pci_register_device(bus, "virtio-console", sizeof(VirtIOConsole), |
| 132 | + -1, NULL, NULL); | ||
| 133 | + if (!d) | ||
| 134 | + return NULL; | ||
| 135 | + | ||
| 136 | + s = (VirtIOConsole *)virtio_init_pci(d, "virtio-console", | ||
| 131 | PCI_VENDOR_ID_REDHAT_QUMRANET, | 137 | PCI_VENDOR_ID_REDHAT_QUMRANET, |
| 132 | PCI_DEVICE_ID_VIRTIO_CONSOLE, | 138 | PCI_DEVICE_ID_VIRTIO_CONSOLE, |
| 133 | PCI_VENDOR_ID_REDHAT_QUMRANET, | 139 | PCI_VENDOR_ID_REDHAT_QUMRANET, |
| 134 | VIRTIO_ID_CONSOLE, | 140 | VIRTIO_ID_CONSOLE, |
| 135 | PCI_CLASS_DISPLAY_OTHER, 0x00, | 141 | PCI_CLASS_DISPLAY_OTHER, 0x00, |
| 136 | - 0, sizeof(VirtIOConsole)); | 142 | + 0); |
| 137 | if (s == NULL) | 143 | if (s == NULL) |
| 138 | return NULL; | 144 | return NULL; |
| 139 | 145 |
hw/virtio-net.c
| @@ -585,21 +585,18 @@ static void virtio_net_cleanup(VLANClientState *vc) | @@ -585,21 +585,18 @@ static void virtio_net_cleanup(VLANClientState *vc) | ||
| 585 | virtio_cleanup(&n->vdev); | 585 | virtio_cleanup(&n->vdev); |
| 586 | } | 586 | } |
| 587 | 587 | ||
| 588 | -PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn) | 588 | +static void virtio_net_init(PCIDevice *pci_dev) |
| 589 | { | 589 | { |
| 590 | VirtIONet *n; | 590 | VirtIONet *n; |
| 591 | static int virtio_net_id; | 591 | static int virtio_net_id; |
| 592 | 592 | ||
| 593 | - n = (VirtIONet *)virtio_init_pci(bus, "virtio-net", | 593 | + n = (VirtIONet *)virtio_init_pci(pci_dev, "virtio-net", |
| 594 | PCI_VENDOR_ID_REDHAT_QUMRANET, | 594 | PCI_VENDOR_ID_REDHAT_QUMRANET, |
| 595 | PCI_DEVICE_ID_VIRTIO_NET, | 595 | PCI_DEVICE_ID_VIRTIO_NET, |
| 596 | PCI_VENDOR_ID_REDHAT_QUMRANET, | 596 | PCI_VENDOR_ID_REDHAT_QUMRANET, |
| 597 | VIRTIO_ID_NET, | 597 | VIRTIO_ID_NET, |
| 598 | PCI_CLASS_NETWORK_ETHERNET, 0x00, | 598 | PCI_CLASS_NETWORK_ETHERNET, 0x00, |
| 599 | - sizeof(struct virtio_net_config), | ||
| 600 | - sizeof(VirtIONet)); | ||
| 601 | - if (!n) | ||
| 602 | - return NULL; | 599 | + sizeof(struct virtio_net_config)); |
| 603 | 600 | ||
| 604 | n->vdev.get_config = virtio_net_get_config; | 601 | n->vdev.get_config = virtio_net_get_config; |
| 605 | n->vdev.set_config = virtio_net_set_config; | 602 | n->vdev.set_config = virtio_net_set_config; |
| @@ -610,9 +607,9 @@ PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn) | @@ -610,9 +607,9 @@ PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn) | ||
| 610 | n->rx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_rx); | 607 | n->rx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_rx); |
| 611 | n->tx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_tx); | 608 | n->tx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_tx); |
| 612 | n->ctrl_vq = virtio_add_queue(&n->vdev, 16, virtio_net_handle_ctrl); | 609 | n->ctrl_vq = virtio_add_queue(&n->vdev, 16, virtio_net_handle_ctrl); |
| 613 | - memcpy(n->mac, nd->macaddr, ETH_ALEN); | 610 | + qdev_get_macaddr(&pci_dev->qdev, n->mac); |
| 614 | n->status = VIRTIO_NET_S_LINK_UP; | 611 | n->status = VIRTIO_NET_S_LINK_UP; |
| 615 | - n->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name, | 612 | + n->vc = qdev_get_vlan_client(&pci_dev->qdev, |
| 616 | virtio_net_receive, | 613 | virtio_net_receive, |
| 617 | virtio_net_can_receive, | 614 | virtio_net_can_receive, |
| 618 | virtio_net_cleanup, n); | 615 | virtio_net_cleanup, n); |
| @@ -631,5 +628,11 @@ PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn) | @@ -631,5 +628,11 @@ PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn) | ||
| 631 | 628 | ||
| 632 | register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION, | 629 | register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION, |
| 633 | virtio_net_save, virtio_net_load, n); | 630 | virtio_net_save, virtio_net_load, n); |
| 634 | - return (PCIDevice *)n; | ||
| 635 | } | 631 | } |
| 632 | + | ||
| 633 | +static void virtio_net_register_devices(void) | ||
| 634 | +{ | ||
| 635 | + pci_qdev_register("virtio_net", sizeof(VirtIONet), virtio_net_init); | ||
| 636 | +} | ||
| 637 | + | ||
| 638 | +device_init(virtio_net_register_devices) |
hw/virtio-net.h
| @@ -85,8 +85,6 @@ struct virtio_net_hdr_mrg_rxbuf | @@ -85,8 +85,6 @@ struct virtio_net_hdr_mrg_rxbuf | ||
| 85 | uint16_t num_buffers; /* Number of merged rx buffers */ | 85 | uint16_t num_buffers; /* Number of merged rx buffers */ |
| 86 | }; | 86 | }; |
| 87 | 87 | ||
| 88 | -PCIDevice *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn); | ||
| 89 | - | ||
| 90 | /* | 88 | /* |
| 91 | * Control virtqueue data structures | 89 | * Control virtqueue data structures |
| 92 | * | 90 | * |
hw/virtio.c
| @@ -757,22 +757,16 @@ void virtio_cleanup(VirtIODevice *vdev) | @@ -757,22 +757,16 @@ void virtio_cleanup(VirtIODevice *vdev) | ||
| 757 | qemu_free(vdev->vq); | 757 | qemu_free(vdev->vq); |
| 758 | } | 758 | } |
| 759 | 759 | ||
| 760 | -VirtIODevice *virtio_init_pci(PCIBus *bus, const char *name, | 760 | +VirtIODevice *virtio_init_pci(PCIDevice *pci_dev, const char *name, |
| 761 | uint16_t vendor, uint16_t device, | 761 | uint16_t vendor, uint16_t device, |
| 762 | uint16_t subvendor, uint16_t subdevice, | 762 | uint16_t subvendor, uint16_t subdevice, |
| 763 | uint16_t class_code, uint8_t pif, | 763 | uint16_t class_code, uint8_t pif, |
| 764 | - size_t config_size, size_t struct_size) | 764 | + size_t config_size) |
| 765 | { | 765 | { |
| 766 | VirtIODevice *vdev; | 766 | VirtIODevice *vdev; |
| 767 | - PCIDevice *pci_dev; | ||
| 768 | uint8_t *config; | 767 | uint8_t *config; |
| 769 | uint32_t size; | 768 | uint32_t size; |
| 770 | 769 | ||
| 771 | - pci_dev = pci_register_device(bus, name, struct_size, | ||
| 772 | - -1, NULL, NULL); | ||
| 773 | - if (!pci_dev) | ||
| 774 | - return NULL; | ||
| 775 | - | ||
| 776 | vdev = to_virtio_device(pci_dev); | 770 | vdev = to_virtio_device(pci_dev); |
| 777 | 771 | ||
| 778 | vdev->status = 0; | 772 | vdev->status = 0; |
hw/virtio.h
| @@ -92,11 +92,11 @@ struct VirtIODevice | @@ -92,11 +92,11 @@ struct VirtIODevice | ||
| 92 | VirtQueue *vq; | 92 | VirtQueue *vq; |
| 93 | }; | 93 | }; |
| 94 | 94 | ||
| 95 | -VirtIODevice *virtio_init_pci(PCIBus *bus, const char *name, | 95 | +VirtIODevice *virtio_init_pci(PCIDevice *pci_dev, const char *name, |
| 96 | uint16_t vendor, uint16_t device, | 96 | uint16_t vendor, uint16_t device, |
| 97 | uint16_t subvendor, uint16_t subdevice, | 97 | uint16_t subvendor, uint16_t subdevice, |
| 98 | uint16_t class_code, uint8_t pif, | 98 | uint16_t class_code, uint8_t pif, |
| 99 | - size_t config_size, size_t struct_size); | 99 | + size_t config_size); |
| 100 | 100 | ||
| 101 | VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size, | 101 | VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size, |
| 102 | void (*handle_output)(VirtIODevice *, | 102 | void (*handle_output)(VirtIODevice *, |