1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
|
.. SPDX-License-Identifier: GPL-2.0+:
dm command
==========
Synopis
-------
::
dm compat
dm devres
dm drivers
dm static
dm tree [-s]
dm uclass
Description
-----------
The *dm* command allows viewing information about driver model, including the
tree of devices and list of available uclasses.
dm compat
~~~~~~~~~
This shows the compatible strings associated with each driver. Often there
is only one, but multiple strings are shown on their own line. These strings
can be looked up in the device tree files for each board, to see which driver is
used for each node.
dm devres
~~~~~~~~~
This shows a list of a `devres` (device resource) records for a device. Some
drivers use the devres API to allocate memory, so that it can be freed
automatically (without any code needed in the driver's remove() method) when the
device is removed.
This feature is controlled by CONFIG_DEVRES so no useful output is obtained if
this option is disabled.
dm drivers
~~~~~~~~~~
This shows all the available drivers, their uclass and a list of devices that
use that driver, each on its own line. Drivers with no devices are shown with
`<none>` as the driver name.
dm mem
~~~~~~
This subcommand is really just for debugging and exploration. It can be enabled
with the `CONFIG_DM_STATS` option.
All output is in hex except that in brackets which is decimal.
The output consists of a header shows the size of the main device model
structures (struct udevice, struct driver, struct uclass and struct uc_driver)
and the count and memory used by each (number of devices, memory used by
devices, memory used by device names, number of uclasses, memory used by
uclasses).
After that is a table of information about each type of data that can be
attached to a device, showing the number that have non-null data for that type,
the total size of all that data, the amount of memory used in total, the
amount that would be used if this type uses tags instead and the amount that
would be thus saved.
The `driver_data` line shows the number of devices which have non-NULL driver
data.
The `tags` line shows the number of tags and the memory used by those.
At the bottom is an indication of the total memory usage obtained by undertaking
various changes, none of which is currently implemented in U-Boot:
With tags
Using tags instead of all attached types
Singly linked
Using a singly linked list
driver index
Using a driver index instead of a pointer
uclass index
Using a uclass index instead of a pointer
Drop device name
Using empty device names
dm static
~~~~~~~~~
This shows devices bound by platform data, i.e. not from the device tree. There
are normally none of these, but some boards may use static devices for space
reasons.
dm tree
~~~~~~~
This shows the full tree of devices including the following fields:
uclass
Shows the name of the uclass for the device
Index
Shows the index number of the device, within the uclass. This shows the
ordering within the uclass, but not the sequence number.
Probed
Shows `+` if the device is active
Driver
Shows the name of the driver that this device uses
Name
Shows the device name as well as the tree structure, since child devices are
shown attached to their parent.
If -s is given, the top-level devices (those which are children of the root
device) are shown sorted in order of uclass ID, so it is easier to find a
particular device type.
dm uclass
~~~~~~~~~
This shows each uclass along with a list of devices in that uclass. The uclass
ID is shown (e.g. uclass 7) and its name.
For each device, the format is::
n name @ a, seq s
where `n` is the index within the uclass, `a` is the address of the device in
memory and `s` is the sequence number of the device.
Examples
--------
dm compat
~~~~~~~~~
This example shows an abridged version of the sandbox output::
=> dm compat
Driver Compatible
--------------------------------
act8846_reg
sandbox_adder sandbox,adder
axi_sandbox_bus sandbox,axi
blk_partition
bootcount-rtc u-boot,bootcount-rtc
...
rockchip_rk805 rockchip,rk805
rockchip,rk808
rockchip,rk809
rockchip,rk816
rockchip,rk817
rockchip,rk818
root_driver
rtc-rv8803 microcrystal,rv8803
epson,rx8803
epson,rx8900
...
wdt_gpio linux,wdt-gpio
wdt_sandbox sandbox,wdt
dm devres
~~~~~~~~~
This example shows an abridged version of the sandbox test output (running
U-Boot with the -T flag)::
=> dm devres
- root_driver
- demo_shape_drv
- demo_simple_drv
- demo_shape_drv
...
- h-test
- devres-test
00000000130194e0 (100 byte) devm_kmalloc_release BIND
- another-test
...
- syscon@3
- a-mux-controller
0000000013025e60 (96 byte) devm_kmalloc_release PROBE
0000000013025f00 (24 byte) devm_kmalloc_release PROBE
0000000013026010 (24 byte) devm_kmalloc_release PROBE
0000000013026070 (24 byte) devm_kmalloc_release PROBE
00000000130260d0 (24 byte) devm_kmalloc_release PROBE
- syscon@3
- a-mux-controller
0000000013026150 (96 byte) devm_kmalloc_release PROBE
00000000130261f0 (24 byte) devm_kmalloc_release PROBE
0000000013026300 (24 byte) devm_kmalloc_release PROBE
0000000013026360 (24 byte) devm_kmalloc_release PROBE
00000000130263c0 (24 byte) devm_kmalloc_release PROBE
- emul-mux-controller
0000000013025fa0 (32 byte) devm_kmalloc_release PROBE
- testfdtm0
- testfdtm1
...
- pinmux_spi0_pins
- pinmux_uart0_pins
- pinctrl-single-bits
0000000013229180 (320 byte) devm_kmalloc_release PROBE
0000000013229300 (40 byte) devm_kmalloc_release PROBE
0000000013229370 (160 byte) devm_kmalloc_release PROBE
000000001322c190 (40 byte) devm_kmalloc_release PROBE
000000001322c200 (32 byte) devm_kmalloc_release PROBE
- pinmux_i2c0_pins
...
- reg@0
- reg@1
dm drivers
~~~~~~~~~~
This example shows an abridged version of the sandbox output::
=> dm drivers
Driver uid uclass Devices
----------------------------------------------------------
act8846_reg 087 regulator <none>
sandbox_adder 021 axi adder
adder
axi_sandbox_bus 021 axi axi@0
...
da7219 061 misc <none>
demo_shape_drv 001 demo demo_shape_drv
demo_shape_drv
demo_shape_drv
demo_simple_drv 001 demo demo_simple_drv
demo_simple_drv
testfdt_drv 003 testfdt a-test
b-test
d-test
e-test
f-test
g-test
another-test
chosen-test
testbus_drv 005 testbus some-bus
mmio-bus@0
mmio-bus@1
dsa-port 039 ethernet lan0
lan1
dsa_sandbox 035 dsa dsa-test
eep_sandbox 121 w1_eeprom <none>
...
pfuze100_regulator 087 regulator <none>
phy_sandbox 077 phy bind-test-child1
gen_phy@0
gen_phy@1
gen_phy@2
pinconfig 078 pinconfig gpios
gpio0
gpio1
gpio2
gpio3
i2c
groups
pins
i2s
spi
cs
pinmux_pwm_pins
pinmux_spi0_pins
pinmux_uart0_pins
pinmux_i2c0_pins
pinmux_lcd_pins
pmc_sandbox 017 power-mgr pci@1e,0
act8846 pmic 080 pmic <none>
max77686_pmic 080 pmic <none>
mc34708_pmic 080 pmic pmic@41
...
wdt_gpio 122 watchdog gpio-wdt
wdt_sandbox 122 watchdog wdt@0
=>
dm mem
~~~~~~
This example shows the sandbox output::
> dm mem
Struct sizes: udevice b0, driver 80, uclass 30, uc_driver 78
Memory: device fe:aea0, device names a16, uclass 5e:11a0
Attached type Count Size Cur Tags Save
--------------- ----- ----- ----- ----- -----
plat 45 a8f aea0 a7c4 6dc (1756)
parent_plat 1a 3b8 aea0 a718 788 (1928)
uclass_plat 3d 6b4 aea0 a7a4 6fc (1788)
priv 8a 68f3 aea0 a8d8 5c8 (1480)
parent_priv 8 38a0 aea0 a6d0 7d0 (2000)
uclass_priv 4e 14a6 aea0 a7e8 6b8 (1720)
driver_data f 0 aea0 a6ec 7b4 (1972)
uclass 6 20
Attached total 191 cb54 3164 (12644)
tags 0 0
Total size: 18b94 (101268)
With tags: 15a30 (88624)
- singly-linked: 14260 (82528)
- driver index: 13b6e (80750)
- uclass index: 1347c (78972)
Drop device name (not SRAM): a16 (2582)
=>
dm static
~~~~~~~~~
This example shows the sandbox output::
=> dm static
Driver Address
---------------------------------
demo_shape_drv 0000562edab8dca0
demo_simple_drv 0000562edab8dca0
demo_shape_drv 0000562edab8dc90
demo_simple_drv 0000562edab8dc80
demo_shape_drv 0000562edab8dc80
test_drv 0000562edaae8840
test_drv 0000562edaae8848
test_drv 0000562edaae8850
sandbox_gpio 0000000000000000
mod_exp_sw 0000000000000000
sandbox_test_proc 0000562edabb5330
qfw_sandbox 0000000000000000
sandbox_timer 0000000000000000
sandbox_serial 0000562edaa8ed00
sysreset_sandbox 0000000000000000
dm tree
-------
This example shows the abridged sandbox output::
=> dm tree
Class Index Probed Driver Name
-----------------------------------------------------------
root 0 [ + ] root_driver root_driver
demo 0 [ ] demo_shape_drv |-- demo_shape_drv
demo 1 [ ] demo_simple_drv |-- demo_simple_drv
demo 2 [ ] demo_shape_drv |-- demo_shape_drv
demo 3 [ ] demo_simple_drv |-- demo_simple_drv
demo 4 [ ] demo_shape_drv |-- demo_shape_drv
test 0 [ ] test_drv |-- test_drv
test 1 [ ] test_drv |-- test_drv
test 2 [ ] test_drv |-- test_drv
..
sysreset 0 [ ] sysreset_sandbox |-- sysreset_sandbox
bootstd 0 [ ] bootstd_drv |-- bootstd
bootmeth 0 [ ] bootmeth_extlinux | |-- extlinux
bootmeth 1 [ ] bootmeth_efi | `-- efi
reboot-mod 0 [ ] reboot-mode-gpio |-- reboot-mode0
reboot-mod 1 [ ] reboot-mode-rtc |-- reboot-mode@14
...
ethernet 7 [ + ] dsa-port | `-- lan1
pinctrl 0 [ + ] sandbox_pinctrl_gpio |-- pinctrl-gpio
gpio 1 [ + ] sandbox_gpio | |-- base-gpios
nop 0 [ + ] gpio_hog | | |-- hog_input_active_low
nop 1 [ + ] gpio_hog | | |-- hog_input_active_high
nop 2 [ + ] gpio_hog | | |-- hog_output_low
nop 3 [ + ] gpio_hog | | `-- hog_output_high
gpio 2 [ ] sandbox_gpio | |-- extra-gpios
gpio 3 [ ] sandbox_gpio | `-- pinmux-gpios
i2c 0 [ + ] sandbox_i2c |-- i2c@0
i2c_eeprom 0 [ ] i2c_eeprom | |-- eeprom@2c
i2c_eeprom 1 [ ] i2c_eeprom_partition | | `-- bootcount@10
rtc 0 [ ] sandbox_rtc | |-- rtc@43
rtc 1 [ + ] sandbox_rtc | |-- rtc@61
i2c_emul_p 0 [ + ] sandbox_i2c_emul_par | |-- emul
i2c_emul 0 [ ] sandbox_i2c_eeprom_e | | |-- emul-eeprom
i2c_emul 1 [ ] sandbox_i2c_rtc_emul | | |-- emul0
i2c_emul 2 [ + ] sandbox_i2c_rtc_emul | | |-- emull
i2c_emul 3 [ ] sandbox_i2c_pmic_emu | | |-- pmic-emul0
i2c_emul 4 [ ] sandbox_i2c_pmic_emu | | `-- pmic-emul1
pmic 0 [ ] sandbox_pmic | |-- sandbox_pmic
regulator 0 [ ] sandbox_buck | | |-- buck1
regulator 1 [ ] sandbox_buck | | |-- buck2
regulator 2 [ ] sandbox_ldo | | |-- ldo1
regulator 3 [ ] sandbox_ldo | | |-- ldo2
regulator 4 [ ] sandbox_buck | | `-- no_match_by_nodename
pmic 1 [ ] mc34708_pmic | `-- pmic@41
bootcount 0 [ + ] bootcount-rtc |-- bootcount@0
bootcount 1 [ ] bootcount-i2c-eeprom |-- bootcount
...
clk 4 [ ] fixed_clock |-- osc
firmware 0 [ ] sandbox_firmware |-- sandbox-firmware
scmi_agent 0 [ ] sandbox-scmi_agent `-- scmi
clk 5 [ ] scmi_clk |-- protocol@14
reset 2 [ ] scmi_reset_domain |-- protocol@16
nop 8 [ ] scmi_voltage_domain `-- regulators
regulator 5 [ ] scmi_regulator |-- reg@0
regulator 6 [ ] scmi_regulator `-- reg@1
=>
dm uclass
~~~~~~~~~
This example shows the abridged sandbox output::
=> dm uclass
uclass 0: root
0 * root_driver @ 03015460, seq 0
uclass 1: demo
0 demo_shape_drv @ 03015560, seq 0
1 demo_simple_drv @ 03015620, seq 1
2 demo_shape_drv @ 030156e0, seq 2
3 demo_simple_drv @ 030157a0, seq 3
4 demo_shape_drv @ 03015860, seq 4
uclass 2: test
0 test_drv @ 03015980, seq 0
1 test_drv @ 03015a60, seq 1
2 test_drv @ 03015b40, seq 2
...
uclass 20: audio-codec
0 audio-codec @ 030168e0, seq 0
uclass 21: axi
0 adder @ 0301db60, seq 1
1 adder @ 0301dc40, seq 2
2 axi@0 @ 030217d0, seq 0
uclass 22: blk
0 mmc2.blk @ 0301ca00, seq 0
1 mmc1.blk @ 0301cee0, seq 1
2 mmc0.blk @ 0301d380, seq 2
uclass 23: bootcount
0 * bootcount@0 @ 0301b3f0, seq 0
1 bootcount @ 0301b4b0, seq 1
2 bootcount_4@0 @ 0301b570, seq 2
3 bootcount_2@0 @ 0301b630, seq 3
uclass 24: bootdev
0 mmc2.bootdev @ 0301cbb0, seq 0
1 mmc1.bootdev @ 0301d050, seq 1
2 mmc0.bootdev @ 0301d4f0, seq 2
...
uclass 78: pinconfig
0 gpios @ 03022410, seq 0
1 gpio0 @ 030224d0, seq 1
2 gpio1 @ 03022590, seq 2
3 gpio2 @ 03022650, seq 3
4 gpio3 @ 03022710, seq 4
5 i2c @ 030227d0, seq 5
6 groups @ 03022890, seq 6
7 pins @ 03022950, seq 7
8 i2s @ 03022a10, seq 8
9 spi @ 03022ad0, seq 9
10 cs @ 03022b90, seq 10
11 pinmux_pwm_pins @ 03022e10, seq 11
12 pinmux_spi0_pins @ 03022ed0, seq 12
13 pinmux_uart0_pins @ 03022f90, seq 13
14 * pinmux_i2c0_pins @ 03023130, seq 14
15 * pinmux_lcd_pins @ 030231f0, seq 15
...
uclass 119: virtio
0 sandbox_virtio1 @ 030220d0, seq 0
1 sandbox_virtio2 @ 03022190, seq 1
uclass 120: w1
uclass 121: w1_eeprom
uclass 122: watchdog
0 * gpio-wdt @ 0301c070, seq 0
1 * wdt@0 @ 03021710, seq 1
=>
|