]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - test/dm/cmd_dm.c
test: Add a common unit test command
[karo-tx-uboot.git] / test / dm / cmd_dm.c
1 /*
2  * Copyright (c) 2013 Google, Inc
3  *
4  * (C) Copyright 2012
5  * Marek Vasut <marex@denx.de>
6  *
7  * SPDX-License-Identifier:     GPL-2.0+
8  */
9
10 #include <common.h>
11 #include <dm.h>
12 #include <malloc.h>
13 #include <mapmem.h>
14 #include <errno.h>
15 #include <asm/io.h>
16 #include <dm/root.h>
17 #include <dm/test.h>
18 #include <dm/uclass-internal.h>
19
20 static void show_devices(struct udevice *dev, int depth, int last_flag)
21 {
22         int i, is_last;
23         struct udevice *child;
24         char class_name[12];
25
26         /* print the first 11 characters to not break the tree-format. */
27         strlcpy(class_name, dev->uclass->uc_drv->name, sizeof(class_name));
28         printf(" %-11s [ %c ]    ", class_name,
29                dev->flags & DM_FLAG_ACTIVATED ? '+' : ' ');
30
31         for (i = depth; i >= 0; i--) {
32                 is_last = (last_flag >> i) & 1;
33                 if (i) {
34                         if (is_last)
35                                 printf("    ");
36                         else
37                                 printf("|   ");
38                 } else {
39                         if (is_last)
40                                 printf("`-- ");
41                         else
42                                 printf("|-- ");
43                 }
44         }
45
46         printf("%s\n", dev->name);
47
48         list_for_each_entry(child, &dev->child_head, sibling_node) {
49                 is_last = list_is_last(&child->sibling_node, &dev->child_head);
50                 show_devices(child, depth + 1, (last_flag << 1) | is_last);
51         }
52 }
53
54 static int do_dm_dump_all(cmd_tbl_t *cmdtp, int flag, int argc,
55                           char * const argv[])
56 {
57         struct udevice *root;
58
59         root = dm_root();
60         if (root) {
61                 printf(" Class       Probed   Name\n");
62                 printf("----------------------------------------\n");
63                 show_devices(root, -1, 0);
64         }
65
66         return 0;
67 }
68
69 /**
70  * dm_display_line() - Display information about a single device
71  *
72  * Displays a single line of information with an option prefix
73  *
74  * @dev:        Device to display
75  */
76 static void dm_display_line(struct udevice *dev)
77 {
78         printf("- %c %s @ %08lx",
79                dev->flags & DM_FLAG_ACTIVATED ? '*' : ' ',
80                dev->name, (ulong)map_to_sysmem(dev));
81         if (dev->seq != -1 || dev->req_seq != -1)
82                 printf(", seq %d, (req %d)", dev->seq, dev->req_seq);
83         puts("\n");
84 }
85
86 static int do_dm_dump_uclass(cmd_tbl_t *cmdtp, int flag, int argc,
87                              char * const argv[])
88 {
89         struct uclass *uc;
90         int ret;
91         int id;
92
93         for (id = 0; id < UCLASS_COUNT; id++) {
94                 struct udevice *dev;
95
96                 ret = uclass_get(id, &uc);
97                 if (ret)
98                         continue;
99
100                 printf("uclass %d: %s\n", id, uc->uc_drv->name);
101                 if (list_empty(&uc->dev_head))
102                         continue;
103                 list_for_each_entry(dev, &uc->dev_head, uclass_node) {
104                         dm_display_line(dev);
105                 }
106                 puts("\n");
107         }
108
109         return 0;
110 }
111
112 #ifdef CONFIG_DM_TEST
113 static int do_dm_test(cmd_tbl_t *cmdtp, int flag, int argc,
114                           char * const argv[])
115 {
116         const char *test_name = NULL;
117
118         if (argc > 0)
119                 test_name = argv[0];
120
121         return dm_test_main(test_name);
122 }
123 #define TEST_HELP "\ndm test         Run tests"
124 #else
125 #define TEST_HELP
126 #endif
127
128 static cmd_tbl_t test_commands[] = {
129         U_BOOT_CMD_MKENT(tree, 0, 1, do_dm_dump_all, "", ""),
130         U_BOOT_CMD_MKENT(uclass, 1, 1, do_dm_dump_uclass, "", ""),
131 #ifdef CONFIG_DM_TEST
132         U_BOOT_CMD_MKENT(test, 1, 1, do_dm_test, "", ""),
133 #endif
134 };
135
136 static int do_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
137 {
138         cmd_tbl_t *test_cmd;
139         int ret;
140
141         if (argc < 2)
142                 return CMD_RET_USAGE;
143         test_cmd = find_cmd_tbl(argv[1], test_commands,
144                                 ARRAY_SIZE(test_commands));
145         argc -= 2;
146         argv += 2;
147         if (!test_cmd || argc > test_cmd->maxargs)
148                 return CMD_RET_USAGE;
149
150         ret = test_cmd->cmd(test_cmd, flag, argc, argv);
151
152         return cmd_process_error(test_cmd, ret);
153 }
154
155 U_BOOT_CMD(
156         dm,     3,      1,      do_dm,
157         "Driver model low level access",
158         "tree         Dump driver model tree ('*' = activated)\n"
159         "dm uclass        Dump list of instances for each uclass"
160         TEST_HELP
161 );