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