From 7379d0b05b11519ecbe586017939ed1b0a6871c4 Mon Sep 17 00:00:00 2001 From: Ayan Kumar Halder Date: Fri, 17 Dec 2021 15:48:55 +0000 Subject: Refactor uboot-script-gen Extract some of the functions from uboot-script-gen into common. This will be sourced by disk_image(in subsequent patch) which will invoke the functions for generating dtb. common will have access to all the environment variables defined in the Imagebuilder config file as described in README.md Signed-off-by: Ayan Kumar Halder Reviewed-by: Stefano Stabellini Signed-off-by: Stefano Stabellini --- scripts/common | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 scripts/common (limited to 'scripts/common') 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 +} -- cgit v1.2.3