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 LinuxTest, BUILD_DIR 14 15@skipUnless(os.getenv('QEMU_TEST_FLAKY_TESTS'), 'Test is unstable on GitLab') 16 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 """ 26 27 IOMMU_ADDON = ',iommu_platform=on,disable-modern=off,disable-legacy=on' 28 kernel_path = None 29 initrd_path = None 30 kernel_params = None 31 32 def set_up_boot(self): 33 path = self.download_boot() 34 self.vm.add_args('-device', 'virtio-blk-pci,bus=pcie.0,scsi=off,' + 35 'drive=drv0,id=virtio-disk0,bootindex=1,' 36 'werror=stop,rerror=stop' + self.IOMMU_ADDON) 37 self.vm.add_args('-drive', 38 'file=%s,if=none,cache=writethrough,id=drv0' % path) 39 40 def setUp(self): 41 super(SMMU, self).setUp(None, 'virtio-net-pci' + self.IOMMU_ADDON) 42 43 def common_vm_setup(self, custom_kernel=False): 44 self.require_accelerator("kvm") 45 self.vm.add_args("-accel", "kvm") 46 self.vm.add_args("-cpu", "host") 47 self.vm.add_args("-machine", "iommu=smmuv3") 48 self.vm.add_args("-d", "guest_errors") 49 self.vm.add_args('-bios', os.path.join(BUILD_DIR, 'pc-bios', 50 'edk2-aarch64-code.fd')) 51 self.vm.add_args('-device', 'virtio-rng-pci,rng=rng0') 52 self.vm.add_args('-object', 53 'rng-random,id=rng0,filename=/dev/urandom') 54 55 if custom_kernel is False: 56 return 57 58 kernel_url = self.distro.pxeboot_url + 'vmlinuz' 59 initrd_url = self.distro.pxeboot_url + 'initrd.img' 60 self.kernel_path = self.fetch_asset(kernel_url) 61 self.initrd_path = self.fetch_asset(initrd_url) 62 63 def run_and_check(self): 64 if self.kernel_path: 65 self.vm.add_args('-kernel', self.kernel_path, 66 '-append', self.kernel_params, 67 '-initrd', self.initrd_path) 68 self.launch_and_wait() 69 self.ssh_command('cat /proc/cmdline') 70 self.ssh_command('dnf -y install numactl-devel') 71 72 73 # 5.3 kernel without RIL # 74 75 def test_smmu_noril(self): 76 """ 77 :avocado: tags=smmu_noril 78 :avocado: tags=smmu_noril_tests 79 :avocado: tags=distro_version:31 80 """ 81 self.common_vm_setup() 82 self.run_and_check() 83 84 def test_smmu_noril_passthrough(self): 85 """ 86 :avocado: tags=smmu_noril_passthrough 87 :avocado: tags=smmu_noril_tests 88 :avocado: tags=distro_version:31 89 """ 90 self.common_vm_setup(True) 91 self.kernel_params = (self.distro.default_kernel_params + 92 ' iommu.passthrough=on') 93 self.run_and_check() 94 95 def test_smmu_noril_nostrict(self): 96 """ 97 :avocado: tags=smmu_noril_nostrict 98 :avocado: tags=smmu_noril_tests 99 :avocado: tags=distro_version:31 100 """ 101 self.common_vm_setup(True) 102 self.kernel_params = (self.distro.default_kernel_params + 103 ' iommu.strict=0') 104 self.run_and_check() 105 106 # 5.8 kernel featuring range invalidation 107 # >= v5.7 kernel 108 109 def test_smmu_ril(self): 110 """ 111 :avocado: tags=smmu_ril 112 :avocado: tags=smmu_ril_tests 113 :avocado: tags=distro_version:33 114 """ 115 self.common_vm_setup() 116 self.run_and_check() 117 118 def test_smmu_ril_passthrough(self): 119 """ 120 :avocado: tags=smmu_ril_passthrough 121 :avocado: tags=smmu_ril_tests 122 :avocado: tags=distro_version:33 123 """ 124 self.common_vm_setup(True) 125 self.kernel_params = (self.distro.default_kernel_params + 126 ' iommu.passthrough=on') 127 self.run_and_check() 128 129 def test_smmu_ril_nostrict(self): 130 """ 131 :avocado: tags=smmu_ril_nostrict 132 :avocado: tags=smmu_ril_tests 133 :avocado: tags=distro_version:33 134 """ 135 self.common_vm_setup(True) 136 self.kernel_params = (self.distro.default_kernel_params + 137 ' iommu.strict=0') 138 self.run_and_check() 139