#!/bin/bash

CROSS_COMPILER_STRING=$1
if [[ "$1x" == "x" ]]; then
	echo "Cross Compiler not defined, exiting."
	exit
fi
#Download Nvidia Bits
echo "Downloading All Required Files, This may take a while..... Please Wait"
wget -O "linux-nvgpu-r32.1.tar.gz" "https://nv-tegra.nvidia.com/gitweb/?p=linux-nvgpu.git;a=snapshot;h=tegra-l4t-r32.1;sf=tgz" > /dev/null
wget -O "soc-tegra-rel-30-r2.tar.gz" "https://nv-tegra.nvidia.com/gitweb/?p=device/hardware/nvidia/soc/tegra.git;a=snapshot;h=rel-30-r2;sf=tgz" > /dev/null
wget -O "soc-tegra-t210-rel-30-r2.tar.gz" "https://nv-tegra.nvidia.com/gitweb/?p=device/hardware/nvidia/soc/t210.git;a=snapshot;h=rel-30-r2;sf=tgz" > /dev/null
wget -O "platform-tegra-common-rel-30-r2.tar.gz" "https://nv-tegra.nvidia.com/gitweb/?p=device/hardware/nvidia/platform/tegra/common.git;a=snapshot;h=rel-30-r2;sf=tgz" > /dev/null
wget -O "platform-tegra-t210-common-rel-30-r2.tar.gz" "https://nv-tegra.nvidia.com/gitweb/?p=device/hardware/nvidia/platform/t210/common.git;a=snapshot;h=rel-30-r2;sf=tgz" > /dev/null

#Download memory patch, fixes boot issue
wget https://raw.githubusercontent.com/lakka-switch/Lakka-LibreELEC/l4t/projects/Switch/devices/L4T/packages/l4t-kernel/patches/l4t-kernel-drop-emc-optimization-flag.patch

#Clone Switchroot Bits
git clone "https://gitlab.com/switchroot/l4t-kernel-4.9.git" > /dev/null
git clone "https://gitlab.com/switchroot/l4t-kernel-nvidia.git" > /dev/null
git clone "https://gitlab.com/switchroot/l4t-platform-t210-switch.git" > /dev/null

#Move Switchroot bits
KERNEL_DIR="./kernel/kernel-4.9"

#Handle Standard Kernel Bits
echo "Extracting and Patching L4T-Switch 4.9"
mkdir -p $KERNEL_DIR
mv ./l4t-kernel-4.9/* $KERNEL_DIR
mv l4t-kernel-drop-emc-optimization-flag.patch $KERNEL_DIR
CURPWD=$(pwd)
cd $KERNEL_DIR
patch -p1 < l4t-kernel-drop-emc-optimization-flag.patch
rm l4t-kernel-drop-emc-optimization-flag.patch
cd $CURPWD
CURPWD=""
rm -r ./l4t-kernel-4.9
echo "Done"

#Handle Nvidia Kernel bits
echo "Extracting Nvidia Kernel Stuff"
mkdir -p ./kernel/nvidia
mv ./l4t-kernel-nvidia*/* ./kernel/nvidia
rm -r ./l4t-kernel-nvidia*
echo "Done"

#Handle Switchroot DTS files
echo "Extracting DTS stuff"
mkdir -p ./kernel/hardware/nvidia/platform/t210/switch
mv ./l4t-platform-t210-switch*/* ./kernel/hardware/nvidia/platform/t210/switch/
rm -r ./l4t-platform-t210-switch*
echo "Done"

#Extract and place nvidia bits
echo "Extracting Nvidia GPU Kernel Bits"
mkdir -p ./kernel/nvgpu
mkdir linux-nvgpu
tar -xf "./linux-nvgpu-r32.1.tar.gz" -C linux-nvgpu --strip 1
rm "./linux-nvgpu-r32.1.tar.gz"
mv ./linux-nvgpu/* ./kernel/nvgpu
rm -r linux-nvgpu
echo "Done"

echo "Extracting Tegra SOC Data"
mkdir -p ./kernel/hardware/nvidia/soc/tegra/
mkdir soc-tegra
tar -xf "./soc-tegra-rel-30-r2.tar.gz" -C soc-tegra --strip 1
rm "./soc-tegra-rel-30-r2.tar.gz"
mv ./soc-tegra/* ./kernel/hardware/nvidia/soc/tegra/
rm -r soc-tegra
echo "Done"

echo "Extracting T210 SOC Data"
mkdir -p ./kernel/hardware/nvidia/soc/t210/
mkdir soc-tegra-t210
tar -xf "soc-tegra-t210-rel-30-r2.tar.gz" -C soc-tegra-t210 --strip 1
rm "soc-tegra-t210-rel-30-r2.tar.gz"
mv ./soc-tegra-t210/* ./kernel/hardware/nvidia/soc/t210/
rm -r soc-tegra-t210
echo "Done"

echo "Extracting Tegra Common Platform Data"
mkdir -p ./kernel/hardware/nvidia/platform/tegra/common/
mkdir platform-tegra-common
tar -xf "platform-tegra-common-rel-30-r2.tar.gz" -C platform-tegra-common --strip 1
rm "platform-tegra-common-rel-30-r2.tar.gz"
mv ./platform-tegra-common/* ./kernel/hardware/nvidia/platform/tegra/common/
rm -r platform-tegra-common
echo "Done"

echo "Extracting T210 Common Platform Data"
mkdir -p ./kernel/hardware/nvidia/platform/t210/common/
mkdir common-t210
tar -xf "platform-tegra-t210-common-rel-30-r2.tar.gz" -C common-t210 --strip 1
rm "platform-tegra-t210-common-rel-30-r2.tar.gz"
mv ./common-t210/* ./kernel/hardware/nvidia/platform/t210/common/
rm -r common-t210
echo "Done"

echo "Preparing Source and Creating Defconfig"
cd ./kernel/kernel-4.9
#This command fails, because it is missing .config, but is needed to create the defconfig which becomes .config.... Not sure why.
ARCH=arm64 CROSS_COMPILE=$CROSS_COMPILER_STRING make prepare
ARCH=arm64 CROSS_COMPILE=$CROSS_COMPILER_STRING make t210_switch_defconfig
ARCH=arm64 CROSS_COMPILE=$CROSS_COMPILER_STRING make prepare
ARCH=arm64 CROSS_COMPILE=$CROSS_COMPILER_STRING make modules_prepare
cd ../../
echo "Done"
echo "Finished"
