[PATCH 1/2] test/py: Add a way to start sandbox without a device tree

This is useful sometimes when running a specific test. Add support for it in the existing restart_uboot_with_flags() function.
Signed-off-by: Simon Glass sjg@chromium.org ---
test/py/u_boot_console_sandbox.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/test/py/u_boot_console_sandbox.py b/test/py/u_boot_console_sandbox.py index ce4ca7e55ef..b79ec817957 100644 --- a/test/py/u_boot_console_sandbox.py +++ b/test/py/u_boot_console_sandbox.py @@ -27,6 +27,7 @@ class ConsoleSandbox(ConsoleBase):
super(ConsoleSandbox, self).__init__(log, config, max_fifo_fill=1024) self.sandbox_flags = [] + self.use_dtb = True
def get_spawn(self): """Connect to a fresh U-Boot instance. @@ -48,16 +49,13 @@ class ConsoleSandbox(ConsoleBase): cmd = [] if self.config.gdbserver: cmd += ['gdbserver', self.config.gdbserver] - cmd += [ - self.config.build_dir + fname, - '-v', - '-d', - self.config.dtb - ] + cmd += [self.config.build_dir + fname, '-v'] + if self.use_dtb: + cmd += ['-d', self.config.dtb] cmd += self.sandbox_flags return Spawn(cmd, cwd=self.config.source_dir)
- def restart_uboot_with_flags(self, flags, expect_reset=False): + def restart_uboot_with_flags(self, flags, expect_reset=False, use_dtb=True): """Run U-Boot with the given command-line flags
Args: @@ -65,6 +63,7 @@ class ConsoleSandbox(ConsoleBase): expect_reset: Boolean indication whether this boot is expected to be reset while the 1st boot process after main boot before prompt. False by default. + use_dtb: True to use a device tree file, False to run without one
Returns: A u_boot_spawn.Spawn object that is attached to U-Boot. @@ -72,9 +71,11 @@ class ConsoleSandbox(ConsoleBase):
try: self.sandbox_flags = flags + self.use_dtb = use_dtb return self.restart_uboot(expect_reset) finally: self.sandbox_flags = [] + self.use_dtb = True
def kill(self, sig): """Send a specific Unix signal to the sandbox process.

With sandbox, U-Boot can be run without a device tree (i.e. no -d or -T parameter). In this case an empty device tree is created for convenience. With a recent change this causes an error due to the missing '/binman' node.
Add this node to avoid the problem, as well as a test that U-Boot can be run without a device tree.
Fixes: 059df5624b ("arch: Kconfig: imply BINMAN for SANDBOX") Fixes: https://source.denx.de/u-boot/u-boot/-/issues/11 Signed-off-by: Simon Glass sjg@chromium.org ---
arch/sandbox/cpu/cpu.c | 27 ++++++++++++++++++++++++++- test/py/tests/test_help.py | 14 ++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/arch/sandbox/cpu/cpu.c b/arch/sandbox/cpu/cpu.c index ff0fa8a6853..7a82798c36d 100644 --- a/arch/sandbox/cpu/cpu.c +++ b/arch/sandbox/cpu/cpu.c @@ -291,6 +291,31 @@ void invalidate_dcache_range(unsigned long start, unsigned long stop) { }
+/** + * setup_auto_tree() - Set up a basic device tree to allow sandbox to work + * + * This is used when no device tree is provided. It creates a simple tree with + * just a /binman node. + * + * @blob: Place to put the created device tree + * Returns: 0 on success, -ve FDT error code on failure + */ +static int setup_auto_tree(void *blob) +{ + int err; + + err = fdt_create_empty_tree(blob, 256); + if (err) + return err; + + /* Create a /binman node in case CONFIG_BINMAN is enabled */ + err = fdt_add_subnode(blob, 0, "binman"); + if (err < 0) + return err; + + return 0; +} + void *board_fdt_blob_setup(int *ret) { struct sandbox_state *state = state_get_current(); @@ -303,7 +328,7 @@ void *board_fdt_blob_setup(int *ret) blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0); *ret = 0; if (!state->fdt_fname) { - err = fdt_create_empty_tree(blob, 256); + err = setup_auto_tree(blob); if (!err) goto done; printf("Unable to create empty FDT: %s\n", fdt_strerror(err)); diff --git a/test/py/tests/test_help.py b/test/py/tests/test_help.py index d50295e5bd0..03b9d91c117 100644 --- a/test/py/tests/test_help.py +++ b/test/py/tests/test_help.py @@ -2,7 +2,21 @@ # Copyright (c) 2015 Stephen Warren # Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
+import pytest + def test_help(u_boot_console): """Test that the "help" command can be executed."""
u_boot_console.run_command('help') + +@pytest.mark.boardspec('sandbox') +def test_help_no_devicetree(u_boot_console): + try: + cons = u_boot_console + cons.restart_uboot_with_flags([], use_dtb=False) + cons.run_command('help') + output = cons.get_spawn_output().replace('\r', '') + assert 'print command description/usage' in output + finally: + # Restart afterward to get the normal device tree back + u_boot_console.restart_uboot()

On Wed, Apr 27, 2022 at 01:47:57PM -0600, Simon Glass wrote:
With sandbox, U-Boot can be run without a device tree (i.e. no -d or -T parameter). In this case an empty device tree is created for convenience. With a recent change this causes an error due to the missing '/binman' node.
Add this node to avoid the problem, as well as a test that U-Boot can be run without a device tree.
Fixes: 059df5624b ("arch: Kconfig: imply BINMAN for SANDBOX") Fixes: https://source.denx.de/u-boot/u-boot/-/issues/11 Signed-off-by: Simon Glass sjg@chromium.org
Applied to u-boot/master, thanks!

On Wed, Apr 27, 2022 at 01:47:56PM -0600, Simon Glass wrote:
This is useful sometimes when running a specific test. Add support for it in the existing restart_uboot_with_flags() function.
Signed-off-by: Simon Glass sjg@chromium.org
Applied to u-boot/master, thanks!
participants (2)
-
Simon Glass
-
Tom Rini