Commit 6d9500bb authored by Yi Liu's avatar Yi Liu Committed by Jason Gunthorpe
Browse files

iommufd/selftest: Add coverage for reporting max_pasid_log2 via IOMMU_HW_INFO

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: default avatarNicolin Chen <nicolinc@nvidia.com>
Tested-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Signed-off-by: default avatarYi Liu <yi.l.liu@intel.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 803f9729
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -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));
+2 −1
Original line number Diff line number Diff line
@@ -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,
+13 −4
Original line number Diff line number Diff line
@@ -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)
{