1bbbd9b6eSWillian Rampazzo# Functional tests for the MIPS Malta board 2bbbd9b6eSWillian Rampazzo# 3bbbd9b6eSWillian Rampazzo# Copyright (c) Philippe Mathieu-Daudé <f4bug@amsat.org> 4bbbd9b6eSWillian Rampazzo# 5bbbd9b6eSWillian Rampazzo# This work is licensed under the terms of the GNU GPL, version 2 or later. 6bbbd9b6eSWillian Rampazzo# See the COPYING file in the top-level directory. 7bbbd9b6eSWillian Rampazzo# 8bbbd9b6eSWillian Rampazzo# SPDX-License-Identifier: GPL-2.0-or-later 9bbbd9b6eSWillian Rampazzo 10bbbd9b6eSWillian Rampazzoimport os 11bbbd9b6eSWillian Rampazzoimport gzip 12bbbd9b6eSWillian Rampazzoimport logging 13bbbd9b6eSWillian Rampazzo 14bbbd9b6eSWillian Rampazzofrom avocado import skipIf 15*14c2b184SPhilippe Mathieu-Daudéfrom avocado import skipUnless 16*14c2b184SPhilippe Mathieu-Daudéfrom avocado.utils import archive 17*14c2b184SPhilippe Mathieu-Daudéfrom avocado_qemu import QemuSystemTest 18*14c2b184SPhilippe Mathieu-Daudéfrom avocado_qemu import exec_command_and_wait_for_pattern 19*14c2b184SPhilippe Mathieu-Daudéfrom avocado_qemu import interrupt_interactive_console_until_pattern 20*14c2b184SPhilippe Mathieu-Daudéfrom avocado_qemu import wait_for_console_pattern 21bbbd9b6eSWillian Rampazzo 22bbbd9b6eSWillian Rampazzo 23bbbd9b6eSWillian RampazzoNUMPY_AVAILABLE = True 24bbbd9b6eSWillian Rampazzotry: 25bbbd9b6eSWillian Rampazzo import numpy as np 26bbbd9b6eSWillian Rampazzoexcept ImportError: 27bbbd9b6eSWillian Rampazzo NUMPY_AVAILABLE = False 28bbbd9b6eSWillian Rampazzo 29bbbd9b6eSWillian RampazzoCV2_AVAILABLE = True 30bbbd9b6eSWillian Rampazzotry: 31bbbd9b6eSWillian Rampazzo import cv2 32bbbd9b6eSWillian Rampazzoexcept ImportError: 33bbbd9b6eSWillian Rampazzo CV2_AVAILABLE = False 34bbbd9b6eSWillian Rampazzo 35bbbd9b6eSWillian Rampazzo 36bbbd9b6eSWillian Rampazzo@skipUnless(NUMPY_AVAILABLE, 'Python NumPy not installed') 37bbbd9b6eSWillian Rampazzo@skipUnless(CV2_AVAILABLE, 'Python OpenCV not installed') 382283b627SPhilippe Mathieu-Daudéclass MaltaMachineFramebuffer(QemuSystemTest): 39bbbd9b6eSWillian Rampazzo 40bbbd9b6eSWillian Rampazzo timeout = 30 41bbbd9b6eSWillian Rampazzo 42bbbd9b6eSWillian Rampazzo KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 ' 43bbbd9b6eSWillian Rampazzo 44bbbd9b6eSWillian Rampazzo def do_test_i6400_framebuffer_logo(self, cpu_cores_count): 45bbbd9b6eSWillian Rampazzo """ 46bbbd9b6eSWillian Rampazzo Boot Linux kernel and check Tux logo is displayed on the framebuffer. 47bbbd9b6eSWillian Rampazzo """ 48bbbd9b6eSWillian Rampazzo screendump_path = os.path.join(self.workdir, 'screendump.pbm') 49bbbd9b6eSWillian Rampazzo 50bbbd9b6eSWillian Rampazzo kernel_url = ('https://github.com/philmd/qemu-testing-blob/raw/' 51bbbd9b6eSWillian Rampazzo 'a5966ca4b5/mips/malta/mips64el/' 52bbbd9b6eSWillian Rampazzo 'vmlinux-4.7.0-rc1.I6400.gz') 53bbbd9b6eSWillian Rampazzo kernel_hash = '096f50c377ec5072e6a366943324622c312045f6' 54bbbd9b6eSWillian Rampazzo kernel_path_gz = self.fetch_asset(kernel_url, asset_hash=kernel_hash) 55bbbd9b6eSWillian Rampazzo kernel_path = self.workdir + "vmlinux" 56bbbd9b6eSWillian Rampazzo archive.gzip_uncompress(kernel_path_gz, kernel_path) 57bbbd9b6eSWillian Rampazzo 58bbbd9b6eSWillian Rampazzo tuxlogo_url = ('https://github.com/torvalds/linux/raw/v2.6.12/' 59bbbd9b6eSWillian Rampazzo 'drivers/video/logo/logo_linux_vga16.ppm') 60bbbd9b6eSWillian Rampazzo tuxlogo_hash = '3991c2ddbd1ddaecda7601f8aafbcf5b02dc86af' 61bbbd9b6eSWillian Rampazzo tuxlogo_path = self.fetch_asset(tuxlogo_url, asset_hash=tuxlogo_hash) 62bbbd9b6eSWillian Rampazzo 63bbbd9b6eSWillian Rampazzo self.vm.set_console() 64bbbd9b6eSWillian Rampazzo kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 65bbbd9b6eSWillian Rampazzo 'clocksource=GIC console=tty0 console=ttyS0') 66bbbd9b6eSWillian Rampazzo self.vm.add_args('-kernel', kernel_path, 67bbbd9b6eSWillian Rampazzo '-smp', '%u' % cpu_cores_count, 68bbbd9b6eSWillian Rampazzo '-vga', 'std', 69bbbd9b6eSWillian Rampazzo '-append', kernel_command_line) 70bbbd9b6eSWillian Rampazzo self.vm.launch() 71bbbd9b6eSWillian Rampazzo framebuffer_ready = 'Console: switching to colour frame buffer device' 72bbbd9b6eSWillian Rampazzo wait_for_console_pattern(self, framebuffer_ready, 73bbbd9b6eSWillian Rampazzo failure_message='Kernel panic - not syncing') 74bbbd9b6eSWillian Rampazzo self.vm.command('human-monitor-command', command_line='stop') 75bbbd9b6eSWillian Rampazzo self.vm.command('human-monitor-command', 76bbbd9b6eSWillian Rampazzo command_line='screendump %s' % screendump_path) 77bbbd9b6eSWillian Rampazzo logger = logging.getLogger('framebuffer') 78bbbd9b6eSWillian Rampazzo 79bbbd9b6eSWillian Rampazzo match_threshold = 0.95 80bbbd9b6eSWillian Rampazzo screendump_bgr = cv2.imread(screendump_path, cv2.IMREAD_COLOR) 81bbbd9b6eSWillian Rampazzo tuxlogo_bgr = cv2.imread(tuxlogo_path, cv2.IMREAD_COLOR) 82bbbd9b6eSWillian Rampazzo result = cv2.matchTemplate(screendump_bgr, tuxlogo_bgr, 83bbbd9b6eSWillian Rampazzo cv2.TM_CCOEFF_NORMED) 84bbbd9b6eSWillian Rampazzo loc = np.where(result >= match_threshold) 85bbbd9b6eSWillian Rampazzo tuxlogo_count = 0 86bbbd9b6eSWillian Rampazzo h, w = tuxlogo_bgr.shape[:2] 87bbbd9b6eSWillian Rampazzo debug_png = os.getenv('AVOCADO_CV2_SCREENDUMP_PNG_PATH') 88bbbd9b6eSWillian Rampazzo for tuxlogo_count, pt in enumerate(zip(*loc[::-1]), start=1): 89bbbd9b6eSWillian Rampazzo logger.debug('found Tux at position (x, y) = %s', pt) 90bbbd9b6eSWillian Rampazzo cv2.rectangle(screendump_bgr, pt, 91bbbd9b6eSWillian Rampazzo (pt[0] + w, pt[1] + h), (0, 0, 255), 2) 92bbbd9b6eSWillian Rampazzo if debug_png: 93bbbd9b6eSWillian Rampazzo cv2.imwrite(debug_png, screendump_bgr) 94bbbd9b6eSWillian Rampazzo self.assertGreaterEqual(tuxlogo_count, cpu_cores_count) 95bbbd9b6eSWillian Rampazzo 96bbbd9b6eSWillian Rampazzo def test_mips_malta_i6400_framebuffer_logo_1core(self): 97bbbd9b6eSWillian Rampazzo """ 98bbbd9b6eSWillian Rampazzo :avocado: tags=arch:mips64el 99bbbd9b6eSWillian Rampazzo :avocado: tags=machine:malta 100bbbd9b6eSWillian Rampazzo :avocado: tags=cpu:I6400 101bbbd9b6eSWillian Rampazzo """ 102bbbd9b6eSWillian Rampazzo self.do_test_i6400_framebuffer_logo(1) 103bbbd9b6eSWillian Rampazzo 104bbbd9b6eSWillian Rampazzo @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab') 105bbbd9b6eSWillian Rampazzo def test_mips_malta_i6400_framebuffer_logo_7cores(self): 106bbbd9b6eSWillian Rampazzo """ 107bbbd9b6eSWillian Rampazzo :avocado: tags=arch:mips64el 108bbbd9b6eSWillian Rampazzo :avocado: tags=machine:malta 109bbbd9b6eSWillian Rampazzo :avocado: tags=cpu:I6400 110bbbd9b6eSWillian Rampazzo :avocado: tags=mips:smp 111bbbd9b6eSWillian Rampazzo """ 112bbbd9b6eSWillian Rampazzo self.do_test_i6400_framebuffer_logo(7) 113bbbd9b6eSWillian Rampazzo 114bbbd9b6eSWillian Rampazzo @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab') 115bbbd9b6eSWillian Rampazzo def test_mips_malta_i6400_framebuffer_logo_8cores(self): 116bbbd9b6eSWillian Rampazzo """ 117bbbd9b6eSWillian Rampazzo :avocado: tags=arch:mips64el 118bbbd9b6eSWillian Rampazzo :avocado: tags=machine:malta 119bbbd9b6eSWillian Rampazzo :avocado: tags=cpu:I6400 120bbbd9b6eSWillian Rampazzo :avocado: tags=mips:smp 121bbbd9b6eSWillian Rampazzo """ 122bbbd9b6eSWillian Rampazzo self.do_test_i6400_framebuffer_logo(8) 123*14c2b184SPhilippe Mathieu-Daudé 124*14c2b184SPhilippe Mathieu-Daudéclass MaltaMachine(QemuSystemTest): 125*14c2b184SPhilippe Mathieu-Daudé 126*14c2b184SPhilippe Mathieu-Daudé def do_test_yamon(self): 127*14c2b184SPhilippe Mathieu-Daudé rom_url = ('http://www.imgtec.com/tools/mips-tools/downloads/' 128*14c2b184SPhilippe Mathieu-Daudé 'yamon/yamon-bin-02.22.zip') 129*14c2b184SPhilippe Mathieu-Daudé rom_hash = '8da7ecddbc5312704b8b324341ee238189bde480' 130*14c2b184SPhilippe Mathieu-Daudé zip_path = self.fetch_asset(rom_url, asset_hash=rom_hash) 131*14c2b184SPhilippe Mathieu-Daudé 132*14c2b184SPhilippe Mathieu-Daudé archive.extract(zip_path, self.workdir) 133*14c2b184SPhilippe Mathieu-Daudé yamon_path = os.path.join(self.workdir, 'yamon-02.22.bin') 134*14c2b184SPhilippe Mathieu-Daudé 135*14c2b184SPhilippe Mathieu-Daudé self.vm.set_console() 136*14c2b184SPhilippe Mathieu-Daudé self.vm.add_args('-bios', yamon_path) 137*14c2b184SPhilippe Mathieu-Daudé self.vm.launch() 138*14c2b184SPhilippe Mathieu-Daudé 139*14c2b184SPhilippe Mathieu-Daudé prompt = 'YAMON>' 140*14c2b184SPhilippe Mathieu-Daudé pattern = 'YAMON ROM Monitor' 141*14c2b184SPhilippe Mathieu-Daudé interrupt_interactive_console_until_pattern(self, pattern, prompt) 142*14c2b184SPhilippe Mathieu-Daudé wait_for_console_pattern(self, prompt) 143*14c2b184SPhilippe Mathieu-Daudé self.vm.shutdown() 144*14c2b184SPhilippe Mathieu-Daudé 145*14c2b184SPhilippe Mathieu-Daudé def test_mipsel_malta_yamon(self): 146*14c2b184SPhilippe Mathieu-Daudé """ 147*14c2b184SPhilippe Mathieu-Daudé :avocado: tags=arch:mipsel 148*14c2b184SPhilippe Mathieu-Daudé :avocado: tags=machine:malta 149*14c2b184SPhilippe Mathieu-Daudé :avocado: tags=endian:little 150*14c2b184SPhilippe Mathieu-Daudé """ 151*14c2b184SPhilippe Mathieu-Daudé self.do_test_yamon() 152*14c2b184SPhilippe Mathieu-Daudé 153*14c2b184SPhilippe Mathieu-Daudé def test_mips64el_malta_yamon(self): 154*14c2b184SPhilippe Mathieu-Daudé """ 155*14c2b184SPhilippe Mathieu-Daudé :avocado: tags=arch:mips64el 156*14c2b184SPhilippe Mathieu-Daudé :avocado: tags=machine:malta 157*14c2b184SPhilippe Mathieu-Daudé :avocado: tags=endian:little 158*14c2b184SPhilippe Mathieu-Daudé """ 159*14c2b184SPhilippe Mathieu-Daudé self.do_test_yamon() 160