The function number must be lower than the next function number advertised with ARI.
Signed-off-by: Akihiko Odaki <[email protected]> --- hw/pci/pci.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hw/pci/pci.c b/hw/pci/pci.c index e2eb4c3b4a..568665ee42 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -2059,6 +2059,8 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp) Error *local_err = NULL; bool is_default_rom; uint16_t class_id; + uint16_t ari; + uint16_t nextfn; /* * capped by systemd (see: udev-builtin-net_id.c) @@ -2121,6 +2123,19 @@ static void pci_qdev_realize(DeviceState *qdev, Error **errp) } } + if (pci_is_express(pci_dev)) { + ari = pcie_find_capability(pci_dev, PCI_EXT_CAP_ID_ARI); + if (ari) { + nextfn = (pci_get_long(pci_dev->config + ari + PCI_ARI_CAP) >> 8) & 0xff; + if (nextfn && (pci_dev->devfn & 0xff) >= nextfn) { + error_setg(errp, "PCI: function number %u is not lower than ARI next function number %u", + pci_dev->devfn & 0xff, nextfn); + pci_qdev_unrealize(DEVICE(pci_dev)); + return; + } + } + } + if (pci_dev->failover_pair_id) { if (!pci_bus_is_express(pci_get_bus(pci_dev))) { error_setg(errp, "failover primary device must be on " -- 2.41.0
