virtio_pci_types_register() builds the base, generic, transitional and non-transitional TypeInfos for one virtio-pci device. Copy an is_available callback onto each of them so a device can register target-specific variants of the same names.
Signed-off-by: Yonggang Luo <[email protected]> --- hw/virtio/virtio-pci.c | 4 ++++ include/hw/virtio/virtio-pci.h | 1 + 2 files changed, 5 insertions(+) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index c73f1f546cb..1ce39e92e9d 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -2522,11 +2522,13 @@ void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t) .class_size = t->class_size, .abstract = true, .interfaces = t->interfaces, + .is_available = t->is_available, }; TypeInfo generic_type_info = { .name = t->generic_name, .parent = base_type_info.name, .class_init = virtio_pci_generic_class_init, + .is_available = t->is_available, .interfaces = (const InterfaceInfo[]) { { INTERFACE_PCIE_DEVICE }, { INTERFACE_CONVENTIONAL_PCI_DEVICE }, @@ -2562,6 +2564,7 @@ void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t) .name = t->non_transitional_name, .parent = base_type_info.name, .instance_init = virtio_pci_non_transitional_instance_init, + .is_available = t->is_available, .interfaces = (const InterfaceInfo[]) { { INTERFACE_PCIE_DEVICE }, { INTERFACE_CONVENTIONAL_PCI_DEVICE }, @@ -2576,6 +2579,7 @@ void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t) .name = t->transitional_name, .parent = base_type_info.name, .instance_init = virtio_pci_transitional_instance_init, + .is_available = t->is_available, .interfaces = (const InterfaceInfo[]) { /* * Transitional virtio devices work only as Conventional PCI diff --git a/include/hw/virtio/virtio-pci.h b/include/hw/virtio/virtio-pci.h index ee50fb0d551..6c3561d319a 100644 --- a/include/hw/virtio/virtio-pci.h +++ b/include/hw/virtio/virtio-pci.h @@ -236,6 +236,7 @@ typedef struct VirtioPCIDeviceTypeInfo { void (*instance_init)(Object *obj); void (*instance_finalize)(Object *obj); void (*class_init)(ObjectClass *klass, const void *data); + bool (*is_available)(void); const InterfaceInfo *interfaces; } VirtioPCIDeviceTypeInfo; -- 2.55.0.windows.3
