]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommufd/selftest: Add coverage for reporting max_pasid_log2 via IOMMU_HW_INFO
authorYi Liu <yi.l.liu@intel.com>
Fri, 21 Mar 2025 18:01:43 +0000 (11:01 -0700)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 28 Mar 2025 13:07:23 +0000 (10:07 -0300)
IOMMU_HW_INFO is extended to report max_pasid_log2, hence add coverage
for it.

Link: https://patch.msgid.link/r/20250321180143.8468-6-yi.l.liu@intel.com
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
tools/testing/selftests/iommu/iommufd.c
tools/testing/selftests/iommu/iommufd_fail_nth.c
tools/testing/selftests/iommu/iommufd_utils.h

index c39222b9869ba897c035ef22f3764c4f2e4f909a..7eb7ee149f2bc4b4500a4a79094fe5c6a1f46dae 100644 (file)
@@ -342,12 +342,14 @@ FIXTURE(iommufd_ioas)
        uint32_t hwpt_id;
        uint32_t device_id;
        uint64_t base_iova;
+       uint32_t device_pasid_id;
 };
 
 FIXTURE_VARIANT(iommufd_ioas)
 {
        unsigned int mock_domains;
        unsigned int memory_limit;
+       bool pasid_capable;
 };
 
 FIXTURE_SETUP(iommufd_ioas)
@@ -372,6 +374,12 @@ FIXTURE_SETUP(iommufd_ioas)
                                             IOMMU_TEST_DEV_CACHE_DEFAULT);
                self->base_iova = MOCK_APERTURE_START;
        }
+
+       if (variant->pasid_capable)
+               test_cmd_mock_domain_flags(self->ioas_id,
+                                          MOCK_FLAGS_DEVICE_PASID,
+                                          NULL, NULL,
+                                          &self->device_pasid_id);
 }
 
 FIXTURE_TEARDOWN(iommufd_ioas)
@@ -387,6 +395,7 @@ FIXTURE_VARIANT_ADD(iommufd_ioas, no_domain)
 FIXTURE_VARIANT_ADD(iommufd_ioas, mock_domain)
 {
        .mock_domains = 1,
+       .pasid_capable = true,
 };
 
 FIXTURE_VARIANT_ADD(iommufd_ioas, two_mock_domain)
@@ -752,6 +761,8 @@ TEST_F(iommufd_ioas, get_hw_info)
        } buffer_smaller;
 
        if (self->device_id) {
+               uint8_t max_pasid = 0;
+
                /* Provide a zero-size user_buffer */
                test_cmd_get_hw_info(self->device_id, NULL, 0);
                /* Provide a user_buffer with exact size */
@@ -766,6 +777,13 @@ TEST_F(iommufd_ioas, get_hw_info)
                 * the fields within the size range still gets updated.
                 */
                test_cmd_get_hw_info(self->device_id, &buffer_smaller, sizeof(buffer_smaller));
+               test_cmd_get_hw_info_pasid(self->device_id, &max_pasid);
+               ASSERT_EQ(0, max_pasid);
+               if (variant->pasid_capable) {
+                       test_cmd_get_hw_info_pasid(self->device_pasid_id,
+                                                  &max_pasid);
+                       ASSERT_EQ(MOCK_PASID_WIDTH, max_pasid);
+               }
        } else {
                test_err_get_hw_info(ENOENT, self->device_id,
                                     &buffer_exact, sizeof(buffer_exact));
index 8fd6f4500090392cd3f2b9f58b01659cadf83b1e..e11ec4b121fc37ea13f1032bd926911d09eeb953 100644 (file)
@@ -666,7 +666,8 @@ TEST_FAIL_NTH(basic_fail_nth, device)
                                        &self->stdev_id, NULL, &idev_id))
                return -1;
 
-       if (_test_cmd_get_hw_info(self->fd, idev_id, &info, sizeof(info), NULL))
+       if (_test_cmd_get_hw_info(self->fd, idev_id, &info,
+                                 sizeof(info), NULL, NULL))
                return -1;
 
        if (_test_cmd_hwpt_alloc(self->fd, idev_id, ioas_id, 0,
index 27794b6f58fc57c65590ee25f37b6950af06f41b..72f6636e5d909911e6f06ec397f37c8e7e440c5a 100644 (file)
@@ -758,7 +758,8 @@ static void teardown_iommufd(int fd, struct __test_metadata *_metadata)
 
 /* @data can be NULL */
 static int _test_cmd_get_hw_info(int fd, __u32 device_id, void *data,
-                                size_t data_len, uint32_t *capabilities)
+                                size_t data_len, uint32_t *capabilities,
+                                uint8_t *max_pasid)
 {
        struct iommu_test_hw_info *info = (struct iommu_test_hw_info *)data;
        struct iommu_hw_info cmd = {
@@ -803,6 +804,9 @@ static int _test_cmd_get_hw_info(int fd, __u32 device_id, void *data,
                        assert(!info->flags);
        }
 
+       if (max_pasid)
+               *max_pasid = cmd.out_max_pasid_log2;
+
        if (capabilities)
                *capabilities = cmd.out_capabilities;
 
@@ -811,14 +815,19 @@ static int _test_cmd_get_hw_info(int fd, __u32 device_id, void *data,
 
 #define test_cmd_get_hw_info(device_id, data, data_len)               \
        ASSERT_EQ(0, _test_cmd_get_hw_info(self->fd, device_id, data, \
-                                          data_len, NULL))
+                                          data_len, NULL, NULL))
 
 #define test_err_get_hw_info(_errno, device_id, data, data_len)               \
        EXPECT_ERRNO(_errno, _test_cmd_get_hw_info(self->fd, device_id, data, \
-                                                  data_len, NULL))
+                                                  data_len, NULL, NULL))
 
 #define test_cmd_get_hw_capabilities(device_id, caps, mask) \
-       ASSERT_EQ(0, _test_cmd_get_hw_info(self->fd, device_id, NULL, 0, &caps))
+       ASSERT_EQ(0, _test_cmd_get_hw_info(self->fd, device_id, NULL, \
+                                          0, &caps, NULL))
+
+#define test_cmd_get_hw_info_pasid(device_id, max_pasid)              \
+       ASSERT_EQ(0, _test_cmd_get_hw_info(self->fd, device_id, NULL, \
+                                          0, NULL, max_pasid))
 
 static int _test_ioctl_fault_alloc(int fd, __u32 *fault_id, __u32 *fault_fd)
 {