diff mbox series

[1/1] support/testing: add pciutils runtime test

Message ID 20240117201157.51827-1-ju.o@free.fr
State Accepted
Headers show
Series [1/1] support/testing: add pciutils runtime test | expand

Commit Message

Julien Olivain Jan. 17, 2024, 8:11 p.m. UTC
Signed-off-by: Julien Olivain <ju.o@free.fr>
---
Patch tested on branch master at commit b200632 with commands:

    make check-package
    ...
    0 warnings generated

    support/testing/run-tests \
        -d dl -o output_folder \
        tests.package.test_pciutils
    ...
    OK
---
 DEVELOPERS                                    |  1 +
 .../testing/tests/package/test_pciutils.py    | 83 +++++++++++++++++++
 2 files changed, 84 insertions(+)
 create mode 100644 support/testing/tests/package/test_pciutils.py

Comments

Thomas Petazzoni Feb. 5, 2024, 3:13 p.m. UTC | #1
On Wed, 17 Jan 2024 21:11:57 +0100
Julien Olivain <ju.o@free.fr> wrote:

> Signed-off-by: Julien Olivain <ju.o@free.fr>
> ---
> Patch tested on branch master at commit b200632 with commands:

Applied to master, thanks a lot!

Thomas
diff mbox series

Patch

diff --git a/DEVELOPERS b/DEVELOPERS
index f5b04937b6..bc92bdb813 100644
--- a/DEVELOPERS
+++ b/DEVELOPERS
@@ -1797,6 +1797,7 @@  F:	support/testing/tests/package/test_octave.py
 F:	support/testing/tests/package/test_ola.py
 F:	support/testing/tests/package/test_ola/
 F:	support/testing/tests/package/test_openblas.py
+F:	support/testing/tests/package/test_pciutils.py
 F:	support/testing/tests/package/test_perftest.py
 F:	support/testing/tests/package/test_pigz.py
 F:	support/testing/tests/package/test_python_distro.py
diff --git a/support/testing/tests/package/test_pciutils.py b/support/testing/tests/package/test_pciutils.py
new file mode 100644
index 0000000000..3221b0cfd1
--- /dev/null
+++ b/support/testing/tests/package/test_pciutils.py
@@ -0,0 +1,83 @@ 
+import os
+
+import infra.basetest
+
+
+class TestPCIUtils(infra.basetest.BRTest):
+    config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \
+        """
+        BR2_PACKAGE_PCIUTILS=y
+        BR2_TARGET_ROOTFS_CPIO=y
+        # BR2_TARGET_ROOTFS_TAR is not set
+        """
+
+    def test_run(self):
+        cpio_file = os.path.join(self.builddir, "images", "rootfs.cpio")
+
+        # Note: we add a qemu pci-testdev in order to have a stable
+        # device ID, and for writing in configuration space without
+        # interfering with the rest of the emulation. See:
+        # https://www.qemu.org/docs/master/specs/pci-testdev.html
+        self.emulator.boot(arch="armv5",
+                           kernel="builtin",
+                           options=["-initrd", cpio_file,
+                                    "-device", "pci-testdev"])
+        self.emulator.login()
+
+        # Check the program executes. This test also check that we
+        # have "lspci" from the pciutils package, rather than the
+        # busybox applet (which does not recognize the --version
+        # option)"
+        self.assertRunOk("lspci --version")
+
+        # Check few program invocations.
+        self.assertRunOk("lspci")
+        for lspci_opt in ["-t", "-n", "-v", "-vv", "-x"]:
+            self.assertRunOk(f"lspci {lspci_opt}")
+
+        # Check we can see the qemu pci-testdev.
+        # Vendor: 1b36: Red Hat, Inc.
+        # Device: 0005: QEMU PCI Test Device
+        pci_vendor_id = "1b36"
+        pci_device_id = "0005"
+        pci_dev = f"{pci_vendor_id}:{pci_device_id}"
+        cmd = f"lspci -d {pci_dev}"
+        output, exit_code = self.emulator.run(cmd)
+        self.assertEqual(exit_code, 0)
+        self.assertIn("Red Hat, Inc.", output[0])
+        self.assertIn("QEMU PCI Test Device", output[0])
+
+        # We disable INTx emulation by setting bit 10 of the COMMAND
+        # register in the configuration space. See:
+        # https://git.kernel.org/pub/scm/utils/pciutils/pciutils.git/tree/lib/header.h?h=v3.10.0#n26
+        dis_int_x = 0x400
+        data_mask = f"{hex(dis_int_x)}:{hex(dis_int_x)}"
+        cmd = f"setpci -d {pci_dev} COMMAND.w={data_mask}"
+        self.assertRunOk(cmd)
+
+        # We read back and check the value.
+        cmd = f"setpci -d {pci_dev} COMMAND.w"
+        output, exit_code = self.emulator.run(cmd)
+        read_value = int(output[0], 16)
+        self.assertEqual(exit_code, 0)
+        self.assertTrue((read_value & dis_int_x) == dis_int_x)
+
+        # We check lspci now see the disabled INTx emulation.
+        cmd = f"lspci -vv -d {pci_dev} | grep -F 'DisINTx+'"
+        self.assertRunOk(cmd)
+
+        # We re-enable the INTx emulation by clearing the bit 10.
+        data_mask = f"0x0:{hex(dis_int_x)}"
+        cmd = f"setpci -d {pci_dev} COMMAND.w={data_mask}"
+        self.assertRunOk(cmd)
+
+        # We read back and check the value, again.
+        cmd = f"setpci -d {pci_dev} COMMAND.w"
+        output, exit_code = self.emulator.run(cmd)
+        read_value = int(output[0], 16)
+        self.assertEqual(exit_code, 0)
+        self.assertTrue((read_value & dis_int_x) == 0)
+
+        # We check lspci now see the enabled INTx emulation.
+        cmd = f"lspci -vv -d {pci_dev} | grep -F 'DisINTx-'"
+        self.assertRunOk(cmd)