xref: /qemu/tests/functional/test_virtio_gpu.py (revision 8b5a0dd3a8a4526bb91430b7f548c95d46093dc1)
1239d08aaSThomas Huth#!/usr/bin/env python3
2239d08aaSThomas Huth#
373240f10SMarc-André Lureau# virtio-gpu tests
473240f10SMarc-André Lureau#
573240f10SMarc-André Lureau# This work is licensed under the terms of the GNU GPL, version 2 or
673240f10SMarc-André Lureau# later.  See the COPYING file in the top-level directory.
773240f10SMarc-André Lureau
873240f10SMarc-André Lureau
9239d08aaSThomas Huthfrom qemu_test import QemuSystemTest, Asset
10239d08aaSThomas Huthfrom qemu_test import wait_for_console_pattern
11239d08aaSThomas Huthfrom qemu_test import exec_command_and_wait_for_pattern
12239d08aaSThomas Huthfrom qemu_test import is_readable_executable_file
1373240f10SMarc-André Lureau
1473240f10SMarc-André Lureau
1573240f10SMarc-André Lureauimport os
1673240f10SMarc-André Lureauimport socket
1773240f10SMarc-André Lureauimport subprocess
1873240f10SMarc-André Lureau
1973240f10SMarc-André Lureau
20*8b5a0dd3SDaniel P. Berrangédef pick_default_vug_bin(test):
21*8b5a0dd3SDaniel P. Berrangé    bld_dir_path = test.build_file("contrib", "vhost-user-gpu", "vhost-user-gpu")
2273240f10SMarc-André Lureau    if is_readable_executable_file(bld_dir_path):
2373240f10SMarc-André Lureau        return bld_dir_path
2473240f10SMarc-André Lureau
2573240f10SMarc-André Lureau
262283b627SPhilippe Mathieu-Daudéclass VirtioGPUx86(QemuSystemTest):
2773240f10SMarc-André Lureau
28532835d0SCleber Rosa    KERNEL_COMMAND_LINE = "printk.time=0 console=ttyS0 rdinit=/bin/bash"
29239d08aaSThomas Huth    ASSET_KERNEL = Asset(
30239d08aaSThomas Huth        ("https://archives.fedoraproject.org/pub/archive/fedora"
3173240f10SMarc-André Lureau         "/linux/releases/33/Everything/x86_64/os/images"
32239d08aaSThomas Huth         "/pxeboot/vmlinuz"),
33239d08aaSThomas Huth        '2dc5fb5cfe9ac278fa45640f3602d9b7a08cc189ed63fd9b162b07073e4df397')
34239d08aaSThomas Huth    ASSET_INITRD = Asset(
35239d08aaSThomas Huth        ("https://archives.fedoraproject.org/pub/archive/fedora"
3673240f10SMarc-André Lureau         "/linux/releases/33/Everything/x86_64/os/images"
37239d08aaSThomas Huth         "/pxeboot/initrd.img"),
38239d08aaSThomas Huth        'c49b97f893a5349e4883452178763e402bdc5caa8845b226a2d1329b5f356045')
3973240f10SMarc-André Lureau
4073240f10SMarc-André Lureau    def wait_for_console_pattern(self, success_message, vm=None):
4173240f10SMarc-André Lureau        wait_for_console_pattern(
4273240f10SMarc-André Lureau            self,
4373240f10SMarc-André Lureau            success_message,
4473240f10SMarc-André Lureau            failure_message="Kernel panic - not syncing",
4573240f10SMarc-André Lureau            vm=vm,
4673240f10SMarc-André Lureau        )
4773240f10SMarc-André Lureau
4873240f10SMarc-André Lureau    def test_virtio_vga_virgl(self):
4973240f10SMarc-André Lureau        # FIXME: should check presence of virtio, virgl etc
508ee6e281SCleber Rosa        self.require_accelerator('kvm')
5173240f10SMarc-André Lureau
52239d08aaSThomas Huth        kernel_path = self.ASSET_KERNEL.fetch()
53239d08aaSThomas Huth        initrd_path = self.ASSET_INITRD.fetch()
5473240f10SMarc-André Lureau
5573240f10SMarc-André Lureau        self.vm.set_console()
56239d08aaSThomas Huth        self.vm.add_args("-cpu", "host")
5773240f10SMarc-André Lureau        self.vm.add_args("-m", "2G")
5873240f10SMarc-André Lureau        self.vm.add_args("-machine", "pc,accel=kvm")
593a05eee2SCleber Rosa        self.vm.add_args("-device", "virtio-vga-gl")
6073240f10SMarc-André Lureau        self.vm.add_args("-display", "egl-headless")
6173240f10SMarc-André Lureau        self.vm.add_args(
6273240f10SMarc-André Lureau            "-kernel",
6373240f10SMarc-André Lureau            kernel_path,
6473240f10SMarc-André Lureau            "-initrd",
6573240f10SMarc-André Lureau            initrd_path,
6673240f10SMarc-André Lureau            "-append",
67532835d0SCleber Rosa            self.KERNEL_COMMAND_LINE,
6873240f10SMarc-André Lureau        )
69d9894645SAlex Bennée        try:
7073240f10SMarc-André Lureau            self.vm.launch()
71d9894645SAlex Bennée        except:
72d9894645SAlex Bennée            # TODO: probably fails because we are missing the VirGL features
73239d08aaSThomas Huth            self.skipTest("VirGL not enabled?")
74d9894645SAlex Bennée
7573240f10SMarc-André Lureau        self.wait_for_console_pattern("as init process")
7673240f10SMarc-André Lureau        exec_command_and_wait_for_pattern(
777699e37bSDaniel P. Berrangé            self, "/usr/sbin/modprobe virtio_gpu", "features: +virgl +edid"
7873240f10SMarc-André Lureau        )
7973240f10SMarc-André Lureau
8073240f10SMarc-André Lureau    def test_vhost_user_vga_virgl(self):
8173240f10SMarc-André Lureau        # FIXME: should check presence of vhost-user-gpu, virgl, memfd etc
828ee6e281SCleber Rosa        self.require_accelerator('kvm')
8373240f10SMarc-André Lureau
84*8b5a0dd3SDaniel P. Berrangé        vug = pick_default_vug_bin(self)
8573240f10SMarc-André Lureau        if not vug:
86239d08aaSThomas Huth            self.skipTest("Could not find vhost-user-gpu")
8773240f10SMarc-André Lureau
88239d08aaSThomas Huth        kernel_path = self.ASSET_KERNEL.fetch()
89239d08aaSThomas Huth        initrd_path = self.ASSET_INITRD.fetch()
9073240f10SMarc-André Lureau
9173240f10SMarc-André Lureau        # Create socketpair to connect proxy and remote processes
9273240f10SMarc-André Lureau        qemu_sock, vug_sock = socket.socketpair(
9373240f10SMarc-André Lureau            socket.AF_UNIX, socket.SOCK_STREAM
9473240f10SMarc-André Lureau        )
9573240f10SMarc-André Lureau        os.set_inheritable(qemu_sock.fileno(), True)
9673240f10SMarc-André Lureau        os.set_inheritable(vug_sock.fileno(), True)
9773240f10SMarc-André Lureau
98bcc12768SDaniel P. Berrangé        self._vug_log_path = self.log_file("vhost-user-gpu.log")
9973240f10SMarc-André Lureau        self._vug_log_file = open(self._vug_log_path, "wb")
100cdcc50bfSCleber Rosa        self.log.info('Complete vhost-user-gpu.log file can be '
101cdcc50bfSCleber Rosa                      'found at %s', self._vug_log_path)
10273240f10SMarc-André Lureau
10373240f10SMarc-André Lureau        vugp = subprocess.Popen(
10473240f10SMarc-André Lureau            [vug, "--virgl", "--fd=%d" % vug_sock.fileno()],
10573240f10SMarc-André Lureau            stdin=subprocess.DEVNULL,
10673240f10SMarc-André Lureau            stdout=self._vug_log_file,
10773240f10SMarc-André Lureau            stderr=subprocess.STDOUT,
10873240f10SMarc-André Lureau            shell=False,
10973240f10SMarc-André Lureau            close_fds=False,
11073240f10SMarc-André Lureau        )
11173240f10SMarc-André Lureau
11273240f10SMarc-André Lureau        self.vm.set_console()
113239d08aaSThomas Huth        self.vm.add_args("-cpu", "host")
11473240f10SMarc-André Lureau        self.vm.add_args("-m", "2G")
11573240f10SMarc-André Lureau        self.vm.add_args("-object", "memory-backend-memfd,id=mem,size=2G")
11673240f10SMarc-André Lureau        self.vm.add_args("-machine", "pc,memory-backend=mem,accel=kvm")
11773240f10SMarc-André Lureau        self.vm.add_args("-chardev", "socket,id=vug,fd=%d" % qemu_sock.fileno())
11873240f10SMarc-André Lureau        self.vm.add_args("-device", "vhost-user-vga,chardev=vug")
11973240f10SMarc-André Lureau        self.vm.add_args("-display", "egl-headless")
12073240f10SMarc-André Lureau        self.vm.add_args(
12173240f10SMarc-André Lureau            "-kernel",
12273240f10SMarc-André Lureau            kernel_path,
12373240f10SMarc-André Lureau            "-initrd",
12473240f10SMarc-André Lureau            initrd_path,
12573240f10SMarc-André Lureau            "-append",
126532835d0SCleber Rosa            self.KERNEL_COMMAND_LINE,
12773240f10SMarc-André Lureau        )
1287f027ee0SThomas Huth        try:
12973240f10SMarc-André Lureau            self.vm.launch()
1307f027ee0SThomas Huth        except:
1317f027ee0SThomas Huth            # TODO: probably fails because we are missing the VirGL features
132239d08aaSThomas Huth            self.skipTest("VirGL not enabled?")
13373240f10SMarc-André Lureau        self.wait_for_console_pattern("as init process")
134ffab603bSThomas Huth        exec_command_and_wait_for_pattern(self, "/usr/sbin/modprobe virtio_gpu",
135ffab603bSThomas Huth                                          "features: +virgl +edid")
13673240f10SMarc-André Lureau        self.vm.shutdown()
13773240f10SMarc-André Lureau        qemu_sock.close()
13873240f10SMarc-André Lureau        vugp.terminate()
13973240f10SMarc-André Lureau        vugp.wait()
140239d08aaSThomas Huth
141239d08aaSThomas Huthif __name__ == '__main__':
142239d08aaSThomas Huth    QemuSystemTest.main()
143