Add libfdt unit test cases
This patch incorporates the standalone libfdt unit tests written by Andre
Przywara into the unit test framework. These tests use DTB files to
exercise the functions in libfdt and fdt_wrappers.c to ensure that they work
correctly.
Several of these DTBs cannot be supplied in this repository due to license
restrictions, they are found in the Linux kernel source tree and in the
trusted firmware a source tree. A script has been provided to build these
DTB files and place them in the correct location to be used and can be
found in tests/lib/fdt/device_trees, it requires the two source trees to
be provided as arguments.
At some point we'd like to include DTS files in this repository to make
things easier but for now they are external dependencies.
Signed-off-by: John Powell <john.powell@arm.com>
Co-authored-by: Andre Przywara <andre.przywara@arm.com>
Change-Id: Ieccc61f84fc6ae91d6871224e8538e2d78218444
diff --git a/tests/lib/fdt/device_trees/build_dtb.sh b/tests/lib/fdt/device_trees/build_dtb.sh
new file mode 100755
index 0000000..30ee90b
--- /dev/null
+++ b/tests/lib/fdt/device_trees/build_dtb.sh
@@ -0,0 +1,82 @@
+#
+# Copyright (c) 2020, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+LINUX_SOURCE=$1
+TFA_SOURCE=$2
+DTS_LINUX64_JUNO_R1="$LINUX_SOURCE/arch/arm64/boot/dts/arm/juno-r1.dts"
+DTS_LINUX64_SUN50I_A64_PINE64_PLUS="$LINUX_SOURCE/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64-plus.dts"
+DTS_LINUX32_ATLAS7_EVB="$LINUX_SOURCE/arch/arm/boot/dts/atlas7-evb.dts"
+DTS_LINUX32_BCM2837_RPI_3_B_PLUS="$LINUX_SOURCE/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts"
+DTS_TEST="test.dts"
+DTS_FVP_BASE_GICV3_PSCI="$TFA_SOURCE/fdts/fvp-base-gicv3-psci.dts"
+
+process_linux_dts()
+{
+ # DTS file path in first argument
+ # DTB file in 2nd argument
+ # Use global LINUX_SOURCE
+ DTS_FILE=$1
+ DTB_FILE=$2
+
+ cpp -I $LINUX_SOURCE/include -x assembler-with-cpp -o $DTS_FILE.preprocessed $DTS_FILE
+ sed -i -e '/stdc-predef.h/d' $DTS_FILE.preprocessed -e 's/1,pci-domain/linux,pci-domain/g' $DTS_FILE.preprocessed
+ dtc -O dtb -o $DTB_FILE -i $DTS_FILE -b 0 $DTS_FILE.preprocessed
+ rm $DTS_FILE.preprocessed
+}
+
+process_tfa_dts()
+{
+ # DTS file path in first argument
+ # DTB file in 2nd argument
+ DTS_FILE=$1
+ DTB_FILE=$2
+ cpp -I $TFA_SOURCE/include -x assembler-with-cpp -o $DTS_FILE.preprocessed $DTS_FILE
+ sed -i -e '/stdc-predef.h/d' $DTS_FILE.preprocessed -e 's/1,pci-domain/linux,pci-domain/g' $DTS_FILE.preprocessed
+ dtc -O dtb -o $DTB_FILE -i $DTS_FILE -b 0 $DTS_FILE.preprocessed
+ rm $DTS_FILE.preprocessed
+}
+
+process_dts()
+{
+ # DTS file path in first argument
+ # DTB file in 2nd argument
+ DTS_FILE=$1
+ DTB_FILE=$2
+ dtc -o $DTB_FILE $DTS_FILE
+}
+
+# basic argument checks
+if [[ ( "$1" == "-h" ) || ( "$1" == "--help" ) ]]; then
+ echo "Usage: $0 [OPTION] path/to/linux/source path/to/tfa/source"
+ echo ""
+ echo " This script will build the necessary DTB files from their"
+ echo " sources in the Linux kernel and TFA repositories. Provide the"
+ echo " path to the Linux source tree as the first argument to this"
+ echo " script and the path to the TFA source tree as the second"
+ echo " argument."
+ echo ""
+ echo " -h, --help print this help text"
+ exit 0
+fi
+if [[ ( -z "$1" ) || ( -z "$2" ) ]]; then
+ echo "Invalid arguments, use -h/--help for more info."
+ exit 1
+fi
+
+# create a folder for new DTB files to be placed in
+mkdir dtb
+
+# generate linux DTB files
+process_linux_dts $DTS_LINUX64_JUNO_R1 dtb/juno-r1.dtb
+process_linux_dts $DTS_LINUX64_SUN50I_A64_PINE64_PLUS dtb/sun50i-a64-pine64-plus.dtb
+process_linux_dts $DTS_LINUX32_ATLAS7_EVB dtb/atlas7-evb.dtb
+process_linux_dts $DTS_LINUX32_BCM2837_RPI_3_B_PLUS dtb/bcm2837-rpi-3-b-plus.dtb
+
+# generate TFA DTB file
+process_tfa_dts $DTS_FVP_BASE_GICV3_PSCI dtb/fvp-base-gicv3-psci.dtb
+
+# generate test DTB file
+process_dts $DTS_TEST dtb/test.dtb
diff --git a/tests/lib/fdt/device_trees/test.dts b/tests/lib/fdt/device_trees/test.dts
new file mode 100644
index 0000000..ce10e99
--- /dev/null
+++ b/tests/lib/fdt/device_trees/test.dts
@@ -0,0 +1,91 @@
+/dts-v1/;
+/{
+ #address-cells = <2>;
+ #size-cells = <2>;
+ dev1@184090000 {
+ compatible = "acme,device1";
+ reg = <0x1 0x84090000 0 0x10000>;
+ address = <0x1 0x84090000 0 0x10000>;
+ };
+ dev2@40000 {
+ compatible = "acme,device2";
+ reg = <0 0x40000 0 0x10000>;
+ address = <0 0x40000 0 0x10000>;
+ };
+ transparent-bus {
+ compatible = "simple-bus";
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+ dev3@1c00000 {
+ compatible = "acme,device3";
+ reg = <0 0x1c00000 0x0 0x40000>;
+ address = <0 0x1c00000 0x0 0x40000>;
+ };
+ dev4@901300000 {
+ compatible = "acme,device4";
+ reg = <9 0x1300000 0x0 0x40000>;
+ address = <9 0x1300000 0x0 0x40000>;
+ };
+ };
+ legacy-bus@40000000 {
+ compatible = "simple-bus";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0x0 0 0x40000000 0x10000000>;
+ dev5@0 {
+ compatible = "acme,device5";
+ reg = <0x0 0x10000>;
+ address = <0x0 0x40000000 0x0 0x10000>;
+ };
+
+ dev6@90000 {
+ compatible = "acme,device6";
+ reg = <0x90000 0x10000>;
+ address = <0x0 0x40090000 0x0 0x10000>;
+ };
+ large-bus@8000000 {
+ compatible = "simple-bus";
+ #address-cells = <2>;
+ #size-cells = <1>;
+ ranges = <0x0 0x1000000 0x8000000 0x8000000>;
+ /* outside of any mapping entry */
+ dev7@800000 {
+ compatible = "acme,device7";
+ reg = <0 0x800000 0x1000>;
+ address = <0xffffffff 0xffffffff 0x0 0x1000>;
+ };
+ dev8@1400000 {
+ compatible = "acme,device8";
+ reg = <0 0x1400000 0x1000>;
+ address = <0 0x48400000 0x0 0x1000>;
+ };
+ };
+ };
+ high-bus@c0000000 {
+ compatible = "simple-bus";
+ #address-cells = <2>;
+ #size-cells = <1>;
+ ranges = <0 0x0 0 0xc0000000 0x10000000>,
+ <1 0x0 2 0x80000000 0x10000000>,
+ <3 0x0 4 0xc0000000 0x10000000>,
+ <9 0x0 3 0x40000000 0x10000000>,
+ <5 0x0 9 0xd0000000 0x10000000>;
+ dev9@100030000 {
+ compatible = "acme,device9";
+ reg = <1 0x30000 0x10000>;
+ address = <0x2 0x80030000 0x0 0x10000>;
+ };
+ dev10@300180000 {
+ compatible = "acme,device10";
+ reg = <3 0x180000 0x10000>;
+ address = <4 0xc0180000 0 0x10000>;
+ };
+ /* not actually mapped */
+ dev11@400080000 {
+ compatible = "acme,device11";
+ reg = <4 0x80000 0x10000>;
+ address = <0xffffffff 0xffffffff 0x0 0x10000>;
+ };
+ };
+};