xref: /openbmc/qemu/tests/avocado/intel_iommu.py (revision 5d25fcb7)
1bbbd9b6eSWillian Rampazzo# INTEL_IOMMU 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
13bbbd9b6eSWillian Rampazzofrom avocado_qemu import LinuxTest
14bbbd9b6eSWillian Rampazzo
159b45cc99SAlex Bennée@skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab')
169b45cc99SAlex Bennée
17bbbd9b6eSWillian Rampazzoclass IntelIOMMU(LinuxTest):
18bbbd9b6eSWillian Rampazzo    """
19bbbd9b6eSWillian Rampazzo    :avocado: tags=arch:x86_64
20bbbd9b6eSWillian Rampazzo    :avocado: tags=distro:fedora
21bbbd9b6eSWillian Rampazzo    :avocado: tags=distro_version:31
22bbbd9b6eSWillian Rampazzo    :avocado: tags=machine:q35
23bbbd9b6eSWillian Rampazzo    :avocado: tags=accel:kvm
24bbbd9b6eSWillian Rampazzo    :avocado: tags=intel_iommu
25*5d25fcb7SAlex 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()
35bbbd9b6eSWillian Rampazzo        self.vm.add_args('-device', 'virtio-blk-pci,bus=pcie.0,scsi=off,' +
36bbbd9b6eSWillian Rampazzo                         'drive=drv0,id=virtio-disk0,bootindex=1,'
37bbbd9b6eSWillian Rampazzo                         'werror=stop,rerror=stop' + self.IOMMU_ADDON)
38bbbd9b6eSWillian Rampazzo        self.vm.add_args('-device', 'virtio-gpu-pci' + self.IOMMU_ADDON)
39bbbd9b6eSWillian Rampazzo        self.vm.add_args('-drive',
40bbbd9b6eSWillian Rampazzo                         'file=%s,if=none,cache=writethrough,id=drv0' % path)
41bbbd9b6eSWillian Rampazzo
42bbbd9b6eSWillian Rampazzo    def setUp(self):
43bbbd9b6eSWillian Rampazzo        super(IntelIOMMU, self).setUp(None, 'virtio-net-pci' + self.IOMMU_ADDON)
44bbbd9b6eSWillian Rampazzo
45bbbd9b6eSWillian Rampazzo    def add_common_args(self):
46bbbd9b6eSWillian Rampazzo        self.vm.add_args('-device', 'virtio-rng-pci,rng=rng0')
47bbbd9b6eSWillian Rampazzo        self.vm.add_args('-object',
48bbbd9b6eSWillian Rampazzo                         'rng-random,id=rng0,filename=/dev/urandom')
49bbbd9b6eSWillian Rampazzo
50bbbd9b6eSWillian Rampazzo    def common_vm_setup(self, custom_kernel=None):
51bbbd9b6eSWillian Rampazzo        self.require_accelerator("kvm")
52bbbd9b6eSWillian Rampazzo        self.add_common_args()
53bbbd9b6eSWillian Rampazzo        self.vm.add_args("-accel", "kvm")
54bbbd9b6eSWillian Rampazzo
55bbbd9b6eSWillian Rampazzo        if custom_kernel is None:
56bbbd9b6eSWillian Rampazzo            return
57bbbd9b6eSWillian Rampazzo
58bbbd9b6eSWillian Rampazzo        kernel_url = self.distro.pxeboot_url + 'vmlinuz'
599cdafe3bSThomas Huth        kernel_hash = '5b6f6876e1b5bda314f93893271da0d5777b1f3c'
60bbbd9b6eSWillian Rampazzo        initrd_url = self.distro.pxeboot_url + 'initrd.img'
619cdafe3bSThomas Huth        initrd_hash = 'dd0340a1b39bd28f88532babd4581c67649ec5b1'
629cdafe3bSThomas Huth        self.kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
639cdafe3bSThomas Huth        self.initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
64bbbd9b6eSWillian Rampazzo
65bbbd9b6eSWillian Rampazzo    def run_and_check(self):
66bbbd9b6eSWillian Rampazzo        if self.kernel_path:
67bbbd9b6eSWillian Rampazzo            self.vm.add_args('-kernel', self.kernel_path,
68bbbd9b6eSWillian Rampazzo                             '-append', self.kernel_params,
69bbbd9b6eSWillian Rampazzo                             '-initrd', self.initrd_path)
70bbbd9b6eSWillian Rampazzo        self.launch_and_wait()
71bbbd9b6eSWillian Rampazzo        self.ssh_command('cat /proc/cmdline')
72bbbd9b6eSWillian Rampazzo        self.ssh_command('dmesg | grep -e DMAR -e IOMMU')
73bbbd9b6eSWillian Rampazzo        self.ssh_command('find /sys/kernel/iommu_groups/ -type l')
74bbbd9b6eSWillian Rampazzo        self.ssh_command('dnf -y install numactl-devel')
75bbbd9b6eSWillian Rampazzo
76bbbd9b6eSWillian Rampazzo    def test_intel_iommu(self):
77bbbd9b6eSWillian Rampazzo        """
78bbbd9b6eSWillian Rampazzo        :avocado: tags=intel_iommu_intremap
79bbbd9b6eSWillian Rampazzo        """
80bbbd9b6eSWillian Rampazzo
81bbbd9b6eSWillian Rampazzo        self.common_vm_setup(True)
82bbbd9b6eSWillian Rampazzo        self.vm.add_args('-device', 'intel-iommu,intremap=on')
83bbbd9b6eSWillian Rampazzo        self.vm.add_args('-machine', 'kernel_irqchip=split')
84bbbd9b6eSWillian Rampazzo
85bbbd9b6eSWillian Rampazzo        self.kernel_params = (self.distro.default_kernel_params +
86bbbd9b6eSWillian Rampazzo                              ' quiet intel_iommu=on')
87bbbd9b6eSWillian Rampazzo        self.run_and_check()
88bbbd9b6eSWillian Rampazzo
89bbbd9b6eSWillian Rampazzo    def test_intel_iommu_strict(self):
90bbbd9b6eSWillian Rampazzo        """
91bbbd9b6eSWillian Rampazzo        :avocado: tags=intel_iommu_strict
92bbbd9b6eSWillian Rampazzo        """
93bbbd9b6eSWillian Rampazzo
94bbbd9b6eSWillian Rampazzo        self.common_vm_setup(True)
95bbbd9b6eSWillian Rampazzo        self.vm.add_args('-device', 'intel-iommu,intremap=on')
96bbbd9b6eSWillian Rampazzo        self.vm.add_args('-machine', 'kernel_irqchip=split')
97bbbd9b6eSWillian Rampazzo        self.kernel_params = (self.distro.default_kernel_params +
98bbbd9b6eSWillian Rampazzo                              ' quiet intel_iommu=on,strict')
99bbbd9b6eSWillian Rampazzo        self.run_and_check()
100bbbd9b6eSWillian Rampazzo
101bbbd9b6eSWillian Rampazzo    def test_intel_iommu_strict_cm(self):
102bbbd9b6eSWillian Rampazzo        """
103bbbd9b6eSWillian Rampazzo        :avocado: tags=intel_iommu_strict_cm
104bbbd9b6eSWillian Rampazzo        """
105bbbd9b6eSWillian Rampazzo
106bbbd9b6eSWillian Rampazzo        self.common_vm_setup(True)
107bbbd9b6eSWillian Rampazzo        self.vm.add_args('-device', 'intel-iommu,intremap=on,caching-mode=on')
108bbbd9b6eSWillian Rampazzo        self.vm.add_args('-machine', 'kernel_irqchip=split')
109bbbd9b6eSWillian Rampazzo        self.kernel_params = (self.distro.default_kernel_params +
110bbbd9b6eSWillian Rampazzo                              ' quiet intel_iommu=on,strict')
111bbbd9b6eSWillian Rampazzo        self.run_and_check()
112bbbd9b6eSWillian Rampazzo
113bbbd9b6eSWillian Rampazzo    def test_intel_iommu_pt(self):
114bbbd9b6eSWillian Rampazzo        """
115bbbd9b6eSWillian Rampazzo        :avocado: tags=intel_iommu_pt
116bbbd9b6eSWillian Rampazzo        """
117bbbd9b6eSWillian Rampazzo
118bbbd9b6eSWillian Rampazzo        self.common_vm_setup(True)
119bbbd9b6eSWillian Rampazzo        self.vm.add_args('-device', 'intel-iommu,intremap=on')
120bbbd9b6eSWillian Rampazzo        self.vm.add_args('-machine', 'kernel_irqchip=split')
121bbbd9b6eSWillian Rampazzo        self.kernel_params = (self.distro.default_kernel_params +
122bbbd9b6eSWillian Rampazzo                              ' quiet intel_iommu=on iommu=pt')
123bbbd9b6eSWillian Rampazzo        self.run_and_check()
124