1fcf2658bSPhilippe Mathieu-Daudé#!/usr/bin/env python3 2fcf2658bSPhilippe Mathieu-Daudé# 3fcf2658bSPhilippe Mathieu-Daudé# Functional tests for the little-endian 64-bit MIPS Malta board 4fcf2658bSPhilippe Mathieu-Daudé# 5fcf2658bSPhilippe Mathieu-Daudé# Copyright (c) Philippe Mathieu-Daudé <f4bug@amsat.org> 6fcf2658bSPhilippe Mathieu-Daudé# 7fcf2658bSPhilippe Mathieu-Daudé# This work is licensed under the terms of the GNU GPL, version 2 or later. 8fcf2658bSPhilippe Mathieu-Daudé# See the COPYING file in the top-level directory. 9fcf2658bSPhilippe Mathieu-Daudé# 10fcf2658bSPhilippe Mathieu-Daudé# SPDX-License-Identifier: GPL-2.0-or-later 11fcf2658bSPhilippe Mathieu-Daudé 12fcf2658bSPhilippe Mathieu-Daudéimport os 13fcf2658bSPhilippe Mathieu-Daudéimport logging 14fcf2658bSPhilippe Mathieu-Daudé 15fcf2658bSPhilippe Mathieu-Daudéfrom qemu_test import LinuxKernelTest, Asset 16fcf2658bSPhilippe Mathieu-Daudéfrom qemu_test import exec_command_and_wait_for_pattern 173d593860SDaniel P. Berrangéfrom qemu_test import skipIfMissingImports, skipFlakyTest, skipUntrustedTest 18fcf2658bSPhilippe Mathieu-Daudé 198e3461c3SThomas Huthfrom test_mips_malta import mips_check_wheezy 208e3461c3SThomas Huth 21fcf2658bSPhilippe Mathieu-Daudé 22a4b60becSPhilippe Mathieu-Daudéclass MaltaMachineConsole(LinuxKernelTest): 230e165dfcSPhilippe Mathieu-Daudé 240e165dfcSPhilippe Mathieu-Daudé ASSET_KERNEL_2_63_2 = Asset( 250e165dfcSPhilippe Mathieu-Daudé ('http://snapshot.debian.org/archive/debian/' 260e165dfcSPhilippe Mathieu-Daudé '20130217T032700Z/pool/main/l/linux-2.6/' 270e165dfcSPhilippe Mathieu-Daudé 'linux-image-2.6.32-5-5kc-malta_2.6.32-48_mipsel.deb'), 280e165dfcSPhilippe Mathieu-Daudé '35eb476f03be589824b0310358f1c447d85e645b88cbcd2ac02b97ef560f9f8d') 290e165dfcSPhilippe Mathieu-Daudé 300e165dfcSPhilippe Mathieu-Daudé def test_mips64el_malta(self): 310e165dfcSPhilippe Mathieu-Daudé """ 320e165dfcSPhilippe Mathieu-Daudé This test requires the ar tool to extract "data.tar.gz" from 330e165dfcSPhilippe Mathieu-Daudé the Debian package. 340e165dfcSPhilippe Mathieu-Daudé 350e165dfcSPhilippe Mathieu-Daudé The kernel can be rebuilt using this Debian kernel source [1] and 360e165dfcSPhilippe Mathieu-Daudé following the instructions on [2]. 370e165dfcSPhilippe Mathieu-Daudé 380e165dfcSPhilippe Mathieu-Daudé [1] http://snapshot.debian.org/package/linux-2.6/2.6.32-48/ 390e165dfcSPhilippe Mathieu-Daudé #linux-source-2.6.32_2.6.32-48 400e165dfcSPhilippe Mathieu-Daudé [2] https://kernel-team.pages.debian.net/kernel-handbook/ 410e165dfcSPhilippe Mathieu-Daudé ch-common-tasks.html#s-common-official 420e165dfcSPhilippe Mathieu-Daudé """ 435831ed84SDaniel P. Berrangé kernel_path = self.archive_extract( 445831ed84SDaniel P. Berrangé self.ASSET_KERNEL_2_63_2, 455831ed84SDaniel P. Berrangé member='boot/vmlinux-2.6.32-5-5kc-malta') 460e165dfcSPhilippe Mathieu-Daudé 470e165dfcSPhilippe Mathieu-Daudé self.set_machine('malta') 480e165dfcSPhilippe Mathieu-Daudé self.vm.set_console() 49a4b60becSPhilippe Mathieu-Daudé kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0' 500e165dfcSPhilippe Mathieu-Daudé self.vm.add_args('-kernel', kernel_path, 510e165dfcSPhilippe Mathieu-Daudé '-append', kernel_command_line) 520e165dfcSPhilippe Mathieu-Daudé self.vm.launch() 530e165dfcSPhilippe Mathieu-Daudé console_pattern = 'Kernel command line: %s' % kernel_command_line 54a4b60becSPhilippe Mathieu-Daudé self.wait_for_console_pattern(console_pattern) 550e165dfcSPhilippe Mathieu-Daudé 560e165dfcSPhilippe Mathieu-Daudé ASSET_KERNEL_3_19_3 = Asset( 570e165dfcSPhilippe Mathieu-Daudé ('https://github.com/philmd/qemu-testing-blob/' 580e165dfcSPhilippe Mathieu-Daudé 'raw/9ad2df38/mips/malta/mips64el/' 590e165dfcSPhilippe Mathieu-Daudé 'vmlinux-3.19.3.mtoman.20150408'), 600e165dfcSPhilippe Mathieu-Daudé '8d3beb003bc66051ead98e7172139017fcf9ce2172576541c57e86418dfa5ab8') 610e165dfcSPhilippe Mathieu-Daudé 620e165dfcSPhilippe Mathieu-Daudé ASSET_CPIO_R1 = Asset( 630e165dfcSPhilippe Mathieu-Daudé ('https://github.com/groeck/linux-build-test/' 640e165dfcSPhilippe Mathieu-Daudé 'raw/8584a59e/rootfs/mipsel64/' 650e165dfcSPhilippe Mathieu-Daudé 'rootfs.mipsel64r1.cpio.gz'), 660e165dfcSPhilippe Mathieu-Daudé '75ba10cd35fb44e32948eeb26974f061b703c81c4ba2fab1ebcacf1d1bec3b61') 670e165dfcSPhilippe Mathieu-Daudé 683d593860SDaniel P. Berrangé @skipUntrustedTest() 690e165dfcSPhilippe Mathieu-Daudé def test_mips64el_malta_5KEc_cpio(self): 700e165dfcSPhilippe Mathieu-Daudé kernel_path = self.ASSET_KERNEL_3_19_3.fetch() 7165d35a4eSDaniel P. Berrangé initrd_path = self.uncompress(self.ASSET_CPIO_R1) 720e165dfcSPhilippe Mathieu-Daudé 730e165dfcSPhilippe Mathieu-Daudé self.set_machine('malta') 740e165dfcSPhilippe Mathieu-Daudé self.vm.set_console() 75a4b60becSPhilippe Mathieu-Daudé kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE 760e165dfcSPhilippe Mathieu-Daudé + 'console=ttyS0 console=tty ' 770e165dfcSPhilippe Mathieu-Daudé + 'rdinit=/sbin/init noreboot') 780e165dfcSPhilippe Mathieu-Daudé self.vm.add_args('-cpu', '5KEc', 790e165dfcSPhilippe Mathieu-Daudé '-kernel', kernel_path, 800e165dfcSPhilippe Mathieu-Daudé '-initrd', initrd_path, 810e165dfcSPhilippe Mathieu-Daudé '-append', kernel_command_line, 820e165dfcSPhilippe Mathieu-Daudé '-no-reboot') 830e165dfcSPhilippe Mathieu-Daudé self.vm.launch() 84a4b60becSPhilippe Mathieu-Daudé self.wait_for_console_pattern('Boot successful.') 850e165dfcSPhilippe Mathieu-Daudé 860e165dfcSPhilippe Mathieu-Daudé exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo', 870e165dfcSPhilippe Mathieu-Daudé 'MIPS 5KE') 880e165dfcSPhilippe Mathieu-Daudé exec_command_and_wait_for_pattern(self, 'uname -a', 890e165dfcSPhilippe Mathieu-Daudé '3.19.3.mtoman.20150408') 900e165dfcSPhilippe Mathieu-Daudé exec_command_and_wait_for_pattern(self, 'reboot', 910e165dfcSPhilippe Mathieu-Daudé 'reboot: Restarting system') 920e165dfcSPhilippe Mathieu-Daudé # Wait for VM to shut down gracefully 930e165dfcSPhilippe Mathieu-Daudé self.vm.wait() 940e165dfcSPhilippe Mathieu-Daudé 958e3461c3SThomas Huth ASSET_WHEEZY_KERNEL = Asset( 968e3461c3SThomas Huth ('https://people.debian.org/~aurel32/qemu/mipsel/' 978e3461c3SThomas Huth 'vmlinux-3.2.0-4-5kc-malta'), 988e3461c3SThomas Huth '5e8b725244c59745bb8b64f5d8f49f25fecfa549f3395fb6d19a3b9e5065b85b') 998e3461c3SThomas Huth 1008e3461c3SThomas Huth ASSET_WHEEZY_DISK = Asset( 1018e3461c3SThomas Huth ('https://people.debian.org/~aurel32/qemu/mipsel/' 1028e3461c3SThomas Huth 'debian_wheezy_mipsel_standard.qcow2'), 1038e3461c3SThomas Huth '454f09ae39f7e6461c84727b927100d2c7813841f2a0a5dce328114887ecf914') 1048e3461c3SThomas Huth 1058e3461c3SThomas Huth def test_wheezy(self): 1068e3461c3SThomas Huth kernel_path = self.ASSET_WHEEZY_KERNEL.fetch() 1078e3461c3SThomas Huth image_path = self.ASSET_WHEEZY_DISK.fetch() 1088e3461c3SThomas Huth kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE 1098e3461c3SThomas Huth + 'console=ttyS0 root=/dev/sda1') 1108e3461c3SThomas Huth mips_check_wheezy(self, 1118e3461c3SThomas Huth kernel_path, image_path, kernel_command_line, cpuinfo='MIPS 20Kc', 1128e3461c3SThomas Huth dl_file='/boot/initrd.img-3.2.0-4-5kc-malta', 1138e3461c3SThomas Huth hsum='7579f8b56c1187c7c04d0dc3c0c56c7a6314c5ddd3a9bf8803ecc7cf8a3be9f8') 1148e3461c3SThomas Huth 1150e165dfcSPhilippe Mathieu-Daudé 1163d593860SDaniel P. Berrangé@skipIfMissingImports('numpy', 'cv2') 117fcf2658bSPhilippe Mathieu-Daudéclass MaltaMachineFramebuffer(LinuxKernelTest): 118fcf2658bSPhilippe Mathieu-Daudé 119fcf2658bSPhilippe Mathieu-Daudé timeout = 30 120fcf2658bSPhilippe Mathieu-Daudé 121fcf2658bSPhilippe Mathieu-Daudé ASSET_KERNEL_4_7_0 = Asset( 122fcf2658bSPhilippe Mathieu-Daudé ('https://github.com/philmd/qemu-testing-blob/raw/a5966ca4b5/' 123fcf2658bSPhilippe Mathieu-Daudé 'mips/malta/mips64el/vmlinux-4.7.0-rc1.I6400.gz'), 124fcf2658bSPhilippe Mathieu-Daudé '1f64efc59968a3c328672e6b10213fe574bb2308d9d2ed44e75e40be59e9fbc2') 125fcf2658bSPhilippe Mathieu-Daudé 126fcf2658bSPhilippe Mathieu-Daudé ASSET_TUXLOGO = Asset( 127fcf2658bSPhilippe Mathieu-Daudé ('https://github.com/torvalds/linux/raw/v2.6.12/' 128fcf2658bSPhilippe Mathieu-Daudé 'drivers/video/logo/logo_linux_vga16.ppm'), 129fcf2658bSPhilippe Mathieu-Daudé 'b762f0d91ec018887ad1b334543c2fdf9be9fdfc87672b409211efaa3ea0ef79') 130fcf2658bSPhilippe Mathieu-Daudé 131fcf2658bSPhilippe Mathieu-Daudé def do_test_i6400_framebuffer_logo(self, cpu_cores_count): 132fcf2658bSPhilippe Mathieu-Daudé """ 133fcf2658bSPhilippe Mathieu-Daudé Boot Linux kernel and check Tux logo is displayed on the framebuffer. 134fcf2658bSPhilippe Mathieu-Daudé """ 1353d593860SDaniel P. Berrangé 1363d593860SDaniel P. Berrangé import numpy as np 1373d593860SDaniel P. Berrangé import cv2 1383d593860SDaniel P. Berrangé 139beaf88c8SDaniel P. Berrangé screendump_path = self.scratch_file('screendump.pbm') 140fcf2658bSPhilippe Mathieu-Daudé 14165d35a4eSDaniel P. Berrangé kernel_path = self.uncompress(self.ASSET_KERNEL_4_7_0) 142fcf2658bSPhilippe Mathieu-Daudé 143fcf2658bSPhilippe Mathieu-Daudé tuxlogo_path = self.ASSET_TUXLOGO.fetch() 144fcf2658bSPhilippe Mathieu-Daudé 145fcf2658bSPhilippe Mathieu-Daudé self.set_machine('malta') 146fcf2658bSPhilippe Mathieu-Daudé self.vm.set_console() 147fcf2658bSPhilippe Mathieu-Daudé kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 148fcf2658bSPhilippe Mathieu-Daudé 'clocksource=GIC console=tty0 console=ttyS0') 149fcf2658bSPhilippe Mathieu-Daudé self.vm.add_args('-kernel', kernel_path, 150fcf2658bSPhilippe Mathieu-Daudé '-cpu', 'I6400', 151fcf2658bSPhilippe Mathieu-Daudé '-smp', '%u' % cpu_cores_count, 152fcf2658bSPhilippe Mathieu-Daudé '-vga', 'std', 153fcf2658bSPhilippe Mathieu-Daudé '-append', kernel_command_line) 154fcf2658bSPhilippe Mathieu-Daudé self.vm.launch() 155fcf2658bSPhilippe Mathieu-Daudé framebuffer_ready = 'Console: switching to colour frame buffer device' 156fcf2658bSPhilippe Mathieu-Daudé self.wait_for_console_pattern(framebuffer_ready) 157fcf2658bSPhilippe Mathieu-Daudé self.vm.cmd('human-monitor-command', command_line='stop') 158*c23d3339SThomas Huth res = self.vm.cmd('human-monitor-command', 159fcf2658bSPhilippe Mathieu-Daudé command_line='screendump %s' % screendump_path) 160*c23d3339SThomas Huth if 'unknown command' in res: 161*c23d3339SThomas Huth self.skipTest('screendump not available') 162fcf2658bSPhilippe Mathieu-Daudé logger = logging.getLogger('framebuffer') 163fcf2658bSPhilippe Mathieu-Daudé 164fcf2658bSPhilippe Mathieu-Daudé match_threshold = 0.95 165fcf2658bSPhilippe Mathieu-Daudé screendump_bgr = cv2.imread(screendump_path, cv2.IMREAD_COLOR) 166fcf2658bSPhilippe Mathieu-Daudé tuxlogo_bgr = cv2.imread(tuxlogo_path, cv2.IMREAD_COLOR) 167fcf2658bSPhilippe Mathieu-Daudé result = cv2.matchTemplate(screendump_bgr, tuxlogo_bgr, 168fcf2658bSPhilippe Mathieu-Daudé cv2.TM_CCOEFF_NORMED) 169fcf2658bSPhilippe Mathieu-Daudé loc = np.where(result >= match_threshold) 170fcf2658bSPhilippe Mathieu-Daudé tuxlogo_count = 0 171fcf2658bSPhilippe Mathieu-Daudé h, w = tuxlogo_bgr.shape[:2] 172b0b5bc2dSDaniel P. Berrangé debug_png = os.getenv('QEMU_TEST_CV2_SCREENDUMP_PNG_PATH') 173fcf2658bSPhilippe Mathieu-Daudé for tuxlogo_count, pt in enumerate(zip(*loc[::-1]), start=1): 174fcf2658bSPhilippe Mathieu-Daudé logger.debug('found Tux at position (x, y) = %s', pt) 175fcf2658bSPhilippe Mathieu-Daudé cv2.rectangle(screendump_bgr, pt, 176fcf2658bSPhilippe Mathieu-Daudé (pt[0] + w, pt[1] + h), (0, 0, 255), 2) 177fcf2658bSPhilippe Mathieu-Daudé if debug_png: 178fcf2658bSPhilippe Mathieu-Daudé cv2.imwrite(debug_png, screendump_bgr) 179fcf2658bSPhilippe Mathieu-Daudé self.assertGreaterEqual(tuxlogo_count, cpu_cores_count) 180fcf2658bSPhilippe Mathieu-Daudé 181fcf2658bSPhilippe Mathieu-Daudé def test_mips_malta_i6400_framebuffer_logo_1core(self): 182fcf2658bSPhilippe Mathieu-Daudé self.do_test_i6400_framebuffer_logo(1) 183fcf2658bSPhilippe Mathieu-Daudé 1843d593860SDaniel P. Berrangé # XXX file tracking bug 1853d593860SDaniel P. Berrangé @skipFlakyTest(bug_url=None) 186fcf2658bSPhilippe Mathieu-Daudé def test_mips_malta_i6400_framebuffer_logo_7cores(self): 187fcf2658bSPhilippe Mathieu-Daudé self.do_test_i6400_framebuffer_logo(7) 188fcf2658bSPhilippe Mathieu-Daudé 1893d593860SDaniel P. Berrangé @skipFlakyTest(bug_url=None) 190fcf2658bSPhilippe Mathieu-Daudé def test_mips_malta_i6400_framebuffer_logo_8cores(self): 191fcf2658bSPhilippe Mathieu-Daudé self.do_test_i6400_framebuffer_logo(8) 192fcf2658bSPhilippe Mathieu-Daudé 193fcf2658bSPhilippe Mathieu-Daudé 194a4b60becSPhilippe Mathieu-Daudéfrom test_mipsel_malta import MaltaMachineYAMON 195a4b60becSPhilippe Mathieu-Daudé 196fcf2658bSPhilippe Mathieu-Daudéif __name__ == '__main__': 197fcf2658bSPhilippe Mathieu-Daudé LinuxKernelTest.main() 198