Am 10. November 2025 11:22:57 UTC schrieb Gaurav Sharma
<[email protected]>:
>Added script that would validate the iMX8MM emulation by checking the
>linux console log. If it succeeds, it will return:-
>
>ok 1 test_imx8mm_evk.Imx8mmEvkMachine.test_aarch64_imx8mm_evk_usdhc
>
>Signed-off-by: Gaurav Sharma <[email protected]>
Hi Gaurav!
Nice to see another imx8 machine being contributed! I'm impressed how close you
stick to the imx8mp, both in terms of structuring this series as well as the
code.
I've built your series and ran the functional test. Comments below.
>---
> tests/functional/aarch64/meson.build | 2 +
> tests/functional/aarch64/test_imx8mm_evk.py | 67 +++++++++++++++++++++
> 2 files changed, 69 insertions(+)
> create mode 100755 tests/functional/aarch64/test_imx8mm_evk.py
>
>diff --git a/tests/functional/aarch64/meson.build
>b/tests/functional/aarch64/meson.build
>index 5ad52f93e1..31ecedbf6f 100644
>--- a/tests/functional/aarch64/meson.build
>+++ b/tests/functional/aarch64/meson.build
>@@ -5,6 +5,7 @@ test_aarch64_timeouts = {
> 'aspeed_ast2700fc' : 600,
> 'device_passthrough' : 720,
> 'imx8mp_evk' : 240,
>+ 'imx8mm_evk' : 240,
> 'raspi4' : 480,
> 'reverse_debug' : 180,
> 'rme_virt' : 1200,
>@@ -28,6 +29,7 @@ tests_aarch64_system_thorough = [
> 'device_passthrough',
> 'hotplug_pci',
> 'imx8mp_evk',
>+ 'imx8mm_evk',
Looks like these lists are sorted alphabetically. Shall we preserve that?
> 'kvm',
> 'multiprocess',
> 'raspi3',
>diff --git a/tests/functional/aarch64/test_imx8mm_evk.py
>b/tests/functional/aarch64/test_imx8mm_evk.py
>new file mode 100755
>index 0000000000..d5eb43afc6
>--- /dev/null
>+++ b/tests/functional/aarch64/test_imx8mm_evk.py
>@@ -0,0 +1,67 @@
>+#!/usr/bin/env python3
>+#
>+# Functional test that boots a Linux kernel and checks the console
>+#
>+# SPDX-License-Identifier: GPL-2.0-or-later
>+
>+from qemu_test import LinuxKernelTest, Asset
>+
>+class Imx8mmEvkMachine(LinuxKernelTest):
>+
>+ ASSET_IMAGE = Asset(
>+ ('https://cloud.debian.org/images/cloud/bookworm/20231210-1590/'
>+ 'debian-12-generic-arm64-20231210-1590.tar.xz'),
>+ '7ebf1577b32d5af6204df74b54ca2e4675de9b5a9fa14f3ff70b88eeb7b3b359')
>+
>+ KERNEL_OFFSET = 0x51000000
>+ KERNEL_SIZE = 32622528
>+ INITRD_OFFSET = 0x76000000
>+ INITRD_SIZE = 30987766
>+ DTB_OFFSET = 0x64F51000
This DTB offset is the one for the imx8mp-evk, and in fact the console log
confirms it. Both machines seem to be so similar that the test passes anyway.
What you need is the offset in the "disk.raw" image that gets extracted from
above file. Open "disk.raw" in a hex editor and search for "imx8mm-evk", then
determine the offset of the preceeding "d00df00d" DTB magic. That is your
offset.
Best regards,
Bernhard
>+ DTB_SIZE = 45 * 1024
>+
>+ def extract(self, in_path, out_path, offset, size):
>+ try:
>+ with open(in_path, "rb") as source:
>+ source.seek(offset)
>+ data = source.read(size)
>+ with open(out_path, "wb") as target:
>+ target.write(data)
>+ except (IOError, ValueError) as e:
>+ self.log.error(f"Failed to extract {out_path}: {e}")
>+ raise
>+
>+ def setUp(self):
>+ super().setUp()
>+
>+ self.image_path = self.scratch_file("disk.raw")
>+ self.kernel_path = self.scratch_file("linux")
>+ self.initrd_path = self.scratch_file("initrd.zstd")
>+ self.dtb_path = self.scratch_file("imx8mm-evk.dtb")
>+
>+ self.archive_extract(self.ASSET_IMAGE)
>+ self.extract(self.image_path, self.kernel_path,
>+ self.KERNEL_OFFSET, self.KERNEL_SIZE)
>+ self.extract(self.image_path, self.initrd_path,
>+ self.INITRD_OFFSET, self.INITRD_SIZE)
>+ self.extract(self.image_path, self.dtb_path,
>+ self.DTB_OFFSET, self.DTB_SIZE)
>+
>+ def test_aarch64_imx8mm_evk_usdhc(self):
>+ self.require_accelerator("tcg")
>+ self.set_machine('imx8mm-evk')
>+ self.vm.set_console(console_index=1)
>+ self.vm.add_args('-m', '2G',
>+ '-smp', '4',
>+ '-kernel', self.kernel_path,
>+ '-initrd', self.initrd_path,
>+ '-dtb', self.dtb_path,
>+ '-append', 'root=/dev/mmcblk2p1',
>+ '-drive', f'file={self.image_path},if=sd,bus=2,'
>+ 'format=raw,id=mmcblk2,snapshot=on')
>+
>+ self.vm.launch()
>+ self.wait_for_console_pattern('Welcome to ')
>+
>+if __name__ == '__main__':
>+ LinuxKernelTest.main()