systemd/2bca841137833edeaf3779542d6...

57 lines
2.1 KiB
Diff

diff --git a/src/kernel-install/90-loaderentry.install.in b/src/kernel-install/90-loaderentry.install.in
index e8e8cf3..8f13307 100755
--- a/src/kernel-install/90-loaderentry.install.in
+++ b/src/kernel-install/90-loaderentry.install.in
@@ -115,6 +115,43 @@ install -m 0644 "$KERNEL_IMAGE" "$KERNEL_DEST" || {
}
chown root:root "$KERNEL_DEST" || :
+if [ -n "$KERNEL_INSTALL_CONF_ROOT" ]; then
+ if [ -f "$KERNEL_INSTALL_CONF_ROOT/devicetree" ]; then
+ read -r DEVICETREE <"$KERNEL_INSTALL_CONF_ROOT/devicetree"
+ fi
+elif [ -f /etc/kernel/devicetree ]; then
+ read -r DEVICETREE </etc/kernel/devicetree
+elif [ -f /usr/lib/kernel/devicetree ]; then
+ read -r DEVICETREE </usr/lib/kernel/devicetree
+fi
+if [ -n "$DEVICETREE" ]; then
+ for prefix in \
+ "/boot/dtb-$KERNEL_VERSION" \
+ "/boot/dtbs/$KERNEL_VERSION" \
+ "/lib/firmware/$KERNEL_VERSION/device-tree" \
+ "/lib/linux-image-$KERNEL_VERSION" \
+ "/lib/modules/$KERNEL_VERSION/dtb"
+ do
+ [ -f "$prefix/$DEVICETREE" ] || continue
+ DEVICETREE_SRC="$prefix/$DEVICETREE"
+ break
+ done
+
+ [ -n "$DEVICETREE_SRC" ] || {
+ echo "Error: could not find device tree blob '$DEVICETREE'." >&2
+ exit 1
+ }
+
+ DEVICETREE_DEST="$ENTRY_DIR_ABS/${DEVICETREE##*/}"
+ DEVICETREE_ENTRY="$ENTRY_DIR/${DEVICETREE##*/}"
+
+ install -m 0644 "$DEVICETREE_SRC" "$DEVICETREE_DEST" || {
+ echo "Error: could not copy '$DEVICETREE_SRC' to '$DEVICETREE_DEST'." >&2
+ exit 1
+ }
+ chown root:root "$DEVICETREE_DEST" || :
+fi
+
shift "$INITRD_OPTIONS_SHIFT"
# All files listed as arguments, and staged files starting with "initrd" are installed as initrds.
for initrd in "$@" "${KERNEL_INSTALL_STAGING_AREA}"/initrd*; do
@@ -151,6 +188,7 @@ mkdir -p "${LOADER_ENTRY%/*}" || {
[ -n "$SORT_KEY" ] && echo "sort-key $SORT_KEY"
echo "options $BOOT_OPTIONS"
echo "linux $KERNEL_ENTRY"
+ [ -n "$DEVICETREE_ENTRY" ] && echo "devicetree $DEVICETREE_ENTRY"
have_initrd=
for initrd in "${@}" "${KERNEL_INSTALL_STAGING_AREA}"/initrd*; do