Commit 082f1bca authored by Jason Gunthorpe's avatar Jason Gunthorpe Committed by Joerg Roedel
Browse files

iommu/amd: Fully decode all combinations of alloc_paging_flags



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: ce2cd175 ("iommu/amd: Enhance amd_iommu_domain_alloc_user()")
Reviewed-by: default avatarVasant Hegde <vasant.hegde@amd.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/7-v2-9776c53c2966+1c7-amd_paging_flags_jgg@nvidia.com


Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 5a081f7f
Loading
Loading
Loading
Loading
+15 −15
Original line number Diff line number Diff line
@@ -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);

	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 (flags & IOMMU_HWPT_ALLOC_PASID) {
		if (!amd_iommu_pasid_supported())
			return ERR_PTR(-EOPNOTSUPP);

			break;
		return do_iommu_domain_alloc(dev, flags, PD_MODE_V2);
	}

	/* 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);
	}

	case 0:
		/* If nothing specific is required use the kernel commandline default */
		return do_iommu_domain_alloc(dev, 0, amd_iommu_pgtable);
	default:
		break;
	}
	return ERR_PTR(-EOPNOTSUPP);
}

void amd_iommu_domain_free(struct iommu_domain *dom)