s390x/pci: Check for multifunction after device realization

The SR-IOV PFs set the multifunction bit during device realization so
check them after that. There is no functional change because we
explicitly ignore the multifunction bit for SR-IOV devices.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20250116-reuse-v20-5-7cb370606368@daynix.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Akihiko Odaki 2025-01-16 18:00:56 +09:00 committed by Michael S. Tsirkin
parent d966250e93
commit 2c968f4653

View File

@ -971,21 +971,7 @@ static void s390_pcihost_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
"this device"); "this device");
} }
if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) { if (object_dynamic_cast(OBJECT(dev), TYPE_S390_PCI_DEVICE)) {
PCIDevice *pdev = PCI_DEVICE(dev);
/*
* Multifunction is not supported due to the lack of CLP. However,
* do not check for multifunction capability for SR-IOV devices because
* SR-IOV devices automatically add the multifunction capability whether
* the user intends to use the functions other than the PF.
*/
if (pdev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION &&
!pdev->exp.sriov_cap) {
error_setg(errp, "multifunction not supported in s390");
return;
}
} else if (object_dynamic_cast(OBJECT(dev), TYPE_S390_PCI_DEVICE)) {
S390PCIBusDevice *pbdev = S390_PCI_DEVICE(dev); S390PCIBusDevice *pbdev = S390_PCI_DEVICE(dev);
if (!s390_pci_alloc_idx(s, pbdev)) { if (!s390_pci_alloc_idx(s, pbdev)) {
@ -1076,6 +1062,18 @@ static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
} else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) { } else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
pdev = PCI_DEVICE(dev); pdev = PCI_DEVICE(dev);
/*
* Multifunction is not supported due to the lack of CLP. However,
* do not check for multifunction capability for SR-IOV devices because
* SR-IOV devices automatically add the multifunction capability whether
* the user intends to use the functions other than the PF.
*/
if (pdev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION &&
!pdev->exp.sriov_cap) {
error_setg(errp, "multifunction not supported in s390");
return;
}
if (!dev->id) { if (!dev->id) {
/* In the case the PCI device does not define an id */ /* In the case the PCI device does not define an id */
/* we generate one based on the PCI address */ /* we generate one based on the PCI address */