Add support for selecting the IOMMU mode through the environment variable VFIO_SELFTESTS_IOMMU_MODE. This allows tests to be run with different IOMMU backends without modifying test code.
The environment variable is validated against the list of supported modes. On PowerPC, this includes the sPAPR TCE v2 mode which will be added in a subsequent patch. If the environment variable is not set, tests use their default mode, preserving existing behavior. Signed-off-by: Narayana Murty N <[email protected]> --- .../selftests/vfio/lib/include/libvfio.h | 9 +++++ tools/testing/selftests/vfio/lib/libvfio.c | 39 +++++++++++++++++++ .../selftests/vfio/vfio_pci_device_test.c | 4 +- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/vfio/lib/include/libvfio.h b/tools/testing/selftests/vfio/lib/include/libvfio.h index 07862b470777..c0b4a2ab06c5 100644 --- a/tools/testing/selftests/vfio/lib/include/libvfio.h +++ b/tools/testing/selftests/vfio/lib/include/libvfio.h @@ -24,6 +24,15 @@ const char *vfio_selftests_get_bdf(int *argc, char *argv[]); char **vfio_selftests_get_bdfs(int *argc, char *argv[], int *nr_bdfs); +/* + * Return the IOMMU mode string from the environment variable + * $VFIO_SELFTESTS_IOMMU_MODE. + * + * Returns NULL if the environment variable is not set, allowing + * tests to use their default mode. + */ +const char *vfio_selftests_get_iommu_mode(void); + /* * Reserve virtual address space of size at an address satisfying * (vaddr % align) == offset. diff --git a/tools/testing/selftests/vfio/lib/libvfio.c b/tools/testing/selftests/vfio/lib/libvfio.c index 3a3d1ed635c1..617c8dc7288c 100644 --- a/tools/testing/selftests/vfio/lib/libvfio.c +++ b/tools/testing/selftests/vfio/lib/libvfio.c @@ -101,3 +101,42 @@ void *mmap_reserve(size_t size, size_t align, size_t offset) return map_align; } + +static const char *get_iommu_mode_env(void) +{ + const char *mode; + static const char * const valid_modes[] = { + MODE_VFIO_TYPE1_IOMMU, + MODE_VFIO_TYPE1V2_IOMMU, + MODE_IOMMUFD_COMPAT_TYPE1, + MODE_IOMMUFD_COMPAT_TYPE1V2, + MODE_IOMMUFD, +#ifdef __powerpc__ + MODE_VFIO_SPAPR_TCE_V2_IOMMU, +#endif + }; + int i; + + mode = getenv("VFIO_SELFTESTS_IOMMU_MODE"); + if (!mode) + return NULL; + + for (i = 0; i < ARRAY_SIZE(valid_modes); i++) { + if (!strcmp(mode, valid_modes[i])) + return mode; + } + + fprintf(stderr, "Invalid VFIO_SELFTESTS_IOMMU_MODE: %s\n", mode); + fprintf(stderr, "Valid modes are:\n"); + for (i = 0; i < ARRAY_SIZE(valid_modes); i++) + fprintf(stderr, " %s\n", valid_modes[i]); + exit(KSFT_SKIP); +} + +const char *vfio_selftests_get_iommu_mode(void) +{ + return get_iommu_mode_env(); +} + + return map_align; +} diff --git a/tools/testing/selftests/vfio/vfio_pci_device_test.c b/tools/testing/selftests/vfio/vfio_pci_device_test.c index 93c11fd5e081..45b8bf60527a 100644 --- a/tools/testing/selftests/vfio/vfio_pci_device_test.c +++ b/tools/testing/selftests/vfio/vfio_pci_device_test.c @@ -29,7 +29,7 @@ FIXTURE(vfio_pci_device_test) { FIXTURE_SETUP(vfio_pci_device_test) { - self->iommu = iommu_init(default_iommu_mode); + self->iommu = iommu_init(vfio_selftests_get_iommu_mode()); self->device = vfio_pci_device_init(device_bdf, self->iommu); } @@ -121,7 +121,7 @@ FIXTURE_VARIANT_ADD(vfio_pci_irq_test, msix) { FIXTURE_SETUP(vfio_pci_irq_test) { - self->iommu = iommu_init(default_iommu_mode); + self->iommu = iommu_init(vfio_selftests_get_iommu_mode()); self->device = vfio_pci_device_init(device_bdf, self->iommu); } -- 2.51.1

