190fd1591SPhilippe Mathieu-Daudé#!/usr/bin/env python3 290fd1591SPhilippe Mathieu-Daudé# 390fd1591SPhilippe Mathieu-Daudé# Functional test that boots a Linux kernel on a Sifive U machine 490fd1591SPhilippe Mathieu-Daudé# and checks the console 590fd1591SPhilippe Mathieu-Daudé# 690fd1591SPhilippe Mathieu-Daudé# Copyright (c) Linaro Ltd. 790fd1591SPhilippe Mathieu-Daudé# 890fd1591SPhilippe Mathieu-Daudé# Author: 990fd1591SPhilippe Mathieu-Daudé# Philippe Mathieu-Daudé 1090fd1591SPhilippe Mathieu-Daudé# 1190fd1591SPhilippe Mathieu-Daudé# SPDX-License-Identifier: GPL-2.0-or-later 1290fd1591SPhilippe Mathieu-Daudé 1390fd1591SPhilippe Mathieu-Daudéimport os 1490fd1591SPhilippe Mathieu-Daudé 1590fd1591SPhilippe Mathieu-Daudéfrom qemu_test import Asset, LinuxKernelTest 1690fd1591SPhilippe Mathieu-Daudéfrom qemu_test import skipIfMissingCommands 1790fd1591SPhilippe Mathieu-Daudé 1890fd1591SPhilippe Mathieu-Daudé 1990fd1591SPhilippe Mathieu-Daudéclass SifiveU(LinuxKernelTest): 2090fd1591SPhilippe Mathieu-Daudé 2190fd1591SPhilippe Mathieu-Daudé ASSET_KERNEL = Asset( 2290fd1591SPhilippe Mathieu-Daudé 'https://storage.tuxboot.com/buildroot/20241119/riscv64/Image', 2390fd1591SPhilippe Mathieu-Daudé '2bd8132a3bf21570290042324fff48c987f42f2a00c08de979f43f0662ebadba') 2490fd1591SPhilippe Mathieu-Daudé ASSET_ROOTFS = Asset( 2590fd1591SPhilippe Mathieu-Daudé ('https://github.com/groeck/linux-build-test/raw/' 2690fd1591SPhilippe Mathieu-Daudé '9819da19e6eef291686fdd7b029ea00e764dc62f/rootfs/riscv64/' 2790fd1591SPhilippe Mathieu-Daudé 'rootfs.ext2.gz'), 2890fd1591SPhilippe Mathieu-Daudé 'b6ed95610310b7956f9bf20c4c9c0c05fea647900df441da9dfe767d24e8b28b') 2990fd1591SPhilippe Mathieu-Daudé 30*7db162faSPhilippe Mathieu-Daudé def do_test_riscv64_sifive_u_mmc_spi(self, connect_card): 3190fd1591SPhilippe Mathieu-Daudé self.set_machine('sifive_u') 3290fd1591SPhilippe Mathieu-Daudé kernel_path = self.ASSET_KERNEL.fetch() 3390fd1591SPhilippe Mathieu-Daudé rootfs_path = self.uncompress(self.ASSET_ROOTFS) 3490fd1591SPhilippe Mathieu-Daudé 3590fd1591SPhilippe Mathieu-Daudé self.vm.set_console() 3690fd1591SPhilippe Mathieu-Daudé kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 3790fd1591SPhilippe Mathieu-Daudé 'earlycon=sbi console=ttySIF0 ' 38*7db162faSPhilippe Mathieu-Daudé 'root=/dev/mmcblk0 ') 3990fd1591SPhilippe Mathieu-Daudé self.vm.add_args('-kernel', kernel_path, 4090fd1591SPhilippe Mathieu-Daudé '-append', kernel_command_line, 4190fd1591SPhilippe Mathieu-Daudé '-no-reboot') 42*7db162faSPhilippe Mathieu-Daudé if connect_card: 43*7db162faSPhilippe Mathieu-Daudé kernel_command_line += 'panic=-1 noreboot rootwait ' 44*7db162faSPhilippe Mathieu-Daudé self.vm.add_args('-drive', f'file={rootfs_path},if=sd,format=raw') 45*7db162faSPhilippe Mathieu-Daudé pattern = 'Boot successful.' 46*7db162faSPhilippe Mathieu-Daudé else: 47*7db162faSPhilippe Mathieu-Daudé kernel_command_line += 'panic=0 noreboot ' 48*7db162faSPhilippe Mathieu-Daudé pattern = 'Cannot open root device "mmcblk0" or unknown-block(0,0)' 49*7db162faSPhilippe Mathieu-Daudé 5090fd1591SPhilippe Mathieu-Daudé self.vm.launch() 51*7db162faSPhilippe Mathieu-Daudé self.wait_for_console_pattern(pattern) 5290fd1591SPhilippe Mathieu-Daudé 5390fd1591SPhilippe Mathieu-Daudé os.remove(rootfs_path) 5490fd1591SPhilippe Mathieu-Daudé 55*7db162faSPhilippe Mathieu-Daudé def test_riscv64_sifive_u_nommc_spi(self): 56*7db162faSPhilippe Mathieu-Daudé self.do_test_riscv64_sifive_u_mmc_spi(False) 57*7db162faSPhilippe Mathieu-Daudé 58*7db162faSPhilippe Mathieu-Daudé def test_riscv64_sifive_u_mmc_spi(self): 59*7db162faSPhilippe Mathieu-Daudé self.do_test_riscv64_sifive_u_mmc_spi(True) 60*7db162faSPhilippe Mathieu-Daudé 6190fd1591SPhilippe Mathieu-Daudé 6290fd1591SPhilippe Mathieu-Daudéif __name__ == '__main__': 6390fd1591SPhilippe Mathieu-Daudé LinuxKernelTest.main() 64