Files
u-boot/cmd/sb.c
Simon Glass 71cea84cc3 sandbox: Add devon and devoff subcommands to sb command
There are quite a few media devices in test.dts which are not enabled by
default, so are not bound on startup. Sometimes it is useful to be able
to use these from the command line.

Add 'sb devon' and 'sb devoff' subcommands to enable and disable devices
from the device tree. For example, running sandbox with -T, then
'sb devon mmc11' enables the mmc11 device mentioned in test.dts

Co-developed-by: Claude <noreply@anthropic.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
2025-10-24 08:47:38 +01:00

160 lines
3.7 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright 2018, Google Inc.
* Written by Simon Glass <sjg@chromium.org>
*/
#include <command.h>
#include <dm.h>
#include <spl.h>
#include <asm/cpu.h>
#include <asm/global_data.h>
#include <asm/state.h>
#include <dm/device-internal.h>
#include <dm/lists.h>
DECLARE_GLOBAL_DATA_PTR;
static int do_sb_handoff(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
#if CONFIG_IS_ENABLED(HANDOFF)
if (gd->spl_handoff)
printf("SPL handoff magic %lx\n", gd->spl_handoff->arch.magic);
else
printf("SPL handoff info not received\n");
return 0;
#else
printf("Command not supported\n");
return CMD_RET_USAGE;
#endif
}
static int do_sb_map(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
sandbox_map_list();
return 0;
}
static int do_sb_state(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct sandbox_state *state;
state = state_get_current();
state_show(state);
return 0;
}
static int do_sb_devon(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct udevice *dev;
ofnode root, node;
int ret;
if (argc != 2)
return CMD_RET_USAGE;
/* Find the specified device tree node */
root = oftree_root(oftree_default());
node = ofnode_find_subnode(root, argv[1]);
if (!ofnode_valid(node)) {
printf("Device tree node '%s' not found\n", argv[1]);
return CMD_RET_FAILURE;
}
/* Check if device is already bound */
ret = device_find_global_by_ofnode(node, &dev);
if (!ret) {
printf("Device '%s' is already enabled\n", argv[1]);
return CMD_RET_FAILURE;
}
/* Bind the device from device tree */
ret = lists_bind_fdt(gd->dm_root, node, &dev, NULL, false);
if (ret) {
printf("Failed to bind device '%s' (err %dE)\n", argv[1],
ret);
return CMD_RET_FAILURE;
}
/* Probe the device */
ret = device_probe(dev);
if (ret) {
printf("Failed to probe device '%s' (err %dE)\n", argv[1],
ret);
return CMD_RET_FAILURE;
}
printf("Device '%s' enabled\n", dev->name);
return CMD_RET_SUCCESS;
}
static int do_sb_devoff(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct udevice *dev;
ofnode root, node;
int ret;
if (argc != 2)
return CMD_RET_USAGE;
/* Find the specified device tree node */
root = oftree_root(oftree_default());
node = ofnode_find_subnode(root, argv[1]);
if (!ofnode_valid(node)) {
printf("Device tree node '%s' not found\n", argv[1]);
return CMD_RET_FAILURE;
}
/* Find the device bound to this node */
ret = device_find_global_by_ofnode(node, &dev);
if (ret) {
printf("Device '%s' not found or not bound (err %dE)\n",
argv[1], ret);
return CMD_RET_FAILURE;
}
/* Remove the device (deactivate it) */
ret = device_remove(dev, DM_REMOVE_NORMAL);
if (ret) {
printf("Failed to remove device '%s' (err %dE)\n", argv[1],
ret);
return CMD_RET_FAILURE;
}
/* Unbind the device */
ret = device_unbind(dev);
if (ret) {
printf("Failed to unbind device '%s' (err %dE)\n", argv[1],
ret);
return CMD_RET_FAILURE;
}
printf("Device '%s' disabled\n", argv[1]);
return CMD_RET_SUCCESS;
}
U_BOOT_LONGHELP(sb,
"devoff <node> - Disable device from device tree node\n"
"sb devon <node> - Enable device from device tree node\n"
"sb handoff - Show handoff data received from SPL\n"
"sb map - Show mapped memory\n"
"sb state - Show sandbox state");
U_BOOT_CMD_WITH_SUBCMDS(sb, "Sandbox status commands", sb_help_text,
U_BOOT_SUBCMD_MKENT(devoff, 2, 1, do_sb_devoff),
U_BOOT_SUBCMD_MKENT(devon, 2, 1, do_sb_devon),
U_BOOT_SUBCMD_MKENT(handoff, 1, 1, do_sb_handoff),
U_BOOT_SUBCMD_MKENT(map, 1, 1, do_sb_map),
U_BOOT_SUBCMD_MKENT(state, 1, 1, do_sb_state));