master
py 108 lines 4.1 KB
Raw
1 #!/usr/bin/env python3
2 #
3 # Functional tests that boot Linux on a Kendryte K230 machine.
4 #
5 # The direct boot test lets QEMU load OpenSBI, Linux, the device tree, and the
6 # initramfs. The firmware boot test starts the K230 SDK U-Boot and uses bootm
7 # to launch OpenSBI and Linux from images preloaded into RAM.
8 #
9 # Author:
10 # Junze Cao
11 #
12 # SPDX-License-Identifier: GPL-2.0-or-later
13
14 import os
15
16 from qemu_test import Asset, LinuxKernelTest
17 from qemu_test import exec_command_and_wait_for_pattern
18 from qemu_test import interrupt_interactive_console_until_pattern
19
20
21 class K230Machine(LinuxKernelTest):
22
23 ASSET_KERNEL = Asset(
24 ('https://raw.githubusercontent.com/zevorn/k230-boot-assets/'
25 'c3c32fb46e8307c5063f13e8f367c98bf9273cd1/'
26 'yocto/direct-boot/Image'),
27 '3a44970213fa68ad318d308518adfc0bf4bee72ed1b2926f9b468f82ef7d7829')
28 ASSET_DTB = Asset(
29 ('https://raw.githubusercontent.com/zevorn/k230-boot-assets/'
30 'c3c32fb46e8307c5063f13e8f367c98bf9273cd1/'
31 'yocto/direct-boot/k230-canmv.dtb'),
32 '5050240b48ce0988c73eaefa73e4945a40abca503cf488d22a3adf6ef50bbe4c')
33 ASSET_INITRD = Asset(
34 ('https://raw.githubusercontent.com/zevorn/k230-boot-assets/'
35 'c3c32fb46e8307c5063f13e8f367c98bf9273cd1/'
36 'yocto/direct-boot/rootfs.cpio.gz'),
37 '4e1869a99a232ee60324f71f3a9e84a79b03ccabb5b73f8a727c5ff5be5c0914')
38 ASSET_UBOOT = Asset(
39 ('https://raw.githubusercontent.com/zevorn/k230-boot-assets/'
40 'c3c32fb46e8307c5063f13e8f367c98bf9273cd1/common/u-boot'),
41 '0915b9a92a7c911846a8cf691866ef14ef050a51d04209f884ae8e9ec33f36d2')
42 ASSET_FW_JUMP = Asset(
43 ('https://raw.githubusercontent.com/zevorn/k230-boot-assets/'
44 'c3c32fb46e8307c5063f13e8f367c98bf9273cd1/'
45 'common/fw_jump.uImage'),
46 'cf7788e470f1d6e8c85491ecdc2705518db1b6af54080e8c7a3464bad0d902b7')
47
48 def wait_for_linux_shell(self):
49 self.wait_for_console_pattern('meta-k230 initramfs starting...')
50 self.wait_for_console_pattern('~ #')
51
52 def test_k230_direct_boot(self):
53 self.set_machine('k230')
54 kernel_path = self.ASSET_KERNEL.fetch()
55 dtb_path = self.ASSET_DTB.fetch()
56 initrd_path = self.ASSET_INITRD.fetch()
57
58 self.vm.set_console()
59 self.vm.add_args('-kernel', kernel_path,
60 '-dtb', dtb_path,
61 '-initrd', initrd_path,
62 '-append', 'console=ttyS0,115200 earlycon=sbi',
63 '-no-reboot')
64 self.vm.launch()
65 self.wait_for_linux_shell()
66
67 def test_k230_uboot_boot(self):
68 self.set_machine('k230')
69 kernel_path = self.ASSET_KERNEL.fetch()
70 dtb_path = self.ASSET_DTB.fetch()
71 initrd_path = self.ASSET_INITRD.fetch()
72 uboot_path = self.ASSET_UBOOT.fetch()
73 fw_jump_path = self.ASSET_FW_JUMP.fetch()
74 initrd_end = 0x0a100000 + os.path.getsize(initrd_path)
75
76 self.vm.set_console()
77 self.vm.add_args(
78 '-bios', uboot_path,
79 '-device',
80 f'loader,file={fw_jump_path},addr=0xc100000,force-raw=on',
81 '-device',
82 f'loader,file={kernel_path},addr=0x8200000,force-raw=on',
83 '-device',
84 f'loader,file={initrd_path},addr=0xa100000,force-raw=on',
85 '-device',
86 f'loader,file={dtb_path},addr=0xa000000,force-raw=on',
87 '-no-reboot')
88 self.vm.launch()
89
90 interrupt_interactive_console_until_pattern(self, 'K230#')
91 commands = (
92 'setenv bootargs console=ttyS0,115200 earlycon=sbi',
93 'fdt addr 0xa000000',
94 'fdt resize 8192',
95 'fdt set /chosen linux,initrd-start <0x0 0xa100000>',
96 f'fdt set /chosen linux,initrd-end <0x0 0x{initrd_end:x}>',
97 )
98 for command in commands:
99 exec_command_and_wait_for_pattern(self, command, 'K230#')
100
101 exec_command_and_wait_for_pattern(
102 self, 'bootm 0xc100000 - 0xa000000',
103 'Starting kernel ...', failure_message='ERROR')
104 self.wait_for_linux_shell()
105
106
107 if __name__ == '__main__':
108 LinuxKernelTest.main()