From b63f3b74cc6f87a1106e2afd49e82cac3538ef53 Mon Sep 17 00:00:00 2001 From: SzuWei Lin Date: Tue, 10 Jan 2017 11:54:22 +0800 Subject: Add shell scripts to verify DTO Add two shell scripts to verify DTO (device tree overlay). verify_dto_inc.sh uses syntax /include/ to simulate DTO. verify_dto_ovl.sh uses dtc to compile dts to dtb, and uses ufdt_overlay_test_app which implemented with libufdt to apply DTO. Also modified test code and test cases to use these shell scripts. Bug: 33954716 Test: run test scripts (see libufdt/tests/README) Change-Id: Iaa16d6d2b9a6cb767ed0cf25180b0e6ee290415d --- tests/common.sh | 18 +---- tests/gen_test.sh | 91 +++++----------------- tests/run_tests.sh | 5 +- tests/testdata/apply_fragment-base.dts | 7 ++ tests/testdata/apply_fragment-overlay.dts | 4 + tests/testdata/apply_fragment.add_dts | 2 - tests/testdata/apply_fragment.base_dts | 6 -- tests/testdata/dtc_local_fixup.add_dts | 5 -- tests/testdata/dtc_local_fixup.base_dts | 8 -- tests/testdata/libufdt_local_fixup.add_dts | 5 -- tests/testdata/libufdt_local_fixup.add_ov_dts | 11 --- tests/testdata/libufdt_local_fixup.base_dts | 8 -- tests/testdata/local_fixup-base.dts | 7 ++ tests/testdata/local_fixup-overlay.dts | 7 ++ tests/testdata/local_fixup_with_offset-base.dts | 7 ++ tests/testdata/local_fixup_with_offset-overlay.dts | 10 +++ tests/testdata/local_fixup_with_offset.add_dts | 8 -- tests/testdata/local_fixup_with_offset.base_dts | 6 -- tests/testdata/no_local_fixup-base.dts | 7 ++ tests/testdata/no_local_fixup-overlay.dts | 5 ++ tests/testdata/no_local_fixup.add_dts | 3 - tests/testdata/no_local_fixup.base_dts | 7 -- tests/testdata/overlay_2_layers-base.dts | 11 +++ tests/testdata/overlay_2_layers-overlay.dts | 8 ++ tests/testdata/overlay_2_layers.add_dts | 7 -- tests/testdata/overlay_2_layers.base_dts | 11 --- tests/verify_dto_inc.sh | 51 ++++++++++++ tests/verify_dto_ovl.sh | 48 ++++++++++++ 28 files changed, 196 insertions(+), 177 deletions(-) create mode 100644 tests/testdata/apply_fragment-base.dts create mode 100644 tests/testdata/apply_fragment-overlay.dts delete mode 100644 tests/testdata/apply_fragment.add_dts delete mode 100644 tests/testdata/apply_fragment.base_dts delete mode 100644 tests/testdata/dtc_local_fixup.add_dts delete mode 100644 tests/testdata/dtc_local_fixup.base_dts delete mode 100644 tests/testdata/libufdt_local_fixup.add_dts delete mode 100644 tests/testdata/libufdt_local_fixup.add_ov_dts delete mode 100644 tests/testdata/libufdt_local_fixup.base_dts create mode 100644 tests/testdata/local_fixup-base.dts create mode 100644 tests/testdata/local_fixup-overlay.dts create mode 100644 tests/testdata/local_fixup_with_offset-base.dts create mode 100644 tests/testdata/local_fixup_with_offset-overlay.dts delete mode 100644 tests/testdata/local_fixup_with_offset.add_dts delete mode 100644 tests/testdata/local_fixup_with_offset.base_dts create mode 100644 tests/testdata/no_local_fixup-base.dts create mode 100644 tests/testdata/no_local_fixup-overlay.dts delete mode 100644 tests/testdata/no_local_fixup.add_dts delete mode 100644 tests/testdata/no_local_fixup.base_dts create mode 100644 tests/testdata/overlay_2_layers-base.dts create mode 100644 tests/testdata/overlay_2_layers-overlay.dts delete mode 100644 tests/testdata/overlay_2_layers.add_dts delete mode 100644 tests/testdata/overlay_2_layers.base_dts create mode 100755 tests/verify_dto_inc.sh create mode 100755 tests/verify_dto_ovl.sh (limited to 'tests') diff --git a/tests/common.sh b/tests/common.sh index 4c8ce78..7fcc4c4 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -13,20 +13,6 @@ command_exists () { type "$1" &> /dev/null; } -dtb_to_dts () { - dtc -O dts -s $1 - if [ $? -ne 0 ]; then - die "dtb_to_dts $1 failed!" - fi -} - -dts_to_dtb () { - dtc -O dtb -s -@ $1 - if [ $? -ne 0 ]; then - die "dts_to_dtb $1 failed!" - fi -} - remove_local_fixups() { sed '/__local_fixups__/ {s/^\s*__local_fixups__\s*//; :again;N; s/{[^{}]*};//; /^$/ !b again; d}' $1 } @@ -36,6 +22,6 @@ remove_overlay_stuff() { sed "/__symbols__/,/[}];/d" $1 | sed "/\(^[ \t]*phandle\)/d" | sed "/\(^[ \t]*linux,phandle\)/d" | sed '/^\s*$/d' | remove_local_fixups } -dt_diff () { - diff -u <(dtb_to_dts "$1" | remove_overlay_stuff) <(dtb_to_dts "$2" | remove_overlay_stuff) +dts_diff () { + diff -u <(cat "$1" | remove_overlay_stuff) <(cat "$2" | remove_overlay_stuff) } diff --git a/tests/gen_test.sh b/tests/gen_test.sh index 74f7177..dcb6d2d 100755 --- a/tests/gen_test.sh +++ b/tests/gen_test.sh @@ -4,88 +4,39 @@ # the "base" and "add" device tree source (.dts) files in two # different ways. # -# 1) /include/ the "add" at the end of the "base" file and -# compile with dtc to make the "gold standard" .dtb +# 1) Use /include/ and compile via dtc to make the "gold standard" # -# 2) Compile them separately (modifying the "add" file to -# be an overlay file) with dtc, then join them with the -# ov_test program +# 2) Compile them separately dtc, and join them with the +# ufdt_apply_overlay program # -# To do this, we need to generate a lot of files from the .base_dts -# and .add_dts files: -# .base_inc_dts - Has the /include/ "${FILENAME}.add_dts" at the end. -# .base_inc_dtb - The dtc-generated "gold standard" -# .add_ov_dts - Has the /plugin/ at the start -# .base_dtb - Compiled version of just the base -# .add_ov_dtbo - Compiled version of the overlay -# .base_ov_dtb - overlay-test-joined version of the dtb -# -# Then, compare .base_inc_dtb and .base_ov_dtb with dtdiff -# (or maybe diff?) and return 0 iff they are identical. +# Then, compare 1) and 2) with dts_diff (diff merged nodes) and return 0 +# iff they are identical. -# Include some functions from common.sh. SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" source ${SCRIPT_DIR}/common.sh -# Constants -IN_DATA_DIR="testdata" -OUT_DATA_DIR="test-out" - -# Global variables -FILENAME=$1 - on_exit() { - rm -rf "${OUT_DATA_DIR}" -} - -# Generate test cases to OUT_DATA_DIR -prepare_tests() { - cp "${IN_DATA_DIR}/${FILENAME}.base_dts" "${OUT_DATA_DIR}/${FILENAME}.base_dts" - cp "${IN_DATA_DIR}/${FILENAME}.add_dts" "${OUT_DATA_DIR}/${FILENAME}.add_dts" - - # Add the "include" to make .base_inc_dts - cp "${IN_DATA_DIR}/${FILENAME}.base_dts" "${OUT_DATA_DIR}/${FILENAME}.base_inc_dts" - echo "/include/ \"${FILENAME}.add_dts\"" >> "${OUT_DATA_DIR}/${FILENAME}.base_inc_dts" - - # Generate .base_inc_dtb - dtc -@ -O dtb -s -b 0 -o "${OUT_DATA_DIR}/${FILENAME}.base_inc.dtb" \ - "${OUT_DATA_DIR}/${FILENAME}.base_inc_dts" - - # Add /dts-v1/ /plugin/; in front of .add_dts file. In order to trigger dtc's - # fragment generation mechanism. - if [ -a "${IN_DATA_DIR}/${FILENAME}.add_ov_dts" ]; then - cp "${IN_DATA_DIR}/${FILENAME}.add_ov_dts" "${OUT_DATA_DIR}/${FILENAME}.add_ov_dts" - else - sed "1i/dts-v1/ /plugin/;" "${IN_DATA_DIR}/${FILENAME}.add_dts" > \ - "${OUT_DATA_DIR}/${FILENAME}.add_ov_dts" - fi + rm -rf "$TEMP_DIR" } -# Compile test cases into dtb, and do the diff things. -compile_and_diff() { - # Compile the base to make .base_dtb - dtc -O dtb -b 0 -qq -@ -o "${OUT_DATA_DIR}/${FILENAME}.base_dtb" \ - "${OUT_DATA_DIR}/${FILENAME}.base_dts" - - # Compile the overlay to make .add_ov_dtbo - dtc -O dtb -b 0 -qq -@ -o "${OUT_DATA_DIR}/${FILENAME}.add_ov_dtbo" \ - "${OUT_DATA_DIR}/${FILENAME}.add_ov_dts" - - # Run ov_test to combine .base_dtb and .add_ov_dtbo - # into .base_ov_dtb - ufdt_apply_overlay "${OUT_DATA_DIR}/${FILENAME}.base_dtb" \ - "${OUT_DATA_DIR}/${FILENAME}.add_ov_dtbo" \ - "${OUT_DATA_DIR}/${FILENAME}.base_ov.dtb" - - # Run the diff - dt_diff ${OUT_DATA_DIR}/${FILENAME}.base_inc.dtb ${OUT_DATA_DIR}/${FILENAME}.base_ov.dtb -} +# Constants +IN_DATA_DIR="testdata" +TEMP_DIR=`mktemp -d` # The script will exit directly if any command fails. set -e trap on_exit EXIT -mkdir -p "${OUT_DATA_DIR}" >& /dev/null +# Global variables +TESTCASE_NAME=$1 +BASE_DTS="$IN_DATA_DIR/${TESTCASE_NAME}-base.dts" +OVERLAY_DTS="$IN_DATA_DIR/${TESTCASE_NAME}-overlay.dts" +INC_MERGED_DTS="$TEMP_DIR/${TESTCASE_NAME}-inc-merged.dts" +OVL_MERGED_DTS="$TEMP_DIR/${TESTCASE_NAME}-ovl-merged.dts" -prepare_tests -compile_and_diff +# +# Complie and diff +# +$SCRIPT_DIR/verify_dto_inc.sh "$BASE_DTS" "$OVERLAY_DTS" "$INC_MERGED_DTS" +$SCRIPT_DIR/verify_dto_ovl.sh "$BASE_DTS" "$OVERLAY_DTS" "$OVL_MERGED_DTS" +dts_diff "$INC_MERGED_DTS" "$OVL_MERGED_DTS" diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 845f190..1e13528 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -47,11 +47,8 @@ main() { "apply_fragment" \ "Run test about fdt_apply_fragment with phandle update" run_test_case \ - "libufdt_local_fixup" \ + "local_fixup" \ "Run test about fdt_overlay_do_local_fixups" - run_test_case \ - "dtc_local_fixup" \ - "Run test about local fixup format consistent with current dtc" run_test_case \ "local_fixup_with_offset" \ "Run test about dealing with local fixup with offset > 0" diff --git a/tests/testdata/apply_fragment-base.dts b/tests/testdata/apply_fragment-base.dts new file mode 100644 index 0000000..30880bb --- /dev/null +++ b/tests/testdata/apply_fragment-base.dts @@ -0,0 +1,7 @@ +/dts-v1/; + +/ { + a: a {}; + b: b {}; + c: c {}; +}; diff --git a/tests/testdata/apply_fragment-overlay.dts b/tests/testdata/apply_fragment-overlay.dts new file mode 100644 index 0000000..f3e8073 --- /dev/null +++ b/tests/testdata/apply_fragment-overlay.dts @@ -0,0 +1,4 @@ +/dts-v1/ /plugin/; + +&a { d: d{}; }; +&b { e{}; }; diff --git a/tests/testdata/apply_fragment.add_dts b/tests/testdata/apply_fragment.add_dts deleted file mode 100644 index 7666089..0000000 --- a/tests/testdata/apply_fragment.add_dts +++ /dev/null @@ -1,2 +0,0 @@ -&a { d: d{}; }; -&b { e{}; }; diff --git a/tests/testdata/apply_fragment.base_dts b/tests/testdata/apply_fragment.base_dts deleted file mode 100644 index c116a9b..0000000 --- a/tests/testdata/apply_fragment.base_dts +++ /dev/null @@ -1,6 +0,0 @@ -/dts-v1/; -/ { - a: a {}; - b: b {}; - c: c {}; -}; diff --git a/tests/testdata/dtc_local_fixup.add_dts b/tests/testdata/dtc_local_fixup.add_dts deleted file mode 100644 index b158cd7..0000000 --- a/tests/testdata/dtc_local_fixup.add_dts +++ /dev/null @@ -1,5 +0,0 @@ -&a { - c: c{ - d{ interrupt_parent = <&c>; }; - }; -}; diff --git a/tests/testdata/dtc_local_fixup.base_dts b/tests/testdata/dtc_local_fixup.base_dts deleted file mode 100644 index f5a1086..0000000 --- a/tests/testdata/dtc_local_fixup.base_dts +++ /dev/null @@ -1,8 +0,0 @@ -/dts-v1/; -/ { -a: a { - interrupt_parent = <&a>; - }; -}; - - diff --git a/tests/testdata/libufdt_local_fixup.add_dts b/tests/testdata/libufdt_local_fixup.add_dts deleted file mode 100644 index b158cd7..0000000 --- a/tests/testdata/libufdt_local_fixup.add_dts +++ /dev/null @@ -1,5 +0,0 @@ -&a { - c: c{ - d{ interrupt_parent = <&c>; }; - }; -}; diff --git a/tests/testdata/libufdt_local_fixup.add_ov_dts b/tests/testdata/libufdt_local_fixup.add_ov_dts deleted file mode 100644 index 2734141..0000000 --- a/tests/testdata/libufdt_local_fixup.add_ov_dts +++ /dev/null @@ -1,11 +0,0 @@ -/dts-v1/ /plugin/; -/ { - fragment@0 { - target = <&a>; - __overlay__ { - c: c{ - d{ interrupt_parent = <&c>; }; - }; - }; - }; -}; diff --git a/tests/testdata/libufdt_local_fixup.base_dts b/tests/testdata/libufdt_local_fixup.base_dts deleted file mode 100644 index 556e3dc..0000000 --- a/tests/testdata/libufdt_local_fixup.base_dts +++ /dev/null @@ -1,8 +0,0 @@ -/dts-v1/; -/ { - a: a { - interrupt_parent = <&a>; - }; -}; - - diff --git a/tests/testdata/local_fixup-base.dts b/tests/testdata/local_fixup-base.dts new file mode 100644 index 0000000..bc2d837 --- /dev/null +++ b/tests/testdata/local_fixup-base.dts @@ -0,0 +1,7 @@ +/dts-v1/; + +/ { +a: a { + interrupt_parent = <&a>; + }; +}; diff --git a/tests/testdata/local_fixup-overlay.dts b/tests/testdata/local_fixup-overlay.dts new file mode 100644 index 0000000..719a1c8 --- /dev/null +++ b/tests/testdata/local_fixup-overlay.dts @@ -0,0 +1,7 @@ +/dts-v1/ /plugin/; + +&a { + c: c{ + d{ interrupt_parent = <&c>; }; + }; +}; diff --git a/tests/testdata/local_fixup_with_offset-base.dts b/tests/testdata/local_fixup_with_offset-base.dts new file mode 100644 index 0000000..bc2d837 --- /dev/null +++ b/tests/testdata/local_fixup_with_offset-base.dts @@ -0,0 +1,7 @@ +/dts-v1/; + +/ { +a: a { + interrupt_parent = <&a>; + }; +}; diff --git a/tests/testdata/local_fixup_with_offset-overlay.dts b/tests/testdata/local_fixup_with_offset-overlay.dts new file mode 100644 index 0000000..58e6461 --- /dev/null +++ b/tests/testdata/local_fixup_with_offset-overlay.dts @@ -0,0 +1,10 @@ +/dts-v1/ /plugin/; + +&a { + c: c{ + d{ interrupt_parent = <0 1 &c 2 3>; }; + }; + e: e{ + f{ interrupt_parent = <&c 5 &e>; }; + }; +}; diff --git a/tests/testdata/local_fixup_with_offset.add_dts b/tests/testdata/local_fixup_with_offset.add_dts deleted file mode 100644 index f45757e..0000000 --- a/tests/testdata/local_fixup_with_offset.add_dts +++ /dev/null @@ -1,8 +0,0 @@ -&a { - c: c{ - d{ interrupt_parent = <0 1 &c 2 3>; }; - }; - e: e{ - f{ interrupt_parent = <&c 5 &e>; }; - }; -}; diff --git a/tests/testdata/local_fixup_with_offset.base_dts b/tests/testdata/local_fixup_with_offset.base_dts deleted file mode 100644 index f90145d..0000000 --- a/tests/testdata/local_fixup_with_offset.base_dts +++ /dev/null @@ -1,6 +0,0 @@ -/dts-v1/; -/ { -a: a { - interrupt_parent = <&a>; - }; -}; diff --git a/tests/testdata/no_local_fixup-base.dts b/tests/testdata/no_local_fixup-base.dts new file mode 100644 index 0000000..01bad36 --- /dev/null +++ b/tests/testdata/no_local_fixup-base.dts @@ -0,0 +1,7 @@ +/dts-v1/; +/ { + a: a { + b = "b"; + c = "c"; + }; + }; diff --git a/tests/testdata/no_local_fixup-overlay.dts b/tests/testdata/no_local_fixup-overlay.dts new file mode 100644 index 0000000..4be517f --- /dev/null +++ b/tests/testdata/no_local_fixup-overlay.dts @@ -0,0 +1,5 @@ +/dts-v1/ /plugin/; + +&a { c = "new-c"; + d: d = "d"; +}; diff --git a/tests/testdata/no_local_fixup.add_dts b/tests/testdata/no_local_fixup.add_dts deleted file mode 100644 index 2cdf6a4..0000000 --- a/tests/testdata/no_local_fixup.add_dts +++ /dev/null @@ -1,3 +0,0 @@ -&a { c = "new-c"; - d: d = "d"; -}; diff --git a/tests/testdata/no_local_fixup.base_dts b/tests/testdata/no_local_fixup.base_dts deleted file mode 100644 index 01bad36..0000000 --- a/tests/testdata/no_local_fixup.base_dts +++ /dev/null @@ -1,7 +0,0 @@ -/dts-v1/; -/ { - a: a { - b = "b"; - c = "c"; - }; - }; diff --git a/tests/testdata/overlay_2_layers-base.dts b/tests/testdata/overlay_2_layers-base.dts new file mode 100644 index 0000000..1d7b578 --- /dev/null +++ b/tests/testdata/overlay_2_layers-base.dts @@ -0,0 +1,11 @@ +/dts-v1/; +/ { + a: a { + b = "b"; + c = "c"; + d { + e = "e"; + }; + }; +}; + diff --git a/tests/testdata/overlay_2_layers-overlay.dts b/tests/testdata/overlay_2_layers-overlay.dts new file mode 100644 index 0000000..2140d8e --- /dev/null +++ b/tests/testdata/overlay_2_layers-overlay.dts @@ -0,0 +1,8 @@ +/dts-v1/ /plugin/; + +&a { + g = "g"; + d { + f = "f"; + }; +}; diff --git a/tests/testdata/overlay_2_layers.add_dts b/tests/testdata/overlay_2_layers.add_dts deleted file mode 100644 index 952a462..0000000 --- a/tests/testdata/overlay_2_layers.add_dts +++ /dev/null @@ -1,7 +0,0 @@ -&a { - g = "g"; - d { - f = "f"; - }; -}; - diff --git a/tests/testdata/overlay_2_layers.base_dts b/tests/testdata/overlay_2_layers.base_dts deleted file mode 100644 index 1d7b578..0000000 --- a/tests/testdata/overlay_2_layers.base_dts +++ /dev/null @@ -1,11 +0,0 @@ -/dts-v1/; -/ { - a: a { - b = "b"; - c = "c"; - d { - e = "e"; - }; - }; -}; - diff --git a/tests/verify_dto_inc.sh b/tests/verify_dto_inc.sh new file mode 100755 index 0000000..4832593 --- /dev/null +++ b/tests/verify_dto_inc.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +PROG_NAME=`basename $0` + +function usage() { + echo "Usage:" + echo " $PROG_NAME " +} + +function on_exit() { + rm -rf "$TEMP_DIR" +} + +# +# Start +# + +if [[ $# -lt 3 ]]; then + usage + exit 1 +fi + +BASE_DTS=$1 +OVERLAY_DTS=$2 +OUT_DTS=$3 + +TEMP_DIR=`mktemp -d` +# The script will exit directly if any command fails. +set -e +trap on_exit EXIT + +# Finds '/dts-v1/ /plugin/;' and replace to '/* REMOVED */' +OVERLAY_DTS_DIR=`dirname "$OVERLAY_DTS"` +OVERLAY_DTS_NAME=`basename "$OVERLAY_DTS"` +OVERLAY_DT_WO_HEADER_DTS="$TEMP_DIR/$OVERLAY_DTS_NAME" +sed "s/^\\s*\\/dts-v1\\/\s*\\/plugin\\/\\s*;/\\/\\* REMOVED \\*\\//g" \ + "$OVERLAY_DTS" > "$OVERLAY_DT_WO_HEADER_DTS" + +# Appends /include/ ...; +BASE_DTS_DIR=`dirname "$BASE_DTS"` +BASE_DTS_NAME=`basename "$BASE_DTS"` +BASE_DT_WITH_INC_DTS="$TEMP_DIR/$BASE_DTS_NAME" +cp "$BASE_DTS" "$BASE_DT_WITH_INC_DTS" +echo "/include/ \"$OVERLAY_DT_WO_HEADER_DTS\"" >> "$BASE_DT_WITH_INC_DTS" + +# Simulate device tree overlay +MERGED_DTB="$BASE_DT_WITH_INC_DTS.dtb" +dtc -@ -s -i "$BASE_DTS_DIR" -i "$OVERLAY_DTS_DIR" -O dtb -o "$MERGED_DTB" "$BASE_DT_WITH_INC_DTS" + +# Dump +dtc -s -O dts -o "$OUT_DTS" "$MERGED_DTB" diff --git a/tests/verify_dto_ovl.sh b/tests/verify_dto_ovl.sh new file mode 100755 index 0000000..8b4827a --- /dev/null +++ b/tests/verify_dto_ovl.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +PROG_NAME=`basename $0` + +function usage() { + echo "Usage:" + echo " $PROG_NAME " +} + +function on_exit() { + rm -rf "$TEMP_DIR" +} + +# +# Start +# + +if [[ $# -lt 3 ]]; then + usage + exit 1 +fi + +BASE_DTS=$1 +OVERLAY_DTS=$2 +OUT_DTS=$3 + +TEMP_DIR=`mktemp -d` +# The script will exit directly if any command fails. +set -e +trap on_exit EXIT + +# Compile the *-base.dts to make *-base.dtb +BASE_DTS_NAME=`basename "$BASE_DTS"` +BASE_DTB="$TEMP_DIR/${BASE_DTS_NAME}-base.dtb" +dtc -@ -s -qq -O dtb -o "$BASE_DTB" "$BASE_DTS" + +# Compile the *-overlay.dts to make *-overlay.dtb +OVERLAY_DTS_NAME=`basename "$OVERLAY_DTS"` +OVERLAY_DTB="$TEMP_DIR/${OVERLAY_DTS_NAME}-overlay.dtb" +dtc -@ -s -qq -O dtb -o "$OVERLAY_DTB" "$OVERLAY_DTS" + +# Run ufdt_apply_overlay to combine *-base.dtb and *-overlay.dtb +# into *-merged.dtb +MERGED_DTB="$TEMP_DIR/${BASE_DTS_NAME}-merged.dtb" +ufdt_apply_overlay "$BASE_DTB" "$OVERLAY_DTB" "$MERGED_DTB" + +# Dump +dtc -s -O dts -o "$OUT_DTS" "$MERGED_DTB" -- cgit v1.2.3