From: Nikola Prica pci_enable_atomic_ops_to_root() currently fails when no Root Port is visible. That is common in passthrough guests (ESXi, Hyper-V): the endpoint is assigned to the VM, but the guest topology has no Root Port above it. In those setups the hypervisor may already have enabled AtomicOp Requester Enable on the device. If PCI_EXP_DEVCTL2_ATOMIC_REQ is set, treat AtomicOps as already enabled and return success instead of failing the Root Port walk. Fixes: 1ae8c4ce1570 ("PCI: Enable AtomicOps only if Root Port supports them") Reviewed-by: Christian König Reviewed-by: Gerd Bayer Tested-by: Gerd Bayer Signed-off-by: Nikola Prica --- v3: Add Fixes tag v2: Be more strict and only apply logic in headless device case. --- drivers/pci/pci.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index b2879a6be5f8..62729ade496f 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -3769,8 +3769,18 @@ int pci_enable_atomic_ops_to_root(struct pci_dev *dev, u32 cap_mask) } root = pcie_find_root_port(dev); - if (!root) + if (!root) { + /* + * A hypervisor may expose a headless topology with no + * visible root port. If it has already set AtomicOp + * Requester Enable, there is nothing more to do. + */ + pcie_capability_read_dword(dev, PCI_EXP_DEVCTL2, &ctl2); + if (ctl2 & PCI_EXP_DEVCTL2_ATOMIC_REQ) + return 0; + return -EINVAL; + } pcie_capability_read_dword(root, PCI_EXP_DEVCAP2, &cap); if ((cap & cap_mask) != cap_mask) -- 2.34.1