106811959SSimon Glass /* 206811959SSimon Glass * Copyright (c) 2013 Google, Inc 306811959SSimon Glass * 406811959SSimon Glass * (C) Copyright 2012 506811959SSimon Glass * Marek Vasut <marex@denx.de> 606811959SSimon Glass * 706811959SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 806811959SSimon Glass */ 906811959SSimon Glass 1006811959SSimon Glass #include <common.h> 11cbb2df20STom Rini #include <command.h> 1206811959SSimon Glass #include <dm.h> 1306811959SSimon Glass #include <malloc.h> 140eb25b61SJoe Hershberger #include <mapmem.h> 1506811959SSimon Glass #include <errno.h> 1606811959SSimon Glass #include <asm/io.h> 17*028a3c08SJoseph Chen #include <dm/of_access.h> 1806811959SSimon Glass #include <dm/root.h> 19304fbef1SSimon Glass #include <dm/util.h> 2006811959SSimon Glass 2106811959SSimon Glass static int do_dm_dump_all(cmd_tbl_t *cmdtp, int flag, int argc, 2206811959SSimon Glass char * const argv[]) 2306811959SSimon Glass { 24304fbef1SSimon Glass dm_dump_all(); 25a56642c7SMasahiro Yamada 26a56642c7SMasahiro Yamada return 0; 27a56642c7SMasahiro Yamada } 28a56642c7SMasahiro Yamada 2906811959SSimon Glass static int do_dm_dump_uclass(cmd_tbl_t *cmdtp, int flag, int argc, 3006811959SSimon Glass char * const argv[]) 3106811959SSimon Glass { 32304fbef1SSimon Glass dm_dump_uclass(); 3306811959SSimon Glass 3406811959SSimon Glass return 0; 3506811959SSimon Glass } 3606811959SSimon Glass 3740b6f2d0SMasahiro Yamada static int do_dm_dump_devres(cmd_tbl_t *cmdtp, int flag, int argc, 3840b6f2d0SMasahiro Yamada char * const argv[]) 3940b6f2d0SMasahiro Yamada { 4040b6f2d0SMasahiro Yamada dm_dump_devres(); 4140b6f2d0SMasahiro Yamada 4240b6f2d0SMasahiro Yamada return 0; 4340b6f2d0SMasahiro Yamada } 4440b6f2d0SMasahiro Yamada 45*028a3c08SJoseph Chen static int do_dm_dump_aliases(cmd_tbl_t *cmdtp, int flag, int argc, 46*028a3c08SJoseph Chen char * const argv[]) 47*028a3c08SJoseph Chen { 48*028a3c08SJoseph Chen #ifdef CONFIG_OF_LIVE 49*028a3c08SJoseph Chen of_alias_dump(); 50*028a3c08SJoseph Chen #endif 51*028a3c08SJoseph Chen return 0; 52*028a3c08SJoseph Chen } 53*028a3c08SJoseph Chen 5406811959SSimon Glass static cmd_tbl_t test_commands[] = { 5506811959SSimon Glass U_BOOT_CMD_MKENT(tree, 0, 1, do_dm_dump_all, "", ""), 5606811959SSimon Glass U_BOOT_CMD_MKENT(uclass, 1, 1, do_dm_dump_uclass, "", ""), 5740b6f2d0SMasahiro Yamada U_BOOT_CMD_MKENT(devres, 1, 1, do_dm_dump_devres, "", ""), 58*028a3c08SJoseph Chen U_BOOT_CMD_MKENT(aliases, 0, 1, do_dm_dump_aliases, "", ""), 5906811959SSimon Glass }; 6006811959SSimon Glass 61d6df048bSMichal Simek static __maybe_unused void dm_reloc(void) 62d6df048bSMichal Simek { 63d6df048bSMichal Simek static int relocated; 64d6df048bSMichal Simek 65d6df048bSMichal Simek if (!relocated) { 66d6df048bSMichal Simek fixup_cmdtable(test_commands, ARRAY_SIZE(test_commands)); 67d6df048bSMichal Simek relocated = 1; 68d6df048bSMichal Simek } 69d6df048bSMichal Simek } 70d6df048bSMichal Simek 7106811959SSimon Glass static int do_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 7206811959SSimon Glass { 7306811959SSimon Glass cmd_tbl_t *test_cmd; 7406811959SSimon Glass int ret; 7506811959SSimon Glass 76d6df048bSMichal Simek #ifdef CONFIG_NEEDS_MANUAL_RELOC 77d6df048bSMichal Simek dm_reloc(); 78d6df048bSMichal Simek #endif 79d6df048bSMichal Simek 8057f54d55SSimon Glass if (argc < 2) 8106811959SSimon Glass return CMD_RET_USAGE; 8206811959SSimon Glass test_cmd = find_cmd_tbl(argv[1], test_commands, 8306811959SSimon Glass ARRAY_SIZE(test_commands)); 8406811959SSimon Glass argc -= 2; 8506811959SSimon Glass argv += 2; 8606811959SSimon Glass if (!test_cmd || argc > test_cmd->maxargs) 8706811959SSimon Glass return CMD_RET_USAGE; 8806811959SSimon Glass 8906811959SSimon Glass ret = test_cmd->cmd(test_cmd, flag, argc, argv); 9006811959SSimon Glass 9106811959SSimon Glass return cmd_process_error(test_cmd, ret); 9206811959SSimon Glass } 9306811959SSimon Glass 9406811959SSimon Glass U_BOOT_CMD( 9557f54d55SSimon Glass dm, 3, 1, do_dm, 9606811959SSimon Glass "Driver model low level access", 97fffa24d7SSimon Glass "tree Dump driver model tree ('*' = activated)\n" 9840b6f2d0SMasahiro Yamada "dm uclass Dump list of instances for each uclass\n" 99*028a3c08SJoseph Chen "dm devres Dump list of device resources for each device\n" 100*028a3c08SJoseph Chen "dm aliases Dump list of aliases" 10106811959SSimon Glass ); 102