virtio-blk-pci and virtio-net-pci added the s390x loadparm property from class_init when target_s390x() was true. Register each VirtioPCIDeviceTypeInfo twice. The s390x variant calls pci_qdev_property_add_specifics(), which now always adds loadparm, and the other variant does not. target_s390x() and target_not_s390x() select the two.
Signed-off-by: Yonggang Luo <[email protected]> --- hw/pci/pci.c | 13 +++++-------- hw/virtio/virtio-blk-pci.c | 22 +++++++++++++++++++++- hw/virtio/virtio-net-pci.c | 22 +++++++++++++++++++++- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 0efb4eb4bb0..e1bd3bb0e29 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -2895,14 +2895,11 @@ void pci_qdev_property_add_specifics(DeviceClass *dc) { ObjectClass *oc = OBJECT_CLASS(dc); - /* The loadparm property is only supported on s390x */ - if (target_s390x()) { - object_class_property_add_str(oc, "loadparm", - pci_qdev_property_get_loadparm, - pci_qdev_property_set_loadparm); - object_class_property_set_description(oc, "loadparm", - "load parameter (s390x only)"); - } + object_class_property_add_str(oc, "loadparm", + pci_qdev_property_get_loadparm, + pci_qdev_property_set_loadparm); + object_class_property_set_description(oc, "loadparm", + "load parameter (s390x only)"); } MemoryRegion *pci_address_space(PCIDevice *dev) diff --git a/hw/virtio/virtio-blk-pci.c b/hw/virtio/virtio-blk-pci.c index 3eecc23a657..f4f86f7b428 100644 --- a/hw/virtio/virtio-blk-pci.c +++ b/hw/virtio/virtio-blk-pci.c @@ -22,6 +22,7 @@ #include "hw/virtio/virtio-pci.h" #include "qapi/error.h" #include "qemu/module.h" +#include "qemu/target-info.h" #include "qom/object.h" typedef struct VirtIOBlkPCI VirtIOBlkPCI; @@ -71,7 +72,6 @@ static void virtio_blk_pci_class_init(ObjectClass *klass, const void *data) set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); device_class_set_props(dc, virtio_blk_pci_properties); - pci_qdev_property_add_specifics(dc); k->realize = virtio_blk_pci_realize; pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET; pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_BLOCK; @@ -89,6 +89,13 @@ static void virtio_blk_pci_instance_init(Object *obj) "bootindex"); } +static void virtio_blk_pci_s390x_class_init(ObjectClass *klass, + const void *data) +{ + virtio_blk_pci_class_init(klass, data); + pci_qdev_property_add_specifics(DEVICE_CLASS(klass)); +} + static const VirtioPCIDeviceTypeInfo virtio_blk_pci_info = { .base_name = TYPE_VIRTIO_BLK_PCI, .generic_name = "virtio-blk-pci", @@ -97,11 +104,24 @@ static const VirtioPCIDeviceTypeInfo virtio_blk_pci_info = { .instance_size = sizeof(VirtIOBlkPCI), .instance_init = virtio_blk_pci_instance_init, .class_init = virtio_blk_pci_class_init, + .is_available = target_not_s390x, +}; + +static const VirtioPCIDeviceTypeInfo virtio_blk_pci_s390x_info = { + .base_name = TYPE_VIRTIO_BLK_PCI, + .generic_name = "virtio-blk-pci", + .transitional_name = "virtio-blk-pci-transitional", + .non_transitional_name = "virtio-blk-pci-non-transitional", + .instance_size = sizeof(VirtIOBlkPCI), + .instance_init = virtio_blk_pci_instance_init, + .class_init = virtio_blk_pci_s390x_class_init, + .is_available = target_s390x, }; static void virtio_blk_pci_register(void) { virtio_pci_types_register(&virtio_blk_pci_info); + virtio_pci_types_register(&virtio_blk_pci_s390x_info); } type_init(virtio_blk_pci_register) diff --git a/hw/virtio/virtio-net-pci.c b/hw/virtio/virtio-net-pci.c index 893d1905a97..d7aaf255507 100644 --- a/hw/virtio/virtio-net-pci.c +++ b/hw/virtio/virtio-net-pci.c @@ -22,6 +22,7 @@ #include "hw/virtio/virtio-pci.h" #include "qapi/error.h" #include "qemu/module.h" +#include "qemu/target-info.h" #include "qom/object.h" typedef struct VirtIONetPCI VirtIONetPCI; @@ -77,7 +78,6 @@ static void virtio_net_pci_class_init(ObjectClass *klass, const void *data) k->sriov_vf_user_creatable = true; set_bit(DEVICE_CATEGORY_NETWORK, dc->categories); device_class_set_props(dc, virtio_net_properties); - pci_qdev_property_add_specifics(dc); vpciklass->realize = virtio_net_pci_realize; } @@ -91,6 +91,13 @@ static void virtio_net_pci_instance_init(Object *obj) "bootindex"); } +static void virtio_net_pci_s390x_class_init(ObjectClass *klass, + const void *data) +{ + virtio_net_pci_class_init(klass, data); + pci_qdev_property_add_specifics(DEVICE_CLASS(klass)); +} + static const VirtioPCIDeviceTypeInfo virtio_net_pci_info = { .base_name = TYPE_VIRTIO_NET_PCI, .generic_name = "virtio-net-pci", @@ -99,11 +106,24 @@ static const VirtioPCIDeviceTypeInfo virtio_net_pci_info = { .instance_size = sizeof(VirtIONetPCI), .instance_init = virtio_net_pci_instance_init, .class_init = virtio_net_pci_class_init, + .is_available = target_not_s390x, +}; + +static const VirtioPCIDeviceTypeInfo virtio_net_pci_s390x_info = { + .base_name = TYPE_VIRTIO_NET_PCI, + .generic_name = "virtio-net-pci", + .transitional_name = "virtio-net-pci-transitional", + .non_transitional_name = "virtio-net-pci-non-transitional", + .instance_size = sizeof(VirtIONetPCI), + .instance_init = virtio_net_pci_instance_init, + .class_init = virtio_net_pci_s390x_class_init, + .is_available = target_s390x, }; static void virtio_net_pci_register(void) { virtio_pci_types_register(&virtio_net_pci_info); + virtio_pci_types_register(&virtio_net_pci_s390x_info); } type_init(virtio_net_pci_register) -- 2.55.0.windows.3
