#!/bin/bash

device="$1"
stowaway=""
boot=""
root_vg=""
root_lv="$2"
cmdline=$(</proc/cmdline)

base=0x40080000
second_offset=0x00e80000
kernel_offset=0x00000000
ramdisk_offset=0x04f80000
tags_offset=0x03f80000
pagesize=2048
dtb_offset=0x0
header_version=0
kernel=""
kernel_version=""
dtb=""
output="/usr/share/kernel/linux-boot.img"
cmdline_extra=""

if [[ -z "$device" ]]
then
  if [[ "$cmdline" =~ ^(.*)androidboot.hardware\=mt6797(.*)$ ]];
  then
    device="geminipda"
  fi

  if [[ "$cmdline" =~ ^(.*)androidboot.hardware\=mt6771(.*)$ ]];
  then
    device="cosmocom"
  fi

  if [[ "$cmdline" =~ ^(.*)androidboot.hardware\=mt6873(.*)$ ]];
  then
    device="astroslide"
  fi
fi

if [[ -z "$device" ]]
then
  model=$(</proc/device-tree/model)
  if [[ "$model" =~ ^(.*)MT6797(.*)$ ]];
  then
    device="geminipda"
  fi

  if [[ "$model" =~ ^(.*)MT6771(.*)$ ]];
  then
    device="cosmocom"
  fi

  if [[ "$model" =~ ^(.*)MT6873(.*)$ ]];
  then
    device="astroslide"
  fi
fi

case $device in
  geminipda)
    ramdisk_offset=0x04f80000
    tags_offset=0x03f80000
    kernel_version="3.18.79"
    kernel="/usr/share/kernel/Gemini-Image.gz-dtb"
    ;;

  cosmocom)
    ramdisk_offset=0x14f80000
    tags_offset=0x13f80000
    kernel_version="4.4.146"
    kernel="/usr/share/kernel/Cosmo-Image.gz-dtb"
    ;;

  astroslide)
    base=0x40078000
    second_offset=0xbff88000
    kernel_offset=0x00008000
    ramdisk_offset=0x07c08000 #0x47c80000=0x40078000+0x07c08000
    tags_offset=0x0bc08000
    dtb_offset=0x0bc08000
    header_version=2
    kernel_version="4.14.186"
    kernel="/usr/share/kernel/Astro-Image.gz"
    mkdtboimg.py create /usr/share/kernel/Astro.dtb /usr/share/kernel/mt6873.dtb
    dtb="/usr/share/kernel/Astro.dtb"
    ;;

  *)
    echo "Unknown device. Please provide either geminipda, cosmocom or astroslide as an argument."
    echo "Skipping kernel image creation."
    exit 0
    ;;
esac

echo "Device is $device"

# kernel and initramfs both depend upon each other
if [ ! -f /boot/config-${kernel_version} ];
then
    echo "Kernel not yet installed."
    echo "Skipping kernel image creation."
    exit 0
fi

ramdisk="/usr/share/kernel/initrd.img-${kernel_version}"

echo Updating Ramdisk in /usr/share/kernel/
mkdir -p /usr/share/kernel
update-initramfs -tc -k ${kernel_version} -v -b /usr/share/kernel

if [[ "$cmdline" =~ ^(.*)bootpartition\=([_a-zA-Z0-9\-]*)(.*)$ ]];
then
  boot="${BASH_REMATCH[2]}"
fi

if [[ "$cmdline" =~ ^(.*)stowaways_os\=([_a-zA-Z0-9\-]*)(.*)$ ]];
then
  stowaway="${BASH_REMATCH[2]}"
fi

if [[ "$cmdline" =~ ^(.*)root_vg\=([_a-zA-Z0-9\-]*)(.*)$ ]];
then
  root_vg="${BASH_REMATCH[2]}"
fi

if [[ "$2" == "" ]];
then
  if [[ "$cmdline" =~ ^(.*)root_lv\=([_a-zA-Z0-9\-]*)(.*)$ ]];
  then
    root_lv="${BASH_REMATCH[2]}"
  fi
fi

if [ -z "$stowaway" ] && [ -z "$root_lv" ]
then
  output="/usr/share/kernel/${device}-boot.img"
fi

if [ -n "$stowaway" ]
then
  output="/usr/share/kernel/${device}-boot-stowaways-${stowaway}.img"
  cmdline_extra="stowaways_os=${stowaway}"
fi

if [ -n "$root_lv" ] && [ -z "$root_vg" ]
then
  output="/usr/share/kernel/${device}-boot-lvm-${root_lv}.img"
  cmdline_extra="root_lv=${root_lv}"
fi

if [ -n "$root_lv" ] && [ -n "$root_vg" ]
then
  output="/usr/share/kernel/${device}-boot-lvm-${root_vg}-${root_lv}.img"
  cmdline_extra="root_vg=${root_vg} root_lv=${root_lv}"
fi

cmdline_extra="${cmdline_extra} audit=0"

mkbootimg --kernel ${kernel} --ramdisk ${ramdisk} --dtb "${dtb}" --base ${base} --second_offset ${second_offset} --dtb_offset ${dtb_offset} --cmdline "bootopt=64S3,32N2,64N2 log_buf_len=4M ${cmdline_extra}" --kernel_offset ${kernel_offset} --ramdisk_offset ${ramdisk_offset} --tags_offset ${tags_offset} --pagesize ${pagesize} --header_version ${header_version} -o ${output}

echo ""
echo "Kernel images installed to /usr/share/kernel/"

if [ -z "$boot" ]
then
  echo "Note: Old boot loader detected, you should flash the kernel manually. Please select kernel and boot partition as appropriate to your setup, taking particular reference to the boot time keys you hold to start Gemian"
  boot="boot2"
  echo "sudo dd if=${output} of=/dev/disk/by-partlabel/${boot}"
fi

if [[ "$1" == "" ]];
then
  echo "Flashing ${output} to /dev/disk/by-partlabel/${boot}"
  dd if=${output} of=/dev/disk/by-partlabel/${boot}
fi

echo "After writing the kernel image a reboot is necessary to use the new kernel."
echo ""
