xref: /openbmc/u-boot/cmd/dm.c (revision 522e0354)
1*6df41b1cSTom Rini // SPDX-License-Identifier: GPL-2.0+
2*6df41b1cSTom Rini /*
3*6df41b1cSTom Rini  * Copyright (c) 2013 Google, Inc
4*6df41b1cSTom Rini  *
5*6df41b1cSTom Rini  * (C) Copyright 2012
6*6df41b1cSTom Rini  * Marek Vasut <marex@denx.de>
7*6df41b1cSTom Rini  */
8*6df41b1cSTom Rini 
9*6df41b1cSTom Rini #include <common.h>
10*6df41b1cSTom Rini #include <command.h>
11*6df41b1cSTom Rini #include <dm.h>
12*6df41b1cSTom Rini #include <malloc.h>
13*6df41b1cSTom Rini #include <mapmem.h>
14*6df41b1cSTom Rini #include <errno.h>
15*6df41b1cSTom Rini #include <asm/io.h>
16*6df41b1cSTom Rini #include <dm/root.h>
17*6df41b1cSTom Rini #include <dm/util.h>
18*6df41b1cSTom Rini 
do_dm_dump_all(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])19*6df41b1cSTom Rini static int do_dm_dump_all(cmd_tbl_t *cmdtp, int flag, int argc,
20*6df41b1cSTom Rini 			  char * const argv[])
21*6df41b1cSTom Rini {
22*6df41b1cSTom Rini 	dm_dump_all();
23*6df41b1cSTom Rini 
24*6df41b1cSTom Rini 	return 0;
25*6df41b1cSTom Rini }
26*6df41b1cSTom Rini 
do_dm_dump_uclass(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])27*6df41b1cSTom Rini static int do_dm_dump_uclass(cmd_tbl_t *cmdtp, int flag, int argc,
28*6df41b1cSTom Rini 			     char * const argv[])
29*6df41b1cSTom Rini {
30*6df41b1cSTom Rini 	dm_dump_uclass();
31*6df41b1cSTom Rini 
32*6df41b1cSTom Rini 	return 0;
33*6df41b1cSTom Rini }
34*6df41b1cSTom Rini 
do_dm_dump_devres(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])35*6df41b1cSTom Rini static int do_dm_dump_devres(cmd_tbl_t *cmdtp, int flag, int argc,
36*6df41b1cSTom Rini 			     char * const argv[])
37*6df41b1cSTom Rini {
38*6df41b1cSTom Rini 	dm_dump_devres();
39*6df41b1cSTom Rini 
40*6df41b1cSTom Rini 	return 0;
41*6df41b1cSTom Rini }
42*6df41b1cSTom Rini 
43*6df41b1cSTom Rini static cmd_tbl_t test_commands[] = {
44*6df41b1cSTom Rini 	U_BOOT_CMD_MKENT(tree, 0, 1, do_dm_dump_all, "", ""),
45*6df41b1cSTom Rini 	U_BOOT_CMD_MKENT(uclass, 1, 1, do_dm_dump_uclass, "", ""),
46*6df41b1cSTom Rini 	U_BOOT_CMD_MKENT(devres, 1, 1, do_dm_dump_devres, "", ""),
47*6df41b1cSTom Rini };
48*6df41b1cSTom Rini 
dm_reloc(void)49*6df41b1cSTom Rini static __maybe_unused void dm_reloc(void)
50*6df41b1cSTom Rini {
51*6df41b1cSTom Rini 	static int relocated;
52*6df41b1cSTom Rini 
53*6df41b1cSTom Rini 	if (!relocated) {
54*6df41b1cSTom Rini 		fixup_cmdtable(test_commands, ARRAY_SIZE(test_commands));
55*6df41b1cSTom Rini 		relocated = 1;
56*6df41b1cSTom Rini 	}
57*6df41b1cSTom Rini }
58*6df41b1cSTom Rini 
do_dm(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])59*6df41b1cSTom Rini static int do_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
60*6df41b1cSTom Rini {
61*6df41b1cSTom Rini 	cmd_tbl_t *test_cmd;
62*6df41b1cSTom Rini 	int ret;
63*6df41b1cSTom Rini 
64*6df41b1cSTom Rini #ifdef CONFIG_NEEDS_MANUAL_RELOC
65*6df41b1cSTom Rini 	dm_reloc();
66*6df41b1cSTom Rini #endif
67*6df41b1cSTom Rini 
68*6df41b1cSTom Rini 	if (argc < 2)
69*6df41b1cSTom Rini 		return CMD_RET_USAGE;
70*6df41b1cSTom Rini 	test_cmd = find_cmd_tbl(argv[1], test_commands,
71*6df41b1cSTom Rini 				ARRAY_SIZE(test_commands));
72*6df41b1cSTom Rini 	argc -= 2;
73*6df41b1cSTom Rini 	argv += 2;
74*6df41b1cSTom Rini 	if (!test_cmd || argc > test_cmd->maxargs)
75*6df41b1cSTom Rini 		return CMD_RET_USAGE;
76*6df41b1cSTom Rini 
77*6df41b1cSTom Rini 	ret = test_cmd->cmd(test_cmd, flag, argc, argv);
78*6df41b1cSTom Rini 
79*6df41b1cSTom Rini 	return cmd_process_error(test_cmd, ret);
80*6df41b1cSTom Rini }
81*6df41b1cSTom Rini 
82*6df41b1cSTom Rini U_BOOT_CMD(
83*6df41b1cSTom Rini 	dm,	3,	1,	do_dm,
84*6df41b1cSTom Rini 	"Driver model low level access",
85*6df41b1cSTom Rini 	"tree          Dump driver model tree ('*' = activated)\n"
86*6df41b1cSTom Rini 	"dm uclass        Dump list of instances for each uclass\n"
87*6df41b1cSTom Rini 	"dm devres        Dump list of device resources for each device"
88*6df41b1cSTom Rini );
89