IOMMU_HWPT_FAULT_ID_VALID is used to mark if the fault_id field of
iommu_hwp_alloc is valid or not. As the fault_id field is handled in
the iommufd core, so it makes sense to sanitize the
IOMMU_HWPT_FAULT_ID_VALID flag in the iommufd core, and mask it out
before passing the user flags to the iommu drivers.
Link: https://patch.msgid.link/r/20241207120108.5640-1-yi.l.liu@intel.com
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
 
                              const struct iommu_user_data *user_data)
 {
        struct arm_vsmmu *vsmmu = container_of(viommu, struct arm_vsmmu, core);
-       const u32 SUPPORTED_FLAGS = IOMMU_HWPT_FAULT_ID_VALID;
        struct arm_smmu_nested_domain *nested_domain;
        struct iommu_hwpt_arm_smmuv3 arg;
        bool enable_ats = false;
        int ret;
 
-       /*
-        * Faults delivered to the nested domain are faults that originated by
-        * the S1 in the domain. The core code will match all PASIDs when
-        * delivering the fault due to user_pasid_table
-        */
-       if (flags & ~SUPPORTED_FLAGS)
+       if (flags)
                return ERR_PTR(-EOPNOTSUPP);
 
        ret = iommu_copy_struct_from_user(&arg, user_data,
 
        bool first_stage;
 
        if (flags &
-           (~(IOMMU_HWPT_ALLOC_NEST_PARENT | IOMMU_HWPT_ALLOC_DIRTY_TRACKING
-              | IOMMU_HWPT_FAULT_ID_VALID)))
+           (~(IOMMU_HWPT_ALLOC_NEST_PARENT | IOMMU_HWPT_ALLOC_DIRTY_TRACKING)))
                return ERR_PTR(-EOPNOTSUPP);
        if (nested_parent && !nested_supported(iommu))
                return ERR_PTR(-EOPNOTSUPP);
 
        hwpt_paging->nest_parent = flags & IOMMU_HWPT_ALLOC_NEST_PARENT;
 
        if (ops->domain_alloc_paging_flags) {
-               hwpt->domain = ops->domain_alloc_paging_flags(idev->dev, flags,
-                                                             user_data);
+               hwpt->domain = ops->domain_alloc_paging_flags(idev->dev,
+                               flags & ~IOMMU_HWPT_FAULT_ID_VALID, user_data);
                if (IS_ERR(hwpt->domain)) {
                        rc = PTR_ERR(hwpt->domain);
                        hwpt->domain = NULL;
        struct iommufd_hw_pagetable *hwpt;
        int rc;
 
+       if (flags & ~IOMMU_HWPT_FAULT_ID_VALID)
+               return ERR_PTR(-EOPNOTSUPP);
        if (!user_data->len)
                return ERR_PTR(-EOPNOTSUPP);
        if (!viommu->ops || !viommu->ops->alloc_domain_nested)
        hwpt_nested->parent = viommu->hwpt;
 
        hwpt->domain =
-               viommu->ops->alloc_domain_nested(viommu, flags, user_data);
+               viommu->ops->alloc_domain_nested(viommu,
+                               flags & ~IOMMU_HWPT_FAULT_ID_VALID,
+                               user_data);
        if (IS_ERR(hwpt->domain)) {
                rc = PTR_ERR(hwpt->domain);
                hwpt->domain = NULL;
 
        struct mock_viommu *mock_viommu = to_mock_viommu(viommu);
        struct mock_iommu_domain_nested *mock_nested;
 
-       if (flags & ~IOMMU_HWPT_FAULT_ID_VALID)
+       if (flags)
                return ERR_PTR(-EOPNOTSUPP);
 
        mock_nested = __mock_domain_alloc_nested(user_data);