PCIE root ports only allow one device on slot 0/function 0. When hotplugging a device on a pcie root port, make sure that the device address passed is always 0x00 that represents slot 0 and function 0. Any other slot value and function value would be illegal on a root port.
CC: [email protected] CC: [email protected] Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2128929 Signed-off-by: Ani Sinha <[email protected]> --- hw/pci/pci.c | 9 +++++++++ 1 file changed, 9 insertions(+) Note: I tested this with both native and acpi hotplug enabled on pcie. The check seems to work on both. (qemu) netdev_add socket,id=hostnet1,listen=:1234 (qemu) device_add e1000e,netdev=hostnet1,mac=00:11:22:33:44:03,id=net1,bus=pci.6,addr=0x2.0x5 Error: PCI: slot 2 function 5 is not valid for e1000e (qemu) device_add e1000e,netdev=hostnet1,mac=00:11:22:33:44:03,id=net1,bus=pci.6,addr=0x0.0 (qemu) info network net1: index=0,type=nic,model=e1000e,macaddr=00:11:22:33:44:03 \ hostnet1: index=0,type=socket, (qemu) device_del net1 (qemu) info network hostnet1: index=0,type=socket, diff --git a/hw/pci/pci.c b/hw/pci/pci.c index bf38905b7d..bc39322dfd 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -64,6 +64,7 @@ bool pci_available = true; static char *pcibus_get_dev_path(DeviceState *dev); static char *pcibus_get_fw_dev_path(DeviceState *dev); static void pcibus_reset(BusState *qbus); +static bool pcie_has_upstream_port(PCIDevice *dev); static Property pci_props[] = { DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1), @@ -1189,6 +1190,14 @@ static PCIDevice *do_pci_register_device(PCIDevice *pci_dev, name); return NULL; + } else if (dev->hotplugged && + !pci_is_vf(pci_dev) && + pcie_has_upstream_port(pci_dev) && devfn) { + /* For an upstream PCIE port, we only support one device at slot 0 */ + error_setg(errp, "PCI: slot %d function %d is not valid for %s", + PCI_SLOT(devfn), PCI_FUNC(devfn), name); + return NULL; + } pci_dev->devfn = devfn; -- 2.39.1
