aboutsummaryrefslogtreecommitdiff
path: root/scripts/common
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/common')
-rw-r--r--scripts/common167
1 files changed, 167 insertions, 0 deletions
diff --git a/scripts/common b/scripts/common
new file mode 100644
index 0000000..f311ac5
--- /dev/null
+++ b/scripts/common
@@ -0,0 +1,167 @@
+#!/bin/bash
+
+# scripts/common makes use of variables defined in the ImageBuilder
+# config file as described in README.md, including but not limited to
+# the following:
+#
+# - UBOOT_SOURCE
+# - UBOOT_SCRIPT
+# - NUM_DOMUS
+# - DOMU_PASSTHROUGH_PATHS
+# - DOMU_PASSTHROUGH_DTB
+
+tmp_files=()
+tmp_dirs=()
+
+function remove_tmp_files()
+{
+ for i in "${tmp_files[@]}"
+ do
+ rm -r "$i"
+ done
+
+ for i in "${tmp_dirs[@]}"
+ do
+ rm -rf "$i"
+ done
+}
+
+function cleanup_and_return_err()
+{
+ rm -f $UBOOT_SOURCE $UBOOT_SCRIPT
+ remove_tmp_files
+ exit 1
+}
+
+function sanity_check_partial_dts()
+{
+ local domU_passthrough_path="$1"
+ local repo="$2"
+ local dir="$3"
+ local address_cells_val
+ local size_cells_val
+ local tmpdtb
+ local val
+ local file
+
+ for devpath in $domU_passthrough_path
+ do
+ file=${devpath##*/}
+ file="$repo"/"$dir"/"$file".dts
+
+ if ! test -f "$file"
+ then
+ echo "Device tree \"$file\" is not present"
+ cleanup_and_return_err
+ fi
+
+ tmpdtb=`mktemp`
+ dtc -I dts -O dtb -o $tmpdtb "$file"
+ tmp_files+=($tmpdtb)
+
+ val=$(fdtget $tmpdtb /passthrough \#address-cells)
+ if test -z "$address_cells_val"
+ then
+ address_cells_val="$val"
+ else
+ if test "$address_cells_val" -ne "$val"
+ then
+ echo "Address cells mismatch for ${DOMU_PASSTHROUGH_PATHS[$i]}"
+ cleanup_and_return_err
+ fi
+ fi
+
+ val=$(fdtget $tmpdtb /passthrough \#size-cells)
+ if test -z "$size_cells_val"
+ then
+ size_cells_val="$val"
+ else
+ if test "$size_cells_val" -ne "$val"
+ then
+ echo "Size cells mismatch for ${DOMU_PASSTHROUGH_PATHS[$i]}"
+ cleanup_and_return_err
+ fi
+ fi
+ done
+}
+
+function compile_merge_partial_dts()
+{
+ local repo=$(echo "$1" | awk '{print $1}')
+ local dir=$(echo "$1" | awk '{print $2}')
+ local tmp
+ local tmp_dtb_dir
+
+ if [[ "$repo" =~ .*@.*:.* ]]
+ then
+ tmp=`mktemp -d`
+ tmp_dirs+=($tmp)
+
+ echo "Cloning git repo \"$git_repo\""
+ git clone "$repo" $tmp
+ if [ $? -ne 0 ]
+ then
+ echo "Error occurred while cloning \"$git_repo\""
+ cleanup_and_return_err
+ fi
+
+ repo=$tmp
+ fi
+
+ tmp_dtb_dir=`mktemp -d "partial-dtbs-XXX"`
+
+ if test -z "$dir"
+ then
+ dir="."
+ fi
+
+ i=0
+ while test $i -lt $NUM_DOMUS
+ do
+ if test -z "${DOMU_PASSTHROUGH_PATHS[$i]}"
+ then
+ echo "DOMU_PASSTHROUGH_PATHS[$i] is not defined"
+ cleanup_and_return_err
+ fi
+
+ sanity_check_partial_dts "${DOMU_PASSTHROUGH_PATHS[$i]}" "$repo" "$dir"
+
+ tmp=`mktemp "$tmp_dtb_dir/partial-dts-domU$i-XXX"`
+ tmp_files+=($tmp)
+
+ j=1
+
+ for devpath in ${DOMU_PASSTHROUGH_PATHS[$i]}
+ do
+ file=${devpath##*/}
+ file="$repo"/"$dir"/"$file".dts
+
+ echo "/include/ \"$file\"" >> "$tmp"
+
+ # All the subsequent dts files should not have dts version mentioned
+ if [ $j -gt 1 ]
+ then
+ sed -i '/\/dts-v/d' "$file"
+ fi
+
+ j=$(( $j + 1 ))
+ done
+
+ dtc -I dts -O dtb -o "$tmp".dtb "$tmp"
+ if [ $? -ne 0 ]
+ then
+ echo "Could not compile \"$tmp\""
+ cleanup_and_return_err
+ fi
+
+ if test "${DOMU_PASSTHROUGH_DTB[$i]}"
+ then
+ echo "Can't set both PASSTHROUGH_DTS_REPO and DOMU_PASSTHROUGH_DTB"
+ cleanup_and_return_err
+ fi
+
+ DOMU_PASSTHROUGH_DTB[$i]="$tmp".dtb
+
+ i=$(( $i + 1 ))
+ done
+}