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