From nobody Mon Feb 9 03:13:24 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 154328707107210.900439851656756; Mon, 26 Nov 2018 18:51:11 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B51C780F7B; Tue, 27 Nov 2018 02:51:07 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 771225C6B0; Tue, 27 Nov 2018 02:51:07 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id CE363181A968; Tue, 27 Nov 2018 02:51:06 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id wAR2oknq020688 for ; Mon, 26 Nov 2018 21:50:46 -0500 Received: by smtp.corp.redhat.com (Postfix) id 4327917F80; Tue, 27 Nov 2018 02:50:46 +0000 (UTC) Received: from localhost (ovpn-116-21.gru2.redhat.com [10.97.116.21]) by smtp.corp.redhat.com (Postfix) with ESMTP id 87D3E19747; Tue, 27 Nov 2018 02:50:26 +0000 (UTC) From: Eduardo Habkost To: "Michael S. Tsirkin" , qemu-devel@nongnu.org Date: Tue, 27 Nov 2018 00:49:58 -0200 Message-Id: <20181127024959.7060-2-ehabkost@redhat.com> In-Reply-To: <20181127024959.7060-1-ehabkost@redhat.com> References: <20181127024959.7060-1-ehabkost@redhat.com> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: Kevin Wolf , Fam Zheng , Stefan Hajnoczi , Amit Shah , libvir-list@redhat.com, Jason Wang , Cornelia Huck , Andrea Bolognani , Wainer dos Santos Moschetta , Caio Carrara , Gonglei , Laine Stump , Cleber Rosa , Paolo Bonzini , Max Reitz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcel Apfelbaum , Gerd Hoffmann Subject: [libvirt] [PATCH for-4.0 v3 1/2] virtio: Helper for registering virtio device types X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 27 Nov 2018 02:51:08 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Introduce a helper for registering different flavours of virtio devices. Convert code to use the helper, but keep only the existing generic types. Transitional and non-transitional device types will be added by another patch. Acked-by: Andrea Bolognani Signed-off-by: Eduardo Habkost Reviewed-by: Cornelia Huck --- Changes v2 -> v3: * Split into two separate patches (type registration helper and introduction of new types) * Rewrote comments describing each flavour * Rewrote virtio_pci_types_register() completely: * Replaced magic generation of type names with explicit fields in VirtioPCIDeviceTypeInfo * Removed modern_only field (won't be used anymore) * Don't register a separate base type unless it's required by the caller --- hw/virtio/virtio-pci.h | 54 ++++++++ hw/display/virtio-gpu-pci.c | 7 +- hw/display/virtio-vga.c | 7 +- hw/virtio/virtio-crypto-pci.c | 7 +- hw/virtio/virtio-pci.c | 231 ++++++++++++++++++++++++---------- 5 files changed, 228 insertions(+), 78 deletions(-) diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h index 813082b0d7..b26731a305 100644 --- a/hw/virtio/virtio-pci.h +++ b/hw/virtio/virtio-pci.h @@ -417,4 +417,58 @@ struct VirtIOCryptoPCI { /* Virtio ABI version, if we increment this, we break the guest driver. */ #define VIRTIO_PCI_ABI_VERSION 0 =20 +/* Input for virtio_pci_types_register() */ +typedef struct VirtioPCIDeviceTypeInfo { + /* + * Common base class for the subclasses below. + * + * Required only if transitional_name or non_transitional_name is set. + * + * We need a separate base type instead of making all types + * inherit from generic_name for two reasons: + * 1) generic_name implements INTERFACE_PCIE_DEVICE, but + * transitional_name don't. + * 2) generic_name has the "disable-legacy" and "disable-modern" + * properties, transitional_name and non_transitional name don't. + */ + const char *base_name; + /* + * Generic device type. Optional. + * + * Supports both transitional and non-transitional modes, + * using the disable-legacy and disable-modern properties. + * If disable-legacy=3Dauto, (non-)transitional mode is selected + * depending on the bus where the device is plugged. + * + * Implements both INTERFACE_PCIE_DEVICE and INTERFACE_CONVENTIONAL_PC= I_DEVICE, + * but PCI Express is supported only in non-transitional mode. + * + * The only type implemented by QEMU 3.1 and older. + */ + const char *generic_name; + /* + * The non-transitional device type. Optional. + * + * Implements both INTERFACE_PCIE_DEVICE and INTERFACE_CONVENTIONAL_PC= I_DEVICE. + */ + const char *transitional_name; + /* + * The transitional device type. Optional. + * + * Implements INTERFACE_CONVENTIONAL_PCI_DEVICE only. + */ + const char *non_transitional_name; + + /* Parent type. If NULL, TYPE_VIRTIO_PCI is used */ + const char *parent; + + /* Same as TypeInfo fields: */ + size_t instance_size; + void (*instance_init)(Object *obj); + void (*class_init)(ObjectClass *klass, void *data); +} VirtioPCIDeviceTypeInfo; + +/* Register virtio-pci type(s). @t must be static. */ +void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t); + #endif diff --git a/hw/display/virtio-gpu-pci.c b/hw/display/virtio-gpu-pci.c index cece4aa495..faf76a8bc4 100644 --- a/hw/display/virtio-gpu-pci.c +++ b/hw/display/virtio-gpu-pci.c @@ -69,9 +69,8 @@ static void virtio_gpu_initfn(Object *obj) TYPE_VIRTIO_GPU); } =20 -static const TypeInfo virtio_gpu_pci_info =3D { - .name =3D TYPE_VIRTIO_GPU_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo virtio_gpu_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_GPU_PCI, .instance_size =3D sizeof(VirtIOGPUPCI), .instance_init =3D virtio_gpu_initfn, .class_init =3D virtio_gpu_pci_class_init, @@ -79,6 +78,6 @@ static const TypeInfo virtio_gpu_pci_info =3D { =20 static void virtio_gpu_pci_register_types(void) { - type_register_static(&virtio_gpu_pci_info); + virtio_pci_types_register(&virtio_gpu_pci_info); } type_init(virtio_gpu_pci_register_types) diff --git a/hw/display/virtio-vga.c b/hw/display/virtio-vga.c index ab2e369b28..8db4d916f2 100644 --- a/hw/display/virtio-vga.c +++ b/hw/display/virtio-vga.c @@ -207,9 +207,8 @@ static void virtio_vga_inst_initfn(Object *obj) TYPE_VIRTIO_GPU); } =20 -static TypeInfo virtio_vga_info =3D { - .name =3D TYPE_VIRTIO_VGA, - .parent =3D TYPE_VIRTIO_PCI, +static VirtioPCIDeviceTypeInfo virtio_vga_info =3D { + .generic_name =3D TYPE_VIRTIO_VGA, .instance_size =3D sizeof(struct VirtIOVGA), .instance_init =3D virtio_vga_inst_initfn, .class_init =3D virtio_vga_class_init, @@ -217,7 +216,7 @@ static TypeInfo virtio_vga_info =3D { =20 static void virtio_vga_register_types(void) { - type_register_static(&virtio_vga_info); + virtio_pci_types_register(&virtio_vga_info); } =20 type_init(virtio_vga_register_types) diff --git a/hw/virtio/virtio-crypto-pci.c b/hw/virtio/virtio-crypto-pci.c index bf64996e48..8cc3fa3ef7 100644 --- a/hw/virtio/virtio-crypto-pci.c +++ b/hw/virtio/virtio-crypto-pci.c @@ -64,9 +64,8 @@ static void virtio_crypto_initfn(Object *obj) TYPE_VIRTIO_CRYPTO); } =20 -static const TypeInfo virtio_crypto_pci_info =3D { - .name =3D TYPE_VIRTIO_CRYPTO_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo virtio_crypto_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_CRYPTO_PCI, .instance_size =3D sizeof(VirtIOCryptoPCI), .instance_init =3D virtio_crypto_initfn, .class_init =3D virtio_crypto_pci_class_init, @@ -74,6 +73,6 @@ static const TypeInfo virtio_crypto_pci_info =3D { =20 static void virtio_crypto_pci_register_types(void) { - type_register_static(&virtio_crypto_pci_info); + virtio_pci_types_register(&virtio_crypto_pci_info); } type_init(virtio_crypto_pci_register_types) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index a954799267..f07ec55c38 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -1119,9 +1119,8 @@ static void virtio_9p_pci_instance_init(Object *obj) TYPE_VIRTIO_9P); } =20 -static const TypeInfo virtio_9p_pci_info =3D { - .name =3D TYPE_VIRTIO_9P_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo virtio_9p_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_9P_PCI, .instance_size =3D sizeof(V9fsPCIState), .instance_init =3D virtio_9p_pci_instance_init, .class_init =3D virtio_9p_pci_class_init, @@ -1877,9 +1876,6 @@ static void virtio_pci_reset(DeviceState *qdev) static Property virtio_pci_properties[] =3D { DEFINE_PROP_BIT("virtio-pci-bus-master-bug-migration", VirtIOPCIProxy,= flags, VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT, false), - DEFINE_PROP_ON_OFF_AUTO("disable-legacy", VirtIOPCIProxy, disable_lega= cy, - ON_OFF_AUTO_AUTO), - DEFINE_PROP_BOOL("disable-modern", VirtIOPCIProxy, disable_modern, fal= se), DEFINE_PROP_BIT("migrate-extra", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT, true), DEFINE_PROP_BIT("modern-pio-notify", VirtIOPCIProxy, flags, @@ -1939,13 +1935,123 @@ static const TypeInfo virtio_pci_info =3D { .class_init =3D virtio_pci_class_init, .class_size =3D sizeof(VirtioPCIClass), .abstract =3D true, - .interfaces =3D (InterfaceInfo[]) { - { INTERFACE_PCIE_DEVICE }, - { INTERFACE_CONVENTIONAL_PCI_DEVICE }, - { } - }, }; =20 +static Property virtio_pci_generic_properties[] =3D { + DEFINE_PROP_ON_OFF_AUTO("disable-legacy", VirtIOPCIProxy, disable_lega= cy, + ON_OFF_AUTO_AUTO), + DEFINE_PROP_BOOL("disable-modern", VirtIOPCIProxy, disable_modern, fal= se), + DEFINE_PROP_END_OF_LIST(), +}; + +static void virtio_pci_base_class_init(ObjectClass *klass, void *data) +{ + const VirtioPCIDeviceTypeInfo *t =3D data; + if (t->class_init) { + t->class_init(klass, NULL); + } +} + +static void virtio_pci_generic_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->props =3D virtio_pci_generic_properties; +} + +/* Used when the generic type and the base type is the same */ +static void virtio_pci_generic_base_class_init(ObjectClass *klass, void *d= ata) +{ + virtio_pci_base_class_init(klass, data); + virtio_pci_generic_class_init(klass, NULL); +} + +static void virtio_pci_transitional_instance_init(Object *obj) +{ + VirtIOPCIProxy *proxy =3D VIRTIO_PCI(obj); + + proxy->disable_legacy =3D ON_OFF_AUTO_OFF; + proxy->disable_modern =3D false; +} + +static void virtio_pci_non_transitional_instance_init(Object *obj) +{ + VirtIOPCIProxy *proxy =3D VIRTIO_PCI(obj); + + proxy->disable_legacy =3D ON_OFF_AUTO_ON; + proxy->disable_modern =3D false; +} + +void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t) +{ + TypeInfo base_type_info =3D { + .name =3D t->base_name, + .parent =3D t->parent ? t->parent : TYPE_VIRTIO_PCI, + .instance_size =3D t->instance_size, + .instance_init =3D t->instance_init, + .class_init =3D virtio_pci_base_class_init, + .class_data =3D (void *)t, + .abstract =3D true, + }; + TypeInfo generic_type_info =3D { + .name =3D t->generic_name, + .parent =3D base_type_info.name, + .class_init =3D virtio_pci_generic_class_init, + .interfaces =3D (InterfaceInfo[]) { + { INTERFACE_PCIE_DEVICE }, + { INTERFACE_CONVENTIONAL_PCI_DEVICE }, + { } + }, + }; + + if (!base_type_info.name) { + /* No base type -> register a single generic device type */ + base_type_info.name =3D t->generic_name; + base_type_info.class_init =3D virtio_pci_generic_base_class_init; + base_type_info.interfaces =3D generic_type_info.interfaces; + base_type_info.abstract =3D false; + generic_type_info.name =3D NULL; + assert(!t->non_transitional_name); + assert(!t->transitional_name); + } + + type_register(&base_type_info); + if (generic_type_info.name) { + type_register(&generic_type_info); + } + + if (t->non_transitional_name) { + const TypeInfo non_transitional_type_info =3D { + .name =3D t->non_transitional_name, + .parent =3D base_type_info.name, + .instance_init =3D virtio_pci_non_transitional_instance_init, + .interfaces =3D (InterfaceInfo[]) { + { INTERFACE_PCIE_DEVICE }, + { INTERFACE_CONVENTIONAL_PCI_DEVICE }, + { } + }, + }; + type_register(&non_transitional_type_info); + } + + if (t->transitional_name) { + const TypeInfo transitional_type_info =3D { + .name =3D t->transitional_name, + .parent =3D base_type_info.name, + .instance_init =3D virtio_pci_transitional_instance_init, + .interfaces =3D (InterfaceInfo[]) { + /* + * Transitional virtio devices work only as Conventional P= CI + * devices because they require PIO ports. + */ + { INTERFACE_CONVENTIONAL_PCI_DEVICE }, + { } + }, + }; + type_register(&transitional_type_info); + } +} + /* virtio-blk-pci */ =20 static Property virtio_blk_pci_properties[] =3D { @@ -1995,9 +2101,8 @@ static void virtio_blk_pci_instance_init(Object *obj) "bootindex", &error_abort); } =20 -static const TypeInfo virtio_blk_pci_info =3D { - .name =3D TYPE_VIRTIO_BLK_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo virtio_blk_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_BLK_PCI, .instance_size =3D sizeof(VirtIOBlkPCI), .instance_init =3D virtio_blk_pci_instance_init, .class_init =3D virtio_blk_pci_class_init, @@ -2051,9 +2156,8 @@ static void vhost_user_blk_pci_instance_init(Object *= obj) "bootindex", &error_abort); } =20 -static const TypeInfo vhost_user_blk_pci_info =3D { - .name =3D TYPE_VHOST_USER_BLK_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo vhost_user_blk_pci_info =3D { + .generic_name =3D TYPE_VHOST_USER_BLK_PCI, .instance_size =3D sizeof(VHostUserBlkPCI), .instance_init =3D vhost_user_blk_pci_instance_init, .class_init =3D vhost_user_blk_pci_class_init, @@ -2119,9 +2223,8 @@ static void virtio_scsi_pci_instance_init(Object *obj) TYPE_VIRTIO_SCSI); } =20 -static const TypeInfo virtio_scsi_pci_info =3D { - .name =3D TYPE_VIRTIO_SCSI_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo virtio_scsi_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_SCSI_PCI, .instance_size =3D sizeof(VirtIOSCSIPCI), .instance_init =3D virtio_scsi_pci_instance_init, .class_init =3D virtio_scsi_pci_class_init, @@ -2174,9 +2277,8 @@ static void vhost_scsi_pci_instance_init(Object *obj) "bootindex", &error_abort); } =20 -static const TypeInfo vhost_scsi_pci_info =3D { - .name =3D TYPE_VHOST_SCSI_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo vhost_scsi_pci_info =3D { + .generic_name =3D TYPE_VHOST_SCSI_PCI, .instance_size =3D sizeof(VHostSCSIPCI), .instance_init =3D vhost_scsi_pci_instance_init, .class_init =3D vhost_scsi_pci_class_init, @@ -2229,9 +2331,8 @@ static void vhost_user_scsi_pci_instance_init(Object = *obj) "bootindex", &error_abort); } =20 -static const TypeInfo vhost_user_scsi_pci_info =3D { - .name =3D TYPE_VHOST_USER_SCSI_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo vhost_user_scsi_pci_info =3D { + .generic_name =3D TYPE_VHOST_USER_SCSI_PCI, .instance_size =3D sizeof(VHostUserSCSIPCI), .instance_init =3D vhost_user_scsi_pci_instance_init, .class_init =3D vhost_user_scsi_pci_class_init, @@ -2277,9 +2378,8 @@ static void vhost_vsock_pci_instance_init(Object *obj) TYPE_VHOST_VSOCK); } =20 -static const TypeInfo vhost_vsock_pci_info =3D { - .name =3D TYPE_VHOST_VSOCK_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo vhost_vsock_pci_info =3D { + .generic_name =3D TYPE_VHOST_VSOCK_PCI, .instance_size =3D sizeof(VHostVSockPCI), .instance_init =3D vhost_vsock_pci_instance_init, .class_init =3D vhost_vsock_pci_class_init, @@ -2334,9 +2434,8 @@ static void virtio_balloon_pci_instance_init(Object *= obj) "guest-stats-polling-interval", &error_abort= ); } =20 -static const TypeInfo virtio_balloon_pci_info =3D { - .name =3D TYPE_VIRTIO_BALLOON_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo virtio_balloon_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_BALLOON_PCI, .instance_size =3D sizeof(VirtIOBalloonPCI), .instance_init =3D virtio_balloon_pci_instance_init, .class_init =3D virtio_balloon_pci_class_init, @@ -2407,9 +2506,8 @@ static void virtio_serial_pci_instance_init(Object *o= bj) TYPE_VIRTIO_SERIAL); } =20 -static const TypeInfo virtio_serial_pci_info =3D { - .name =3D TYPE_VIRTIO_SERIAL_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo virtio_serial_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_SERIAL_PCI, .instance_size =3D sizeof(VirtIOSerialPCI), .instance_init =3D virtio_serial_pci_instance_init, .class_init =3D virtio_serial_pci_class_init, @@ -2462,9 +2560,8 @@ static void virtio_net_pci_instance_init(Object *obj) "bootindex", &error_abort); } =20 -static const TypeInfo virtio_net_pci_info =3D { - .name =3D TYPE_VIRTIO_NET_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo virtio_net_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_NET_PCI, .instance_size =3D sizeof(VirtIONetPCI), .instance_init =3D virtio_net_pci_instance_init, .class_init =3D virtio_net_pci_class_init, @@ -2513,9 +2610,8 @@ static void virtio_rng_initfn(Object *obj) TYPE_VIRTIO_RNG); } =20 -static const TypeInfo virtio_rng_pci_info =3D { - .name =3D TYPE_VIRTIO_RNG_PCI, - .parent =3D TYPE_VIRTIO_PCI, +static const VirtioPCIDeviceTypeInfo virtio_rng_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_RNG_PCI, .instance_size =3D sizeof(VirtIORngPCI), .instance_init =3D virtio_rng_initfn, .class_init =3D virtio_rng_pci_class_init, @@ -2605,24 +2701,24 @@ static const TypeInfo virtio_input_hid_pci_info =3D= { .abstract =3D true, }; =20 -static const TypeInfo virtio_keyboard_pci_info =3D { - .name =3D TYPE_VIRTIO_KEYBOARD_PCI, +static const VirtioPCIDeviceTypeInfo virtio_keyboard_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_KEYBOARD_PCI, .parent =3D TYPE_VIRTIO_INPUT_HID_PCI, .class_init =3D virtio_input_hid_kbd_pci_class_init, .instance_size =3D sizeof(VirtIOInputHIDPCI), .instance_init =3D virtio_keyboard_initfn, }; =20 -static const TypeInfo virtio_mouse_pci_info =3D { - .name =3D TYPE_VIRTIO_MOUSE_PCI, +static const VirtioPCIDeviceTypeInfo virtio_mouse_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_MOUSE_PCI, .parent =3D TYPE_VIRTIO_INPUT_HID_PCI, .class_init =3D virtio_input_hid_mouse_pci_class_init, .instance_size =3D sizeof(VirtIOInputHIDPCI), .instance_init =3D virtio_mouse_initfn, }; =20 -static const TypeInfo virtio_tablet_pci_info =3D { - .name =3D TYPE_VIRTIO_TABLET_PCI, +static const VirtioPCIDeviceTypeInfo virtio_tablet_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_TABLET_PCI, .parent =3D TYPE_VIRTIO_INPUT_HID_PCI, .instance_size =3D sizeof(VirtIOInputHIDPCI), .instance_init =3D virtio_tablet_initfn, @@ -2637,8 +2733,8 @@ static void virtio_host_initfn(Object *obj) TYPE_VIRTIO_INPUT_HOST); } =20 -static const TypeInfo virtio_host_pci_info =3D { - .name =3D TYPE_VIRTIO_INPUT_HOST_PCI, +static const VirtioPCIDeviceTypeInfo virtio_host_pci_info =3D { + .generic_name =3D TYPE_VIRTIO_INPUT_HOST_PCI, .parent =3D TYPE_VIRTIO_INPUT_PCI, .instance_size =3D sizeof(VirtIOInputHostPCI), .instance_init =3D virtio_host_initfn, @@ -2692,36 +2788,39 @@ static const TypeInfo virtio_pci_bus_info =3D { =20 static void virtio_pci_register_types(void) { - type_register_static(&virtio_rng_pci_info); + /* Base types: */ + type_register_static(&virtio_pci_bus_info); + type_register_static(&virtio_pci_info); type_register_static(&virtio_input_pci_info); type_register_static(&virtio_input_hid_pci_info); - type_register_static(&virtio_keyboard_pci_info); - type_register_static(&virtio_mouse_pci_info); - type_register_static(&virtio_tablet_pci_info); + + /* Implementations: */ + virtio_pci_types_register(&virtio_rng_pci_info); + virtio_pci_types_register(&virtio_keyboard_pci_info); + virtio_pci_types_register(&virtio_mouse_pci_info); + virtio_pci_types_register(&virtio_tablet_pci_info); #ifdef CONFIG_LINUX - type_register_static(&virtio_host_pci_info); + virtio_pci_types_register(&virtio_host_pci_info); #endif - type_register_static(&virtio_pci_bus_info); - type_register_static(&virtio_pci_info); #ifdef CONFIG_VIRTFS - type_register_static(&virtio_9p_pci_info); + virtio_pci_types_register(&virtio_9p_pci_info); #endif - type_register_static(&virtio_blk_pci_info); + virtio_pci_types_register(&virtio_blk_pci_info); #if defined(CONFIG_VHOST_USER) && defined(CONFIG_LINUX) - type_register_static(&vhost_user_blk_pci_info); + virtio_pci_types_register(&vhost_user_blk_pci_info); #endif - type_register_static(&virtio_scsi_pci_info); - type_register_static(&virtio_balloon_pci_info); - type_register_static(&virtio_serial_pci_info); - type_register_static(&virtio_net_pci_info); + virtio_pci_types_register(&virtio_scsi_pci_info); + virtio_pci_types_register(&virtio_balloon_pci_info); + virtio_pci_types_register(&virtio_serial_pci_info); + virtio_pci_types_register(&virtio_net_pci_info); #ifdef CONFIG_VHOST_SCSI - type_register_static(&vhost_scsi_pci_info); + virtio_pci_types_register(&vhost_scsi_pci_info); #endif #if defined(CONFIG_VHOST_USER) && defined(CONFIG_LINUX) - type_register_static(&vhost_user_scsi_pci_info); + virtio_pci_types_register(&vhost_user_scsi_pci_info); #endif #ifdef CONFIG_VHOST_VSOCK - type_register_static(&vhost_vsock_pci_info); + virtio_pci_types_register(&vhost_vsock_pci_info); #endif } =20 --=20 2.18.0.rc1.1.g3f1ff2140 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list