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> 11*cbb2df20STom 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> 1706811959SSimon Glass #include <dm/root.h> 18304fbef1SSimon Glass #include <dm/util.h> 1906811959SSimon Glass 2006811959SSimon Glass static int do_dm_dump_all(cmd_tbl_t *cmdtp, int flag, int argc, 2106811959SSimon Glass char * const argv[]) 2206811959SSimon Glass { 23304fbef1SSimon Glass dm_dump_all(); 24a56642c7SMasahiro Yamada 25a56642c7SMasahiro Yamada return 0; 26a56642c7SMasahiro Yamada } 27a56642c7SMasahiro Yamada 2806811959SSimon Glass static int do_dm_dump_uclass(cmd_tbl_t *cmdtp, int flag, int argc, 2906811959SSimon Glass char * const argv[]) 3006811959SSimon Glass { 31304fbef1SSimon Glass dm_dump_uclass(); 3206811959SSimon Glass 3306811959SSimon Glass return 0; 3406811959SSimon Glass } 3506811959SSimon Glass 3640b6f2d0SMasahiro Yamada static int do_dm_dump_devres(cmd_tbl_t *cmdtp, int flag, int argc, 3740b6f2d0SMasahiro Yamada char * const argv[]) 3840b6f2d0SMasahiro Yamada { 3940b6f2d0SMasahiro Yamada dm_dump_devres(); 4040b6f2d0SMasahiro Yamada 4140b6f2d0SMasahiro Yamada return 0; 4240b6f2d0SMasahiro Yamada } 4340b6f2d0SMasahiro Yamada 4406811959SSimon Glass static cmd_tbl_t test_commands[] = { 4506811959SSimon Glass U_BOOT_CMD_MKENT(tree, 0, 1, do_dm_dump_all, "", ""), 4606811959SSimon Glass U_BOOT_CMD_MKENT(uclass, 1, 1, do_dm_dump_uclass, "", ""), 4740b6f2d0SMasahiro Yamada U_BOOT_CMD_MKENT(devres, 1, 1, do_dm_dump_devres, "", ""), 4806811959SSimon Glass }; 4906811959SSimon Glass 50d6df048bSMichal Simek static __maybe_unused void dm_reloc(void) 51d6df048bSMichal Simek { 52d6df048bSMichal Simek static int relocated; 53d6df048bSMichal Simek 54d6df048bSMichal Simek if (!relocated) { 55d6df048bSMichal Simek fixup_cmdtable(test_commands, ARRAY_SIZE(test_commands)); 56d6df048bSMichal Simek relocated = 1; 57d6df048bSMichal Simek } 58d6df048bSMichal Simek } 59d6df048bSMichal Simek 6006811959SSimon Glass static int do_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 6106811959SSimon Glass { 6206811959SSimon Glass cmd_tbl_t *test_cmd; 6306811959SSimon Glass int ret; 6406811959SSimon Glass 65d6df048bSMichal Simek #ifdef CONFIG_NEEDS_MANUAL_RELOC 66d6df048bSMichal Simek dm_reloc(); 67d6df048bSMichal Simek #endif 68d6df048bSMichal Simek 6957f54d55SSimon Glass if (argc < 2) 7006811959SSimon Glass return CMD_RET_USAGE; 7106811959SSimon Glass test_cmd = find_cmd_tbl(argv[1], test_commands, 7206811959SSimon Glass ARRAY_SIZE(test_commands)); 7306811959SSimon Glass argc -= 2; 7406811959SSimon Glass argv += 2; 7506811959SSimon Glass if (!test_cmd || argc > test_cmd->maxargs) 7606811959SSimon Glass return CMD_RET_USAGE; 7706811959SSimon Glass 7806811959SSimon Glass ret = test_cmd->cmd(test_cmd, flag, argc, argv); 7906811959SSimon Glass 8006811959SSimon Glass return cmd_process_error(test_cmd, ret); 8106811959SSimon Glass } 8206811959SSimon Glass 8306811959SSimon Glass U_BOOT_CMD( 8457f54d55SSimon Glass dm, 3, 1, do_dm, 8506811959SSimon Glass "Driver model low level access", 86fffa24d7SSimon Glass "tree Dump driver model tree ('*' = activated)\n" 8740b6f2d0SMasahiro Yamada "dm uclass Dump list of instances for each uclass\n" 8840b6f2d0SMasahiro Yamada "dm devres Dump list of device resources for each device" 8906811959SSimon Glass ); 90