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> 1106811959SSimon Glass #include <dm.h> 1206811959SSimon Glass #include <malloc.h> 130eb25b61SJoe Hershberger #include <mapmem.h> 1406811959SSimon Glass #include <errno.h> 1506811959SSimon Glass #include <asm/io.h> 1606811959SSimon Glass #include <dm/root.h> 17304fbef1SSimon Glass #include <dm/util.h> 1806811959SSimon Glass 1906811959SSimon Glass static int do_dm_dump_all(cmd_tbl_t *cmdtp, int flag, int argc, 2006811959SSimon Glass char * const argv[]) 2106811959SSimon Glass { 22304fbef1SSimon Glass dm_dump_all(); 23a56642c7SMasahiro Yamada 24a56642c7SMasahiro Yamada return 0; 25a56642c7SMasahiro Yamada } 26a56642c7SMasahiro Yamada 2706811959SSimon Glass static int do_dm_dump_uclass(cmd_tbl_t *cmdtp, int flag, int argc, 2806811959SSimon Glass char * const argv[]) 2906811959SSimon Glass { 30304fbef1SSimon Glass dm_dump_uclass(); 3106811959SSimon Glass 3206811959SSimon Glass return 0; 3306811959SSimon Glass } 3406811959SSimon Glass 3540b6f2d0SMasahiro Yamada static int do_dm_dump_devres(cmd_tbl_t *cmdtp, int flag, int argc, 3640b6f2d0SMasahiro Yamada char * const argv[]) 3740b6f2d0SMasahiro Yamada { 3840b6f2d0SMasahiro Yamada dm_dump_devres(); 3940b6f2d0SMasahiro Yamada 4040b6f2d0SMasahiro Yamada return 0; 4140b6f2d0SMasahiro Yamada } 4240b6f2d0SMasahiro Yamada 4306811959SSimon Glass static cmd_tbl_t test_commands[] = { 4406811959SSimon Glass U_BOOT_CMD_MKENT(tree, 0, 1, do_dm_dump_all, "", ""), 4506811959SSimon Glass U_BOOT_CMD_MKENT(uclass, 1, 1, do_dm_dump_uclass, "", ""), 4640b6f2d0SMasahiro Yamada U_BOOT_CMD_MKENT(devres, 1, 1, do_dm_dump_devres, "", ""), 4706811959SSimon Glass }; 4806811959SSimon Glass 49*d6df048bSMichal Simek static __maybe_unused void dm_reloc(void) 50*d6df048bSMichal Simek { 51*d6df048bSMichal Simek static int relocated; 52*d6df048bSMichal Simek 53*d6df048bSMichal Simek if (!relocated) { 54*d6df048bSMichal Simek fixup_cmdtable(test_commands, ARRAY_SIZE(test_commands)); 55*d6df048bSMichal Simek relocated = 1; 56*d6df048bSMichal Simek } 57*d6df048bSMichal Simek } 58*d6df048bSMichal Simek 5906811959SSimon Glass static int do_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 6006811959SSimon Glass { 6106811959SSimon Glass cmd_tbl_t *test_cmd; 6206811959SSimon Glass int ret; 6306811959SSimon Glass 64*d6df048bSMichal Simek #ifdef CONFIG_NEEDS_MANUAL_RELOC 65*d6df048bSMichal Simek dm_reloc(); 66*d6df048bSMichal Simek #endif 67*d6df048bSMichal Simek 6857f54d55SSimon Glass if (argc < 2) 6906811959SSimon Glass return CMD_RET_USAGE; 7006811959SSimon Glass test_cmd = find_cmd_tbl(argv[1], test_commands, 7106811959SSimon Glass ARRAY_SIZE(test_commands)); 7206811959SSimon Glass argc -= 2; 7306811959SSimon Glass argv += 2; 7406811959SSimon Glass if (!test_cmd || argc > test_cmd->maxargs) 7506811959SSimon Glass return CMD_RET_USAGE; 7606811959SSimon Glass 7706811959SSimon Glass ret = test_cmd->cmd(test_cmd, flag, argc, argv); 7806811959SSimon Glass 7906811959SSimon Glass return cmd_process_error(test_cmd, ret); 8006811959SSimon Glass } 8106811959SSimon Glass 8206811959SSimon Glass U_BOOT_CMD( 8357f54d55SSimon Glass dm, 3, 1, do_dm, 8406811959SSimon Glass "Driver model low level access", 85fffa24d7SSimon Glass "tree Dump driver model tree ('*' = activated)\n" 8640b6f2d0SMasahiro Yamada "dm uclass Dump list of instances for each uclass\n" 8740b6f2d0SMasahiro Yamada "dm devres Dump list of device resources for each device" 8806811959SSimon Glass ); 89