]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommu/amd: Enable PASID and ATS capabilities in the correct order
authorEaswar Hariharan <eahariha@linux.microsoft.com>
Thu, 3 Jul 2025 15:54:33 +0000 (08:54 -0700)
committerJoerg Roedel <joerg.roedel@amd.com>
Fri, 11 Jul 2025 07:13:58 +0000 (09:13 +0200)
Per the PCIe spec, behavior of the PASID capability is undefined if the
value of the PASID Enable bit changes while the Enable bit of the
function's ATS control register is Set. Unfortunately,
pdev_enable_caps() does exactly that by ordering enabling ATS for the
device before enabling PASID.

Cc: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Cc: Vasant Hegde <vasant.hegde@amd.com>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Jerry Snitselaar <jsnitsel@redhat.com>
Fixes: eda8c2860ab679 ("iommu/amd: Enable device ATS/PASID/PRI capabilities independently")
Signed-off-by: Easwar Hariharan <eahariha@linux.microsoft.com>
Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/20250703155433.6221-1-eahariha@linux.microsoft.com
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
drivers/iommu/amd/iommu.c

index 9c67f0be2b3538d2eaf94168feca0045070cfa86..d2d1deabf7e2a19b79d4329e7aa9587cd68504ef 100644 (file)
@@ -634,8 +634,8 @@ static inline void pdev_disable_cap_pasid(struct pci_dev *pdev)
 
 static void pdev_enable_caps(struct pci_dev *pdev)
 {
-       pdev_enable_cap_ats(pdev);
        pdev_enable_cap_pasid(pdev);
+       pdev_enable_cap_ats(pdev);
        pdev_enable_cap_pri(pdev);
 }