xref: /openbmc/qemu/tests/avocado/smmu.py (revision 7a27991a)
1# SMMUv3 Functional tests
2#
3# Copyright (c) 2021 Red Hat, Inc.
4#
5# Author:
6#  Eric Auger <eric.auger@redhat.com>
7#
8# This work is licensed under the terms of the GNU GPL, version 2 or
9# later.  See the COPYING file in the top-level directory.
10import os
11
12from avocado import skipUnless
13from avocado_qemu import BUILD_DIR
14from avocado_qemu.linuxtest import LinuxTest
15
16@skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab')
17class SMMU(LinuxTest):
18    """
19    :avocado: tags=accel:kvm
20    :avocado: tags=cpu:host
21    :avocado: tags=arch:aarch64
22    :avocado: tags=machine:virt
23    :avocado: tags=distro:fedora
24    :avocado: tags=smmu
25    :avocado: tags=flaky
26    """
27
28    IOMMU_ADDON = ',iommu_platform=on,disable-modern=off,disable-legacy=on'
29    kernel_path = None
30    initrd_path = None
31    kernel_params = None
32
33    def set_up_boot(self):
34        path = self.download_boot()
35        self.vm.add_args('-device', 'virtio-blk-pci,bus=pcie.0,' +
36                         'drive=drv0,id=virtio-disk0,bootindex=1,'
37                         'werror=stop,rerror=stop' + self.IOMMU_ADDON)
38        self.vm.add_args('-drive',
39                         'file=%s,if=none,cache=writethrough,id=drv0' % path)
40
41    def setUp(self):
42        super(SMMU, self).setUp(None, 'virtio-net-pci' + self.IOMMU_ADDON)
43
44    def common_vm_setup(self, custom_kernel=False):
45        self.require_accelerator("kvm")
46        self.vm.add_args("-accel", "kvm")
47        self.vm.add_args("-cpu", "host")
48        self.vm.add_args("-machine", "iommu=smmuv3")
49        self.vm.add_args("-d", "guest_errors")
50        self.vm.add_args('-bios', os.path.join(BUILD_DIR, 'pc-bios',
51                         'edk2-aarch64-code.fd'))
52        self.vm.add_args('-device', 'virtio-rng-pci,rng=rng0')
53        self.vm.add_args('-object',
54                         'rng-random,id=rng0,filename=/dev/urandom')
55
56        if custom_kernel is False:
57            return
58
59        kernel_url = self.distro.pxeboot_url + 'vmlinuz'
60        initrd_url = self.distro.pxeboot_url + 'initrd.img'
61        self.kernel_path = self.fetch_asset(kernel_url)
62        self.initrd_path = self.fetch_asset(initrd_url)
63
64    def run_and_check(self):
65        if self.kernel_path:
66            self.vm.add_args('-kernel', self.kernel_path,
67                             '-append', self.kernel_params,
68                             '-initrd', self.initrd_path)
69        self.launch_and_wait()
70        self.ssh_command('cat /proc/cmdline')
71        self.ssh_command('dnf -y install numactl-devel')
72
73
74    # 5.3 kernel without RIL #
75
76    def test_smmu_noril(self):
77        """
78        :avocado: tags=smmu_noril
79        :avocado: tags=smmu_noril_tests
80        :avocado: tags=distro_version:31
81        """
82        self.common_vm_setup()
83        self.run_and_check()
84
85    def test_smmu_noril_passthrough(self):
86        """
87        :avocado: tags=smmu_noril_passthrough
88        :avocado: tags=smmu_noril_tests
89        :avocado: tags=distro_version:31
90        """
91        self.common_vm_setup(True)
92        self.kernel_params = (self.distro.default_kernel_params +
93                              ' iommu.passthrough=on')
94        self.run_and_check()
95
96    def test_smmu_noril_nostrict(self):
97        """
98        :avocado: tags=smmu_noril_nostrict
99        :avocado: tags=smmu_noril_tests
100        :avocado: tags=distro_version:31
101        """
102        self.common_vm_setup(True)
103        self.kernel_params = (self.distro.default_kernel_params +
104                              ' iommu.strict=0')
105        self.run_and_check()
106
107    # 5.8 kernel featuring range invalidation
108    # >= v5.7 kernel
109
110    def test_smmu_ril(self):
111        """
112        :avocado: tags=smmu_ril
113        :avocado: tags=smmu_ril_tests
114        :avocado: tags=distro_version:33
115        """
116        self.common_vm_setup()
117        self.run_and_check()
118
119    def test_smmu_ril_passthrough(self):
120        """
121        :avocado: tags=smmu_ril_passthrough
122        :avocado: tags=smmu_ril_tests
123        :avocado: tags=distro_version:33
124        """
125        self.common_vm_setup(True)
126        self.kernel_params = (self.distro.default_kernel_params +
127                              ' iommu.passthrough=on')
128        self.run_and_check()
129
130    def test_smmu_ril_nostrict(self):
131        """
132        :avocado: tags=smmu_ril_nostrict
133        :avocado: tags=smmu_ril_tests
134        :avocado: tags=distro_version:33
135        """
136        self.common_vm_setup(True)
137        self.kernel_params = (self.distro.default_kernel_params +
138                              ' iommu.strict=0')
139        self.run_and_check()
140