]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommu/amd: Fully decode all combinations of alloc_paging_flags
authorJason Gunthorpe <jgg@nvidia.com>
Fri, 10 Jan 2025 16:35:05 +0000 (12:35 -0400)
committerJoerg Roedel <jroedel@suse.de>
Fri, 17 Jan 2025 07:59:32 +0000 (08:59 +0100)
Currently AMD does not support
 IOMMU_HWPT_ALLOC_PASID | IOMMU_HWPT_ALLOC_DIRTY_TRACKING

It should be rejected. Instead it creates a V1 domain without dirty
tracking support.

Use a switch to fully decode the flags.

Fixes: ce2cd175469f ("iommu/amd: Enhance amd_iommu_domain_alloc_user()")
Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/7-v2-9776c53c2966+1c7-amd_paging_flags_jgg@nvidia.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/iommu.c

index 0600f0682b91573a6a6288843286aaef963eee15..12c1245baaf9305c87ff412eef102716689953aa 100644 (file)
@@ -2554,24 +2554,24 @@ amd_iommu_domain_alloc_paging_flags(struct device *dev, u32 flags,
        if ((flags & ~supported_flags) || user_data)
                return ERR_PTR(-EOPNOTSUPP);
 
-       /* Allocate domain with v2 page table if IOMMU supports PASID. */
-       if (flags & IOMMU_HWPT_ALLOC_PASID) {
+       switch (flags & supported_flags) {
+       case IOMMU_HWPT_ALLOC_DIRTY_TRACKING:
+               /* Allocate domain with v1 page table for dirty tracking */
+               if (!amd_iommu_hd_support(iommu))
+                       break;
+               return do_iommu_domain_alloc(dev, flags, PD_MODE_V1);
+       case IOMMU_HWPT_ALLOC_PASID:
+               /* Allocate domain with v2 page table if IOMMU supports PASID. */
                if (!amd_iommu_pasid_supported())
-                       return ERR_PTR(-EOPNOTSUPP);
-
+                       break;
                return do_iommu_domain_alloc(dev, flags, PD_MODE_V2);
+       case 0:
+               /* If nothing specific is required use the kernel commandline default */
+               return do_iommu_domain_alloc(dev, 0, amd_iommu_pgtable);
+       default:
+               break;
        }
-
-       /* Allocate domain with v1 page table for dirty tracking */
-       if (flags & IOMMU_HWPT_ALLOC_DIRTY_TRACKING) {
-               if (amd_iommu_hd_support(iommu))
-                       return do_iommu_domain_alloc(dev, flags, PD_MODE_V1);
-
-               return ERR_PTR(-EOPNOTSUPP);
-       }
-
-       /* If nothing specific is required use the kernel commandline default */
-       return do_iommu_domain_alloc(dev, 0, amd_iommu_pgtable);
+       return ERR_PTR(-EOPNOTSUPP);
 }
 
 void amd_iommu_domain_free(struct iommu_domain *dom)