Skip to content

Commit 356c3ec

Browse files
committed
guess: Add device-tree feature
This feature scans the device tree [1] for compatible nodes and determines which kernel modules are required for the current hardware. It is intended to be used in embedded linux environments where device trees are used to describe hardware. [1] https://www.devicetree.org/specifications/ Signed-off-by: Alexey Gladkov <[email protected]>
1 parent 68a6163 commit 356c3ec

File tree

5 files changed

+71
-14
lines changed

5 files changed

+71
-14
lines changed

guess/device-tree/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Guess module: device tree
2+
3+
This feature scans the device tree [1] for compatible nodes and determines which
4+
kernel modules are required for the current hardware. It is intended to be used
5+
in embedded linux environments where device trees are used to describe hardware.
6+
7+
You can disable this feature by adding to the `/etc/initrd.mk`:
8+
```
9+
DISABLE_GUESS += device-tree
10+
```
11+
12+
[1] https://www.devicetree.org/specifications/
13+
[2] https://github.com/devicetree-org/devicetree-specification

guess/device-tree/action

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/bin/bash -eu
2+
# SPDX-License-Identifier: GPL-3.0-or-later
3+
4+
. guess-functions
5+
6+
$TRACE_SOURCE "Processing ..."
7+
8+
# Check Device Tree and Open Firmware support.
9+
[ -d "$SYSFS_PATH"/firmware/devicetree ] ||
10+
exit 0
11+
12+
# Do the search in reverse order. Searching for modalias files will show us
13+
# nodes that have kernel modules (uevents are much more than a node with
14+
# modalias), among them we look for those that have OF_NAME in uevent (mandatory
15+
# for open firemware) and for these nodes we look for real kernel modules.
16+
#
17+
# shellcheck disable=SC2016
18+
find "$SYSFS_PATH"/devices/ -type f -name modalias -printf '%h/uevent\0' |
19+
xargs -r0 grep -l '^OF_NAME=' 2>/dev/null |
20+
sed -e 's,/uevent$,/modalias,' |
21+
xargs -r sed -e '${ s/$/\n/ }' |
22+
depinfo ${KERNEL:+-k "$KERNEL"} --no-prefix --input=- 2>/dev/null |
23+
sort -u |
24+
sed -r -n -e 's,^.*/lib/modules/[^/]+/,,p' |
25+
filter_device_tree_modules |
26+
while read -r mod; do
27+
mod="${mod##*/}"
28+
guess_optional_module "${mod%.ko}"
29+
done

guess/device-tree/rules.mk

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# SPDX-License-Identifier: GPL-3.0-or-later
2+
PHONY += guess-device-tree
3+
4+
guess-device-tree:
5+
$V echo "Processing $@ ..."
6+
@ GUESS_SUFFIX=add:$@ \
7+
$(DETECTDIR)/device-tree/action
8+
9+
guess: guess-device-tree

guess/loaded-modules/action

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,7 @@ list_builtin_modules()
3737
list_loaded_modules
3838
list_builtin_modules
3939
} |
40-
grep -E \
41-
-e '^kernel/drivers/bus/' \
42-
-e '^kernel/drivers/clk/' \
43-
-e '^kernel/drivers/dma/' \
44-
-e '^kernel/drivers/i2c/' \
45-
-e '^kernel/drivers/mfd/' \
46-
-e '^kernel/drivers/mmc/' \
47-
-e '^kernel/drivers/nvmem/' \
48-
-e '^kernel/drivers/phy/' \
49-
-e '^kernel/drivers/power/supply/' \
50-
-e '^kernel/drivers/regulator/' \
51-
-e '^kernel/drivers/reset/' \
52-
-e '^kernel/drivers/soc/' \
53-
-e '^kernel/drivers/usb/phy/' |
40+
filter_device_tree_modules |
5441
while read -r mod; do
5542
mod="${mod##*/}"
5643
guess_optional_module "${mod%.ko}"

tools/guess-functions

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,4 +189,23 @@ is_active_feature()
189189
return 1
190190
}
191191

192+
filter_device_tree_modules()
193+
{
194+
grep -E \
195+
-e '^kernel/drivers/bus/' \
196+
-e '^kernel/drivers/clk/' \
197+
-e '^kernel/drivers/dma/' \
198+
-e '^kernel/drivers/i2c/' \
199+
-e '^kernel/drivers/mfd/' \
200+
-e '^kernel/drivers/mmc/' \
201+
-e '^kernel/drivers/nvmem/' \
202+
-e '^kernel/drivers/phy/' \
203+
-e '^kernel/drivers/power/supply/' \
204+
-e '^kernel/drivers/regulator/' \
205+
-e '^kernel/drivers/reset/' \
206+
-e '^kernel/drivers/soc/' \
207+
-e '^kernel/drivers/usb/phy/' \
208+
#
209+
}
210+
192211
fi #__included_make_initrd_guess_functions

0 commit comments

Comments
 (0)