From: Yi Liu <yi.l....@intel.com>

[ Upstream commit 1062d81086156e42878d701b816d2f368b53a77c ]

Allocating a domain with a fault ID indicates that the domain is faultable.
However, there is a gap for the nested parent domain to support PRI. Some
hardware lacks the capability to distinguish whether PRI occurs at stage 1
or stage 2. This limitation may require software-based page table walking
to resolve. Since no in-tree IOMMU driver currently supports this
functionality, it is disallowed. For more details, refer to the related
discussion at [1].

[1] 
https://lore.kernel.org/linux-iommu/bd1655c6-8b2f-4cfa-adb1-badc00d01...@intel.com/

Link: https://patch.msgid.link/r/20250226104012.82079-1-yi.l....@intel.com
Suggested-by: Lu Baolu <baolu...@linux.intel.com>
Signed-off-by: Yi Liu <yi.l....@intel.com>
Reviewed-by: Kevin Tian <kevin.t...@intel.com>
Reviewed-by: Lu Baolu <baolu...@linux.intel.com>
Signed-off-by: Jason Gunthorpe <j...@nvidia.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/iommu/iommufd/hw_pagetable.c    | 3 +++
 tools/testing/selftests/iommu/iommufd.c | 4 ++++
 2 files changed, 7 insertions(+)

diff --git a/drivers/iommu/iommufd/hw_pagetable.c 
b/drivers/iommu/iommufd/hw_pagetable.c
index d06bf6e6c19fd..2454627a8b61b 100644
--- a/drivers/iommu/iommufd/hw_pagetable.c
+++ b/drivers/iommu/iommufd/hw_pagetable.c
@@ -122,6 +122,9 @@ iommufd_hwpt_paging_alloc(struct iommufd_ctx *ictx, struct 
iommufd_ioas *ioas,
        if ((flags & IOMMU_HWPT_ALLOC_DIRTY_TRACKING) &&
            !device_iommu_capable(idev->dev, IOMMU_CAP_DIRTY_TRACKING))
                return ERR_PTR(-EOPNOTSUPP);
+       if ((flags & IOMMU_HWPT_FAULT_ID_VALID) &&
+           (flags & IOMMU_HWPT_ALLOC_NEST_PARENT))
+               return ERR_PTR(-EOPNOTSUPP);
 
        hwpt_paging = __iommufd_object_alloc(
                ictx, hwpt_paging, IOMMUFD_OBJ_HWPT_PAGING, common.obj);
diff --git a/tools/testing/selftests/iommu/iommufd.c 
b/tools/testing/selftests/iommu/iommufd.c
index 4927b9add5add..06f252733660a 100644
--- a/tools/testing/selftests/iommu/iommufd.c
+++ b/tools/testing/selftests/iommu/iommufd.c
@@ -289,6 +289,10 @@ TEST_F(iommufd_ioas, alloc_hwpt_nested)
                                    &test_hwpt_id);
                test_err_hwpt_alloc(EINVAL, self->device_id, self->device_id, 0,
                                    &test_hwpt_id);
+               test_err_hwpt_alloc(EOPNOTSUPP, self->device_id, self->ioas_id,
+                                   IOMMU_HWPT_ALLOC_NEST_PARENT |
+                                               IOMMU_HWPT_FAULT_ID_VALID,
+                                   &test_hwpt_id);
 
                test_cmd_hwpt_alloc(self->device_id, self->ioas_id,
                                    IOMMU_HWPT_ALLOC_NEST_PARENT,
-- 
2.39.5


Reply via email to