1165ab274SPhilippe Mathieu-Daudé#!/usr/bin/env python3 2165ab274SPhilippe Mathieu-Daudé# 3165ab274SPhilippe Mathieu-Daudé# Functional test that boots a Linux kernel on a Raspberry Pi machine 4165ab274SPhilippe Mathieu-Daudé# and checks the console 5165ab274SPhilippe Mathieu-Daudé# 6165ab274SPhilippe Mathieu-Daudé# Copyright (c) 2019 Philippe Mathieu-Daudé <f4bug@amsat.org> 7165ab274SPhilippe Mathieu-Daudé# 8165ab274SPhilippe Mathieu-Daudé# SPDX-License-Identifier: GPL-2.0-or-later 9165ab274SPhilippe Mathieu-Daudé 10165ab274SPhilippe Mathieu-Daudéfrom qemu_test import LinuxKernelTest, Asset 11165ab274SPhilippe Mathieu-Daudéfrom qemu_test import exec_command_and_wait_for_pattern 12165ab274SPhilippe Mathieu-Daudé 13165ab274SPhilippe Mathieu-Daudé 14165ab274SPhilippe Mathieu-Daudéclass ArmRaspi2Machine(LinuxKernelTest): 15165ab274SPhilippe Mathieu-Daudé 16165ab274SPhilippe Mathieu-Daudé ASSET_KERNEL_20190215 = Asset( 17165ab274SPhilippe Mathieu-Daudé ('http://archive.raspberrypi.org/debian/' 18165ab274SPhilippe Mathieu-Daudé 'pool/main/r/raspberrypi-firmware/' 19165ab274SPhilippe Mathieu-Daudé 'raspberrypi-kernel_1.20190215-1_armhf.deb'), 20165ab274SPhilippe Mathieu-Daudé '9f1759f7228113da24f5ee2aa6312946ec09a83e076aba9406c46ff776dfb291') 21165ab274SPhilippe Mathieu-Daudé 22165ab274SPhilippe Mathieu-Daudé ASSET_INITRD = Asset( 23165ab274SPhilippe Mathieu-Daudé ('https://github.com/groeck/linux-build-test/raw/' 24165ab274SPhilippe Mathieu-Daudé '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/' 25165ab274SPhilippe Mathieu-Daudé 'arm/rootfs-armv7a.cpio.gz'), 26165ab274SPhilippe Mathieu-Daudé '2c8dbdb16ea7af2dfbcbea96044dde639fb07d09fd3c4fb31f2027ef71e55ddd') 27165ab274SPhilippe Mathieu-Daudé 28165ab274SPhilippe Mathieu-Daudé def do_test_arm_raspi2(self, uart_id): 29165ab274SPhilippe Mathieu-Daudé """ 30165ab274SPhilippe Mathieu-Daudé The kernel can be rebuilt using the kernel source referenced 31165ab274SPhilippe Mathieu-Daudé and following the instructions on the on: 32165ab274SPhilippe Mathieu-Daudé https://www.raspberrypi.org/documentation/linux/kernel/building.md 33165ab274SPhilippe Mathieu-Daudé """ 34165ab274SPhilippe Mathieu-Daudé serial_kernel_cmdline = { 35165ab274SPhilippe Mathieu-Daudé 0: 'earlycon=pl011,0x3f201000 console=ttyAMA0', 36165ab274SPhilippe Mathieu-Daudé } 375831ed84SDaniel P. Berrangé kernel_path = self.archive_extract(self.ASSET_KERNEL_20190215, 385831ed84SDaniel P. Berrangé member='boot/kernel7.img') 395831ed84SDaniel P. Berrangé dtb_path = self.archive_extract(self.ASSET_KERNEL_20190215, 405831ed84SDaniel P. Berrangé member='boot/bcm2709-rpi-2-b.dtb') 41165ab274SPhilippe Mathieu-Daudé 42165ab274SPhilippe Mathieu-Daudé self.set_machine('raspi2b') 43165ab274SPhilippe Mathieu-Daudé self.vm.set_console() 44165ab274SPhilippe Mathieu-Daudé kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 45165ab274SPhilippe Mathieu-Daudé serial_kernel_cmdline[uart_id] + 46165ab274SPhilippe Mathieu-Daudé ' root=/dev/mmcblk0p2 rootwait ' + 47165ab274SPhilippe Mathieu-Daudé 'dwc_otg.fiq_fsm_enable=0') 48165ab274SPhilippe Mathieu-Daudé self.vm.add_args('-kernel', kernel_path, 49165ab274SPhilippe Mathieu-Daudé '-dtb', dtb_path, 50165ab274SPhilippe Mathieu-Daudé '-append', kernel_command_line, 51165ab274SPhilippe Mathieu-Daudé '-device', 'usb-kbd') 52165ab274SPhilippe Mathieu-Daudé self.vm.launch() 53165ab274SPhilippe Mathieu-Daudé 54165ab274SPhilippe Mathieu-Daudé console_pattern = 'Kernel command line: %s' % kernel_command_line 55165ab274SPhilippe Mathieu-Daudé self.wait_for_console_pattern(console_pattern) 56165ab274SPhilippe Mathieu-Daudé self.wait_for_console_pattern('Product: QEMU USB Keyboard') 57165ab274SPhilippe Mathieu-Daudé 58165ab274SPhilippe Mathieu-Daudé def test_arm_raspi2_uart0(self): 59165ab274SPhilippe Mathieu-Daudé self.do_test_arm_raspi2(0) 60165ab274SPhilippe Mathieu-Daudé 61165ab274SPhilippe Mathieu-Daudé def test_arm_raspi2_initrd(self): 625831ed84SDaniel P. Berrangé kernel_path = self.archive_extract(self.ASSET_KERNEL_20190215, 635831ed84SDaniel P. Berrangé member='boot/kernel7.img') 645831ed84SDaniel P. Berrangé dtb_path = self.archive_extract(self.ASSET_KERNEL_20190215, 655831ed84SDaniel P. Berrangé member='boot/bcm2709-rpi-2-b.dtb') 66*65d35a4eSDaniel P. Berrangé initrd_path = self.uncompress(self.ASSET_INITRD) 67165ab274SPhilippe Mathieu-Daudé 68165ab274SPhilippe Mathieu-Daudé self.set_machine('raspi2b') 69165ab274SPhilippe Mathieu-Daudé self.vm.set_console() 70165ab274SPhilippe Mathieu-Daudé kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 71165ab274SPhilippe Mathieu-Daudé 'earlycon=pl011,0x3f201000 console=ttyAMA0 ' 72165ab274SPhilippe Mathieu-Daudé 'panic=-1 noreboot ' + 73165ab274SPhilippe Mathieu-Daudé 'dwc_otg.fiq_fsm_enable=0') 74165ab274SPhilippe Mathieu-Daudé self.vm.add_args('-kernel', kernel_path, 75165ab274SPhilippe Mathieu-Daudé '-dtb', dtb_path, 76165ab274SPhilippe Mathieu-Daudé '-initrd', initrd_path, 77165ab274SPhilippe Mathieu-Daudé '-append', kernel_command_line, 78165ab274SPhilippe Mathieu-Daudé '-no-reboot') 79165ab274SPhilippe Mathieu-Daudé self.vm.launch() 80165ab274SPhilippe Mathieu-Daudé self.wait_for_console_pattern('Boot successful.') 81165ab274SPhilippe Mathieu-Daudé 82165ab274SPhilippe Mathieu-Daudé exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo', 83165ab274SPhilippe Mathieu-Daudé 'BCM2835') 84165ab274SPhilippe Mathieu-Daudé exec_command_and_wait_for_pattern(self, 'cat /proc/iomem', 85165ab274SPhilippe Mathieu-Daudé '/soc/cprman@7e101000') 86165ab274SPhilippe Mathieu-Daudé exec_command_and_wait_for_pattern(self, 'halt', 'reboot: System halted') 87165ab274SPhilippe Mathieu-Daudé # Wait for VM to shut down gracefully 88165ab274SPhilippe Mathieu-Daudé self.vm.wait() 89165ab274SPhilippe Mathieu-Daudé 90165ab274SPhilippe Mathieu-Daudé 91165ab274SPhilippe Mathieu-Daudéif __name__ == '__main__': 92165ab274SPhilippe Mathieu-Daudé LinuxKernelTest.main() 93