Now that we probe, and handle the DBM bit modifier, unblock the kAPI usage by exposing the IOMMU_DOMAIN_F_ENFORCE_DIRTY and implement it's requirement of revoking device attachment in the iommu_capable. Finally expose the IOMMU_CAP_DIRTY to users (IOMMUFD_DEVICE_GET_CAPS). Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx> --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index bf0aac333725..71dd95a687fd 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2014,6 +2014,8 @@ static bool arm_smmu_capable(struct device *dev, enum iommu_cap cap) return master->smmu->features & ARM_SMMU_FEAT_COHERENCY; case IOMMU_CAP_NOEXEC: return true; + case IOMMU_CAP_DIRTY: + return arm_smmu_dbm_capable(master->smmu); default: return false; } @@ -2430,6 +2432,11 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) master = dev_iommu_priv_get(dev); smmu = master->smmu; + if (domain->flags & IOMMU_DOMAIN_F_ENFORCE_DIRTY && + !arm_smmu_dbm_capable(smmu)) + return -EINVAL; + + /* * Checking that SVA is disabled ensures that this device isn't bound to * any mm, and can be safely detached from its old domain. Bonds cannot @@ -2913,6 +2920,7 @@ static void arm_smmu_remove_dev_pasid(struct device *dev, ioasid_t pasid) } static struct iommu_ops arm_smmu_ops = { + .supported_flags = IOMMU_DOMAIN_F_ENFORCE_DIRTY, .capable = arm_smmu_capable, .domain_alloc = arm_smmu_domain_alloc, .probe_device = arm_smmu_probe_device, -- 2.17.2