On Thu, Jan 16, 2025 at 07:21:06PM +0530, Manivannan Sadhasivam wrote:
> Migrate the PCI endpoint test to Kselftest framework. All the tests that
> were part of the previous pcitest.sh file were migrated.
> 
> Below is the exclusive list of tests:
> 
> 1. BAR0 Test
> 2. BAR1 Test
> 3. BAR2 Test
> 4. BAR3 Test
> 5. BAR4 Test
> 6. BAR5 Test
> 7. Consecutive BAR Tests
> 8. Legacy IRQ Tests
> 9. MSI Interrupt Tests (MSI1 to MSI32)
> 10. MSI-X Interrupt Tests (MSI-X1 to MSI-X2048)
> 11. Read Tests - MEMCPY (For 1, 1024, 1025, 1024000, 1024001 Bytes)
> 12. Write Tests - MEMCPY (For 1, 1024, 1025, 1024000, 1024001 Bytes)
> 13. Copy Tests - MEMCPY (For 1, 1024, 1025, 1024000, 1024001 Bytes)
> 14. Read Tests - DMA (For 1, 1024, 1025, 1024000, 1024001 Bytes)
> 15. Write Tests - DMA (For 1, 1024, 1025, 1024000, 1024001 Bytes)
> 16. Copy Tests - DMA (For 1, 1024, 1025, 1024000, 1024001 Bytes)
> 
> BAR, DMA and MEMCPY tests are added as fixture variants and can be executed
> separately as below:
> 
> $ pci_endpoint_test -v BAR0
> $ pci_endpoint_test -v dma
> $ pci_endpoint_test -v memcpy
> 
> Co-developed-by: Aman Gupta <aman1.gu...@samsung.com>
> Signed-off-by: Aman Gupta <aman1.gu...@samsung.com>
> Co-developed-by: Padmanabhan Rajanbabu <p.rajanb...@samsung.com>
> Signed-off-by: Padmanabhan Rajanbabu <p.rajanb...@samsung.com>
> [mani: reworked based on the IOCTL fix, cleanups, documentation, commit 
> message]
> Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasi...@linaro.org>
> ---
>  Documentation/PCI/endpoint/pci-test-howto.rst | 169 +++++------
>  tools/testing/selftests/Makefile              |   1 +
>  .../testing/selftests/pci_endpoint/.gitignore |   3 +-
>  tools/testing/selftests/pci_endpoint/Build    |   1 -
>  tools/testing/selftests/pci_endpoint/Makefile |  59 +---
>  tools/testing/selftests/pci_endpoint/config   |   4 +
>  .../pci_endpoint/pci_endpoint_test.c          | 221 +++++++++++++++
>  .../testing/selftests/pci_endpoint/pcitest.c  | 265 ------------------
>  .../testing/selftests/pci_endpoint/pcitest.sh |  73 -----
>  9 files changed, 300 insertions(+), 496 deletions(-)
>  delete mode 100644 tools/testing/selftests/pci_endpoint/Build
>  create mode 100644 tools/testing/selftests/pci_endpoint/config
>  create mode 100644 tools/testing/selftests/pci_endpoint/pci_endpoint_test.c
>  delete mode 100644 tools/testing/selftests/pci_endpoint/pcitest.c
>  delete mode 100644 tools/testing/selftests/pci_endpoint/pcitest.sh
> 
> diff --git a/Documentation/PCI/endpoint/pci-test-howto.rst 
> b/Documentation/PCI/endpoint/pci-test-howto.rst
> index c4ae7af50ede..7d0dbad61456 100644
> --- a/Documentation/PCI/endpoint/pci-test-howto.rst
> +++ b/Documentation/PCI/endpoint/pci-test-howto.rst
> @@ -123,9 +123,9 @@ above::
>  Using Endpoint Test function Device
>  -----------------------------------
>  
> -pcitest.sh added in tools/testing/selftests/pci_endpoint can be used to run 
> all
> -the default PCI endpoint tests. To compile this tool the following commands
> -should be used::
> +Kselftest added in tools/testing/selftests/pci_endpoint can be used to run 
> all
> +the default PCI endpoint tests. To build the Kselftest for PCI endpoint
> +subsystem, the following commands should be used::
>  
>       # cd <kernel-dir>
>       # make -C tools/testing/selftests/pci_endpoint
> @@ -133,104 +133,73 @@ should be used::
>  or if you desire to compile and install in your system::
>  
>       # cd <kernel-dir>
> -     # make -C tools/testing/selftests/pci_endpoint install
> +     # make -C tools/testing/selftests/pci_endpoint INSTALL_PATH=/usr/bin 
> install
>  
> -The tool and script will be located in <rootfs>/usr/bin/
> +The test will be located in <rootfs>/usr/bin/
>  
> -
> -pcitest.sh Output
> -~~~~~~~~~~~~~~~~~
> +Kselftest Output
> +~~~~~~~~~~~~~~~~
>  ::
>  
> -     # pcitest.sh
> -     BAR tests
> -
> -     BAR0:           OKAY
> -     BAR1:           OKAY
> -     BAR2:           OKAY
> -     BAR3:           OKAY
> -     BAR4:           NOT OKAY
> -     BAR5:           NOT OKAY
> -
> -     Interrupt tests
> -
> -     SET IRQ TYPE TO LEGACY:         OKAY
> -     LEGACY IRQ:     NOT OKAY
> -     SET IRQ TYPE TO MSI:            OKAY
> -     MSI1:           OKAY
> -     MSI2:           OKAY
> -     MSI3:           OKAY
> -     MSI4:           OKAY
> -     MSI5:           OKAY
> -     MSI6:           OKAY
> -     MSI7:           OKAY
> -     MSI8:           OKAY
> -     MSI9:           OKAY
> -     MSI10:          OKAY
> -     MSI11:          OKAY
> -     MSI12:          OKAY
> -     MSI13:          OKAY
> -     MSI14:          OKAY
> -     MSI15:          OKAY
> -     MSI16:          OKAY
> -     MSI17:          NOT OKAY
> -     MSI18:          NOT OKAY
> -     MSI19:          NOT OKAY
> -     MSI20:          NOT OKAY
> -     MSI21:          NOT OKAY
> -     MSI22:          NOT OKAY
> -     MSI23:          NOT OKAY
> -     MSI24:          NOT OKAY
> -     MSI25:          NOT OKAY
> -     MSI26:          NOT OKAY
> -     MSI27:          NOT OKAY
> -     MSI28:          NOT OKAY
> -     MSI29:          NOT OKAY
> -     MSI30:          NOT OKAY
> -     MSI31:          NOT OKAY
> -     MSI32:          NOT OKAY
> -     SET IRQ TYPE TO MSI-X:          OKAY
> -     MSI-X1:         OKAY
> -     MSI-X2:         OKAY
> -     MSI-X3:         OKAY
> -     MSI-X4:         OKAY
> -     MSI-X5:         OKAY
> -     MSI-X6:         OKAY
> -     MSI-X7:         OKAY
> -     MSI-X8:         OKAY
> -     MSI-X9:         NOT OKAY
> -     MSI-X10:        NOT OKAY
> -     MSI-X11:        NOT OKAY
> -     MSI-X12:        NOT OKAY
> -     MSI-X13:        NOT OKAY
> -     MSI-X14:        NOT OKAY
> -     MSI-X15:        NOT OKAY
> -     MSI-X16:        NOT OKAY
> -     [...]
> -     MSI-X2047:      NOT OKAY
> -     MSI-X2048:      NOT OKAY
> -
> -     Read Tests
> -
> -     SET IRQ TYPE TO MSI:            OKAY
> -     READ (      1 bytes):           OKAY
> -     READ (   1024 bytes):           OKAY
> -     READ (   1025 bytes):           OKAY
> -     READ (1024000 bytes):           OKAY
> -     READ (1024001 bytes):           OKAY
> -
> -     Write Tests
> -
> -     WRITE (      1 bytes):          OKAY
> -     WRITE (   1024 bytes):          OKAY
> -     WRITE (   1025 bytes):          OKAY
> -     WRITE (1024000 bytes):          OKAY
> -     WRITE (1024001 bytes):          OKAY
> -
> -     Copy Tests
> -
> -     COPY (      1 bytes):           OKAY
> -     COPY (   1024 bytes):           OKAY
> -     COPY (   1025 bytes):           OKAY
> -     COPY (1024000 bytes):           OKAY
> -     COPY (1024001 bytes):           OKAY
> +     # pci_endpoint_test
> +     TAP version 13
> +     1..16
> +     # Starting 16 tests from 9 test cases.
> +     #  RUN           pci_ep_bar.BAR0.BAR_TEST ...
> +     #            OK  pci_ep_bar.BAR0.BAR_TEST
> +     ok 1 pci_ep_bar.BAR0.BAR_TEST
> +     #  RUN           pci_ep_bar.BAR1.BAR_TEST ...
> +     #            OK  pci_ep_bar.BAR1.BAR_TEST
> +     ok 2 pci_ep_bar.BAR1.BAR_TEST
> +     #  RUN           pci_ep_bar.BAR2.BAR_TEST ...
> +     #            OK  pci_ep_bar.BAR2.BAR_TEST
> +     ok 3 pci_ep_bar.BAR2.BAR_TEST
> +     #  RUN           pci_ep_bar.BAR3.BAR_TEST ...
> +     #            OK  pci_ep_bar.BAR3.BAR_TEST
> +     ok 4 pci_ep_bar.BAR3.BAR_TEST
> +     #  RUN           pci_ep_bar.BAR4.BAR_TEST ...
> +     #            OK  pci_ep_bar.BAR4.BAR_TEST
> +     ok 5 pci_ep_bar.BAR4.BAR_TEST
> +     #  RUN           pci_ep_bar.BAR5.BAR_TEST ...
> +     #            OK  pci_ep_bar.BAR5.BAR_TEST
> +     ok 6 pci_ep_bar.BAR5.BAR_TEST
> +     #  RUN           pci_ep_basic.CONSECUTIVE_BAR_TEST ...
> +     #            OK  pci_ep_basic.CONSECUTIVE_BAR_TEST
> +     ok 7 pci_ep_basic.CONSECUTIVE_BAR_TEST
> +     #  RUN           pci_ep_basic.LEGACY_IRQ_TEST ...
> +     #            OK  pci_ep_basic.LEGACY_IRQ_TEST
> +     ok 8 pci_ep_basic.LEGACY_IRQ_TEST
> +     #  RUN           pci_ep_basic.MSI_TEST ...
> +     #            OK  pci_ep_basic.MSI_TEST
> +     ok 9 pci_ep_basic.MSI_TEST
> +     #  RUN           pci_ep_basic.MSIX_TEST ...
> +     #            OK  pci_ep_basic.MSIX_TEST
> +     ok 10 pci_ep_basic.MSIX_TEST
> +     #  RUN           pci_ep_data_transfer.memcpy.READ_TEST ...
> +     #            OK  pci_ep_data_transfer.memcpy.READ_TEST
> +     ok 11 pci_ep_data_transfer.memcpy.READ_TEST
> +     #  RUN           pci_ep_data_transfer.memcpy.WRITE_TEST ...
> +     #            OK  pci_ep_data_transfer.memcpy.WRITE_TEST
> +     ok 12 pci_ep_data_transfer.memcpy.WRITE_TEST
> +     #  RUN           pci_ep_data_transfer.memcpy.COPY_TEST ...
> +     #            OK  pci_ep_data_transfer.memcpy.COPY_TEST
> +     ok 13 pci_ep_data_transfer.memcpy.COPY_TEST
> +     #  RUN           pci_ep_data_transfer.dma.READ_TEST ...
> +     #            OK  pci_ep_data_transfer.dma.READ_TEST
> +     ok 14 pci_ep_data_transfer.dma.READ_TEST
> +     #  RUN           pci_ep_data_transfer.dma.WRITE_TEST ...
> +     #            OK  pci_ep_data_transfer.dma.WRITE_TEST
> +     ok 15 pci_ep_data_transfer.dma.WRITE_TEST
> +     #  RUN           pci_ep_data_transfer.dma.COPY_TEST ...
> +     #            OK  pci_ep_data_transfer.dma.COPY_TEST
> +     ok 16 pci_ep_data_transfer.dma.COPY_TEST
> +     # PASSED: 16 / 16 tests passed.
> +     # Totals: pass:16 fail:0 xfail:0 xpass:0 skip:0 error:0
> +
> +
> +Testcase 16 (pci_ep_data_transfer.dma.COPY_TEST) will fail for most of the 
> DMA
> +capable endpoint controllers due to the absence of the MEMCPY over DMA. For 
> such
> +controllers, it is advisable to skip the forementioned testcase using below
> +command::
> +
> +     # pci_endpoint_test -f pci_ep_bar -f pci_ep_basic -v memcpy -T 
> COPY_TEST -v dma
> diff --git a/tools/testing/selftests/Makefile 
> b/tools/testing/selftests/Makefile
> index 2401e973c359..50931cd6aff2 100644
> --- a/tools/testing/selftests/Makefile
> +++ b/tools/testing/selftests/Makefile
> @@ -72,6 +72,7 @@ TARGETS += net/packetdrill
>  TARGETS += net/rds
>  TARGETS += net/tcp_ao
>  TARGETS += nsfs
> +TARGETS += pci_endpoint
>  TARGETS += pcie_bwctrl
>  TARGETS += perf_events
>  TARGETS += pidfd
> diff --git a/tools/testing/selftests/pci_endpoint/.gitignore 
> b/tools/testing/selftests/pci_endpoint/.gitignore
> index 29ab47c48484..6a4837a3e034 100644
> --- a/tools/testing/selftests/pci_endpoint/.gitignore
> +++ b/tools/testing/selftests/pci_endpoint/.gitignore
> @@ -1,3 +1,2 @@
>  # SPDX-License-Identifier: GPL-2.0-only
> -*.o
> -pcitest
> +pci_endpoint_test
> diff --git a/tools/testing/selftests/pci_endpoint/Build 
> b/tools/testing/selftests/pci_endpoint/Build
> deleted file mode 100644
> index c375aea21790..000000000000
> --- a/tools/testing/selftests/pci_endpoint/Build
> +++ /dev/null
> @@ -1 +0,0 @@
> -pcitest-y += pcitest.o
> diff --git a/tools/testing/selftests/pci_endpoint/Makefile 
> b/tools/testing/selftests/pci_endpoint/Makefile
> index 3c6fe18e32cc..bf21ebf20b4a 100644
> --- a/tools/testing/selftests/pci_endpoint/Makefile
> +++ b/tools/testing/selftests/pci_endpoint/Makefile
> @@ -1,58 +1,7 @@
>  # SPDX-License-Identifier: GPL-2.0
> -include ../../../scripts/Makefile.include
> +CFLAGS += -O2 -Wl,-no-as-needed -Wall $(KHDR_INCLUDES)
> +LDFLAGS += -lrt -lpthread -lm
>  
> -bindir ?= /usr/bin
> +TEST_GEN_PROGS = pci_endpoint_test
>  
> -ifeq ($(srctree),)
> -srctree := $(patsubst %/tools/testing/selftests/,%,$(dir $(CURDIR)))
> -endif
> -
> -# Do not use make's built-in rules
> -# (this improves performance and avoids hard-to-debug behaviour);
> -MAKEFLAGS += -r
> -
> -CFLAGS += -O2 -Wall -g -D_GNU_SOURCE -I$(OUTPUT)include
> -
> -ALL_TARGETS := pcitest
> -ALL_PROGRAMS := $(patsubst %,$(OUTPUT)%,$(ALL_TARGETS))
> -
> -SCRIPTS := pcitest.sh
> -
> -all: $(ALL_PROGRAMS)
> -
> -export srctree OUTPUT CC LD CFLAGS
> -include $(srctree)/tools/build/Makefile.include
> -
> -#
> -# We need the following to be outside of kernel tree
> -#
> -$(OUTPUT)include/linux/: ../../../../include/uapi/linux/
> -     mkdir -p $(OUTPUT)include/linux/ 2>&1 || true
> -     ln -sf $(CURDIR)/../../../../include/uapi/linux/pcitest.h $@
> -
> -$(info ${CURDIR})
> -prepare: $(OUTPUT)include/linux/
> -
> -PCITEST_IN := $(OUTPUT)pcitest-in.o
> -$(PCITEST_IN): prepare FORCE
> -     $(Q)$(MAKE) $(build)=pcitest
> -$(OUTPUT)pcitest: $(PCITEST_IN)
> -     $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
> -
> -clean:
> -     rm -f $(ALL_PROGRAMS)
> -     rm -rf $(OUTPUT)include/
> -     find $(or $(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete 
> -o -name '\.*.d' -delete
> -
> -install: $(ALL_PROGRAMS)
> -     install -d -m 755 $(DESTDIR)$(bindir);          \
> -     for program in $(ALL_PROGRAMS); do              \
> -             install $$program $(DESTDIR)$(bindir);  \
> -     done;                                           \
> -     for script in $(SCRIPTS); do                    \
> -             install $$script $(DESTDIR)$(bindir);   \
> -     done
> -
> -FORCE:
> -
> -.PHONY: all install clean FORCE prepare
> +include ../lib.mk
> diff --git a/tools/testing/selftests/pci_endpoint/config 
> b/tools/testing/selftests/pci_endpoint/config
> new file mode 100644
> index 000000000000..7cdcf117db8d
> --- /dev/null
> +++ b/tools/testing/selftests/pci_endpoint/config
> @@ -0,0 +1,4 @@
> +CONFIG_PCI_ENDPOINT=y
> +CONFIG_PCI_ENDPOINT_CONFIGFS=y
> +CONFIG_PCI_EPF_TEST=m
> +CONFIG_PCI_ENDPOINT_TEST=m
> diff --git a/tools/testing/selftests/pci_endpoint/pci_endpoint_test.c 
> b/tools/testing/selftests/pci_endpoint/pci_endpoint_test.c
> new file mode 100644
> index 000000000000..c267b822c108
> --- /dev/null
> +++ b/tools/testing/selftests/pci_endpoint/pci_endpoint_test.c
> @@ -0,0 +1,221 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Kselftest for PCI Endpoint Subsystem
> + *
> + * Copyright (c) 2022 Samsung Electronics Co., Ltd.
> + *             https://www.samsung.com
> + * Author: Aman Gupta <aman1.gu...@samsung.com>
> + *
> + * Copyright (c) 2024, Linaro Ltd.
> + * Author: Manivannan Sadhasivam <manivannan.sadhasi...@linaro.org>
> + */
> +
> +#include <errno.h>
> +#include <fcntl.h>
> +#include <stdbool.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <sys/ioctl.h>
> +#include <unistd.h>
> +
> +#include "../../../../include/uapi/linux/pcitest.h"
> +
> +#include "../kselftest_harness.h"
> +
> +#define pci_ep_ioctl(cmd, arg)                       \
> +({                                           \
> +     ret = ioctl(self->fd, cmd, arg);        \
> +     ret = ret < 0 ? -errno : 0;             \
> +})
> +
> +static const char *test_device = "/dev/pci-endpoint-test.0";
> +static const unsigned long test_size[5] = { 1, 1024, 1025, 1024000, 1024001 
> };
> +
> +FIXTURE(pci_ep_bar)
> +{
> +     int fd;
> +};
> +
> +FIXTURE_SETUP(pci_ep_bar)
> +{
> +     self->fd = open(test_device, O_RDWR);
> +
> +     ASSERT_NE(-1, self->fd) TH_LOG("Can't open PCI Endpoint Test device");
> +}
> +
> +FIXTURE_TEARDOWN(pci_ep_bar)
> +{
> +     close(self->fd);
> +}
> +
> +FIXTURE_VARIANT(pci_ep_bar)
> +{
> +     int barno;
> +};
> +
> +FIXTURE_VARIANT_ADD(pci_ep_bar, BAR0) { .barno = 0 };
> +FIXTURE_VARIANT_ADD(pci_ep_bar, BAR1) { .barno = 1 };
> +FIXTURE_VARIANT_ADD(pci_ep_bar, BAR2) { .barno = 2 };
> +FIXTURE_VARIANT_ADD(pci_ep_bar, BAR3) { .barno = 3 };
> +FIXTURE_VARIANT_ADD(pci_ep_bar, BAR4) { .barno = 4 };
> +FIXTURE_VARIANT_ADD(pci_ep_bar, BAR5) { .barno = 5 };
> +
> +TEST_F(pci_ep_bar, BAR_TEST)
> +{
> +     int ret;
> +
> +     pci_ep_ioctl(PCITEST_BAR, variant->barno);
> +     EXPECT_FALSE(ret) TH_LOG("Test failed for BAR%d", variant->barno);
> +}
> +
> +FIXTURE(pci_ep_basic)
> +{
> +     int fd;
> +};
> +
> +FIXTURE_SETUP(pci_ep_basic)
> +{
> +     self->fd = open(test_device, O_RDWR);
> +
> +     ASSERT_NE(-1, self->fd) TH_LOG("Can't open PCI Endpoint Test device");
> +}
> +
> +FIXTURE_TEARDOWN(pci_ep_basic)
> +{
> +     close(self->fd);
> +}
> +
> +TEST_F(pci_ep_basic, CONSECUTIVE_BAR_TEST)
> +{
> +     int ret;
> +
> +     pci_ep_ioctl(PCITEST_BARS, 0);
> +     EXPECT_FALSE(ret) TH_LOG("Consecutive BAR test failed");
> +}
> +
> +TEST_F(pci_ep_basic, LEGACY_IRQ_TEST)
> +{
> +     int ret;
> +
> +     pci_ep_ioctl(PCITEST_SET_IRQTYPE, 0);
> +     ASSERT_EQ(0, ret) TH_LOG("Can't set Legacy IRQ type");
> +
> +     pci_ep_ioctl(PCITEST_LEGACY_IRQ, 0);
> +     EXPECT_FALSE(ret) TH_LOG("Test failed for Legacy IRQ");
> +}
> +
> +TEST_F(pci_ep_basic, MSI_TEST)
> +{
> +     int ret, i;
> +
> +     pci_ep_ioctl(PCITEST_SET_IRQTYPE, 1);
> +     ASSERT_EQ(0, ret) TH_LOG("Can't set MSI IRQ type");
> +
> +     for (i = 1; i <= 32; i++) {
> +             pci_ep_ioctl(PCITEST_MSI, i);
> +             EXPECT_FALSE(ret) TH_LOG("Test failed for MSI%d", i);
> +     }
> +}
> +
> +TEST_F(pci_ep_basic, MSIX_TEST)
> +{
> +     int ret, i;
> +
> +     pci_ep_ioctl(PCITEST_SET_IRQTYPE, 2);
> +     ASSERT_EQ(0, ret) TH_LOG("Can't set MSI-X IRQ type");
> +
> +     for (i = 1; i <= 2048; i++) {
> +             pci_ep_ioctl(PCITEST_MSIX, i);
> +             EXPECT_FALSE(ret) TH_LOG("Test failed for MSI-X%d", i);
> +     }
> +}
> +
> +FIXTURE(pci_ep_data_transfer)
> +{
> +     int fd;
> +};
> +
> +FIXTURE_SETUP(pci_ep_data_transfer)
> +{
> +     self->fd = open(test_device, O_RDWR);
> +
> +     ASSERT_NE(-1, self->fd) TH_LOG("Can't open PCI Endpoint Test device");
> +}
> +
> +FIXTURE_TEARDOWN(pci_ep_data_transfer)
> +{
> +     close(self->fd);
> +}
> +
> +FIXTURE_VARIANT(pci_ep_data_transfer)
> +{
> +     bool use_dma;
> +};
> +
> +FIXTURE_VARIANT_ADD(pci_ep_data_transfer, memcpy)
> +{
> +     .use_dma = false,
> +};
> +
> +FIXTURE_VARIANT_ADD(pci_ep_data_transfer, dma)
> +{
> +     .use_dma = true,
> +};
> +
> +TEST_F(pci_ep_data_transfer, READ_TEST)
> +{
> +     struct pci_endpoint_test_xfer_param param = {};
> +     int ret, i;
> +
> +     if (variant->use_dma)
> +             param.flags = PCITEST_FLAGS_USE_DMA;
> +
> +     pci_ep_ioctl(PCITEST_SET_IRQTYPE, 1);
> +     ASSERT_EQ(0, ret) TH_LOG("Can't set MSI IRQ type");
> +
> +     for (i = 0; i < ARRAY_SIZE(test_size); i++) {
> +             param.size = test_size[i];
> +             pci_ep_ioctl(PCITEST_READ, &param);
> +             EXPECT_FALSE(ret) TH_LOG("Test failed for size (%ld)",
> +                                      test_size[i]);
> +     }
> +}
> +
> +TEST_F(pci_ep_data_transfer, WRITE_TEST)
> +{
> +     struct pci_endpoint_test_xfer_param param = {};
> +     int ret, i;
> +
> +     if (variant->use_dma)
> +             param.flags = PCITEST_FLAGS_USE_DMA;
> +
> +     pci_ep_ioctl(PCITEST_SET_IRQTYPE, 1);
> +     ASSERT_EQ(0, ret) TH_LOG("Can't set MSI IRQ type");
> +
> +     for (i = 0; i < ARRAY_SIZE(test_size); i++) {
> +             param.size = test_size[i];
> +             pci_ep_ioctl(PCITEST_WRITE, &param);
> +             EXPECT_FALSE(ret) TH_LOG("Test failed for size (%ld)",
> +                                      test_size[i]);
> +     }
> +}
> +
> +TEST_F(pci_ep_data_transfer, COPY_TEST)
> +{
> +     struct pci_endpoint_test_xfer_param param = {};
> +     int ret, i;
> +
> +     if (variant->use_dma)
> +             param.flags = PCITEST_FLAGS_USE_DMA;
> +
> +     pci_ep_ioctl(PCITEST_SET_IRQTYPE, 1);
> +     ASSERT_EQ(0, ret) TH_LOG("Can't set MSI IRQ type");
> +
> +     for (i = 0; i < ARRAY_SIZE(test_size); i++) {
> +             param.size = test_size[i];
> +             pci_ep_ioctl(PCITEST_COPY, &param);
> +             EXPECT_FALSE(ret) TH_LOG("Test failed for size (%ld)",
> +                                      test_size[i]);
> +     }
> +}
> +TEST_HARNESS_MAIN
> diff --git a/tools/testing/selftests/pci_endpoint/pcitest.c 
> b/tools/testing/selftests/pci_endpoint/pcitest.c
> deleted file mode 100644
> index b96cc118839b..000000000000
> --- a/tools/testing/selftests/pci_endpoint/pcitest.c
> +++ /dev/null
> @@ -1,265 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/**
> - * Userspace PCI Endpoint Test Module
> - *
> - * Copyright (C) 2017 Texas Instruments
> - * Author: Kishon Vijay Abraham I <kis...@ti.com>
> - */
> -
> -#include <errno.h>
> -#include <fcntl.h>
> -#include <stdbool.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <sys/ioctl.h>
> -#include <unistd.h>
> -
> -#include <linux/pcitest.h>
> -
> -static char *irq[] = { "LEGACY", "MSI", "MSI-X" };
> -
> -struct pci_test {
> -     char            *device;
> -     char            barnum;
> -     bool            consecutive_bar_test;
> -     bool            legacyirq;
> -     unsigned int    msinum;
> -     unsigned int    msixnum;
> -     int             irqtype;
> -     bool            set_irqtype;
> -     bool            get_irqtype;
> -     bool            clear_irq;
> -     bool            read;
> -     bool            write;
> -     bool            copy;
> -     unsigned long   size;
> -     bool            use_dma;
> -};
> -
> -static int run_test(struct pci_test *test)
> -{
> -     struct pci_endpoint_test_xfer_param param = {};
> -     int ret = -EINVAL;
> -     int fd;
> -
> -     fd = open(test->device, O_RDWR);
> -     if (fd < 0) {
> -             perror("can't open PCI Endpoint Test device");
> -             return -ENODEV;
> -     }
> -
> -     if (test->barnum >= 0 && test->barnum <= 5) {
> -             ret = ioctl(fd, PCITEST_BAR, test->barnum);
> -             fprintf(stdout, "BAR%d:\t\t", test->barnum);
> -             if (ret < 0)
> -                     fprintf(stdout, "NOT OKAY\n");
> -             else
> -                     fprintf(stdout, "OKAY\n");
> -     }
> -
> -     if (test->consecutive_bar_test) {
> -             ret = ioctl(fd, PCITEST_BARS);
> -             fprintf(stdout, "Consecutive BAR test:\t\t");
> -             if (ret < 0)
> -                     fprintf(stdout, "NOT OKAY\n");
> -             else
> -                     fprintf(stdout, "OKAY\n");
> -     }
> -
> -     if (test->set_irqtype) {
> -             ret = ioctl(fd, PCITEST_SET_IRQTYPE, test->irqtype);
> -             fprintf(stdout, "SET IRQ TYPE TO %s:\t\t", irq[test->irqtype]);
> -             if (ret < 0)
> -                     fprintf(stdout, "NOT OKAY\n");
> -             else
> -                     fprintf(stdout, "OKAY\n");
> -     }
> -
> -     if (test->get_irqtype) {
> -             ret = ioctl(fd, PCITEST_GET_IRQTYPE);
> -             fprintf(stdout, "GET IRQ TYPE:\t\t");
> -             if (ret < 0) {
> -                     fprintf(stdout, "NOT OKAY\n");
> -             } else {
> -                     fprintf(stdout, "%s\n", irq[ret]);
> -                     ret = 0;
> -             }
> -     }
> -
> -     if (test->clear_irq) {
> -             ret = ioctl(fd, PCITEST_CLEAR_IRQ);
> -             fprintf(stdout, "CLEAR IRQ:\t\t");
> -             if (ret < 0)
> -                     fprintf(stdout, "NOT OKAY\n");
> -             else
> -                     fprintf(stdout, "OKAY\n");
> -     }
> -
> -     if (test->legacyirq) {
> -             ret = ioctl(fd, PCITEST_LEGACY_IRQ, 0);
> -             fprintf(stdout, "LEGACY IRQ:\t");
> -             if (ret < 0)
> -                     fprintf(stdout, "NOT OKAY\n");
> -             else
> -                     fprintf(stdout, "OKAY\n");
> -     }
> -
> -     if (test->msinum > 0 && test->msinum <= 32) {
> -             ret = ioctl(fd, PCITEST_MSI, test->msinum);
> -             fprintf(stdout, "MSI%u:\t\t", test->msinum);
> -             if (ret < 0)
> -                     fprintf(stdout, "NOT OKAY\n");
> -             else
> -                     fprintf(stdout, "OKAY\n");
> -     }
> -
> -     if (test->msixnum > 0 && test->msixnum <= 2048) {
> -             ret = ioctl(fd, PCITEST_MSIX, test->msixnum);
> -             fprintf(stdout, "MSI-X%u:\t\t", test->msixnum);
> -             if (ret < 0)
> -                     fprintf(stdout, "NOT OKAY\n");
> -             else
> -                     fprintf(stdout, "OKAY\n");
> -     }
> -
> -     if (test->write) {
> -             param.size = test->size;
> -             if (test->use_dma)
> -                     param.flags = PCITEST_FLAGS_USE_DMA;
> -             ret = ioctl(fd, PCITEST_WRITE, &param);
> -             fprintf(stdout, "WRITE (%7lu bytes):\t\t", test->size);
> -             if (ret < 0)
> -                     fprintf(stdout, "NOT OKAY\n");
> -             else
> -                     fprintf(stdout, "OKAY\n");
> -     }
> -
> -     if (test->read) {
> -             param.size = test->size;
> -             if (test->use_dma)
> -                     param.flags = PCITEST_FLAGS_USE_DMA;
> -             ret = ioctl(fd, PCITEST_READ, &param);
> -             fprintf(stdout, "READ (%7lu bytes):\t\t", test->size);
> -             if (ret < 0)
> -                     fprintf(stdout, "NOT OKAY\n");
> -             else
> -                     fprintf(stdout, "OKAY\n");
> -     }
> -
> -     if (test->copy) {
> -             param.size = test->size;
> -             if (test->use_dma)
> -                     param.flags = PCITEST_FLAGS_USE_DMA;
> -             ret = ioctl(fd, PCITEST_COPY, &param);
> -             fprintf(stdout, "COPY (%7lu bytes):\t\t", test->size);
> -             if (ret < 0)
> -                     fprintf(stdout, "NOT OKAY\n");
> -             else
> -                     fprintf(stdout, "OKAY\n");
> -     }
> -
> -     fflush(stdout);
> -     close(fd);
> -     return ret;
> -}
> -
> -int main(int argc, char **argv)
> -{
> -     int c;
> -     struct pci_test *test;
> -
> -     test = calloc(1, sizeof(*test));
> -     if (!test) {
> -             perror("Fail to allocate memory for pci_test\n");
> -             return -ENOMEM;
> -     }
> -
> -     /* since '0' is a valid BAR number, initialize it to -1 */
> -     test->barnum = -1;
> -
> -     /* set default size as 100KB */
> -     test->size = 0x19000;
> -
> -     /* set default endpoint device */
> -     test->device = "/dev/pci-endpoint-test.0";
> -
> -     while ((c = getopt(argc, argv, "D:b:Cm:x:i:deIlhrwcs:")) != EOF)
> -     switch (c) {
> -     case 'D':
> -             test->device = optarg;
> -             continue;
> -     case 'b':
> -             test->barnum = atoi(optarg);
> -             if (test->barnum < 0 || test->barnum > 5)
> -                     goto usage;
> -             continue;
> -     case 'C':
> -             test->consecutive_bar_test = true;
> -             continue;
> -     case 'l':
> -             test->legacyirq = true;
> -             continue;
> -     case 'm':
> -             test->msinum = atoi(optarg);
> -             if (test->msinum < 1 || test->msinum > 32)
> -                     goto usage;
> -             continue;
> -     case 'x':
> -             test->msixnum = atoi(optarg);
> -             if (test->msixnum < 1 || test->msixnum > 2048)
> -                     goto usage;
> -             continue;
> -     case 'i':
> -             test->irqtype = atoi(optarg);
> -             if (test->irqtype < 0 || test->irqtype > 2)
> -                     goto usage;
> -             test->set_irqtype = true;
> -             continue;
> -     case 'I':
> -             test->get_irqtype = true;
> -             continue;
> -     case 'r':
> -             test->read = true;
> -             continue;
> -     case 'w':
> -             test->write = true;
> -             continue;
> -     case 'c':
> -             test->copy = true;
> -             continue;
> -     case 'e':
> -             test->clear_irq = true;
> -             continue;
> -     case 's':
> -             test->size = strtoul(optarg, NULL, 0);
> -             continue;
> -     case 'd':
> -             test->use_dma = true;
> -             continue;
> -     case 'h':
> -     default:
> -usage:
> -             fprintf(stderr,
> -                     "usage: %s [options]\n"
> -                     "Options:\n"
> -                     "\t-D <dev>             PCI endpoint test device 
> {default: /dev/pci-endpoint-test.0}\n"
> -                     "\t-b <bar num>         BAR test (bar number between 
> 0..5)\n"
> -                     "\t-C                   Consecutive BAR test\n"
> -                     "\t-m <msi num>         MSI test (msi number between 
> 1..32)\n"
> -                     "\t-x <msix num>        \tMSI-X test (msix number 
> between 1..2048)\n"
> -                     "\t-i <irq type>        \tSet IRQ type (0 - Legacy, 1 - 
> MSI, 2 - MSI-X)\n"
> -                     "\t-e                   Clear IRQ\n"
> -                     "\t-I                   Get current IRQ type 
> configured\n"
> -                     "\t-d                   Use DMA\n"
> -                     "\t-l                   Legacy IRQ test\n"
> -                     "\t-r                   Read buffer test\n"
> -                     "\t-w                   Write buffer test\n"
> -                     "\t-c                   Copy buffer test\n"
> -                     "\t-s <size>            Size of buffer {default: 
> 100KB}\n"
> -                     "\t-h                   Print this help message\n",
> -                     argv[0]);
> -             return -EINVAL;
> -     }
> -
> -     return run_test(test);
> -}
> diff --git a/tools/testing/selftests/pci_endpoint/pcitest.sh 
> b/tools/testing/selftests/pci_endpoint/pcitest.sh
> deleted file mode 100644
> index 770f4d6df34b..000000000000
> --- a/tools/testing/selftests/pci_endpoint/pcitest.sh
> +++ /dev/null
> @@ -1,73 +0,0 @@
> -#!/bin/sh
> -# SPDX-License-Identifier: GPL-2.0
> -
> -echo "BAR tests"
> -echo
> -
> -bar=0
> -
> -while [ $bar -lt 6 ]
> -do
> -     pcitest -b $bar
> -     bar=`expr $bar + 1`
> -done
> -pcitest -C
> -echo
> -
> -echo "Interrupt tests"
> -echo
> -
> -pcitest -i 0
> -pcitest -l
> -
> -pcitest -i 1
> -msi=1
> -
> -while [ $msi -lt 33 ]
> -do
> -        pcitest -m $msi
> -        msi=`expr $msi + 1`
> -done
> -echo
> -
> -pcitest -i 2
> -msix=1
> -
> -while [ $msix -lt 2049 ]
> -do
> -        pcitest -x $msix
> -        msix=`expr $msix + 1`
> -done
> -echo
> -
> -echo "Read Tests"
> -echo
> -
> -pcitest -i 1
> -
> -pcitest -r -s 1
> -pcitest -r -s 1024
> -pcitest -r -s 1025
> -pcitest -r -s 1024000
> -pcitest -r -s 1024001
> -echo
> -
> -echo "Write Tests"
> -echo
> -
> -pcitest -w -s 1
> -pcitest -w -s 1024
> -pcitest -w -s 1025
> -pcitest -w -s 1024000
> -pcitest -w -s 1024001
> -echo
> -
> -echo "Copy Tests"
> -echo
> -
> -pcitest -c -s 1
> -pcitest -c -s 1024
> -pcitest -c -s 1025
> -pcitest -c -s 1024000
> -pcitest -c -s 1024001
> -echo
> -- 
> 2.25.1
> 

Reviewed-by: Niklas Cassel <cas...@kernel.org>

Reply via email to