Commit ae36fe70 authored by Joao Martins's avatar Joao Martins Committed by Jason Gunthorpe

iommufd/selftest: Test out_capabilities in IOMMU_GET_HW_INFO

Enumerate the capabilities from the mock device and test whether it
advertises as expected. Include it as part of the iommufd_dirty_tracking
fixture.

Link: https://lore.kernel.org/r/20231024135109.73787-18-joao.m.martins@oracle.comSigned-off-by: default avatarJoao Martins <joao.m.martins@oracle.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent a9af47e3
...@@ -376,7 +376,18 @@ static phys_addr_t mock_domain_iova_to_phys(struct iommu_domain *domain, ...@@ -376,7 +376,18 @@ static phys_addr_t mock_domain_iova_to_phys(struct iommu_domain *domain,
static bool mock_domain_capable(struct device *dev, enum iommu_cap cap) static bool mock_domain_capable(struct device *dev, enum iommu_cap cap)
{ {
return cap == IOMMU_CAP_CACHE_COHERENCY; struct mock_dev *mdev = container_of(dev, struct mock_dev, dev);
switch (cap) {
case IOMMU_CAP_CACHE_COHERENCY:
return true;
case IOMMU_CAP_DIRTY_TRACKING:
return !(mdev->flags & MOCK_FLAGS_DEVICE_NO_DIRTY);
default:
break;
}
return false;
} }
static void mock_domain_set_plaform_dma_ops(struct device *dev) static void mock_domain_set_plaform_dma_ops(struct device *dev)
......
...@@ -1563,6 +1563,23 @@ TEST_F(iommufd_dirty_tracking, set_dirty_tracking) ...@@ -1563,6 +1563,23 @@ TEST_F(iommufd_dirty_tracking, set_dirty_tracking)
test_ioctl_destroy(hwpt_id); test_ioctl_destroy(hwpt_id);
} }
TEST_F(iommufd_dirty_tracking, device_dirty_capability)
{
uint32_t caps = 0;
uint32_t stddev_id;
uint32_t hwpt_id;
test_cmd_hwpt_alloc(self->idev_id, self->ioas_id, 0, &hwpt_id);
test_cmd_mock_domain(hwpt_id, &stddev_id, NULL, NULL);
test_cmd_get_hw_capabilities(self->idev_id, caps,
IOMMU_HW_CAP_DIRTY_TRACKING);
ASSERT_EQ(IOMMU_HW_CAP_DIRTY_TRACKING,
caps & IOMMU_HW_CAP_DIRTY_TRACKING);
test_ioctl_destroy(stddev_id);
test_ioctl_destroy(hwpt_id);
}
TEST_F(iommufd_dirty_tracking, get_dirty_bitmap) TEST_F(iommufd_dirty_tracking, get_dirty_bitmap)
{ {
uint32_t stddev_id; uint32_t stddev_id;
......
...@@ -612,7 +612,7 @@ TEST_FAIL_NTH(basic_fail_nth, device) ...@@ -612,7 +612,7 @@ TEST_FAIL_NTH(basic_fail_nth, device)
&idev_id)) &idev_id))
return -1; return -1;
if (_test_cmd_get_hw_info(self->fd, idev_id, &info, sizeof(info))) if (_test_cmd_get_hw_info(self->fd, idev_id, &info, sizeof(info), NULL))
return -1; return -1;
if (_test_cmd_hwpt_alloc(self->fd, idev_id, ioas_id, 0, &hwpt_id)) if (_test_cmd_hwpt_alloc(self->fd, idev_id, ioas_id, 0, &hwpt_id))
......
...@@ -535,8 +535,8 @@ static void teardown_iommufd(int fd, struct __test_metadata *_metadata) ...@@ -535,8 +535,8 @@ static void teardown_iommufd(int fd, struct __test_metadata *_metadata)
#endif #endif
/* @data can be NULL */ /* @data can be NULL */
static int _test_cmd_get_hw_info(int fd, __u32 device_id, static int _test_cmd_get_hw_info(int fd, __u32 device_id, void *data,
void *data, size_t data_len) size_t data_len, uint32_t *capabilities)
{ {
struct iommu_test_hw_info *info = (struct iommu_test_hw_info *)data; struct iommu_test_hw_info *info = (struct iommu_test_hw_info *)data;
struct iommu_hw_info cmd = { struct iommu_hw_info cmd = {
...@@ -544,6 +544,7 @@ static int _test_cmd_get_hw_info(int fd, __u32 device_id, ...@@ -544,6 +544,7 @@ static int _test_cmd_get_hw_info(int fd, __u32 device_id,
.dev_id = device_id, .dev_id = device_id,
.data_len = data_len, .data_len = data_len,
.data_uptr = (uint64_t)data, .data_uptr = (uint64_t)data,
.out_capabilities = 0,
}; };
int ret; int ret;
...@@ -580,14 +581,19 @@ static int _test_cmd_get_hw_info(int fd, __u32 device_id, ...@@ -580,14 +581,19 @@ static int _test_cmd_get_hw_info(int fd, __u32 device_id,
assert(!info->flags); assert(!info->flags);
} }
if (capabilities)
*capabilities = cmd.out_capabilities;
return 0; return 0;
} }
#define test_cmd_get_hw_info(device_id, data, data_len) \ #define test_cmd_get_hw_info(device_id, data, data_len) \
ASSERT_EQ(0, _test_cmd_get_hw_info(self->fd, device_id, \ ASSERT_EQ(0, _test_cmd_get_hw_info(self->fd, device_id, data, \
data, data_len)) data_len, 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))
#define test_err_get_hw_info(_errno, device_id, data, data_len) \ #define test_cmd_get_hw_capabilities(device_id, caps, mask) \
EXPECT_ERRNO(_errno, \ ASSERT_EQ(0, _test_cmd_get_hw_info(self->fd, device_id, NULL, 0, &caps))
_test_cmd_get_hw_info(self->fd, device_id, \
data, data_len))
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment