#!/usr/bin/bash

# set -x

if [[ "$(uname -m)" == arm* || "$(uname -m)" == aarch64 ]]
then
COMMAND="$1"
KERNEL_VERSION="$2"
#BOOT_DIR_ABS="$3"
#KERNEL_IMAGE="$4"

[ -f /etc/u-boot.conf ] && source /etc/u-boot.conf || true
[ -z "$FIRMWAREDT" ] || FirmwareDT=$FIRMWAREDT

if [[ $FirmwareDT == "True" ]]
then
	# if we want to use firmware DT we remove symlink to current kernel DT
        if [ -h /boot/dtb ]; then
            rm -f /boot/dtb
        fi
	exit 0
fi

# Setup a /boot/dtb -> /boot/dtb-$newest_kernel_version symlink so that
# u-boot can find the correct dtb to load.
#
# If invoked to 'add' a new kernel, find the newest based on `sort`ing
# the kernel versions dtb.  If 'remove', then follow basically the same
# procedure but exclude the version currently being removed.
#
# The theory of operation here is that, while newer kernels may add new
# dtb nodes and fields, as upstreaming hw support for some particular
# device progresses, it should never make backward incompatible changes.
# So it should always be safe to use a newer dtb with an older kernel.

    list_dtb_versions() {
        excluded_version="$1"
        for dtbdir in /boot/dtb-*; do
            dtbver=${dtbdir#*-}
            if [ "$dtbver" != "$excluded_version" ]; then
                echo $dtbver
            fi
        done
    }

    setup_dtb_link() {
        ver=`list_dtb_versions $1 | sort -r --sort=version | head -1`
        if [ -h /boot/dtb ]; then
            rm -f /boot/dtb
        fi
        ln -s dtb-$ver /boot/dtb
    }

    ret=0
    case "$COMMAND" in
        add)
            # If we're adding a kernel we want that version
            if [ -h /boot/dtb ]; then
                rm -f /boot/dtb
            fi
            ln -s dtb-$KERNEL_VERSION /boot/dtb
            ret=$?
            ;;
        remove)
            setup_dtb_link $KERNEL_VERSION
            ret=$?
            ;;
    esac
    exit $ret
else
    # Just exit on non ARM
    exit 0
fi
