1#!/usr/bin/env python3 2# 3# Functional test that boots a Linux kernel on a Raspberry Pi machine 4# and checks the console 5# 6# Copyright (c) 2019 Philippe Mathieu-Daudé <f4bug@amsat.org> 7# 8# SPDX-License-Identifier: GPL-2.0-or-later 9 10from qemu_test import LinuxKernelTest, Asset 11from qemu_test import exec_command_and_wait_for_pattern 12from qemu_test.utils import gzip_uncompress 13 14 15class ArmRaspi2Machine(LinuxKernelTest): 16 17 ASSET_KERNEL_20190215 = Asset( 18 ('http://archive.raspberrypi.org/debian/' 19 'pool/main/r/raspberrypi-firmware/' 20 'raspberrypi-kernel_1.20190215-1_armhf.deb'), 21 '9f1759f7228113da24f5ee2aa6312946ec09a83e076aba9406c46ff776dfb291') 22 23 ASSET_INITRD = Asset( 24 ('https://github.com/groeck/linux-build-test/raw/' 25 '2eb0a73b5d5a28df3170c546ddaaa9757e1e0848/rootfs/' 26 'arm/rootfs-armv7a.cpio.gz'), 27 '2c8dbdb16ea7af2dfbcbea96044dde639fb07d09fd3c4fb31f2027ef71e55ddd') 28 29 def do_test_arm_raspi2(self, uart_id): 30 """ 31 The kernel can be rebuilt using the kernel source referenced 32 and following the instructions on the on: 33 https://www.raspberrypi.org/documentation/linux/kernel/building.md 34 """ 35 serial_kernel_cmdline = { 36 0: 'earlycon=pl011,0x3f201000 console=ttyAMA0', 37 } 38 kernel_path = self.archive_extract(self.ASSET_KERNEL_20190215, 39 member='boot/kernel7.img') 40 dtb_path = self.archive_extract(self.ASSET_KERNEL_20190215, 41 member='boot/bcm2709-rpi-2-b.dtb') 42 43 self.set_machine('raspi2b') 44 self.vm.set_console() 45 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 46 serial_kernel_cmdline[uart_id] + 47 ' root=/dev/mmcblk0p2 rootwait ' + 48 'dwc_otg.fiq_fsm_enable=0') 49 self.vm.add_args('-kernel', kernel_path, 50 '-dtb', dtb_path, 51 '-append', kernel_command_line, 52 '-device', 'usb-kbd') 53 self.vm.launch() 54 55 console_pattern = 'Kernel command line: %s' % kernel_command_line 56 self.wait_for_console_pattern(console_pattern) 57 self.wait_for_console_pattern('Product: QEMU USB Keyboard') 58 59 def test_arm_raspi2_uart0(self): 60 self.do_test_arm_raspi2(0) 61 62 def test_arm_raspi2_initrd(self): 63 kernel_path = self.archive_extract(self.ASSET_KERNEL_20190215, 64 member='boot/kernel7.img') 65 dtb_path = self.archive_extract(self.ASSET_KERNEL_20190215, 66 member='boot/bcm2709-rpi-2-b.dtb') 67 initrd_path_gz = self.ASSET_INITRD.fetch() 68 initrd_path = self.scratch_file('rootfs.cpio') 69 gzip_uncompress(initrd_path_gz, initrd_path) 70 71 self.set_machine('raspi2b') 72 self.vm.set_console() 73 kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 74 'earlycon=pl011,0x3f201000 console=ttyAMA0 ' 75 'panic=-1 noreboot ' + 76 'dwc_otg.fiq_fsm_enable=0') 77 self.vm.add_args('-kernel', kernel_path, 78 '-dtb', dtb_path, 79 '-initrd', initrd_path, 80 '-append', kernel_command_line, 81 '-no-reboot') 82 self.vm.launch() 83 self.wait_for_console_pattern('Boot successful.') 84 85 exec_command_and_wait_for_pattern(self, 'cat /proc/cpuinfo', 86 'BCM2835') 87 exec_command_and_wait_for_pattern(self, 'cat /proc/iomem', 88 '/soc/cprman@7e101000') 89 exec_command_and_wait_for_pattern(self, 'halt', 'reboot: System halted') 90 # Wait for VM to shut down gracefully 91 self.vm.wait() 92 93 94if __name__ == '__main__': 95 LinuxKernelTest.main() 96